From 3bc99d57e664c287a41b91719a6100b74f2a8bb7 Mon Sep 17 00:00:00 2001 From: Sam Broughton Date: Sun, 17 Dec 2017 14:33:30 +0200 Subject: [PATCH] Store staged objects in a slice rather than a map This brings back the previous ordering without doing a sort. Since we no longer apply objects one at a time, we don't need an id. --- cluster/kubernetes/kubernetes.go | 8 ++-- cluster/kubernetes/kubernetes_test.go | 14 +++---- cluster/kubernetes/release.go | 57 +++++++++++++++------------ 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/cluster/kubernetes/kubernetes.go b/cluster/kubernetes/kubernetes.go index 60c655d3dc..69ae9738f8 100644 --- a/cluster/kubernetes/kubernetes.go +++ b/cluster/kubernetes/kubernetes.go @@ -83,8 +83,8 @@ func isAddon(obj namespacedLabeled) bool { type Applier interface { delete(log.Logger, []byte) error apply(log.Logger, []byte) error - stageDelete(string, *apiObject) - stageApply(string, *apiObject) + stageDelete(*apiObject) + stageApply(*apiObject) execute(log.Logger, cluster.SyncError) error } @@ -199,7 +199,7 @@ func (c *Cluster) Sync(spec cluster.SyncDef) error { if len(action.Delete) > 0 { obj, err := definitionObj(action.Delete) if err == nil { - c.applier.stageDelete(action.ResourceID, obj) + c.applier.stageDelete(obj) } else { errs[action.ResourceID] = err continue @@ -208,7 +208,7 @@ func (c *Cluster) Sync(spec cluster.SyncDef) error { if len(action.Apply) > 0 { obj, err := definitionObj(action.Apply) if err == nil { - c.applier.stageApply(action.ResourceID, obj) + c.applier.stageApply(obj) } else { errs[action.ResourceID] = err continue diff --git a/cluster/kubernetes/kubernetes_test.go b/cluster/kubernetes/kubernetes_test.go index da83ae821d..d369ff23fd 100644 --- a/cluster/kubernetes/kubernetes_test.go +++ b/cluster/kubernetes/kubernetes_test.go @@ -182,7 +182,7 @@ type mockApplier struct { createErr error deleteErr error - *changeSet + changeSet } func (m *mockApplier) apply(_ log.Logger, _ []byte) error { @@ -196,14 +196,14 @@ func (m *mockApplier) delete(_ log.Logger, _ []byte) error { } func (m *mockApplier) execute(_ log.Logger, errs cluster.SyncError) error { - for id, _ := range m.deleteObjs { + if len(m.deleteObjs) > 0 { if err := m.delete(nil, nil); err != nil { - errs[id] = err + return err } } - for id, _ := range m.applyObjs { + if len(m.applyObjs) > 0 { if err := m.apply(nil, nil); err != nil { - errs[id] = err + return err } } if len(errs) != 0 { @@ -223,9 +223,7 @@ metadata: func setup(t *testing.T) (*Cluster, *mockApplier) { clientset := &mockClientset{} - applier := &mockApplier{ - changeSet: newChangeSet(), - } + applier := &mockApplier{} kube, err := NewCluster(clientset, applier, nil, log.NewNopLogger()) if err != nil { t.Fatal(err) diff --git a/cluster/kubernetes/release.go b/cluster/kubernetes/release.go index 71520b72e2..82ab3577f3 100644 --- a/cluster/kubernetes/release.go +++ b/cluster/kubernetes/release.go @@ -17,14 +17,13 @@ type Kubectl struct { exe string config *rest.Config - *changeSet + changeSet } func NewKubectl(exe string, config *rest.Config) *Kubectl { return &Kubectl{ - exe: exe, - config: config, - changeSet: newChangeSet(), + exe: exe, + config: config, } } @@ -55,19 +54,28 @@ func (c *Kubectl) connectArgs() []string { } func (c *Kubectl) execute(logger log.Logger, errs cluster.SyncError) error { - for id, obj := range c.deleteObjs { - logger := log.With(logger, "resource", id) - if err := c.delete(logger, obj.bytes); err != nil { - errs[id] = err - } + defer c.changeSet.clear() + + var deleteBuf bytes.Buffer + for _, obj := range c.deleteObjs { + fmt.Fprintln(&deleteBuf, "---") + fmt.Fprintln(&deleteBuf, string(obj.bytes)) } - for id, obj := range c.applyObjs { - logger := log.With(logger, "resource", id) - if err := c.apply(logger, obj.bytes); err != nil { - errs[id] = err - } + + if err := c.delete(logger, deleteBuf.Bytes()); err != nil { + errs["deleting"] = err } - c.changeSet = newChangeSet() + + var applyBuf bytes.Buffer + for _, obj := range c.applyObjs { + fmt.Fprintln(&applyBuf, "---") + fmt.Fprintln(&applyBuf, string(obj.bytes)) + } + + if err := c.apply(logger, applyBuf.Bytes()); err != nil { + errs["applying"] = err + } + if len(errs) != 0 { return errs } @@ -105,19 +113,18 @@ func (c *Kubectl) kubectlCommand(args ...string) *exec.Cmd { } type changeSet struct { - deleteObjs, applyObjs map[string]*apiObject + deleteObjs, applyObjs []*apiObject } -func newChangeSet() *changeSet { - return &changeSet{ - deleteObjs: make(map[string]*apiObject), - applyObjs: make(map[string]*apiObject), - } +func (c *changeSet) stageDelete(obj *apiObject) { + c.deleteObjs = append(c.deleteObjs, obj) } -func (c *changeSet) stageDelete(id string, obj *apiObject) { - c.deleteObjs[id] = obj + +func (c *changeSet) stageApply(obj *apiObject) { + c.applyObjs = append(c.applyObjs, obj) } -func (c *changeSet) stageApply(id string, obj *apiObject) { - c.applyObjs[id] = obj +func (c *changeSet) clear() { + c.deleteObjs = nil + c.applyObjs = nil }