Skip to content

Commit 040686d

Browse files
committed
Add logic to generate labels for release drift with kustomize API
1 parent a55d41f commit 040686d

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

controllers/helmreleasedrift/manager.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ import (
3939
)
4040

4141
const (
42-
InstanceLabelKey = "app.kubernetes.io/instance"
42+
InstanceLabelKey = "app.kubernetes.io/instance"
43+
ManagedByLabelValue = "Helm"
4344
)
4445

4546
var (
@@ -77,7 +78,7 @@ func Add(ctx context.Context, restConfig *rest.Config, helmReleaseProxy *addonsv
7778
HealthProbeBindAddress: "0",
7879
Cache: cache.Options{
7980
DefaultLabelSelector: labels.SelectorFromSet(map[string]string{
80-
konfig.ManagedbyLabelKey: "Helm",
81+
konfig.ManagedbyLabelKey: ManagedByLabelValue,
8182
InstanceLabelKey: helmReleaseProxy.Spec.ReleaseName,
8283
}),
8384
},

internal/data/kustomization.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Labels to add to all resources.
2+
labels:
3+
- pairs:
4+
app.kubernetes.io/managed-by: Helm
5+
app.kubernetes.io/instance: $RELEASE_NAME
6+
includeSelectors: false
7+
8+
resources:
9+
- rendered-manifests.yaml

internal/helm_client.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ limitations under the License.
1717
package internal
1818

1919
import (
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

4955
type 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

5769
type 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.
6783
func 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+
}

test/e2e/helm_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ var _ = Describe("Workload cluster creation", func() {
220220
})
221221
})
222222

223-
FIt("Install and manage Helm chart with ReleaseDrift option enabled", func() {
223+
It("Install and manage Helm chart with ReleaseDrift option enabled", func() {
224224
clusterName = fmt.Sprintf("%s-%s", specName, util.RandomString(6))
225225
clusterctl.ApplyClusterTemplateAndWait(ctx, createApplyClusterTemplateInput(
226226
specName,

0 commit comments

Comments
 (0)