Fixing and improving release labelling in rollback

1. Fixed propagating labels to rollback release
2. Added '-l' option to manage labels during rollback

Signed-off-by: Marcin Chojnacki <marcin.chojnacki@nokia.com>
pull/12529/head
Marcin Chojnacki 2 years ago
parent 8fbbc863b4
commit 534b5d44bd

@ -85,6 +85,7 @@ func newRollbackCmd(cfg *action.Configuration, out io.Writer) *cobra.Command {
f.BoolVar(&client.WaitForJobs, "wait-for-jobs", false, "if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout")
f.BoolVar(&client.CleanupOnFail, "cleanup-on-fail", false, "allow deletion of new resources created in this rollback when rollback fails")
f.IntVar(&client.MaxHistory, "history-max", settings.MaxHistory, "limit the maximum number of revisions saved per release. Use 0 for no limit")
f.StringToStringVarP(&client.Labels, "labels", "l", nil, "Labels that would be added to release metadata. Should be divided by comma. By default labels are propagated from the rollback target release.")
return cmd
}

@ -17,6 +17,8 @@ limitations under the License.
package main
import (
"fmt"
"reflect"
"testing"
"helm.sh/helm/v3/pkg/chart"
@ -121,3 +123,45 @@ func TestRollbackFileCompletion(t *testing.T) {
checkFileCompletion(t, "rollback myrelease", false)
checkFileCompletion(t, "rollback myrelease 1", false)
}
func TestRollbackWithLabels(t *testing.T) {
labels1 := map[string]string{"operation": "install", "firstLabel": "firstValue"}
labels2 := map[string]string{"operation": "upgrade", "secondLabel": "secondValue"}
expectedLabels := map[string]string{"operation": "rollback", "firstLabel": "firstValue"}
releaseName := "funny-bunny-labels"
rels := []*release.Release{
{
Name: releaseName,
Info: &release.Info{Status: release.StatusSuperseded},
Chart: &chart.Chart{},
Version: 1,
Labels: labels1,
},
{
Name: releaseName,
Info: &release.Info{Status: release.StatusDeployed},
Chart: &chart.Chart{},
Version: 2,
Labels: labels2,
},
}
storage := storageFixture()
for _, rel := range rels {
if err := storage.Create(rel); err != nil {
t.Fatal(err)
}
}
_, _, err := executeActionCommandC(storage, fmt.Sprintf("rollback -l operation=rollback %s 1", releaseName))
if err != nil {
t.Errorf("unexpected error, got '%v'", err)
}
updatedRel, err := storage.Get(releaseName, 3)
if err != nil {
t.Errorf("unexpected error, got '%v'", err)
}
if !reflect.DeepEqual(updatedRel.Labels, expectedLabels) {
t.Errorf("Expected {%v}, got {%v}", expectedLabels, updatedRel.Labels)
}
}

@ -19,6 +19,7 @@ package action
import (
"bytes"
"fmt"
"helm.sh/helm/v3/pkg/storage/driver"
"strings"
"time"
@ -45,6 +46,7 @@ type Rollback struct {
Force bool // will (if true) force resource upgrade through uninstall/recreate if needed
CleanupOnFail bool
MaxHistory int // MaxHistory limits the maximum number of revisions saved per release
Labels map[string]string
}
// NewRollback creates a new Rollback object with the given configuration.
@ -135,6 +137,9 @@ func (r *Rollback) prepareRollback(name string) (*release.Release, *release.Rele
return nil, nil, err
}
if driver.ContainsSystemLabels(r.Labels) {
return nil, nil, fmt.Errorf("user suplied labels contains system reserved label name. System labels: %+v", driver.GetSystemLabels())
}
// Store a new release object with previous release's configuration
targetRelease := &release.Release{
Name: name,
@ -151,6 +156,7 @@ func (r *Rollback) prepareRollback(name string) (*release.Release, *release.Rele
Description: fmt.Sprintf("Rollback to %d", previousVersion),
},
Version: currentRelease.Version + 1,
Labels: mergeCustomLabels(previousRelease.Labels, r.Labels),
Manifest: previousRelease.Manifest,
Hooks: previousRelease.Hooks,
}

Loading…
Cancel
Save