Skip to content

Commit f171132

Browse files
authored
Add tests for ansible
1 parent 34bf94b commit f171132

16 files changed

+483
-95
lines changed

README.md

+74-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,80 @@
1-
# structural-tests
2-
Securesign project structural and acceptance tests.
1+
# Structural tests
2+
Securesign project structural and acceptance tests. Based on
3+
* Securesign releases: https://github.com/securesign/releases
4+
* Securesign operator: https://github.com/securesign/secure-sign-operator
5+
* Securesign Ansible collection: https://github.com/securesign/artifact-signer-ansible
36

7+
## Automation
8+
Current automation is done via Github actions here: https://github.com/securesign/releases/actions/workflows/structural.yml
49

5-
## Repository list
6-
Pull list of repositories from Pyxis API
10+
## Manual testing
11+
It is necessary to point to the release [snapshot](https://github.com/securesign/releases/blob/main/1.1.0/stable/snapshot.json) file. All other components
12+
for the tests are taken from that file, as shown below:
13+
14+
"operator": {
15+
"snapshot_name": "operator-v1-1-4x2vj",
16+
"rhtas-operator-image": "quay.io/securesign/rhtas-operator-v1-1@sha256:3a61aca9fa8ed6580a367bc08a45cc27fc7f50ff24e786ffde9ec3d9c549b00b",
17+
"rhtas-operator-bundle-image": "quay.io/securesign/rhtas-operator-bundle-v1-1@sha256:6db817ed76948417f358d402e737df7b320f82462ad164b002ded15e560a0fdf"
18+
},
19+
20+
"artifact-signer-ansible": {
21+
"collection": {
22+
"url": "https://github.com/securesign/artifact-signer-ansible/actions/runs/11705765669/artifacts/2152648141",
23+
"sha256": "4da3d330f9e82a65d93b242e0cc14b5912d4bf65d0eac31fe1d226e4c6ae11f5"
24+
}
25+
}
26+
27+
### Parameters
28+
* ``SNAPSHOT`` - points to the ``snapshot.json`` file, can be local or on a server (github).
29+
* ``TEST_GITHUB_TOKEN`` - token used to access ``releases`` project on github.
30+
* ``ANSIBLE`` - ansible collection zip file used instead of the one defined in ``snapshot.json`` file. Can also be local.
31+
* ``REPOSITORIES`` - file with images published in ``registry.redhat.io``, default ``testdata/repositories.json``. For how to get or update this file,
32+
check [Repository List](#repository-list) chapter.
33+
34+
### Examples
35+
Run tests based on a github file:
36+
37+
SNAPSHOT=https://raw.githubusercontent.com/securesign/releases/refs/heads/feat/release-1.1.1/1.1.1/stable/snapshot.json \
38+
TEST_GITHUB_TOKEN=ghp_Ae \
39+
go test -v ./test/... --ginkgo.v
40+
41+
Run the same tests on a local (cloned) file:
42+
43+
SNAPSHOT=../releases/1.1.1/stable/snapshot.json \
44+
go test -v ./test/... --ginkgo.v
45+
46+
Force different ansible collection instead of the one defined in ``snapshot.json`` file. This may be useful, when checking ansible collection not yet published:
47+
48+
SNAPSHOT=../releases/1.1.1/stable/snapshot.json \
49+
ANSIBLE=https://api.github.com/repos/securesign/artifact-signer-ansible/actions/artifacts/2442056100/zip \
50+
go test -v ./test/... --ginkgo.v
51+
52+
To run just individual test use ``--ginkgo.fokus-file`` parameter:
53+
54+
SNAPSHOT=../releases/1.1.1/stable/snapshot.json \
55+
go test -v ./test/... --ginkgo.v --ginkgo.focus-file "ansible"
56+
57+
## Repository List
58+
The [repositories.json](testdata/repositories.json) file is used to check of all images are published correctly. To pull the list of repositories from Pyxis API:
759

860
```bash
961
curl --negotiate -u : -b .cookiejar.txt -c .cookiejar.txt 'https://pyxis.engineering.redhat.com/v1/product-listings/id/6604180e80e2fa3e4947d1d5/repositories?filter=release_categories%3Din%3D%28%22Generally%20Available%22%29&include=data.repository,data._id,data.published' | jq > testdata/repositories.json
1062
```
63+
64+
## Ansible Artifacts
65+
Published Ansible collections are also stored as an zip [artifacts](https://github.com/securesign/artifact-signer-ansible/actions/workflows/collection-build.yaml).
66+
To download list of available artifacts:
67+
68+
curl -L \
69+
-H "Accept: application/vnd.github+json" \
70+
-H "Authorization: Bearer ghp_Ae" \
71+
-H "X-GitHub-Api-Version: 2022-11-28" \
72+
https://api.github.com/repos/securesign/artifact-signer-ansible/actions/artifacts
73+
74+
Downloading one artifact:
75+
76+
curl -L -O \
77+
-H "Accept: application/vnd.github+json" \
78+
-H "Authorization: Bearer ghp_Ae" \
79+
-H "X-GitHub-Api-Version: 2022-11-28" \
80+
https://api.github.com/repos/securesign/artifact-signer-ansible/actions/artifacts/2442056100/zip

go.mod

+1-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/docker/docker v27.4.1+incompatible
77
github.com/onsi/ginkgo/v2 v2.22.2
88
github.com/onsi/gomega v1.36.2
9+
gopkg.in/yaml.v3 v3.0.1
910
sigs.k8s.io/controller-runtime v0.19.4
1011
)
1112

@@ -34,16 +35,12 @@ require (
3435
go.opentelemetry.io/otel v1.33.0 // indirect
3536
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect
3637
go.opentelemetry.io/otel/metric v1.33.0 // indirect
37-
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
3838
go.opentelemetry.io/otel/trace v1.33.0 // indirect
3939
golang.org/x/net v0.34.0 // indirect
4040
golang.org/x/sys v0.29.0 // indirect
4141
golang.org/x/text v0.21.0 // indirect
4242
golang.org/x/time v0.5.0 // indirect
4343
golang.org/x/tools v0.29.0 // indirect
44-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
4544
google.golang.org/grpc v1.66.0 // indirect
46-
google.golang.org/protobuf v1.36.1 // indirect
47-
gopkg.in/yaml.v3 v3.0.1 // indirect
4845
gotest.tools/v3 v3.5.1 // indirect
4946
)

go.sum

+4-22
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
66
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
77
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
88
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
9-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
10-
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
10+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1111
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
1212
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
1313
github.com/docker/docker v27.4.1+incompatible h1:ZJvcY7gfwHn1JF48PfbyXg7Jyt9ZCWDW+GGXOIxEwp4=
@@ -29,8 +29,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
2929
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
3030
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
3131
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
32-
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g=
33-
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
3432
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
3533
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
3634
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -49,12 +47,8 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
4947
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
5048
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
5149
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
52-
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
53-
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
5450
github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
5551
github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
56-
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
57-
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
5852
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
5953
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
6054
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -79,9 +73,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEj
7973
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
8074
go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw=
8175
go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I=
82-
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc=
83-
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s=
8476
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
77+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
8578
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s=
8679
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY=
8780
go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ=
@@ -90,9 +83,8 @@ go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBq
9083
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
9184
go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
9285
go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
93-
go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94=
94-
go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A=
9586
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
87+
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
9688
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
9789
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
9890
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -102,8 +94,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
10294
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
10395
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
10496
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
105-
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
106-
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
10797
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
10898
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
10999
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -117,8 +107,6 @@ golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
117107
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
118108
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
119109
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
120-
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
121-
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
122110
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
123111
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
124112
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
@@ -127,8 +115,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
127115
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
128116
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
129117
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
130-
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
131-
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
132118
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
133119
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
134120
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -141,8 +127,6 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:
141127
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
142128
google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c=
143129
google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
144-
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
145-
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
146130
google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
147131
google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
148132
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -152,7 +136,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
152136
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
153137
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
154138
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
155-
sigs.k8s.io/controller-runtime v0.18.3 h1:B5Wmmo8WMWK7izei+2LlXLVDGzMwAHBNLX68lwtlSR4=
156-
sigs.k8s.io/controller-runtime v0.18.3/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
157139
sigs.k8s.io/controller-runtime v0.19.4 h1:SUmheabttt0nx8uJtoII4oIP27BVVvAKFvdvGFwV/Qo=
158140
sigs.k8s.io/controller-runtime v0.19.4/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package acceptance
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
. "github.com/onsi/ginkgo/v2"
8+
. "github.com/onsi/gomega"
9+
"github.com/securesign/structural-tests/test/support"
10+
)
11+
12+
var _ = Describe("Trusted Artifact Signer Ansible", Ordered, func() {
13+
14+
var (
15+
snapshotData support.SnapshotData
16+
repositories *support.RepositoryList
17+
18+
ansibleFileContent []byte
19+
20+
ansibleTasImages support.AnsibleMap
21+
ansibleOtherImages support.AnsibleMap
22+
)
23+
24+
It("get and parse snapshot file", func() {
25+
var err error
26+
snapshotData, err = support.ParseSnapshotData()
27+
support.LogMap(fmt.Sprintf("Snapshot images (%d):", len(snapshotData.Images)), snapshotData.Images)
28+
Expect(err).NotTo(HaveOccurred())
29+
Expect(snapshotData.Images).NotTo(BeEmpty(), "No images were detected in snapshot file")
30+
31+
repositories, err = support.LoadRepositoryList()
32+
Expect(err).NotTo(HaveOccurred())
33+
Expect(repositories.Data).NotTo(BeEmpty(), "No images were detected in repositories file")
34+
})
35+
36+
It("load ansible definition file", func() {
37+
var err error
38+
ansibleCollectionURL := support.GetEnv(support.EnvAnsibleImagesFile)
39+
if ansibleCollectionURL == "" {
40+
support.LogAvailableAnsibleArtifacts()
41+
// standard way - use ansible definition file path from releases snapshot.json file
42+
snapshotAnsibleURL := snapshotData.Others[support.AnsibleCollectionKey]
43+
log.Printf("Using %s URL from snapshot.json file\n", snapshotAnsibleURL)
44+
Expect(snapshotAnsibleURL).NotTo(BeEmpty())
45+
ansibleCollectionURL, err = support.MapAnsibleZipFileURL(snapshotAnsibleURL)
46+
Expect(err).NotTo(HaveOccurred())
47+
Expect(ansibleCollectionURL).NotTo(BeEmpty())
48+
}
49+
ansibleFileContent, err = support.LoadAnsibleCollectionSnapshotFile(ansibleCollectionURL, support.AnsibleCollectionSnapshotFile)
50+
Expect(err).NotTo(HaveOccurred())
51+
Expect(ansibleFileContent).NotTo(BeEmpty(), "Ansible definition file seems to be empty")
52+
})
53+
54+
It("get and parse ansible images definition file", func() {
55+
ansibleAllImages, err := support.MapAnsibleImages(ansibleFileContent)
56+
Expect(err).NotTo(HaveOccurred())
57+
Expect(ansibleAllImages).NotTo(BeEmpty())
58+
ansibleTasImages, ansibleOtherImages = support.SplitMap(ansibleAllImages, support.AnsibleTasImageKeys())
59+
Expect(ansibleTasImages).NotTo(BeEmpty())
60+
Expect(ansibleOtherImages).NotTo(BeEmpty())
61+
support.LogMap(fmt.Sprintf("Ansible TAS images (%d):", len(ansibleTasImages)), ansibleTasImages)
62+
support.LogMap(fmt.Sprintf("Ansible other images (%d):", len(ansibleOtherImages)), ansibleOtherImages)
63+
})
64+
65+
It("ansible TAS images are listed in registry.redhat.io", func() {
66+
var errs []error
67+
for _, ansibleImage := range ansibleTasImages {
68+
if repositories.FindByImage(ansibleImage) == nil {
69+
errs = append(errs, fmt.Errorf("%w: %s", ErrNotFoundInRegistry, ansibleImage))
70+
}
71+
}
72+
Expect(errs).To(BeEmpty())
73+
})
74+
75+
It("ansible TAS images are all valid", func() {
76+
Expect(support.GetMapKeys(ansibleTasImages)).To(ContainElements(support.AnsibleTasImageKeys()))
77+
Expect(len(ansibleTasImages)).To(BeNumerically("==", len(support.AnsibleTasImageKeys())))
78+
Expect(ansibleTasImages).To(HaveEach(MatchRegexp(support.TasImageDefinitionRegexp)))
79+
})
80+
81+
It("ansible other images are all valid", func() {
82+
Expect(support.GetMapKeys(ansibleOtherImages)).To(ContainElements(support.AnsibleOtherImageKeys()))
83+
Expect(len(ansibleOtherImages)).To(BeNumerically("==", len(support.AnsibleOtherImageKeys())))
84+
Expect(ansibleOtherImages).To(HaveEach(MatchRegexp(support.OtherImageDefinitionRegexp)))
85+
})
86+
87+
It("all ansible TAS image hashes are also defined in releases snapshot", func() {
88+
mapped := make(map[string]string)
89+
for _, imageKey := range support.AnsibleTasImageKeys() {
90+
91+
// skip, while ansible uses older tuf image
92+
if imageKey == "tas_single_node_tuf_image" {
93+
log.Printf("Ansible uses differet TUF image - skipping")
94+
log.Printf(" Ansible: %s", ansibleTasImages[imageKey])
95+
log.Printf(" Snapshot: %s", snapshotData.Images[support.ConvertAnsibleImageKey(imageKey)])
96+
continue
97+
}
98+
99+
aSha := support.ExtractHash(ansibleTasImages[imageKey])
100+
if _, keyExist := snapshotData.Images[support.ConvertAnsibleImageKey(imageKey)]; !keyExist {
101+
mapped[imageKey] = "MISSING"
102+
continue
103+
}
104+
sSha := support.ExtractHash(snapshotData.Images[support.ConvertAnsibleImageKey(imageKey)])
105+
if aSha == sSha {
106+
mapped[imageKey] = "match"
107+
} else {
108+
mapped[imageKey] = "DIFFERENT HASHES"
109+
}
110+
}
111+
Expect(mapped).To(HaveEach("match"), "Ansible images are missing or have different hashes in snapshot file")
112+
})
113+
114+
It("image hashes are all unique", func() {
115+
aImageHashes := support.ExtractHashes(support.GetMapValues(ansibleTasImages))
116+
hashesCounts := make(map[string]int)
117+
for _, hash := range aImageHashes {
118+
_, exist := hashesCounts[hash]
119+
if exist {
120+
hashesCounts[hash]++
121+
} else {
122+
hashesCounts[hash] = 1
123+
}
124+
}
125+
Expect(hashesCounts).To(HaveEach(1))
126+
Expect(ansibleTasImages).To(HaveLen(len(hashesCounts)))
127+
})
128+
129+
})

0 commit comments

Comments
 (0)