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

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
Sam Broughton committed Dec 21, 2017
1 parent 42f1fe2 commit 899c0dc
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
@@ -3,7 +3,6 @@ package kubernetes
import (
"bytes"
"fmt"
"io"
"sync"

k8syaml "github.com/ghodss/yaml"
@@ -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
@@ -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)
}

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

import (
"io"
"testing"

"github.com/go-kit/kit/log"
@@ -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
}
}
}
39 changes: 30 additions & 9 deletions cluster/kubernetes/release.go
Original file line number Diff line number Diff line change
@@ -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{}

0 comments on commit 899c0dc

Please sign in to comment.