mirror of
https://github.com/helm/helm.git
synced 2026-08-05 07:30:46 +00:00
fix(storage): preserve last deployed revision (#7806)
Signed-off-by: Eric Bailey <eric@ericb.me>
This commit is contained in:
@@ -169,21 +169,37 @@ func (s *Storage) removeLeastRecent(name string, max int) error {
|
||||
if len(h) <= max {
|
||||
return nil
|
||||
}
|
||||
overage := len(h) - max
|
||||
|
||||
// We want oldest to newest
|
||||
relutil.SortByRevision(h)
|
||||
|
||||
lastDeployed, err := s.Deployed(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var toDelete []*rspb.Release
|
||||
for _, rel := range h {
|
||||
// once we have enough releases to delete to reach the max, stop
|
||||
if len(h)-len(toDelete) == max {
|
||||
break
|
||||
}
|
||||
if lastDeployed != nil {
|
||||
if rel.Version != lastDeployed.Version {
|
||||
toDelete = append(toDelete, rel)
|
||||
}
|
||||
} else {
|
||||
toDelete = append(toDelete, rel)
|
||||
}
|
||||
}
|
||||
|
||||
// Delete as many as possible. In the case of API throughput limitations,
|
||||
// multiple invocations of this function will eventually delete them all.
|
||||
toDelete := h[0:overage]
|
||||
errs := []error{}
|
||||
for _, rel := range toDelete {
|
||||
key := makeKey(name, rel.Version)
|
||||
_, innerErr := s.Delete(name, rel.Version)
|
||||
if innerErr != nil {
|
||||
s.Log("error pruning %s from release history: %s", key, innerErr)
|
||||
errs = append(errs, innerErr)
|
||||
err = s.deleteReleaseVersion(name, rel.Version)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,6 +214,16 @@ func (s *Storage) removeLeastRecent(name string, max int) error {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Storage) deleteReleaseVersion(name string, version int) error {
|
||||
key := makeKey(name, version)
|
||||
_, err := s.Delete(name, version)
|
||||
if err != nil {
|
||||
s.Log("error pruning %s from release history: %s", key, err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Last fetches the last revision of the named release.
|
||||
func (s *Storage) Last(name string) (*rspb.Release, error) {
|
||||
s.Log("getting last revision of %q", name)
|
||||
|
||||
@@ -333,6 +333,57 @@ func TestStorageRemoveLeastRecent(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestStorageDontDeleteDeployed(t *testing.T) {
|
||||
storage := Init(driver.NewMemory())
|
||||
storage.Log = t.Logf
|
||||
storage.MaxHistory = 3
|
||||
|
||||
const name = "angry-bird"
|
||||
|
||||
// setup storage with test releases
|
||||
setup := func() {
|
||||
// release records
|
||||
rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.StatusSuperseded}.ToRelease()
|
||||
rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.StatusDeployed}.ToRelease()
|
||||
rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.StatusFailed}.ToRelease()
|
||||
rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.StatusFailed}.ToRelease()
|
||||
|
||||
// create the release records in the storage
|
||||
assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)")
|
||||
assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)")
|
||||
assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)")
|
||||
assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)")
|
||||
}
|
||||
setup()
|
||||
|
||||
rls5 := ReleaseTestData{Name: name, Version: 5, Status: rspb.StatusFailed}.ToRelease()
|
||||
assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'angry-bird' (v5)")
|
||||
|
||||
// On inserting the 5th record, we expect a total of 3 releases, but we expect version 2
|
||||
// (the only deployed release), to still exist
|
||||
hist, err := storage.History(name)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if len(hist) != storage.MaxHistory {
|
||||
for _, item := range hist {
|
||||
t.Logf("%s %v", item.Name, item.Version)
|
||||
}
|
||||
t.Fatalf("expected %d items in history, got %d", storage.MaxHistory, len(hist))
|
||||
}
|
||||
|
||||
expectedVersions := map[int]bool{
|
||||
2: true,
|
||||
4: true,
|
||||
5: true,
|
||||
}
|
||||
|
||||
for _, item := range hist {
|
||||
if !expectedVersions[item.Version] {
|
||||
t.Errorf("Release version %d, found when not expected", item.Version)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStorageLast(t *testing.T) {
|
||||
storage := Init(driver.NewMemory())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user