Skip to content

Commit

Permalink
Honor Helm's MaxHistory when using drift correction
Browse files Browse the repository at this point in the history
  • Loading branch information
aruiz14 committed Jun 14, 2024
1 parent 2cf3c91 commit 4db0169
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 12 deletions.
5 changes: 5 additions & 0 deletions e2e/drift/drift_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,11 @@ var _ = Describe("Drift", func() {
_ = json.Unmarshal([]byte(out), &configMap)
return configMap.Data["foo"] == "bar"
}).Should(BeTrue())
Expect(func() string {
kw := k.Namespace(namespace)
n, _ := kw.Get("secrets", "--field-selector=type=helm.sh/release.v1", `-o=go-template='{{printf "%d\n" (len .items)}}'`)
return n
}).Should(Equal("2")) // Max Helm history
})
})

Expand Down
5 changes: 3 additions & 2 deletions internal/cmd/agent/controller/bundledeployment_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,10 @@ func (r *BundleDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req

// Run drift correction
if len(status.ModifiedStatus) > 0 && bd.Spec.CorrectDrift != nil && bd.Spec.CorrectDrift.Enabled {
err = r.Deployer.RemoveExternalChanges(ctx, bd)
if err != nil {
if release, err := r.Deployer.RemoveExternalChanges(ctx, bd); err != nil {
merr = append(merr, fmt.Errorf("failed reconciling drift: %w", err))
} else {
bd.Status.Release = release
}
}

Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/agent/deployer/deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (d *Deployer) Resources(name string, release string) (*helmdeployer.Resourc
return d.helm.Resources(name, release)
}

func (d *Deployer) RemoveExternalChanges(ctx context.Context, bd *fleet.BundleDeployment) error {
func (d *Deployer) RemoveExternalChanges(ctx context.Context, bd *fleet.BundleDeployment) (string, error) {
return d.helm.RemoveExternalChanges(ctx, bd)
}

Expand Down
6 changes: 5 additions & 1 deletion internal/helmdeployer/history.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,17 @@ func (h *Helm) getRelease(releaseName, namespace string, version int) (*release.
return nil, ErrNoRelease
}

func releaseToResourceID(release *release.Release) string {
return fmt.Sprintf("%s/%s:%d", release.Namespace, release.Name, release.Version)
}

func releaseToResources(release *release.Release) (*Resources, error) {
var (
err error
)
resources := &Resources{
DefaultNamespace: release.Namespace,
ID: fmt.Sprintf("%s/%s:%d", release.Namespace, release.Name, release.Version),
ID: releaseToResourceID(release),
}

resources.Objects, err = yaml.ToObjects(bytes.NewBufferString(release.Manifest))
Expand Down
21 changes: 13 additions & 8 deletions internal/helmdeployer/rollback.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ import (

// RemoveExternalChanges does a helm rollback to remove changes made outside of fleet.
// It removes the helm history entry if the rollback fails.
func (h *Helm) RemoveExternalChanges(ctx context.Context, bd *fleet.BundleDeployment) error {
func (h *Helm) RemoveExternalChanges(ctx context.Context, bd *fleet.BundleDeployment) (string, error) {
log.FromContext(ctx).WithName("RemoveExternalChanges").Info("Drift correction: rollback")

_, defaultNamespace, releaseName := h.getOpts(bd.Name, bd.Spec.Options)
cfg, err := h.getCfg(ctx, defaultNamespace, bd.Spec.Options.ServiceAccount)
if err != nil {
return err
return "", err
}
currentRelease, err := cfg.Releases.Last(releaseName)
if err != nil {
return err
return "", err
}

r := action.NewRollback(&cfg)
Expand All @@ -37,12 +37,17 @@ func (h *Helm) RemoveExternalChanges(ctx context.Context, bd *fleet.BundleDeploy
if bd.Spec.CorrectDrift.Force {
r.Force = true
}
err = r.Run(releaseName)
if err != nil && !bd.Spec.CorrectDrift.KeepFailHistory {
return removeFailedRollback(cfg, currentRelease, err)
if err := r.Run(releaseName); err != nil {
if bd.Spec.CorrectDrift.KeepFailHistory {
return "", err
}
return "", removeFailedRollback(cfg, currentRelease, err)
}

return err
release, err := cfg.Releases.Last(releaseName)
if err != nil {
return "", err
}
return releaseToResourceID(release), nil
}

func removeFailedRollback(cfg action.Configuration, currentRelease *release.Release, err error) error {
Expand Down

0 comments on commit 4db0169

Please sign in to comment.