github.com/docker/cnab-to-oci@v0.3.0-beta4/converter/convert_test.go (about) 1 package converter 2 3 import ( 4 "testing" 5 6 "github.com/docker/cnab-to-oci/tests" 7 "github.com/docker/distribution/manifest/schema2" 8 "github.com/docker/distribution/reference" 9 ocischemav1 "github.com/opencontainers/image-spec/specs-go/v1" 10 "gotest.tools/assert" 11 ) 12 13 func TestConvertFromFixedUpBundleToOCI(t *testing.T) { 14 bundleConfigDescriptor := ocischemav1.Descriptor{ 15 Digest: "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341", 16 MediaType: schema2.MediaTypeManifest, 17 Size: 315, 18 } 19 targetRef := "my.registry/namespace/my-app:0.1.0" 20 src := tests.MakeTestBundle() 21 22 relocationMap := tests.MakeRelocationMap() 23 24 expected := tests.MakeTestOCIIndex() 25 26 // Convert from bundle to OCI index 27 named, err := reference.ParseNormalizedNamed(targetRef) 28 assert.NilError(t, err) 29 actual, err := ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 30 assert.NilError(t, err) 31 assert.DeepEqual(t, expected, actual) 32 33 // Nil maintainers does not add annotation 34 src = tests.MakeTestBundle() 35 src.Maintainers = nil 36 actual, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 37 assert.NilError(t, err) 38 _, hasMaintainers := actual.Annotations[ocischemav1.AnnotationAuthors] 39 assert.Assert(t, !hasMaintainers) 40 41 // Nil keywords does not add annotation 42 src = tests.MakeTestBundle() 43 src.Keywords = nil 44 actual, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 45 assert.NilError(t, err) 46 _, hasKeywords := actual.Annotations[CNABKeywordsAnnotation] 47 assert.Assert(t, !hasKeywords) 48 49 // Multiple invocation images is not supported 50 src = tests.MakeTestBundle() 51 src.InvocationImages = append(src.InvocationImages, src.InvocationImages[0]) 52 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 53 assert.ErrorContains(t, err, "only one invocation image supported") 54 55 // Invalid media type 56 src = tests.MakeTestBundle() 57 src.InvocationImages[0].MediaType = "some-invalid-mediatype" 58 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 59 assert.ErrorContains(t, err, `unsupported media type "some-invalid-mediatype" for image "my.registry/namespace/my-app@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343"`) 60 61 // All images must be in the same repository 62 src = tests.MakeTestBundle() 63 badRelocationMap := tests.MakeRelocationMap() 64 badRelocationMap["my.registry/namespace/my-app-invoc"] = "my.registry/namespace/other-repo@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343" 65 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap) 66 assert.ErrorContains(t, err, `invalid invocation image: image `+ 67 `"my.registry/namespace/other-repo@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343" is not in the same repository as "my.registry/namespace/my-app:0.1.0"`) 68 69 // Image reference must be digested 70 src = tests.MakeTestBundle() 71 badRelocationMap = tests.MakeRelocationMap() 72 badRelocationMap["my.registry/namespace/my-app-invoc"] = "my.registry/namespace/my-app:not-digested" 73 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap) 74 assert.ErrorContains(t, err, "invalid invocation image: image \"my.registry/namespace/"+ 75 "my-app:not-digested\" is not a digested reference") 76 77 // Invalid reference 78 src = tests.MakeTestBundle() 79 badRelocationMap = tests.MakeRelocationMap() 80 badRelocationMap["my.registry/namespace/my-app-invoc"] = "Some/iNvalid/Ref" 81 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap) 82 assert.ErrorContains(t, err, "invalid invocation image: "+ 83 "image \"Some/iNvalid/Ref\" is not a valid image reference: invalid reference format: repository name must be lowercase") 84 85 // Invalid size 86 src = tests.MakeTestBundle() 87 src.InvocationImages[0].Size = 0 88 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 89 assert.ErrorContains(t, err, "size is not set") 90 91 // mediatype ociindex 92 src = tests.MakeTestBundle() 93 src.InvocationImages[0].MediaType = ocischemav1.MediaTypeImageIndex 94 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 95 assert.NilError(t, err) 96 97 // mediatype docker manifestlist 98 src = tests.MakeTestBundle() 99 src.InvocationImages[0].MediaType = "application/vnd.docker.distribution.manifest.list.v2+json" 100 _, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap) 101 assert.NilError(t, err) 102 } 103 104 func TestGetConfigDescriptor(t *testing.T) { 105 ix := &ocischemav1.Index{ 106 Manifests: []ocischemav1.Descriptor{ 107 { 108 Digest: "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341", 109 MediaType: schema2.MediaTypeManifest, 110 Size: 315, 111 Annotations: map[string]string{ 112 CNABDescriptorTypeAnnotation: CNABDescriptorTypeConfig, 113 }, 114 }, 115 { 116 Digest: "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341", 117 MediaType: "application/vnd.docker.distribution.manifest.v2+json", 118 Size: 315, 119 Annotations: map[string]string{ 120 "io.cnab.type": "invocation", 121 }, 122 }, 123 { 124 Digest: "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341", 125 MediaType: "application/vnd.oci.image.manifest.v1+json", 126 Size: 1385, 127 Annotations: map[string]string{ 128 "io.cnab.type": "component", 129 "io.cnab.component_name": "image-1", 130 "io.cnab.original_name": "nginx:2.12", 131 }, 132 }, 133 }, 134 } 135 expected := ocischemav1.Descriptor{ 136 Digest: "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341", 137 MediaType: schema2.MediaTypeManifest, 138 Size: 315, 139 Annotations: map[string]string{ 140 CNABDescriptorTypeAnnotation: CNABDescriptorTypeConfig, 141 }, 142 } 143 d, err := GetBundleConfigManifestDescriptor(ix) 144 assert.NilError(t, err) 145 assert.DeepEqual(t, expected, d) 146 ix.Manifests = ix.Manifests[1:] 147 _, err = GetBundleConfigManifestDescriptor(ix) 148 assert.ErrorContains(t, err, "bundle config not found") 149 } 150 151 func TestGenerateRelocationMap(t *testing.T) { 152 targetRef := "my.registry/namespace/my-app:0.1.0" 153 named, err := reference.ParseNormalizedNamed(targetRef) 154 assert.NilError(t, err) 155 156 ix := tests.MakeTestOCIIndex() 157 b := tests.MakeTestBundle() 158 159 expected := tests.MakeRelocationMap() 160 161 relocationMap, err := GenerateRelocationMap(ix, b, named) 162 assert.NilError(t, err) 163 assert.DeepEqual(t, relocationMap, expected) 164 }