From d280ff8c159939709dde4a590212bce6093ccad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakob=20M=C3=B6ller?= Date: Wed, 21 May 2025 12:43:10 +0200 Subject: [PATCH] fix: allow pre-v3.7.0 HELM Charts in HELM OCI Artifact downloader (#1476) #### What this PR does / why we need it The release of Helm v3.7.0 included the implementation of HIP 6 for OCI support. The chart layer media type was switched from application/tar+gzip to application/vnd.cncf.helm.chart.content.v1.tar+gzip. To support HELM Charts created before this version, we should maintain compatibility with a legacy layer detection. This implements this detection to make sure we don't have breaking changes after our recent adjustment to media type based checking. See https://helm.sh/docs/topics/registries/#oci-feature-deprecation-and-behavior-changes-with-v370 for context #### Which issue(s) this PR fixes fix https://github.com/open-component-model/ocm/issues/1469 relates to https://github.com/open-component-model/ocm/pull/1470 and needs to be backported the same (cherry picked from commit 729a19f72a9dd89b6ba9c65aab372e77330fd959) --- .../download/handlers/helm/download_test.go | 14 ++++++++++++++ .../download/handlers/helm/handler.go | 7 ++++++- .../helm/testdata/legacy-pre-hip-helm-chart.tgz | Bin 0 -> 25829 bytes 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 api/ocm/extensions/download/handlers/helm/testdata/legacy-pre-hip-helm-chart.tgz 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 0000000000000000000000000000000000000000..1b31398d84ec093fb1cd65e732c214ffbcc92244 GIT binary patch literal 25829 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