Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: kubernetes-sigs/cluster-api-addon-provider-helm
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 22fbe8a3af59d4bad6d5ef075c1e4d35d8238c79
Choose a base ref
..
head repository: kubernetes-sigs/cluster-api-addon-provider-helm
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 227994bb9aef3dde4480d070a09013b193c109d3
Choose a head ref
Showing with 73 additions and 17 deletions.
  1. +3 −2 controllers/helmreleasedrift/manager.go
  2. +9 −0 internal/data/kustomization.yaml
  3. +44 −1 internal/helm_client.go
  4. +10 −8 test/e2e/helm_releasedrift.go
  5. +7 −6 test/e2e/helm_test.go
5 changes: 3 additions & 2 deletions controllers/helmreleasedrift/manager.go
Original file line number Diff line number Diff line change
@@ -39,7 +39,8 @@ import (
)

const (
InstanceLabelKey = "app.kubernetes.io/instance"
InstanceLabelKey = "app.kubernetes.io/instance"
ManagedByLabelValue = "Helm"
)

var (
@@ -77,7 +78,7 @@ func Add(ctx context.Context, restConfig *rest.Config, helmReleaseProxy *addonsv
HealthProbeBindAddress: "0",
Cache: cache.Options{
DefaultLabelSelector: labels.SelectorFromSet(map[string]string{
konfig.ManagedbyLabelKey: "Helm",
konfig.ManagedbyLabelKey: ManagedByLabelValue,
InstanceLabelKey: helmReleaseProxy.Spec.ReleaseName,
}),
},
9 changes: 9 additions & 0 deletions internal/data/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Labels to add to all resources.
labels:
- pairs:
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/instance: $RELEASE_NAME
includeSelectors: false

resources:
- rendered-manifests.yaml
45 changes: 44 additions & 1 deletion internal/helm_client.go
Original file line number Diff line number Diff line change
@@ -17,12 +17,15 @@ limitations under the License.
package internal

import (
"bytes"
"context"
_ "embed"
"fmt"
"io"
"net/url"
"os"
"path"
"strings"

"github.com/databus23/helm-diff/v3/diff"
"github.com/databus23/helm-diff/v3/manifest"
@@ -35,6 +38,7 @@ import (
helmCli "helm.sh/helm/v3/pkg/cli"
helmVals "helm.sh/helm/v3/pkg/cli/values"
helmGetter "helm.sh/helm/v3/pkg/getter"
"helm.sh/helm/v3/pkg/postrender"
"helm.sh/helm/v3/pkg/registry"
helmRelease "helm.sh/helm/v3/pkg/release"
helmDriver "helm.sh/helm/v3/pkg/storage/driver"
@@ -44,6 +48,8 @@ import (
"k8s.io/utils/ptr"
addonsv1alpha1 "sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/kustomize/api/krusty"
"sigs.k8s.io/kustomize/kyaml/filesys"
)

type Client interface {
@@ -52,7 +58,13 @@ type Client interface {
UninstallHelmRelease(ctx context.Context, restConfig *rest.Config, spec addonsv1alpha1.HelmReleaseProxySpec) (*helmRelease.UninstallReleaseResponse, error)
}

var _ Client = (*HelmClient)(nil)
var (
_ Client = (*HelmClient)(nil)
_ postrender.PostRenderer = (*releaseDriftPostRenderer)(nil)
)

//go:embed data/kustomization.yaml
var releaseDriftKustomization string

type HelmClient struct{}

@@ -63,6 +75,10 @@ type HelmInstallOverride struct {
IsUpgrade bool
}

type releaseDriftPostRenderer struct {
releaseName string
}

// GetActionConfig returns a new Helm action configuration.
func GetActionConfig(ctx context.Context, namespace string, config *rest.Config) (*helmAction.Configuration, error) {
log := ctrl.LoggerFrom(ctx)
@@ -216,6 +232,9 @@ func (c *HelmClient) InstallHelmRelease(ctx context.Context, restConfig *rest.Co
installClient.RepoURL = repoURL
installClient.Version = spec.Version
installClient.Namespace = spec.ReleaseNamespace
if spec.ReleaseDrift {
installClient.PostRenderer = releaseDriftPostRenderer{releaseName: spec.ReleaseName}
}

if spec.ReleaseName == "" {
installClient.GenerateName = true
@@ -348,6 +367,9 @@ func (c *HelmClient) UpgradeHelmReleaseIfChanged(ctx context.Context, restConfig
upgradeClient.RepoURL = repoURL
upgradeClient.Version = spec.Version
upgradeClient.Namespace = spec.ReleaseNamespace
if spec.ReleaseDrift {
upgradeClient.PostRenderer = releaseDriftPostRenderer{releaseName: spec.ReleaseName}
}

log.V(2).Info("Locating chart...")
cp, err := upgradeClient.ChartPathOptions.LocateChart(chartName, settings)
@@ -565,3 +587,24 @@ func (c *HelmClient) RollbackHelmRelease(ctx context.Context, restConfig *rest.C

return rollbackClient.Run(spec.ReleaseName)
}

func (r releaseDriftPostRenderer) Run(renderedManifests *bytes.Buffer) (modifiedManifests *bytes.Buffer, err error) {
fSys := filesys.MakeFsInMemory()
if err := fSys.WriteFile("kustomization.yaml", []byte(strings.Replace(releaseDriftKustomization, "$RELEASE_NAME", r.releaseName, 1))); err != nil {
return nil, err
}
if err := fSys.WriteFile("rendered-manifests.yaml", renderedManifests.Bytes()); err != nil {
return nil, err
}

kustomizer := krusty.MakeKustomizer(krusty.MakeDefaultOptions())
m, err := kustomizer.Run(fSys, ".")
if err != nil {
return nil, err
}
yml, err := m.AsYaml()
if err != nil {
return nil, err
}
return bytes.NewBuffer(yml), nil
}
18 changes: 10 additions & 8 deletions test/e2e/helm_releasedrift.go
Original file line number Diff line number Diff line change
@@ -37,12 +37,13 @@ import (

// HelmReleaseDriftInput specifies the input for Helm release drift Deployment validation and verifying that it was successful.
type HelmReleaseDriftInput struct {
BootstrapClusterProxy framework.ClusterProxy
Namespace *corev1.Namespace
ClusterName string
HelmChartProxy *addonsv1alpha1.HelmChartProxy
InitialDeploymentReplicas int32
UpdatedDeploymentReplicas int32
BootstrapClusterProxy framework.ClusterProxy
Namespace *corev1.Namespace
ClusterName string
HelmChartProxy *addonsv1alpha1.HelmChartProxy
UpdatedDeploymentReplicas int32
ExpectedDeploymentReplicas int32
ExpectedRevision int
}

func HelmReleaseDriftWithDeployment(ctx context.Context, inputGetter func() HelmReleaseDriftInput) {
@@ -77,8 +78,8 @@ func HelmReleaseDriftWithDeployment(ctx context.Context, inputGetter func() Helm
if err := mgmtClient.Get(ctx, deploymentName, deployment); err != nil {
return err
}
if *deployment.Spec.Replicas != input.InitialDeploymentReplicas && deployment.Status.ReadyReplicas != input.InitialDeploymentReplicas {
return fmt.Errorf("expected Deployment replicas to be %d, got %d", input.InitialDeploymentReplicas, deployment.Status.ReadyReplicas)
if *deployment.Spec.Replicas != input.ExpectedDeploymentReplicas && deployment.Status.ReadyReplicas != input.ExpectedDeploymentReplicas {
return fmt.Errorf("expected Deployment replicas to be %d, got %d", input.ExpectedDeploymentReplicas, deployment.Status.ReadyReplicas)
}

return nil
@@ -89,6 +90,7 @@ func HelmReleaseDriftWithDeployment(ctx context.Context, inputGetter func() Helm
Namespace: input.Namespace,
ClusterName: input.ClusterName,
HelmChartProxy: input.HelmChartProxy,
ExpectedRevision: input.ExpectedRevision,
}
EnsureHelmReleaseInstallOrUpgrade(ctx, specName, input.BootstrapClusterProxy, nil, &helmUpgradeInput, true)
}
13 changes: 7 additions & 6 deletions test/e2e/helm_test.go
Original file line number Diff line number Diff line change
@@ -270,12 +270,13 @@ var _ = Describe("Workload cluster creation", func() {
By("Updating Nginx deployment and waiting for the release drift", func() {
HelmReleaseDriftWithDeployment(ctx, func() HelmReleaseDriftInput {
return HelmReleaseDriftInput{
BootstrapClusterProxy: bootstrapClusterProxy,
Namespace: namespace,
ClusterName: clusterName,
HelmChartProxy: hcp,
InitialDeploymentReplicas: 1,
UpdatedDeploymentReplicas: 2,
BootstrapClusterProxy: bootstrapClusterProxy,
Namespace: namespace,
ClusterName: clusterName,
HelmChartProxy: hcp,
UpdatedDeploymentReplicas: 2,
ExpectedDeploymentReplicas: 1,
ExpectedRevision: 2,
}
})
})