Skip to content
This repository has been archived by the owner on Nov 1, 2022. It is now read-only.

Commit

Permalink
Store staged objects in a slice rather than a map
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Sam Broughton committed Dec 17, 2017
1 parent c5a45d1 commit 3bc99d5
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 37 deletions.
8 changes: 4 additions & 4 deletions cluster/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
14 changes: 6 additions & 8 deletions cluster/kubernetes/kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ type mockApplier struct {
createErr error
deleteErr error

*changeSet
changeSet
}

func (m *mockApplier) apply(_ log.Logger, _ []byte) error {
Expand All @@ -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 {
Expand All @@ -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)
Expand Down
57 changes: 32 additions & 25 deletions cluster/kubernetes/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}

Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}

0 comments on commit 3bc99d5

Please sign in to comment.