diff --git a/runner/cmd.go b/runner/cmd.go index c4f0f586a2f15ddc7871939a2ac2d89eb1cfd76e_cnVubmVyL2NtZC5nbw==..6ee63476c95b5e07b41436805a5f442708b3cdfa_cnVubmVyL2NtZC5nbw== 100644 --- a/runner/cmd.go +++ b/runner/cmd.go @@ -27,7 +27,9 @@ } func NewCmdConfig(logger zerolog.Logger, configDir string, namespace string) (*CmdConfig, error) { - var cmdConfig CmdConfig + cmdConfig := &CmdConfig{} + cmdConfig.Spec.Charts.Helm = make(map[string]CmdHelmChart) + cmdConfig.Spec.Charts.Ytt = make(map[string]CmdYttChart) cmdConfig.Namespace = namespace cmdConfig.Logger = logger @@ -42,4 +44,9 @@ return nil, err } + // first "import" all variables from baseCfg + cmdConfig.Spec.Variables = baseCfg.Spec.Variables + // then merge in all variables from the nsCfg + cmdConfig.MergeVariables(nsCfg) + // TODO: @@ -45,3 +52,10 @@ // TODO: - // - merge baseCfg & nsCfg according to magic + // - merge baseCfg & nsCfg charts + if err := cmdConfig.importCharts(baseCfg); err != nil { + return nil, err + } + if err := cmdConfig.importCharts(nsCfg); err != nil { + return nil, err + } + // - hydrate @@ -47,5 +61,9 @@ // - hydrate - return &cmdConfig, nil + if err := cmdConfig.hydrate(); err != nil { + return nil, err + } + + return cmdConfig, nil } type CmdConfig struct { @@ -137,3 +155,73 @@ } return nil } + +// MergeVariables takes a config (from a file, not a cmd one) and import its +// variables into the current cmdconfig by replacing old ones +// and adding the new ones +func (c *CmdConfig) MergeVariables(other *Config) { + for _, variable := range other.Spec.Variables { + c.overlayVariable(variable) + } +} + +// overlayVariable takes a variable in and either replaces an existing variable +// of the same name or create a new variable in the config if no matching name +// is found +func (c *CmdConfig) overlayVariable(v Variable) { + // find same variable by name and replace is value + // if not found then create the variable + for index, originalVariable := range c.Spec.Variables { + if originalVariable.Name == v.Name { + c.Spec.Variables[index].Value = v.Value + return + } + } + c.Spec.Variables = append(c.Spec.Variables, v) +} + +func (c *CmdConfig) importCharts(other *Config) error { + if err := c.importHelmCharts(other.Spec.Charts.Helm); err != nil { + return nil + } + if err := c.importYttCharts(other.Spec.Charts.Ytt); err != nil { + return nil + } + return nil +} + +func (c *CmdConfig) importHelmCharts(helmCharts map[string]HelmChart) error { + for id, chart := range helmCharts { + convertedChart, err := cmdHelmChartFromHelmChart(chart) + if err != nil { + return err + } + _, ok := c.Spec.Charts.Helm[id] + if !ok { + // we have no chart by that name yet... + // create one + c.Spec.Charts.Helm[id] = *convertedChart + continue + } + // else just append values to existing one + convertedChart.Values = append(c.Spec.Charts.Helm[id].Values, convertedChart.Values...) + c.Spec.Charts.Helm[id] = *convertedChart + } + return nil +} + +func cmdHelmChartFromHelmChart(c HelmChart) (*CmdHelmChart, error) { + strValues, err := yaml.Marshal(c.Values) + if err != nil { + return nil, err + } + return &CmdHelmChart{ + Type: c.Type, + Name: c.Name, + Values: []string{string(strValues)}, + }, nil +} + +func (c *CmdConfig) importYttCharts(yttCharts map[string]YttChart) error { + return nil +} diff --git a/runner/cmd_test.go b/runner/cmd_test.go index c4f0f586a2f15ddc7871939a2ac2d89eb1cfd76e_cnVubmVyL2NtZF90ZXN0Lmdv..6ee63476c95b5e07b41436805a5f442708b3cdfa_cnVubmVyL2NtZF90ZXN0Lmdv 100644 --- a/runner/cmd_test.go +++ b/runner/cmd_test.go @@ -6,6 +6,7 @@ "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "orus.io/cloudcrane/beaver/testutils" ) func TestRunCMD(t *testing.T) { @@ -19,3 +20,16 @@ fmt.Println(errMsg) } } + +func TestCmdConfig(t *testing.T) { + tl := testutils.NewTestLogger(t) + testNS := "ns1" + c, err := NewCmdConfig(tl.Logger(), "fixtures/", testNS) + require.NoError(t, err) + + // TODO: make sure this is the expected values including the leading | ... + assert.Equal(t, []string{ + "|\n config:\n datasource:\n password: <path:cnpp.k8s.cloudcrane.io/data/ns1/postgres#password>\n role: 'admin'\n fullnameoverride: pg-exporter-ns1\n"}, + c.Spec.Charts.Helm["postgres"].Values, + ) +} diff --git a/runner/config.go b/runner/config.go index c4f0f586a2f15ddc7871939a2ac2d89eb1cfd76e_cnVubmVyL2NvbmZpZy5nbw==..6ee63476c95b5e07b41436805a5f442708b3cdfa_cnVubmVyL2NvbmZpZy5nbw== 100644 --- a/runner/config.go +++ b/runner/config.go @@ -62,26 +62,3 @@ return cfg, nil } - -// MergeVariables takes another config and will import those variables into -// the current config by replacing old ones and adding the new ones -func (c *Config) MergeVariables(other *Config) { - for _, variable := range other.Spec.Variables { - c.overlayVariable(variable) - } -} - -// overlayVariable takes a variable in and either replaces an existing variable -// of the same name or create a new variable in the config if no matching name -// is found -func (c *Config) overlayVariable(v Variable) { - // find same variable by name and replace is value - // if not found then create the variable - for index, originalVariable := range c.Spec.Variables { - if originalVariable.Name == v.Name { - c.Spec.Variables[index].Value = v.Value - return - } - } - c.Spec.Variables = append(c.Spec.Variables, v) -} diff --git a/runner/config_test.go b/runner/config_test.go index c4f0f586a2f15ddc7871939a2ac2d89eb1cfd76e_cnVubmVyL2NvbmZpZ190ZXN0Lmdv..6ee63476c95b5e07b41436805a5f442708b3cdfa_cnVubmVyL2NvbmZpZ190ZXN0Lmdv 100644 --- a/runner/config_test.go +++ b/runner/config_test.go @@ -5,7 +5,7 @@ "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "orus.io/cloudcrane/beaver/testutils" + "gopkg.in/yaml.v2" ) func TestConfig(t *testing.T) { @@ -9,5 +9,4 @@ ) func TestConfig(t *testing.T) { - logger := testutils.GetLogger(t) configDir := "fixtures/" @@ -13,6 +12,5 @@ configDir := "fixtures/" - testNS := "ns1" - config, err := NewConfig(logger, configDir, testNS) + config, err := NewConfig(configDir) require.NoError(t, err) // first config.spec.variables entry name should be VAULT_KV in our test file assert.Equal(t, "VAULT_KV", config.Spec.Variables[0].Name) @@ -16,8 +14,9 @@ require.NoError(t, err) // first config.spec.variables entry name should be VAULT_KV in our test file assert.Equal(t, "VAULT_KV", config.Spec.Variables[0].Name) - // the postgres chart should have been expanded with our variables - assert.Equal( - t, - `config: + + dumped, err := yaml.Marshal(config.Spec.Charts.Helm["postgres"].Values) + require.NoError(t, err) + // this config entry is just read from the base file, and not yet hydrated + assert.Equal(t, `config: datasource: @@ -23,4 +22,5 @@ datasource: - password: <path:cnpp.k8s.cloudcrane.io/data/ns1/postgres#password> -fullnameoverride: pg-exporter-ns1 + password: <path:{{.VAULT_KV}}/data/{{.namespace}}/postgres#password> + role: '{{.ROLE}}' +fullnameoverride: pg-exporter-{{.namespace}} `, @@ -26,4 +26,3 @@ `, - config.Spec.Charts.Helm["postgres"].Values, - ) + string(dumped)) @@ -29,5 +28,6 @@ - // verify ytt entries - assert.Equal(t, "cnpp.k8s.cloudcrane.io", config.Spec.Charts.Ytt["odoo"].Values[0].Value) - assert.Equal(t, testNS, config.Spec.Charts.Ytt["odoo"].Values[1].Value) + /* + // verify ytt entries + assert.Equal(t, "cnpp.k8s.cloudcrane.io", config.Spec.Charts.Ytt["odoo"].Values[0].Value) + assert.Equal(t, testNS, config.Spec.Charts.Ytt["odoo"].Values[1].Value) @@ -33,5 +33,5 @@ - // yaml support should let toto entry use DEFAULT_VALUES defined in odoo - assert.Equal(t, "cnpp.k8s.cloudcrane.io", config.Spec.Charts.Ytt["toto"].Values[0].Value) - assert.Equal(t, testNS, config.Spec.Charts.Ytt["toto"].Values[1].Value) + // yaml support should let toto entry use DEFAULT_VALUES defined in odoo + assert.Equal(t, "cnpp.k8s.cloudcrane.io", config.Spec.Charts.Ytt["toto"].Values[0].Value) + assert.Equal(t, testNS, config.Spec.Charts.Ytt["toto"].Values[1].Value) @@ -37,4 +37,5 @@ - // verify variables overwrite - assert.Equal(t, "admin", config.Spec.Charts.Ytt["odoo"].Values[2].Value) + // verify variables overwrite + assert.Equal(t, "admin", config.Spec.Charts.Ytt["odoo"].Values[2].Value) + */ }