Initialize kubernetes config on upgrade
This change revealed more about how the system needs to work, so there
are some supporting changes:
* helm.upgrade and helm.help are now vars rather than raw functions.
This allows unit tests to target the "which step should we run"
logic directly by comparing function pointers, rather than having to
configure/prepare a fully-valid Plan and then infer the logic’s
correctness based on the Plan’s state.
* configuration that's specific to kubeconfig initialization is now part
of the InitKube struct rather than run.Config, since other steps
shouldn’t need access to those settings (particularly the secrets).
* Step.Execute now receives a run.Config so it can log debug output.
This commit is contained in:
184
internal/run/initkube_test.go
Normal file
184
internal/run/initkube_test.go
Normal file
@@ -0,0 +1,184 @@
|
||||
package run
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"text/template"
|
||||
// "github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/suite"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type InitKubeTestSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestInitKubeTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(InitKubeTestSuite))
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareExecute() {
|
||||
templateFile, err := tempfile("kubeconfig********.yml.tpl", `
|
||||
certificate: {{ .Certificate }}
|
||||
namespace: {{ .Namespace }}
|
||||
`)
|
||||
defer os.Remove(templateFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
configFile, err := tempfile("kubeconfig********.yml", "")
|
||||
defer os.Remove(configFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: templateFile.Name(),
|
||||
}
|
||||
cfg := Config{
|
||||
Namespace: "Cisco",
|
||||
KubeConfig: configFile.Name(),
|
||||
}
|
||||
err = init.Prepare(cfg)
|
||||
suite.Require().Nil(err)
|
||||
|
||||
suite.IsType(&template.Template{}, init.template)
|
||||
suite.NotNil(init.configFile)
|
||||
|
||||
err = init.Execute(cfg)
|
||||
suite.Require().Nil(err)
|
||||
|
||||
conf, err := ioutil.ReadFile(configFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
want := `
|
||||
certificate: CCNA
|
||||
namespace: Cisco
|
||||
`
|
||||
suite.Equal(want, string(conf))
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareParseError() {
|
||||
templateFile, err := tempfile("kubeconfig********.yml.tpl", `{{ NonexistentFunction }}`)
|
||||
defer os.Remove(templateFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: templateFile.Name(),
|
||||
}
|
||||
err = init.Prepare(Config{})
|
||||
suite.Error(err)
|
||||
suite.Regexp("could not load kubeconfig .* function .* not defined", err)
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareNonexistentTemplateFile() {
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: "/usr/foreign/exclude/kubeprofig.tpl",
|
||||
}
|
||||
err := init.Prepare(Config{})
|
||||
suite.Error(err)
|
||||
suite.Regexp("could not load kubeconfig .* no such file or directory", err)
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareCannotOpenDestinationFile() {
|
||||
templateFile, err := tempfile("kubeconfig********.yml.tpl", "hurgity burgity")
|
||||
defer os.Remove(templateFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: templateFile.Name(),
|
||||
}
|
||||
|
||||
cfg := Config{
|
||||
KubeConfig: "/usr/foreign/exclude/kubeprofig",
|
||||
}
|
||||
err = init.Prepare(cfg)
|
||||
suite.Error(err)
|
||||
suite.Regexp("could not open .* for writing: .* no such file or directory", err)
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareRequiredConfig() {
|
||||
templateFile, err := tempfile("kubeconfig********.yml.tpl", "hurgity burgity")
|
||||
defer os.Remove(templateFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
configFile, err := tempfile("kubeconfig********.yml", "")
|
||||
defer os.Remove(configFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
// initial config with all required fields present
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: templateFile.Name(),
|
||||
}
|
||||
|
||||
cfg := Config{
|
||||
KubeConfig: configFile.Name(),
|
||||
}
|
||||
|
||||
suite.NoError(init.Prepare(cfg)) // consistency check; we should be starting in a happy state
|
||||
|
||||
init.APIServer = ""
|
||||
suite.Error(init.Prepare(cfg), "APIServer should be required.")
|
||||
|
||||
init.APIServer = "Sysadmin"
|
||||
init.Token = ""
|
||||
suite.Error(init.Prepare(cfg), "Token should be required.")
|
||||
|
||||
init.Token = "Aspire virtual currency"
|
||||
init.Certificate = ""
|
||||
suite.Error(init.Prepare(cfg), "Certificate should be required.")
|
||||
|
||||
init.SkipTLSVerify = true
|
||||
suite.NoError(init.Prepare(cfg), "Certificate should not be required if SkipTLSVerify is true")
|
||||
}
|
||||
|
||||
func (suite *InitKubeTestSuite) TestPrepareDefaultsServiceAccount() {
|
||||
templateFile, err := tempfile("kubeconfig********.yml.tpl", "hurgity burgity")
|
||||
defer os.Remove(templateFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
configFile, err := tempfile("kubeconfig********.yml", "")
|
||||
defer os.Remove(configFile.Name())
|
||||
suite.Require().Nil(err)
|
||||
|
||||
init := InitKube{
|
||||
APIServer: "Sysadmin",
|
||||
Certificate: "CCNA",
|
||||
Token: "Aspire virtual currency",
|
||||
TemplateFile: templateFile.Name(),
|
||||
}
|
||||
|
||||
cfg := Config{
|
||||
KubeConfig: configFile.Name(),
|
||||
}
|
||||
|
||||
init.Prepare(cfg)
|
||||
suite.Equal("helm", init.ServiceAccount)
|
||||
}
|
||||
|
||||
func tempfile(name, contents string) (*os.File, error) {
|
||||
file, err := ioutil.TempFile("", name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = file.Write([]byte(contents))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = file.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return file, nil
|
||||
}
|
||||
Reference in New Issue
Block a user