From d0163268776315d2b35cbe9a190515981e7f6a9f Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Tue, 15 Dec 2020 13:29:19 -0800 Subject: [PATCH] avoid error when the node has local-config --- api/builtins/HelmChartInflationGenerator.go | 83 ++++++++++--------- api/internal/crawl/go.sum | 1 + api/resmap/factory.go | 4 +- api/resmap/factory_test.go | 90 +++++++++++++-------- 4 files changed, 104 insertions(+), 74 deletions(-) diff --git a/api/builtins/HelmChartInflationGenerator.go b/api/builtins/HelmChartInflationGenerator.go index b79b3e319..ff1921500 100644 --- a/api/builtins/HelmChartInflationGenerator.go +++ b/api/builtins/HelmChartInflationGenerator.go @@ -107,7 +107,49 @@ func (p *HelmChartInflationGeneratorPlugin) EncodeValues(w io.Writer) error { return nil } -// +// useValuesLocal process (merge) inflator config provided values with chart default values.yaml +func (p *HelmChartInflationGeneratorPlugin) useValuesLocal() error { + fn := path.Join(p.ChartHome, p.ChartName, "kustomize-values.yaml") + vf, err := os.Create(fn) + defer vf.Close() + if err != nil { + return err + } + // override, merge, none + if p.ValuesMerge == "none" || p.ValuesMerge == "no" || p.ValuesMerge == "false" { + p.Values = fn + } else { + pValues, err := ioutil.ReadFile(p.Values) + if err != nil { + return err + } + chValues := make(map[string]interface{}) + err = yaml.Unmarshal(pValues, &chValues) + if err != nil { + return err + } + if p.ValuesMerge == "override" { + err = mergo.Merge(&chValues, p.ValuesLocal, mergo.WithOverride) + if err != nil { + return err + } + } + if p.ValuesMerge == "merge" { + err = mergo.Merge(&chValues, p.ValuesLocal) + if err != nil { + return err + } + } + p.ValuesLocal = chValues + p.Values = fn + } + err = p.EncodeValues(vf) + if err != nil { + return err + } + vf.Sync() + return nil +} // Generate implements generator func (p *HelmChartInflationGeneratorPlugin) Generate() (resmap.ResMap, error) { @@ -126,47 +168,12 @@ func (p *HelmChartInflationGeneratorPlugin) Generate() (resmap.ResMap, error) { } } - // values + // inflator config valuesLocal if len(p.ValuesLocal) > 0 { - fn := path.Join(p.ChartHome, p.ChartName, "kustomize-values.yaml") - vf, err := os.Create(fn) - defer vf.Close() + err := p.useValuesLocal() if err != nil { return nil, err } - // override, merge, none - if p.ValuesMerge == "none" || p.ValuesMerge == "no" || p.ValuesMerge == "false" { - p.Values = fn - } else { - pValues, err := ioutil.ReadFile(p.Values) - if err != nil { - return nil, err - } - chValues := make(map[string]interface{}) - err = yaml.Unmarshal(pValues, &chValues) - if err != nil { - return nil, err - } - if p.ValuesMerge == "override" { - err = mergo.Merge(&chValues, p.ValuesLocal, mergo.WithOverride) - if err != nil { - return nil, err - } - } - if p.ValuesMerge == "merge" { - err = mergo.Merge(&chValues, p.ValuesLocal) - if err != nil { - return nil, err - } - } - p.ValuesLocal = chValues - p.Values = fn - } - err = p.EncodeValues(vf) - if err != nil { - return nil, err - } - vf.Sync() } // render the charts diff --git a/api/internal/crawl/go.sum b/api/internal/crawl/go.sum index 0e905756b..04e6229c6 100644 --- a/api/internal/crawl/go.sum +++ b/api/internal/crawl/go.sum @@ -220,6 +220,7 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= diff --git a/api/resmap/factory.go b/api/resmap/factory.go index e4e4e43f2..25fdd7fd3 100644 --- a/api/resmap/factory.go +++ b/api/resmap/factory.go @@ -152,11 +152,11 @@ func (rmF *Factory) NewResMapFromRNodeSlice(rnodes []*yaml.RNode) (ResMap, error if err != nil { return nil, err } - r, err := rmF.resF.FromBytes([]byte(s)) + r, err := rmF.resF.SliceFromBytes([]byte(s)) if err != nil { return nil, err } - resources = append(resources, r) + resources = append(resources, r...) } return newResMapFromResourceSlice(resources) } diff --git a/api/resmap/factory_test.go b/api/resmap/factory_test.go index 9e0e1bf2e..b03177705 100644 --- a/api/resmap/factory_test.go +++ b/api/resmap/factory_test.go @@ -277,7 +277,17 @@ func TestNewResMapFromSecretArgs(t *testing.T) { } func TestFromRNodeSlice(t *testing.T) { - input := `apiVersion: rbac.authorization.k8s.io/v1 + type testcase struct { + input string + expected ResMap + } + testcases := map[string]testcase{ + "no resource": { + input: "---", + expected: resmaptest_test.NewRmBuilder(t, rf).ResMap(), + }, + "single resource": { + input: `apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: namespace-reader @@ -290,42 +300,54 @@ rules: - get - watch - list - ` - rnodes := []*yaml.RNode{ - yaml.MustParse(input), - } - - rm, err := rmF.NewResMapFromRNodeSlice(rnodes) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - expected := resmaptest_test.NewRmBuilder(t, rf).Add( - map[string]interface{}{ - "apiVersion": "rbac.authorization.k8s.io/v1", - "kind": "ClusterRole", - "metadata": map[string]interface{}{ - "name": "namespace-reader", - }, - "rules": []interface{}{ + `, + expected: resmaptest_test.NewRmBuilder(t, rf).Add( map[string]interface{}{ - "apiGroups": []interface{}{ - "", + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "ClusterRole", + "metadata": map[string]interface{}{ + "name": "namespace-reader", }, - "resources": []interface{}{ - "namespaces", + "rules": []interface{}{ + map[string]interface{}{ + "apiGroups": []interface{}{ + "", + }, + "resources": []interface{}{ + "namespaces", + }, + "verbs": []interface{}{ + "get", + "watch", + "list", + }, + }, }, - "verbs": []interface{}{ - "get", - "watch", - "list", - }, - }, - }, - }).ResMap() - - if err = expected.ErrorIfNotEqualLists(rm); err != nil { - t.Fatalf("error: %s", err) + }).ResMap(), + }, + "local config": { + // local config should be ignored + input: `apiVersion: v1 +kind: ConfigMap +metadata: + name: my-config + annotations: + config.kubernetes.io/local-config: 'true' +`, + expected: resmaptest_test.NewRmBuilder(t, rf).ResMap(), + }, + } + for name, tc := range testcases { + rnodes := []*yaml.RNode{ + yaml.MustParse(tc.input), + } + rm, err := rmF.NewResMapFromRNodeSlice(rnodes) + if err != nil { + t.Fatalf("unexpected error in test case [%s]: %v", name, err) + } + if err = tc.expected.ErrorIfNotEqualLists(rm); err != nil { + t.Fatalf("error in test case [%s]: %s", name, err) + } } }