diff --git a/helm_helpers.go b/helm_helpers.go index 377477e2..cacd851e 100644 --- a/helm_helpers.go +++ b/helm_helpers.go @@ -24,6 +24,7 @@ type releaseState struct { Updated time.Time Status string Chart string + Name string Namespace string TillerNamespace string } @@ -198,6 +199,7 @@ func buildState() { Updated: time, Status: rel.Releases[i].Status, Chart: rel.Releases[i].Chart, + Name: rel.Releases[i].Name, Namespace: rel.Releases[i].Namespace, TillerNamespace: rel.Releases[i].TillerNamespace, } @@ -227,7 +229,6 @@ func helmReleaseExists(r *release, status string) (bool, releaseState) { // getReleaseRevision returns the revision number for a release func getReleaseRevision(rs releaseState) string { - return strconv.Itoa(rs.Revision) } @@ -592,18 +593,22 @@ func initHelm() (bool, string) { func cleanUntrackedReleases() { toDelete := make(map[string]map[*release]bool) log.Println("INFO: checking if any Helmsman managed releases are no longer tracked by your desired state ...") - for ns, releases := range getHelmsmanReleases() { - for r := range releases { - tracked := false - for _, app := range s.Apps { - if app.Name == r.Name && getDesiredTillerNamespace(app) == ns { - tracked = true - } - } + + // List all releases managed my Helmsman + for n, hr := range getHelmsmanReleases() { + for name, tracked := range hr { if !tracked { + rs := currentState[name+"-"+n] + ns := rs.TillerNamespace if _, ok := toDelete[ns]; !ok { toDelete[ns] = make(map[*release]bool) } + r := &release{ + Chart: rs.Chart, + Name: rs.Name, + Namespace: rs.Namespace, + TillerNamespace: rs.TillerNamespace, + } toDelete[ns][r] = true } } @@ -614,7 +619,7 @@ func cleanUntrackedReleases() { } else { for ns, releases := range toDelete { for r := range releases { - if r.isReleaseConsideredToRun() { + if !r.isReleaseConsideredToRun() { logDecision(generateDecisionMessage(r, "untracked release [ "+r.Name+" ] is ignored by target flag. Skipping.", false), -800, ignored) } else { logDecision(generateDecisionMessage(r, "untracked release found: release [ "+r.Name+" ]. It will be deleted", true), -800, delete) diff --git a/kube_helpers.go b/kube_helpers.go index 4d7d0c85..745754c9 100644 --- a/kube_helpers.go +++ b/kube_helpers.go @@ -437,9 +437,9 @@ func labelResource(r *release) { // getHelmsmanReleases returns a map of all releases that are labeled with "MANAGED-BY=HELMSMAN" // The releases are categorized by the namespaces in which their Tiller is running // The returned map format is: map[:map[:true]] -func getHelmsmanReleases() map[string]map[*release]bool { +func getHelmsmanReleases() map[string]map[string]bool { var lines []string - releases := make(map[string]map[*release]bool) + releases := make(map[string]map[string]bool) storageBackend := "configmap" if s.Settings.StorageBackend == "secret" { @@ -480,12 +480,14 @@ func getHelmsmanReleases() map[string]map[*release]bool { continue } else { fields := strings.Fields(lines[i]) + name := fields[0][0:strings.LastIndex(fields[0], ".v")] if _, ok := releases[ns]; !ok { - releases[ns] = make(map[*release]bool) + releases[ns] = make(map[string]bool) } + releases[ns][name] = false for _, r := range s.Apps { - if r.Name == fields[0][0:strings.LastIndex(fields[0], ".v")] { - releases[ns][r] = true + if r.Name == name { + releases[ns][r.Name] = true } } }