Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions tests/integration/image-builders/operator/catalogs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,38 @@ opm render ${REPO}:baz-bundle-v1.0.0 ${REPO}:baz-bundle-v1.0.1 ${REPO}:baz-bundl
```


## test-catalog-invalid-images

Used to test OCPBUGS-33081: a catalog may contain bundles with invalid
related images (missing name, missing tag/digest, unsupported `oci://`
scheme, ...), and oc-mirror is expected to handle that gracefully rather than
failing the whole catalog. `foo.v0.9.9-invalid-related-image`'s bad related
image is never actually pulled - the string only needs to fail image
reference parsing, so it doesn't need to point at a real image.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

### Contents
* Packages: foo
* Channels:
- foo: beta
* Bundles:
- foo.v0.1.0: valid, points at the real, already-published `foo-bundle-v0.1.0` image
- foo.v0.9.9-invalid-related-image: has a related image with no tag or digest
(`registry.example.com/foo/operand-missing-tag`)

### Creating
```bash
CATALOG=test-catalog-invalid-images
mkdir -p ${CATALOG}/foo

opm init foo -c beta -o yaml > ${CATALOG}/foo/operator.yaml

REPO="quay.io/oc-mirror/oc-mirror-dev"
opm render ${REPO}:foo-bundle-v0.1.0 --output=yaml > ${CATALOG}/foo/bundles.yaml
# then hand-edit ${CATALOG}/foo/channels.yaml and append the invalid bundle to
# ${CATALOG}/foo/bundles.yaml - see the checked-in files for the exact content.
```


