@@ -17,12 +17,15 @@ limitations under the License.
17
17
package internal
18
18
19
19
import (
20
+ "bytes"
20
21
"context"
22
+ _ "embed"
21
23
"fmt"
22
24
"io"
23
25
"net/url"
24
26
"os"
25
27
"path"
28
+ "strings"
26
29
27
30
"github.com/databus23/helm-diff/v3/diff"
28
31
"github.com/databus23/helm-diff/v3/manifest"
@@ -35,6 +38,7 @@ import (
35
38
helmCli "helm.sh/helm/v3/pkg/cli"
36
39
helmVals "helm.sh/helm/v3/pkg/cli/values"
37
40
helmGetter "helm.sh/helm/v3/pkg/getter"
41
+ "helm.sh/helm/v3/pkg/postrender"
38
42
"helm.sh/helm/v3/pkg/registry"
39
43
helmRelease "helm.sh/helm/v3/pkg/release"
40
44
helmDriver "helm.sh/helm/v3/pkg/storage/driver"
@@ -44,6 +48,8 @@ import (
44
48
"k8s.io/utils/ptr"
45
49
addonsv1alpha1 "sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1"
46
50
ctrl "sigs.k8s.io/controller-runtime"
51
+ "sigs.k8s.io/kustomize/api/krusty"
52
+ "sigs.k8s.io/kustomize/kyaml/filesys"
47
53
)
48
54
49
55
type Client interface {
@@ -52,7 +58,13 @@ type Client interface {
52
58
UninstallHelmRelease (ctx context.Context , restConfig * rest.Config , spec addonsv1alpha1.HelmReleaseProxySpec ) (* helmRelease.UninstallReleaseResponse , error )
53
59
}
54
60
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
56
68
57
69
type HelmClient struct {}
58
70
@@ -63,6 +75,10 @@ type HelmInstallOverride struct {
63
75
IsUpgrade bool
64
76
}
65
77
78
+ type releaseDriftPostRenderer struct {
79
+ releaseName string
80
+ }
81
+
66
82
// GetActionConfig returns a new Helm action configuration.
67
83
func GetActionConfig (ctx context.Context , namespace string , config * rest.Config ) (* helmAction.Configuration , error ) {
68
84
log := ctrl .LoggerFrom (ctx )
@@ -216,6 +232,9 @@ func (c *HelmClient) InstallHelmRelease(ctx context.Context, restConfig *rest.Co
216
232
installClient .RepoURL = repoURL
217
233
installClient .Version = spec .Version
218
234
installClient .Namespace = spec .ReleaseNamespace
235
+ if spec .ReleaseDrift {
236
+ installClient .PostRenderer = releaseDriftPostRenderer {releaseName : spec .ReleaseName }
237
+ }
219
238
220
239
if spec .ReleaseName == "" {
221
240
installClient .GenerateName = true
@@ -348,6 +367,9 @@ func (c *HelmClient) UpgradeHelmReleaseIfChanged(ctx context.Context, restConfig
348
367
upgradeClient .RepoURL = repoURL
349
368
upgradeClient .Version = spec .Version
350
369
upgradeClient .Namespace = spec .ReleaseNamespace
370
+ if spec .ReleaseDrift {
371
+ upgradeClient .PostRenderer = releaseDriftPostRenderer {releaseName : spec .ReleaseName }
372
+ }
351
373
352
374
log .V (2 ).Info ("Locating chart..." )
353
375
cp , err := upgradeClient .ChartPathOptions .LocateChart (chartName , settings )
@@ -565,3 +587,24 @@ func (c *HelmClient) RollbackHelmRelease(ctx context.Context, restConfig *rest.C
565
587
566
588
return rollbackClient .Run (spec .ReleaseName )
567
589
}
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