From ab9c43adf0eef3e988b91e483eabd26efc644053 Mon Sep 17 00:00:00 2001 From: sh0rez Date: Fri, 9 Aug 2019 15:14:07 +0200 Subject: [PATCH] fix(kubernetes): sort during reconcile (#33) Allows stable order in show and diff --- pkg/kubernetes/kubernetes.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index e7c4bf5f4..0fed6d1c0 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -3,6 +3,7 @@ package kubernetes import ( "bytes" "fmt" + "sort" "strings" "github.com/Masterminds/semver" @@ -41,6 +42,18 @@ func New(s v1alpha1.Spec) *Kubernetes { // Manifest describes a single Kubernetes manifest type Manifest map[string]interface{} +func (m Manifest) Kind() string { + return m["kind"].(string) +} + +func (m Manifest) Name() string { + return m["metadata"].(map[string]interface{})["name"].(string) +} + +func (m Manifest) Namespace() string { + return m["metadata"].(map[string]interface{})["namespace"].(string) +} + // Reconcile receives the raw evaluated jsonnet as a marshaled json dict and // shall return it reconciled as a state object of the target system func (k *Kubernetes) Reconcile(raw map[string]interface{}, objectspecs ...string) (state []Manifest, err error) { @@ -67,6 +80,13 @@ func (k *Kubernetes) Reconcile(raw map[string]interface{}, objectspecs ...string }).([]Manifest) } + sort.SliceStable(out, func(i int, j int) bool { + if out[i].Kind() != out[j].Kind() { + return out[i].Kind() < out[j].Kind() + } + return out[i].Name() < out[j].Name() + }) + return out, nil } @@ -114,7 +134,7 @@ func (k *Kubernetes) Diff(state []Manifest) (string, error) { func objectspec(m Manifest) string { return fmt.Sprintf("%s/%s", - m["kind"], - m["metadata"].(map[string]interface{})["name"], + m.Kind(), + m.Name(), ) }