## Catalog building
```bash
make build # for all catalogs
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
image: quay.io/oc-mirror/oc-mirror-dev:foo-bundle-v0.1.0
name: foo.v0.1.0
package: foo
properties:
- type: olm.gvk
value:
group: test.foo
kind: Foo
version: v1
- type: olm.gvk.required
value:
group: test.bar
kind: Bar
version: v1alpha1
- type: olm.package
value:
packageName: foo
version: 0.1.0
- type: olm.package.required
value:
packageName: bar
versionRange: <0.2.0
- type: olm.bundle.object
value:
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwic2NvcGUiOiJOYW1lc3BhY2VkIiwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSIsInNjaGVtYSI6eyJvcGVuQVBJVjNTY2hlbWEiOnsidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX19LCJzZXJ2ZWQiOnRydWUsInN0b3JhZ2UiOnRydWV9XX19
- type: olm.bundle.object
value:
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiY2FwYWJpbGl0aWVzIjoiQmFzaWNJbnN0YWxsIiwiY2VydGlmaWVkIjoiZmFsc2UiLCJjb250YWluZXJJbWFnZSI6InF1YXkuaW8vb2MtbWlycm9yL29jLW1pcnJvci1kZXZAc2hhMjU2OjFjZThjMDE4N2M4ZmU2YjRiZTMyN2RjODQ4YjhiYWYwNjJjZTFiYWE1MDk2YjRmNWQ5NTU4OTNkMTI2ZDViNTgiLCJkZXNjcmlwdGlvbiI6IlRoZSBGb28gT3BlcmF0b3IgZG9lcyBGb28gdGhpbmdzLiIsIm9sbS5za2lwUmFuZ2UiOiJcdTAwM2MwLjEuMCIsInJlcG9zaXRvcnkiOiJodHRwczovL2dpdGh1Yi5jb20vb3BlbnNoaWZ0L29jLW1pcnJvciJ9LCJuYW1lIjoiZm9vLnYwLjEuMCJ9LCJzcGVjIjp7ImN1c3RvbXJlc291cmNlZGVmaW5pdGlvbnMiOnsib3duZWQiOlt7Imdyb3VwIjoidGVzdC5mb28iLCJraW5kIjoiRm9vIiwibmFtZSI6ImZvb3MudGVzdC5mb28iLCJ2ZXJzaW9uIjoidjEifV19LCJkZXNjcmlwdGlvbiI6IlRoZSBGb28gT3BlcmF0b3IgZG9lcyBGb28gdGhpbmdzLiIsImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaWNvbiI6W3siYmFzZTY0ZGF0YSI6IlBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQSE4yWnlCMlpYSnphVzl1UFNJeExqRWlJR2xrUFNKcFkyOXVJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0lDQWdJSFpwWlhkQ2IzZzlJakFnTUNBeE1qZ3dJREV5T0RBaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURFeU9EQWdNVEk0TURzaUlIaHRiRHB6Y0dGalpUMGljSEpsYzJWeWRtVWlQZ284YzNSNWJHVWdkSGx3WlQwaWRHVjRkQzlqYzNNaVBnb2dJQzV6Y1hWcGNtTnNaU0I3SUdacGJHdzZJQ00zUWpnM09UUTdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0RWd2VDd2dNWEI0S1RzZ2ZRb2dJQzV1WVcxbElIc2dabTl1ZERvZ1ltOXNaQ0EwTURCd2VDQnpZVzV6SUhObGNtbG1PeUJtYVd4c09pQnlaV1E3SUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtERXpNSEI0TENBMU1EQndlQ2tnY205MFlYUmxLREl3WkdWbktUc2dmUW84TDNOMGVXeGxQZ284Wno0S0lDQThjR0YwYUNCamJHRnpjejBpYzNGMWFYSmpiR1VpSUdROUlrMGdNQ3dnTlRBd0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkRJREFzSURVZ05Td2dNQ0ExTURBc0lEQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRk1nTVRBd01Dd2dOU0F4TURBd0xDQTFNREFLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ01UQXdNQ3dnTVRBd01DQTFNREFzSURFd01EQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTUN3Z01UQXdNQ0F3TENBMU1EQWlMejRLSUNBOGRHVjRkQ0JqYkdGemN6MGlibUZ0WlNJK1ptOXZQQzkwWlhoMFBnbzhMMmMrQ2p3dmMzWm5QZ289IiwibWVkaWF0eXBlIjoiaW1hZ2Uvc3ZnK3htbCJ9XSwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiYXBwIjoiZm9vLW9wZXJhdG9yIn19LCJ0ZW1wbGF0ZSI6eyJtZXRhZGF0YSI6eyJsYWJlbHMiOnsiYXBwIjoiZm9vLW9wZXJhdG9yIiwidmVyc2lvbiI6InYwLjEuMCJ9LCJuYW1lIjoiZm9vLW9wZXJhdG9yIn0sInNwZWMiOnsiY29udGFpbmVycyI6W3siY29tbWFuZCI6WyIvcnVuLnNoIl0sImltYWdlIjoicXVheS5pby9vYy1taXJyb3Ivb2MtbWlycm9yLWRldkBzaGEyNTY6MWNlOGMwMTg3YzhmZTZiNGJlMzI3ZGM4NDhiOGJhZjA2MmNlMWJhYTUwOTZiNGY1ZDk1NTg5M2QxMjZkNWI1OCIsImltYWdlUHVsbFBvbGljeSI6IkFsd2F5cyIsIm5hbWUiOiJmb28ifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJpbnN0YWxsTW9kZXMiOlt7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6Ik93bk5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjp0cnVlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbImZvbyJdLCJsYWJlbHMiOnsibmFtZSI6ImZvby1vcGVyYXRvciJ9LCJtYWludGFpbmVycyI6W3siZW1haWwiOiJvYy1taXJyb3JAb3BlbnNoaWZ0Lm9yZyIsIm5hbWUiOiJvYy1taXJyb3IgZGV2ZWxvcGVycyJ9XSwibWF0dXJpdHkiOiJiZXRhIiwicHJvdmlkZXIiOnsibmFtZSI6IkZvbyJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InF1YXkuaW8vb2MtbWlycm9yL29jLW1pcnJvci1kZXZAc2hhMjU2OjFjZThjMDE4N2M4ZmU2YjRiZTMyN2RjODQ4YjhiYWYwNjJjZTFiYWE1MDk2YjRmNWQ5NTU4OTNkMTI2ZDViNTgiLCJuYW1lIjoib3BlcmF0b3IifV0sInZlcnNpb24iOiIwLjEuMCJ9fQ==
relatedImages:
- image: quay.io/oc-mirror/oc-mirror-dev:foo-bundle-v0.1.0
name: ""
- image: quay.io/oc-mirror/oc-mirror-dev@sha256:1ce8c0187c8fe6b4be327dc848b8baf062ce1baa5096b4f5d955893d126d5b58
name: operator
schema: olm.bundle
---
image: quay.io/oc-mirror/oc-mirror-dev:foo-bundle-v0.1.0
name: foo.v0.9.9-invalid-related-image
package: foo
properties:
- type: olm.gvk
value:
group: test.foo
kind: Foo
version: v1
- type: olm.package
value:
packageName: foo
version: 0.9.9
relatedImages:
- image: quay.io/oc-mirror/oc-mirror-dev:foo-bundle-v0.1.0
name: ""
- image: registry.example.com/foo/operand-missing-tag
name: operand
schema: olm.bundle
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
schema: olm.channel
package: foo
name: beta
entries:
- name: foo.v0.1.0
- name: foo.v0.9.9-invalid-related-image
replaces: foo.v0.1.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
defaultChannel: beta
name: foo
schema: olm.package
16 changes: 16 additions & 0 deletions tests/integration/operators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,22 @@ var _ = Describe("operators", func() {
expectRebuiltTagMatchesDigest(ctx, *testRegistry, filepath.Join(iscDir, iscFile))
})
})

// OCPBUGS-33081: a catalog may contain bundles with invalid related images (missing
// name, missing tag/digest, unsupported oci:// scheme, ...).
Describe("catalog with a bundle containing an invalid related image", func() {
iscFile := filepath.Join("operators", "isc-operator-invalid-images.yaml")

It("fails the whole catalog", func() {
By("running mirrorToMirror against a catalog with one valid and one invalid bundle")
result, err := runner.MirrorToMirror(ctx, filepath.Join(iscDir, iscFile), workDir, testRegistry.Endpoint(),
"--dest-tls-verify=false")
expectOcMirrorExitCode(result, err, 4, "collection error", "tag and digest are empty")

By("verifying no content was mirrored, even though one of the two bundles was valid")
expectNoRepositoriesInRegistry(*testRegistry)
})
})
})

// expectCatalogContainsOnlyExpectedPackages verifies that the rebuilt catalog in the registry
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# ImageSetConfig to test mirroring a catalog that has a bundle with an invalid
# related image (OCPBUGS-33081)
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v2alpha1
mirror:
operators:
- catalog: quay.io/oc-mirror/oc-mirror-dev:test-catalog-invalid-images
full: true