From 8fa52bbf253bd19a3304d8813701f6967dbf84e7 Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Fri, 13 Apr 2018 13:16:46 -0700 Subject: [PATCH] add namespace to deduplication tuple helm charts can deploy to multiple namespaces at once, so compare on (namespace, name, kind, version) instead of just (name, kind, version). If no namespace is parsed from the manifest, the helm release namespace is used instead. --- cmd/revision.go | 14 ++++++++++++-- cmd/rollback.go | 7 ++++++- cmd/upgrade.go | 6 +++--- manifest/parse.go | 10 +++++++--- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/cmd/revision.go b/cmd/revision.go index b0e35d7d..9ec1dddb 100644 --- a/cmd/revision.go +++ b/cmd/revision.go @@ -91,7 +91,12 @@ func (d *revision) differentiate() error { return prettyError(err) } - diff.DiffManifests(manifest.Parse(revisionResponse.Release.Manifest), manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, d.outputContext, os.Stdout) + diff.DiffManifests( + manifest.Parse(revisionResponse.Release.Manifest, revisionResponse.Release.Namespace), + manifest.Parse(releaseResponse.Release.Manifest, releaseResponse.Release.Namespace), + d.suppressedKinds, + d.outputContext, + os.Stdout) case 2: revision1, _ := strconv.Atoi(d.revisions[0]) @@ -110,7 +115,12 @@ func (d *revision) differentiate() error { return prettyError(err) } - diff.DiffManifests(manifest.Parse(revisionResponse1.Release.Manifest), manifest.Parse(revisionResponse2.Release.Manifest), d.suppressedKinds, d.outputContext, os.Stdout) + diff.DiffManifests( + manifest.Parse(revisionResponse1.Release.Manifest, revisionResponse1.Release.Namespace), + manifest.Parse(revisionResponse2.Release.Manifest, revisionResponse2.Release.Namespace), + d.suppressedKinds, + d.outputContext, + os.Stdout) default: return errors.New("Invalid Arguments") diff --git a/cmd/rollback.go b/cmd/rollback.go index 0eeb2cc3..1c7b1a2b 100644 --- a/cmd/rollback.go +++ b/cmd/rollback.go @@ -82,7 +82,12 @@ func (d *rollback) backcast() error { } // create a diff between the current manifest and the version of the manifest that a user is intended to rollback - diff.DiffManifests(manifest.Parse(releaseResponse.Release.Manifest), manifest.Parse(revisionResponse.Release.Manifest), d.suppressedKinds, d.outputContext, os.Stdout) + diff.DiffManifests( + manifest.Parse(releaseResponse.Release.Manifest, releaseResponse.Release.Namespace), + manifest.Parse(revisionResponse.Release.Manifest, revisionResponse.Release.Namespace), + d.suppressedKinds, + d.outputContext, + os.Stdout) return nil } diff --git a/cmd/upgrade.go b/cmd/upgrade.go index b018cdfc..50b9d156 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -121,7 +121,7 @@ func (d *diffCmd) run() error { } currentSpecs = make(map[string]*manifest.MappingResult) - newSpecs = manifest.Parse(installResponse.Release.Manifest) + newSpecs = manifest.Parse(installResponse.Release.Manifest, installResponse.Release.Namespace) } else { upgradeResponse, err := d.client.UpdateRelease( d.release, @@ -135,8 +135,8 @@ func (d *diffCmd) run() error { return prettyError(err) } - currentSpecs = manifest.Parse(releaseResponse.Release.Manifest) - newSpecs = manifest.Parse(upgradeResponse.Release.Manifest) + currentSpecs = manifest.Parse(releaseResponse.Release.Manifest, releaseResponse.Release.Namespace) + newSpecs = manifest.Parse(upgradeResponse.Release.Manifest, upgradeResponse.Release.Namespace) } diff.DiffManifests(currentSpecs, newSpecs, d.suppressedKinds, d.outputContext, os.Stdout) diff --git a/manifest/parse.go b/manifest/parse.go index 4f99bb58..d60f9f39 100644 --- a/manifest/parse.go +++ b/manifest/parse.go @@ -22,12 +22,13 @@ type metadata struct { ApiVersion string `yaml:"apiVersion"` Kind string Metadata struct { - Name string + Namespace string + Name string } } func (m metadata) String() string { - return fmt.Sprintf("%s, %s (%s)", m.Metadata.Name, m.Kind, m.ApiVersion) + return fmt.Sprintf("%s, %s, %s (%s)", m.Metadata.Namespace, m.Metadata.Name, m.Kind, m.ApiVersion) } func scanYamlSpecs(data []byte, atEOF bool) (advance int, token []byte, err error) { @@ -53,7 +54,7 @@ func splitSpec(token string) (string, string) { return "", "" } -func Parse(manifest string) map[string]*MappingResult { +func Parse(manifest string, defaultNamespace string) map[string]*MappingResult { scanner := bufio.NewScanner(strings.NewReader(manifest)) scanner.Split(scanYamlSpecs) //Allow for tokens (specs) up to 1M in size @@ -72,6 +73,9 @@ func Parse(manifest string) map[string]*MappingResult { if err := yaml.Unmarshal([]byte(content), &metadata); err != nil { log.Fatalf("YAML unmarshal error: %s\nCan't unmarshal %s", err, content) } + if metadata.Metadata.Namespace == "" { + metadata.Metadata.Namespace = defaultNamespace + } name := metadata.String() if _, ok := result[name]; ok { log.Printf("Error: Found duplicate key %#v in manifest", name)