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

Commit

Permalink
Apply default namespace objects separately to everything else
Browse files Browse the repository at this point in the history
In some not-so-well-defined cases, applying an object to the default namespace
can fail when its yaml doesn't explicitly specify the namespace. The simplest
way to overcome this is to separate them out and pass the namespace flag to
kubectl.
  • Loading branch information
Sam Broughton committed Dec 21, 2017
1 parent c2cce53 commit ab67246
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 33 deletions.
12 changes: 8 additions & 4 deletions cluster/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package kubernetes
import (
"bytes"
"fmt"
"io"
"sync"

k8syaml "github.com/ghodss/yaml"
Expand Down Expand Up @@ -46,10 +45,16 @@ type apiObject struct {
bytes []byte
Kind string `yaml:"kind"`
Metadata struct {
Name string `yaml:"name"`
Name string `yaml:"name"`
Namespace string `yaml:"namespace"`
} `yaml:"metadata"`
}

func (o *apiObject) hasDefaultNamespace() bool {
ns := o.Metadata.Namespace
return ns == "default" || ns == ""
}

// --- add-ons

// Kubernetes has a mechanism of "Add-ons", whereby manifest files
Expand Down Expand Up @@ -82,8 +87,7 @@ func isAddon(obj namespacedLabeled) bool {
// --- /add ons

type Applier interface {
doCommand(log.Logger, string, io.Reader) error
stage(string, string, *apiObject)
stage(id, cmd string, obj *apiObject)
execute(log.Logger, cluster.SyncError)
}

Expand Down
23 changes: 3 additions & 20 deletions cluster/kubernetes/kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package kubernetes
// adequate. Starting with Sync.

import (
"io"
"testing"

"github.com/go-kit/kit/log"
Expand All @@ -14,30 +13,14 @@ import (

type mockApplier struct {
commandRun bool
applyErr error
deleteErr error

changeSet
}

func (m *mockApplier) doCommand(_ log.Logger, command string, _ io.Reader) error {
m.commandRun = true
switch command {
case "apply":
return m.applyErr
case "delete":
return m.deleteErr
default:
return nil
}
}

func (m *mockApplier) execute(_ log.Logger, errs cluster.SyncError) {
func (m *mockApplier) execute(_ log.Logger, _ cluster.SyncError) {
for _, cmd := range cmds {
if len(m.objs[cmd]) > 0 {
if err := m.doCommand(nil, cmd, nil); err != nil {
errs[cmd] = err
}
if len(m.objs[cmd]) != 0 {
m.commandRun = true
}
}
}
Expand Down
39 changes: 30 additions & 9 deletions cluster/kubernetes/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,26 +61,47 @@ func (c *Kubectl) connectArgs() []string {
func (c *Kubectl) execute(logger log.Logger, errs cluster.SyncError) {
defer c.changeSet.clear()

type executeSet struct {
rw io.ReadWriter
cmd []string
changeSet
}

for _, cmd := range cmds {
buf := &bytes.Buffer{}
defaultSet := executeSet{rw: &bytes.Buffer{}, cmd: []string{cmd, "--namespace", "default"}}
otherSet := executeSet{rw: &bytes.Buffer{}, cmd: []string{cmd}}

for _, obj := range c.objs[cmd] {
fmt.Fprintln(buf, "---")
fmt.Fprintln(buf, string(obj.bytes))
set := defaultSet
if !obj.hasDefaultNamespace() {
set = otherSet
}
set.stage(cmd, obj.id, obj.apiObject)
fmt.Fprintln(set.rw, "---")
fmt.Fprintln(set.rw, string(obj.bytes))
}

if err := c.doCommand(logger, cmd, buf); err != nil {
for _, obj := range c.objs[cmd] {
if err := c.doCommand(logger, defaultSet.rw, defaultSet.cmd...); err != nil {
for _, obj := range defaultSet.objs[cmd] {
r := bytes.NewReader(obj.bytes)
if err := c.doCommand(logger, r, defaultSet.cmd...); err != nil {
errs[obj.id] = err
}
}
}
if err := c.doCommand(logger, otherSet.rw, otherSet.cmd...); err != nil {
for _, obj := range otherSet.objs[cmd] {
r := bytes.NewReader(obj.bytes)
if err := c.doCommand(logger, cmd, r); err != nil {
errs[obj.Metadata.Name] = err
if err := c.doCommand(logger, r, otherSet.cmd...); err != nil {
errs[obj.id] = err
}
}
}
}
}

func (c *Kubectl) doCommand(logger log.Logger, command string, r io.Reader) error {
args := []string{command, "-f", "-"}
func (c *Kubectl) doCommand(logger log.Logger, r io.Reader, args ...string) error {
args = append(args, "-f", "-")
cmd := c.kubectlCommand(args...)
cmd.Stdin = r
stderr := &bytes.Buffer{}
Expand Down

0 comments on commit ab67246

Please sign in to comment.