Always use the default kubeconfig file path [#20]

This commit is contained in:
Erin Call 2019-12-23 12:43:17 -08:00
parent 80b26434f5
commit 4755f502b5
No known key found for this signature in database
GPG key ID: 4071FF6C15B8DAD1
10 changed files with 42 additions and 57 deletions

View file

@ -19,8 +19,7 @@ type Config struct {
Prefix string `` // Prefix to use when looking up secret env vars Prefix string `` // Prefix to use when looking up secret env vars
// Global helm config // Global helm config
Debug bool `` // global helm flag (also applies to drone-helm itself) Debug bool `` // global helm flag (also applies to drone-helm itself)
KubeConfig string `split_words:"true" default:"/root/.kube/config"` // path to the kube config file
Values string `` Values string ``
StringValues string `split_words:"true"` StringValues string `split_words:"true"`
ValuesFiles []string `split_words:"true"` ValuesFiles []string `split_words:"true"`

View file

@ -6,7 +6,10 @@ import (
"os" "os"
) )
const kubeConfigTemplate = "/root/.kube/config.tpl" const (
kubeConfigTemplate = "/root/.kube/config.tpl"
kubeConfigFile = "/root/.kube/config"
)
// A Step is one step in the plan. // A Step is one step in the plan.
type Step interface { type Step interface {
@ -27,7 +30,6 @@ func NewPlan(cfg Config) (*Plan, error) {
cfg: cfg, cfg: cfg,
runCfg: run.Config{ runCfg: run.Config{
Debug: cfg.Debug, Debug: cfg.Debug,
KubeConfig: cfg.KubeConfig,
Values: cfg.Values, Values: cfg.Values,
StringValues: cfg.StringValues, StringValues: cfg.StringValues,
ValuesFiles: cfg.ValuesFiles, ValuesFiles: cfg.ValuesFiles,
@ -141,6 +143,7 @@ func initKube(cfg Config) []Step {
ServiceAccount: cfg.ServiceAccount, ServiceAccount: cfg.ServiceAccount,
Token: cfg.KubeToken, Token: cfg.KubeToken,
TemplateFile: kubeConfigTemplate, TemplateFile: kubeConfigTemplate,
ConfigFile: kubeConfigFile,
}, },
} }
} }

View file

@ -32,7 +32,6 @@ func (suite *PlanTestSuite) TestNewPlan() {
cfg := Config{ cfg := Config{
Command: "help", Command: "help",
Debug: false, Debug: false,
KubeConfig: "/branch/.sfere/profig",
Values: "steadfastness,forthrightness", Values: "steadfastness,forthrightness",
StringValues: "tensile_strength,flexibility", StringValues: "tensile_strength,flexibility",
ValuesFiles: []string{"/root/price_inventory.yml"}, ValuesFiles: []string{"/root/price_inventory.yml"},
@ -41,7 +40,6 @@ func (suite *PlanTestSuite) TestNewPlan() {
runCfg := run.Config{ runCfg := run.Config{
Debug: false, Debug: false,
KubeConfig: "/branch/.sfere/profig",
Values: "steadfastness,forthrightness", Values: "steadfastness,forthrightness",
StringValues: "tensile_strength,flexibility", StringValues: "tensile_strength,flexibility",
ValuesFiles: []string{"/root/price_inventory.yml"}, ValuesFiles: []string{"/root/price_inventory.yml"},
@ -142,6 +140,7 @@ func (suite *PlanTestSuite) TestDel() {
ServiceAccount: "greathelm", ServiceAccount: "greathelm",
Token: "b2YgbXkgYWZmZWN0aW9u", Token: "b2YgbXkgYWZmZWN0aW9u",
TemplateFile: kubeConfigTemplate, TemplateFile: kubeConfigTemplate,
ConfigFile: kubeConfigFile,
} }
suite.Equal(expected, init) suite.Equal(expected, init)
@ -176,6 +175,7 @@ func (suite *PlanTestSuite) TestInitKube() {
ServiceAccount: "helmet", ServiceAccount: "helmet",
Token: "cXVlZXIgY2hhcmFjdGVyCg==", Token: "cXVlZXIgY2hhcmFjdGVyCg==",
TemplateFile: kubeConfigTemplate, TemplateFile: kubeConfigTemplate,
ConfigFile: kubeConfigFile,
} }
suite.Equal(expected, init) suite.Equal(expected, init)
} }

View file

@ -7,7 +7,6 @@ import (
// Config contains configuration applicable to all helm commands // Config contains configuration applicable to all helm commands
type Config struct { type Config struct {
Debug bool Debug bool
KubeConfig string
Values string Values string
StringValues string StringValues string
ValuesFiles []string ValuesFiles []string

View file

@ -16,6 +16,7 @@ type InitKube struct {
ServiceAccount string ServiceAccount string
Token string Token string
TemplateFile string TemplateFile string
ConfigFile string
template *template.Template template *template.Template
configFile io.WriteCloser configFile io.WriteCloser
@ -34,7 +35,7 @@ type kubeValues struct {
// Execute generates a kubernetes config file from drone-helm3's template. // Execute generates a kubernetes config file from drone-helm3's template.
func (i *InitKube) Execute(cfg Config) error { func (i *InitKube) Execute(cfg Config) error {
if cfg.Debug { if cfg.Debug {
fmt.Fprintf(cfg.Stderr, "writing kubeconfig file to %s\n", cfg.KubeConfig) fmt.Fprintf(cfg.Stderr, "writing kubeconfig file to %s\n", i.ConfigFile)
} }
defer i.configFile.Close() defer i.configFile.Close()
return i.template.Execute(i.configFile, i.values) return i.template.Execute(i.configFile, i.values)
@ -76,16 +77,16 @@ func (i *InitKube) Prepare(cfg Config) error {
} }
if cfg.Debug { if cfg.Debug {
if _, err := os.Stat(cfg.KubeConfig); err != nil { if _, err := os.Stat(i.ConfigFile); err != nil {
// non-nil err here isn't an actual error state; the kubeconfig just doesn't exist // non-nil err here isn't an actual error state; the kubeconfig just doesn't exist
fmt.Fprint(cfg.Stderr, "creating ") fmt.Fprint(cfg.Stderr, "creating ")
} else { } else {
fmt.Fprint(cfg.Stderr, "truncating ") fmt.Fprint(cfg.Stderr, "truncating ")
} }
fmt.Fprintf(cfg.Stderr, "kubeconfig file at %s\n", cfg.KubeConfig) fmt.Fprintf(cfg.Stderr, "kubeconfig file at %s\n", i.ConfigFile)
} }
i.configFile, err = os.Create(cfg.KubeConfig) i.configFile, err = os.Create(i.ConfigFile)
if err != nil { if err != nil {
return fmt.Errorf("could not open kubeconfig file for writing: %w", err) return fmt.Errorf("could not open kubeconfig file for writing: %w", err)
} }

View file

@ -34,10 +34,10 @@ namespace: {{ .Namespace }}
Certificate: "CCNA", Certificate: "CCNA",
Token: "Aspire virtual currency", Token: "Aspire virtual currency",
TemplateFile: templateFile.Name(), TemplateFile: templateFile.Name(),
ConfigFile: configFile.Name(),
} }
cfg := Config{ cfg := Config{
Namespace: "Cisco", Namespace: "Cisco",
KubeConfig: configFile.Name(),
} }
err = init.Prepare(cfg) err = init.Prepare(cfg)
suite.Require().Nil(err) suite.Require().Nil(err)
@ -95,11 +95,10 @@ func (suite *InitKubeTestSuite) TestPrepareCannotOpenDestinationFile() {
Certificate: "CCNA", Certificate: "CCNA",
Token: "Aspire virtual currency", Token: "Aspire virtual currency",
TemplateFile: templateFile.Name(), TemplateFile: templateFile.Name(),
ConfigFile: "/usr/foreign/exclude/kubeprofig",
} }
cfg := Config{ cfg := Config{}
KubeConfig: "/usr/foreign/exclude/kubeprofig",
}
err = init.Prepare(cfg) err = init.Prepare(cfg)
suite.Error(err) suite.Error(err)
suite.Regexp("could not open .* for writing: .* no such file or directory", err) suite.Regexp("could not open .* for writing: .* no such file or directory", err)
@ -120,11 +119,10 @@ func (suite *InitKubeTestSuite) TestPrepareRequiredConfig() {
Certificate: "CCNA", Certificate: "CCNA",
Token: "Aspire virtual currency", Token: "Aspire virtual currency",
TemplateFile: templateFile.Name(), TemplateFile: templateFile.Name(),
ConfigFile: configFile.Name(),
} }
cfg := Config{ cfg := Config{}
KubeConfig: configFile.Name(),
}
suite.NoError(init.Prepare(cfg)) // consistency check; we should be starting in a happy state suite.NoError(init.Prepare(cfg)) // consistency check; we should be starting in a happy state
@ -157,11 +155,10 @@ func (suite *InitKubeTestSuite) TestPrepareDefaultsServiceAccount() {
Certificate: "CCNA", Certificate: "CCNA",
Token: "Aspire virtual currency", Token: "Aspire virtual currency",
TemplateFile: templateFile.Name(), TemplateFile: templateFile.Name(),
ConfigFile: configFile.Name(),
} }
cfg := Config{ cfg := Config{}
KubeConfig: configFile.Name(),
}
init.Prepare(cfg) init.Prepare(cfg)
suite.Equal("helm", init.ServiceAccount) suite.Equal("helm", init.ServiceAccount)

View file

@ -22,7 +22,7 @@ func (u *Uninstall) Prepare(cfg Config) error {
return fmt.Errorf("release is required") return fmt.Errorf("release is required")
} }
args := []string{"--kubeconfig", cfg.KubeConfig} args := make([]string, 0)
if cfg.Namespace != "" { if cfg.Namespace != "" {
args = append(args, "--namespace", cfg.Namespace) args = append(args, "--namespace", cfg.Namespace)

View file

@ -58,11 +58,9 @@ func (suite *UninstallTestSuite) TestPrepareAndExecute() {
Run(). Run().
Times(1) Times(1)
cfg := Config{ cfg := Config{}
KubeConfig: "/root/.kube/config",
}
suite.NoError(u.Prepare(cfg)) suite.NoError(u.Prepare(cfg))
expected := []string{"--kubeconfig", "/root/.kube/config", "uninstall", "zayde_wølf_king"} expected := []string{"uninstall", "zayde_wølf_king"}
suite.Equal(expected, actual) suite.Equal(expected, actual)
u.Execute(cfg) u.Execute(cfg)
@ -73,15 +71,13 @@ func (suite *UninstallTestSuite) TestPrepareDryRunFlag() {
Release: "firefox_ak_wildfire", Release: "firefox_ak_wildfire",
DryRun: true, DryRun: true,
} }
cfg := Config{ cfg := Config{}
KubeConfig: "/root/.kube/config",
}
suite.mockCmd.EXPECT().Stdout(gomock.Any()).AnyTimes() suite.mockCmd.EXPECT().Stdout(gomock.Any()).AnyTimes()
suite.mockCmd.EXPECT().Stderr(gomock.Any()).AnyTimes() suite.mockCmd.EXPECT().Stderr(gomock.Any()).AnyTimes()
suite.NoError(u.Prepare(cfg)) suite.NoError(u.Prepare(cfg))
expected := []string{"--kubeconfig", "/root/.kube/config", "uninstall", "--dry-run", "firefox_ak_wildfire"} expected := []string{"uninstall", "--dry-run", "firefox_ak_wildfire"}
suite.Equal(expected, suite.actualArgs) suite.Equal(expected, suite.actualArgs)
} }
@ -90,16 +86,14 @@ func (suite *UninstallTestSuite) TestPrepareNamespaceFlag() {
Release: "carly_simon_run_away_with_me", Release: "carly_simon_run_away_with_me",
} }
cfg := Config{ cfg := Config{
KubeConfig: "/root/.kube/config", Namespace: "emotion",
Namespace: "emotion",
} }
suite.mockCmd.EXPECT().Stdout(gomock.Any()).AnyTimes() suite.mockCmd.EXPECT().Stdout(gomock.Any()).AnyTimes()
suite.mockCmd.EXPECT().Stderr(gomock.Any()).AnyTimes() suite.mockCmd.EXPECT().Stderr(gomock.Any()).AnyTimes()
suite.NoError(u.Prepare(cfg)) suite.NoError(u.Prepare(cfg))
expected := []string{"--kubeconfig", "/root/.kube/config", expected := []string{"--namespace", "emotion", "uninstall", "carly_simon_run_away_with_me"}
"--namespace", "emotion", "uninstall", "carly_simon_run_away_with_me"}
suite.Equal(expected, suite.actualArgs) suite.Equal(expected, suite.actualArgs)
} }
@ -109,9 +103,8 @@ func (suite *UninstallTestSuite) TestPrepareDebugFlag() {
} }
stderr := strings.Builder{} stderr := strings.Builder{}
cfg := Config{ cfg := Config{
KubeConfig: "/root/.kube/config", Debug: true,
Debug: true, Stderr: &stderr,
Stderr: &stderr,
} }
command = func(path string, args ...string) cmd { command = func(path string, args ...string) cmd {
@ -126,8 +119,8 @@ func (suite *UninstallTestSuite) TestPrepareDebugFlag() {
suite.mockCmd.EXPECT().Stderr(&stderr).AnyTimes() suite.mockCmd.EXPECT().Stderr(&stderr).AnyTimes()
suite.NoError(u.Prepare(cfg)) suite.NoError(u.Prepare(cfg))
suite.Equal(fmt.Sprintf("Generated command: '%s --kubeconfig /root/.kube/config "+ suite.Equal(fmt.Sprintf("Generated command: '%s --debug "+
"--debug uninstall just_a_band_huff_and_puff'\n", helmBin), stderr.String()) "uninstall just_a_band_huff_and_puff'\n", helmBin), stderr.String())
} }
func (suite *UninstallTestSuite) TestPrepareRequiresRelease() { func (suite *UninstallTestSuite) TestPrepareRequiresRelease() {

View file

@ -33,7 +33,7 @@ func (u *Upgrade) Prepare(cfg Config) error {
return fmt.Errorf("release is required") return fmt.Errorf("release is required")
} }
args := []string{"--kubeconfig", cfg.KubeConfig} args := make([]string, 0)
if cfg.Namespace != "" { if cfg.Namespace != "" {
args = append(args, "--namespace", cfg.Namespace) args = append(args, "--namespace", cfg.Namespace)

View file

@ -41,8 +41,7 @@ func (suite *UpgradeTestSuite) TestPrepareAndExecute() {
command = func(path string, args ...string) cmd { command = func(path string, args ...string) cmd {
suite.Equal(helmBin, path) suite.Equal(helmBin, path)
suite.Equal([]string{"--kubeconfig", "/root/.kube/config", "upgrade", "--install", suite.Equal([]string{"upgrade", "--install", "jonas_brothers_only_human", "at40"}, args)
"jonas_brothers_only_human", "at40"}, args)
return suite.mockCmd return suite.mockCmd
} }
@ -55,9 +54,7 @@ func (suite *UpgradeTestSuite) TestPrepareAndExecute() {
Run(). Run().
Times(1) Times(1)
cfg := Config{ cfg := Config{}
KubeConfig: "/root/.kube/config",
}
err := u.Prepare(cfg) err := u.Prepare(cfg)
suite.Require().Nil(err) suite.Require().Nil(err)
u.Execute(cfg) u.Execute(cfg)
@ -73,8 +70,7 @@ func (suite *UpgradeTestSuite) TestPrepareNamespaceFlag() {
command = func(path string, args ...string) cmd { command = func(path string, args ...string) cmd {
suite.Equal(helmBin, path) suite.Equal(helmBin, path)
suite.Equal([]string{"--kubeconfig", "/root/.kube/config", "--namespace", "melt", "upgrade", suite.Equal([]string{"--namespace", "melt", "upgrade", "--install", "shaed_trampoline", "at40"}, args)
"--install", "shaed_trampoline", "at40"}, args)
return suite.mockCmd return suite.mockCmd
} }
@ -83,8 +79,7 @@ func (suite *UpgradeTestSuite) TestPrepareNamespaceFlag() {
suite.mockCmd.EXPECT().Stderr(gomock.Any()) suite.mockCmd.EXPECT().Stderr(gomock.Any())
cfg := Config{ cfg := Config{
Namespace: "melt", Namespace: "melt",
KubeConfig: "/root/.kube/config",
} }
err := u.Prepare(cfg) err := u.Prepare(cfg)
suite.Require().Nil(err) suite.Require().Nil(err)
@ -105,7 +100,6 @@ func (suite *UpgradeTestSuite) TestPrepareWithUpgradeFlags() {
} }
cfg := Config{ cfg := Config{
KubeConfig: "/root/.kube/config",
Values: "age=35", Values: "age=35",
StringValues: "height=5ft10in", StringValues: "height=5ft10in",
ValuesFiles: []string{"/usr/local/stats", "/usr/local/grades"}, ValuesFiles: []string{"/usr/local/stats", "/usr/local/grades"},
@ -113,7 +107,7 @@ func (suite *UpgradeTestSuite) TestPrepareWithUpgradeFlags() {
command = func(path string, args ...string) cmd { command = func(path string, args ...string) cmd {
suite.Equal(helmBin, path) suite.Equal(helmBin, path)
suite.Equal([]string{"--kubeconfig", "/root/.kube/config", "upgrade", "--install", suite.Equal([]string{"upgrade", "--install",
"--version", "radio_edit", "--version", "radio_edit",
"--dry-run", "--dry-run",
"--wait", "--wait",
@ -165,10 +159,9 @@ func (suite *UpgradeTestSuite) TestPrepareDebugFlag() {
stdout := strings.Builder{} stdout := strings.Builder{}
stderr := strings.Builder{} stderr := strings.Builder{}
cfg := Config{ cfg := Config{
Debug: true, Debug: true,
KubeConfig: "/root/.kube/config", Stdout: &stdout,
Stdout: &stdout, Stderr: &stderr,
Stderr: &stderr,
} }
command = func(path string, args ...string) cmd { command = func(path string, args ...string) cmd {
@ -186,7 +179,7 @@ func (suite *UpgradeTestSuite) TestPrepareDebugFlag() {
u.Prepare(cfg) u.Prepare(cfg)
want := fmt.Sprintf("Generated command: '%s --kubeconfig /root/.kube/config --debug upgrade "+ want := fmt.Sprintf("Generated command: '%s --debug upgrade "+
"--install lewis_capaldi_someone_you_loved at40'\n", helmBin) "--install lewis_capaldi_someone_you_loved at40'\n", helmBin)
suite.Equal(want, stderr.String()) suite.Equal(want, stderr.String())
suite.Equal("", stdout.String()) suite.Equal("", stdout.String())