@@ -17,12 +17,15 @@ limitations under the License.
1717package internal
1818
1919import (
20+ "bytes"
2021 "context"
22+ _ "embed"
2123 "fmt"
2224 "io"
2325 "net/url"
2426 "os"
2527 "path"
28+ "strings"
2629
2730 "github.com/databus23/helm-diff/v3/diff"
2831 "github.com/databus23/helm-diff/v3/manifest"
@@ -35,6 +38,7 @@ import (
3538 helmCli "helm.sh/helm/v3/pkg/cli"
3639 helmVals "helm.sh/helm/v3/pkg/cli/values"
3740 helmGetter "helm.sh/helm/v3/pkg/getter"
41+ "helm.sh/helm/v3/pkg/postrender"
3842 "helm.sh/helm/v3/pkg/registry"
3943 helmRelease "helm.sh/helm/v3/pkg/release"
4044 helmDriver "helm.sh/helm/v3/pkg/storage/driver"
@@ -44,6 +48,8 @@ import (
4448 "k8s.io/utils/ptr"
4549 addonsv1alpha1 "sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1"
4650 ctrl "sigs.k8s.io/controller-runtime"
51+ "sigs.k8s.io/kustomize/api/krusty"
52+ "sigs.k8s.io/kustomize/kyaml/filesys"
4753)
4854
4955type Client interface {
@@ -52,7 +58,13 @@ type Client interface {
5258 UninstallHelmRelease (ctx context.Context , restConfig * rest.Config , spec addonsv1alpha1.HelmReleaseProxySpec ) (* helmRelease.UninstallReleaseResponse , error )
5359}
5460
55- var _ Client = (* HelmClient )(nil )
61+ var (
62+ _ Client = (* HelmClient )(nil )
63+ _ postrender.PostRenderer = (* releaseDriftPostRenderer )(nil )
64+ )
65+
66+ //go:embed data/kustomization.yaml
67+ var releaseDriftKustomization string
5668
5769type HelmClient struct {}
5870
@@ -63,6 +75,10 @@ type HelmInstallOverride struct {
6375 IsUpgrade bool
6476}
6577
78+ type releaseDriftPostRenderer struct {
79+ releaseName string
80+ }
81+
6682// GetActionConfig returns a new Helm action configuration.
6783func GetActionConfig (ctx context.Context , namespace string , config * rest.Config ) (* helmAction.Configuration , error ) {
6884 log := ctrl .LoggerFrom (ctx )
@@ -216,6 +232,9 @@ func (c *HelmClient) InstallHelmRelease(ctx context.Context, restConfig *rest.Co
216232 installClient .RepoURL = repoURL
217233 installClient .Version = spec .Version
218234 installClient .Namespace = spec .ReleaseNamespace
235+ if spec .ReleaseDrift {
236+ installClient .PostRenderer = releaseDriftPostRenderer {releaseName : spec .ReleaseName }
237+ }
219238
220239 if spec .ReleaseName == "" {
221240 installClient .GenerateName = true
@@ -348,6 +367,9 @@ func (c *HelmClient) UpgradeHelmReleaseIfChanged(ctx context.Context, restConfig
348367 upgradeClient .RepoURL = repoURL
349368 upgradeClient .Version = spec .Version
350369 upgradeClient .Namespace = spec .ReleaseNamespace
370+ if spec .ReleaseDrift {
371+ upgradeClient .PostRenderer = releaseDriftPostRenderer {releaseName : spec .ReleaseName }
372+ }
351373
352374 log .V (2 ).Info ("Locating chart..." )
353375 cp , err := upgradeClient .ChartPathOptions .LocateChart (chartName , settings )
@@ -565,3 +587,24 @@ func (c *HelmClient) RollbackHelmRelease(ctx context.Context, restConfig *rest.C
565587
566588 return rollbackClient .Run (spec .ReleaseName )
567589}
590+
591+ func (r releaseDriftPostRenderer ) Run (renderedManifests * bytes.Buffer ) (modifiedManifests * bytes.Buffer , err error ) {
592+ fSys := filesys .MakeFsInMemory ()
593+ if err := fSys .WriteFile ("kustomization.yaml" , []byte (strings .Replace (releaseDriftKustomization , "$RELEASE_NAME" , r .releaseName , 1 ))); err != nil {
594+ return nil , err
595+ }
596+ if err := fSys .WriteFile ("rendered-manifests.yaml" , renderedManifests .Bytes ()); err != nil {
597+ return nil , err
598+ }
599+
600+ kustomizer := krusty .MakeKustomizer (krusty .MakeDefaultOptions ())
601+ m , err := kustomizer .Run (fSys , "." )
602+ if err != nil {
603+ return nil , err
604+ }
605+ yml , err := m .AsYaml ()
606+ if err != nil {
607+ return nil , err
608+ }
609+ return bytes .NewBuffer (yml ), nil
610+ }
0 commit comments