diff --git a/api/ocm/extensions/download/handlers/helm/download_test.go b/api/ocm/extensions/download/handlers/helm/download_test.go index e2b505e78a..7925d4c77d 100644 --- a/api/ocm/extensions/download/handlers/helm/download_test.go +++ b/api/ocm/extensions/download/handlers/helm/download_test.go @@ -33,6 +33,7 @@ const ( ArtifactType = "NotHelmChart" SpecialOCIResource = "specialhelm" UnusualOCIResource = "unusualhelm" + LegacyOCIResource = "legacyhelm" ) var _ = Describe("upload", func() { @@ -53,6 +54,9 @@ var _ = Describe("upload", func() { env.Resource(UnusualOCIResource, Version, resourcetypes.HELM_CHART, v1.LocalRelation, func() { env.BlobFromFile(artifactset.MediaType(artdesc.MediaTypeImageManifest), filepath.Join("/testdata/unusual-ordered-helm-chart.tgz")) }) + env.Resource(LegacyOCIResource, Version, resourcetypes.HELM_CHART, v1.LocalRelation, func() { + env.BlobFromFile(artifactset.MediaType(artdesc.MediaTypeImageManifest), filepath.Join("/testdata/legacy-pre-hip-helm-chart.tgz")) + }) }) }) }) @@ -88,4 +92,14 @@ var _ = Describe("upload", func() { MustBeSuccessful(tarutils.ExtractArchiveToFs(env.FileSystem(), path, env.FileSystem())) Expect(Must(vfs.FileExists(env.FileSystem(), "/postgresql/Chart.yaml"))).To(BeTrue()) }) + + It("successfully download artifacts with helm chart content with legacy content type", func() { + MustBeSuccessful(download.RegisterHandlerByName(env, helm.PATH, nil, download.ForArtifactType(ArtifactType))) + + repo := Must(ctf.Open(env.OCMContext(), accessobj.ACC_READONLY, CTFPath, 0o777, env)) + cv := Must(repo.LookupComponentVersion(Component, Version)) + path := Must(download.DownloadResource(env.OCMContext(), Must(cv.SelectResources(selectors.Identity(v1.Identity{"name": LegacyOCIResource})))[0], "/resource", download.WithFileSystem(env.FileSystem()))) + MustBeSuccessful(tarutils.ExtractArchiveToFs(env.FileSystem(), path, env.FileSystem())) + Expect(Must(vfs.FileExists(env.FileSystem(), "/ingress-nginx/Chart.yaml"))).To(BeTrue()) + }) }) diff --git a/api/ocm/extensions/download/handlers/helm/handler.go b/api/ocm/extensions/download/handlers/helm/handler.go index 13e99f3135..74481cbdfa 100644 --- a/api/ocm/extensions/download/handlers/helm/handler.go +++ b/api/ocm/extensions/download/handlers/helm/handler.go @@ -129,7 +129,12 @@ func download(p common.Printer, art oci.ArtifactAccess, path string, fs vfs.File chartDesc, err := findLayer(desc.Layers, helmregistry.ChartLayerMediaType) if err != nil { - return "", "", fmt.Errorf("no valid chart layer found: %w", err) + // Fallback to legacy chart layer media type if no chart layer is found in the normal order. + // See https://helm.sh/docs/topics/registries/#oci-feature-deprecation-and-behavior-changes-with-v370 + var fallbackErr error + if chartDesc, fallbackErr = findLayer(desc.Layers, helmregistry.LegacyChartLayerMediaType); fallbackErr != nil { + return "", "", errors.Join(err, fallbackErr) + } } chartBlob, err := m.GetBlob(chartDesc.Digest) diff --git a/api/ocm/extensions/download/handlers/helm/testdata/legacy-pre-hip-helm-chart.tgz b/api/ocm/extensions/download/handlers/helm/testdata/legacy-pre-hip-helm-chart.tgz new file mode 100644 index 0000000000..1b31398d84 Binary files /dev/null and b/api/ocm/extensions/download/handlers/helm/testdata/legacy-pre-hip-helm-chart.tgz differ