Repository navigation
chore(deps): update dependency crossplane-contrib/provider-helm to v1.5.0 - #141
Merged
Merged
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v1.4.0→v1.5.0Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Release Notes
crossplane-contrib/provider-helm
v1.5.0Compare Source
Release v1.5.0
Summary
This release makes a
Release's deployed chart digest, chart URL and ownership adoption observable through Helm release labels, replaces the filename-keyed chart cache with a content-addressed one, validates chart specs at admission, turnstakeOwnershipinto a standing claim that detects ownership drift, adds acaBundlefield for charts served behind a private CA, deprecates thev1alpha1APIs behind a conversion webhook, shares the target cluster client across reconciles, and fixesssaForceConflictson releases installed before Helm v4,plainHTTP/insecureSkipTLSVerifyfor OCI pulls, andsetentries with an optional missing source.Highlights
takeOwnershipnow keeps aRelease's claim on its resources live instead of adopting them once and never looking again (#418)Releasethat points at another, and re-pushed tags are picked up (#409)chart.versionis reconciled with the version embedded in an OCI URL (#405)spec.forProvider.caBundleonReleasefor trusting a private CA when pulling from a chart repository or OCI registry (#390)v1alpha1Release,ProviderConfigandProviderConfigUsageare deprecated in favor ofv1beta1;Releasegets a conversion webhook (#400)provider_helm_client_cache_*metrics (#410); opt-out of the Secret informer cache and CRD schema stripping in the manager cache (#392)ssaForceConflictson releases installed before Helm v4 (#406),plainHTTPandinsecureSkipTLSVerifyfor OCI chart pulls (#408),setentries with anoptionalmissing source (#371)golang.org/x/netbumped tov0.60.0, addressing five HTTP/2 advisories innet/httpincluding the critical GO-2026-6612 (#420);go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpcbumped tov0.21.0(addresses CVE-2026-81871 / GHSA-w34q-cm8f-9c5x) (#401)Ownership drift detection
spec.forProvider.takeOwnershipis now a standing claim (both cluster-scoped and namespaced APIs). Previously it adopted pre-existing resources on the first deploy and never looked at them again, so a resource re-stamped by another actor stayed foreign until something else triggered an upgrade.While
takeOwnership: trueis set, every poll compares theapp.kubernetes.io/managed-bylabel and themeta.helm.sh/release-nameandmeta.helm.sh/release-namespaceannotations of every chart-rendered resource against the release, and reports the observation out of date when any differ so that the next deploy re-stamps them. Resources that already match are left untouched, andstatus.syncedand theAvailablecondition are not affected by this check: the release is still the chart, values and version that were asked for. Adopting pre-existing resources stays a one-time operation on the first deploy, recorded instatus.atProvider.ownershipTaken, which is now informational. The check fetches only object metadata, one lookup per rendered resource per poll. Thanks @stevendborrelli! (#418)Chart resolution, observation and caching
Three changes rework how a
Releaseselects, observes and caches its chart (#385, #405, #409, fixing #382, #383, #384 and #404). Together they close the cases where a URL change went undetected, a digest pin was silently ignored, a chart cached for oneReleasewas served to another, or an invalid chart spec failed with an opaque Helm error at deploy time.Deploy facts as Helm release labels (#385)
The facts a
Releaseneeds to observe about its own deploy are persisted as custom Helm release labels, which Helm stores on the release Secret atomically with the deploy and returns with the release. Status fields were not reliable for this: crossplane-runtime resets status set duringCreatewhen it persists critical annotations, and the observation zeroedownershipTakenon every poll, which broke the re-adoption guard one poll after each upgrade (#382). Labels written on install and upgrade:release.helm.crossplane.io/digest-hash:sha256-<first 56 hex>of the effective chart digest. Used for drift detection only; pull-time verification keeps the full digest.release.helm.crossplane.io/url-hash:sha256-<first 56 hex>ofsha256(url). A URL-only deployment now detects a changed URL and upgrades.release.helm.crossplane.io/ownership-taken: stickytrueoncetakeOwnershipwas exercised, so later deploys never silently re-adopt.Observerehydratesstatus.atProvider.digestandstatus.atProvider.ownershipTakenfrom these labels and falls back to the previously persisted status for releases deployed before label support.Chart spec validation and OCI URL versions (#405)
spec.forProvider.chartreject never-valid specs at admission:nameandrepositoryare required whenurlis not set, anddigestneeds an OCI pull source (anoci://URL, or anoci://repository whenurlis not set). Withouturl, an emptynameorrepositoryalso fails with a clear error before any pull instead of an opaque Helm error.chart.version, mirroring the digest handling: a conflicting pair is rejected, and a bare OCI URL (no tag, no digest) deployschart.versioninstead of silently pulling the highest semver tag. The field docs forrepository,name,versionanddigestspell out what applies whenurlis set.urlandrepositoryare set, registry credential resolution scopes to the host inurl, the actual pull source, instead ofrepository.Content-addressed chart cache (#409)
Charts are cached under
/tmp/content-cache, keyed by the sha256 digest the pull source advertises: the manifest digest from the OCI registry, or the tarball digest from the repository index. A chart from another source is stored under its own digest, so it cannot be served for a lookup that resolved elsewhere, whatever name and version it advertises. A pinned OCI digest is its own key, so a cached chart is served without contacting the registry, also when theReleasehas pull credentials. For a tag or version the provider asks the registry which manifest it points at, one request per deploy, so a re-pushed tag is picked up. A tag or version next to a pinned digest is validated against the registry before the cache lookup, so a spec whose version belongs to another digest fails whether or not the pinned chart is already cached. Classic repository tarballs are verified against the digest inindex.yamlbefore they enter the cache. A cache hit is logged at Info level aschart served from content cache. The old filename-keyed/tmp/chartscache is gone, and the cache directory is created once at startup.Behavior changes for existing releases
chart.version. Provider versions up to v1.4.x late-initializedchart.versionin URL mode too, so everyReleasecreated with a bare OCI URL already carries one. Such aReleasestays on that version instead of following the highest semver tag, and one that had since moved to a newer chart is redeployed at the recorded version. Bumpingchart.versionnow triggers an upgrade. Clearing it lets the next deploy pull the highest semver tag again, but does not trigger a deploy by itself. (#405)chart.versionis a reconcile error. Provider versions up to v1.4.x ignoredchart.versionfor the pull in URL mode but still compared it with the deployed chart, so such a pair ran a Helm upgrade on every poll with no error (#130). It now reportsReconcileErrorwithconflicting version input: URL contains :latest but spec.forProvider.chart.version is 1.2.3before any deploy, and the deployed release keeps running untilchart.versionis removed or set to the tag. Tags equal to the chart version, whichhelm pushproduces, are unaffected; a v-prefixed tag next to a version that v1.4.x late-initialized is not, see the warning above. (#405)Releasefrom repository mode to a tagged OCI URL needschart.versionset to the tag or removed in the same change. A version left from repository mode, including a late-initialized one, conflicts with the tag and is rejected. In v1.4.x, setting onlyurlwent undetected. (#385, #405)chart.nameandchart.version. The deployed version stays visible instatus.atProvider.version. (#385)Releasethat carries one keeps running and fails with that error at its next deploy. (#405)chart.versionis compared with the deployed chart version as semver when both parse, in URL and repository mode alike, sov1.2.3matches a chart whoseChart.yamlsays1.2.3. AReleasewhose version differed from the chart's declared version only by a leadingvwas redeployed on every poll; it is now up to date. A semver range or any other value that does not parse is still compared verbatim (#108). (#405)Releasewith pull credentials logs in for the check, so its deploy fails when the registry is unreachable; without credentials Helm skips the check when it cannot look the tag up. (#409)index.yamlfails to deploy withchart downloaded from <url> does not match the digest advertised by its repository index. (#409)/tmp/content-cache, and/tmp/chartsis no longer used. The provider exits at startup if it cannot create/tmp/content-cache. (#409)Releasedeployed before release labels whosechart.digestdiffers fromstatus.atProvider.digestgets one Helm upgrade after the provider upgrade, which pulls the pinned chart and writes thedigest-hashlabel. This includes a pin that was removed on an earlier provider version, where the removal was ignored and status still records the digest. (#409, fixes #404)Deprecated
v1alpha1APIsThe
v1alpha1versions ofRelease,ProviderConfigandProviderConfigUsageare deprecated in favor ofv1beta1and carry thedeprecatedmarker, so the API server warns on requests to them. TheReleaseCRD is now served with a conversion webhook on the provider's webhook server, withv1beta1as the storage version: shared fields are converted through an unstructured round-trip, and fields that exist only inv1beta1are preserved in ahelm.crossplane.io/release-conversion-dataannotation when read throughv1alpha1and restored on the way back, so a write through the deprecated API does not zero fields it cannot represent.ProviderConfigandProviderConfigUsageneed no webhook because their schemas are compatible. Migrate manifests tov1beta1;v1alpha1is scheduled for removal in a future major release (#213). The repository also gains anexample-linttarget and CI job that validate the example manifests against the shipped CRDs withkubectl-validate. (#400)New Features
spec.forProvider.caBundletoRelease(both cluster-scoped and namespaced APIs): aValueFromSourcereference to a PEM-encoded CA bundle in a ConfigMap or Secret key (default keyca.crt), used to verify the chart repository's or OCI registry's TLS certificate without disabling verification. The bundle is concatenated with the system trust store, so a chart from a public CA keeps working next to a private one. See the commented usage in the OCI example. Thanks @barunavo! (#390, fixes #391)Releasecontrollers, instead of once per reconcile. The cache is sized at startup from the existing ProviderConfigs and exposesprovider_helm_client_cache_size,provider_helm_client_cache_entriesandprovider_helm_client_cache_events_totalmetrics. For aReleasewithspec.connectionDetails, aggregated discovery dropped from two requests per reconcile to none. Two behavior changes come with it: client-side rate limiting is off for target cluster clients, the Helm client included (QPS = -1), and the provider exits at startup when it cannot list its ProviderConfigs or when reading their credentials takes longer than 300 seconds. (#410)--enable-secret-cacheflag (defaulttrue, envENABLE_SECRET_CACHE). Set it tofalseto read Secrets with direct API calls instead of the informer cache, trading API server load for memory. The manager cache also strips the schema from cachedCustomResourceDefinitionobjects. (#392)Bug Fixes
ssaForceConflicts: truefailing withinvalid client update option(s): forceConflicts enabled when serverSideApply disabledon releases installed before v1.4.0 (Helm v3). Helm v4'sautoapply mode falls back to client-side apply when the previous revision recorded no apply method, so the flag could never be used on such releases.ssaForceConflictsnow also enables server-side apply on the upgrade and rollback actions, and Helm migrates the release's managed fields from client-side to server-side apply during that upgrade. Behavior is unchanged when the flag is not set. Thanks @jerryguowei! (#406, fixes #403)spec.forProvider.plainHTTPandspec.forProvider.insecureSkipTLSVerifybeing ignored for OCI chart pulls and registry login. Helm v4 uses the preset registry client as-is and dropped the HTTP fallback Helm v3 had, so pulls failed withserver gave HTTP response to HTTPS clientorx509: certificate signed by unknown authority. Both settings now apply to the registry client itself and combine withcaBundle. Thanks @bcanvural! (#408, fixes #407)setentry whosevalueFrompoints at anoptional: trueSecret or ConfigMap failing the whole values composition withmissing value for --setwhen the source or its key is missing. Such entries are now skipped; non-optional references still fail. (#371, fixes #265)Releasedeployed before release labels being ignored:Observecopied the spec digest into an empty status digest, so the pin was marked satisfied without pulling the chart, and the removal was never noticed.Observeno longer copies the spec digest into status. (#409, fixes #404)os.Statthenos.Mkdiron every reconcile, which made every reconcile but the first fail withmkdir /tmp/content-cache: file existswhen many Releases reconciled at once on a fresh pod. The directory is created once at startup. (#409)Releasereconciler not protecting itsProviderConfigfrom deletion. crossplane-runtime's default ProviderConfigUsage cleaner (crossplane-runtime#1113) looks for a singleProviderConfigUsagekind per scope and silently fell back to a no-op because the cluster scheme registers bothv1alpha1andv1beta1. The connector's usage tracker is now passed explicitly, so aProviderConfigstays protected while a cluster-scopedReleasethat uses it is terminating. (#399)Security & Dependency Updates
golang.org/x/netfromv0.58.0tov0.60.0, addressing five HTTP/2 advisories innet/http: CVE-2026-78663 / GO-2026-6612 (double flow control refund on server streams, critical), CVE-2026-78659 / GO-2026-6603 (server memory exhaustion through Trailer headers), CVE-2026-78660 / GO-2026-6610 (transport accepts malformed framing-related headers), CVE-2026-78669 / GO-2026-6611 (excessive CPU from repeated initial window changes) and CVE-2026-97032 / GO-2026-6617 (server crash from an HPACK encoder race).golang.org/x/crypto,x/mod,x/termandx/textmoved with it (#420)go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpctov0.21.0, addressing CVE-2026-81871 / GHSA-w34q-cm8f-9c5x (#401)crossplane-runtimefromv2.3.3to av2.5.0pre-release commit (9d02af3, 2026-09-22) for the ProviderConfig deletion protection and cache performance work (#392, #399)github.com/crossplane/crossplane/apis/v2fromv2.3.4tov2.4.2(#392, #413)provider-kubernetesfromv1.3.0tov1.4.1, which brings Kubernetes libraries fromv0.36.3tov0.37.1,controller-runtimefromv0.24.1tov0.25.2,go-containerregistrytov0.22.1andgrpctov1.84.0(#410), andkubeloginfromv0.1.4tov0.2.20, which fixes the Azure (AKS) authentication regression shipped in provider-kubernetes v1.4.0 (#419)sigs.k8s.io/kustomizefromv0.21.1tov0.21.2(#412)1.26.5to1.27.2(#380, #386, #410, #417)gcr.io/distroless/staticbase image digest (#393, #411)2.4.2and Crossplane CLIv2.5.0in e2e, kindv0.33.0, golangci-lintv2.14.0, docker/buildxv0.38.0(#356, #378, #389, #395, #396, #414, #415)Full Changelog: crossplane-contrib/provider-helm@v1.4.0...v1.5.0
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.