From a3f59f2f4f0722f57472037c8f5534add8b29148 Mon Sep 17 00:00:00 2001 From: Phani Teja Marupaka Date: Tue, 31 Mar 2020 16:56:59 -0700 Subject: [PATCH] Set all setter definitions from source package --- kyaml/setters2/settersutil/fieldsetter.go | 33 ++++++ .../setters2/settersutil/fieldsetter_test.go | 102 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 kyaml/setters2/settersutil/fieldsetter_test.go diff --git a/kyaml/setters2/settersutil/fieldsetter.go b/kyaml/setters2/settersutil/fieldsetter.go index 13361137f..d0b6c6bab 100644 --- a/kyaml/setters2/settersutil/fieldsetter.go +++ b/kyaml/setters2/settersutil/fieldsetter.go @@ -68,3 +68,36 @@ func (fs FieldSetter) Set(openAPIPath, resourcesPath string) (int, error) { }.Execute() return s.Count, err } + +// SetAllSetterDefinitions reads all the Setter Definitions from OpenAPI in source +// package and sets all setter values in destination packages with out updating +// destination packages openAPI files +func SetAllSetterDefinitions(sourcePkgPath, sourcePkgOpenAPIPath string, destDirs ...string) error { + // get all the setter definitions from package + l := setters2.List{} + err := l.List(sourcePkgOpenAPIPath, sourcePkgPath) + if err != nil { + return err + } + + // for each setter definition set the setter values in destination packages + //TODO(pmarupaka): optimize to perform all the setters in single pass instead of N passes + for _, sd := range l.Setters { + for _, destDir := range destDirs { + fs := FieldSetter{ + Name: sd.Name, + Value: sd.Value, + ListValues: sd.ListValues, + Description: sd.Description, + SetBy: sd.SetBy, + } + // pass sourcePkgOpenAPIPath remains unchanged due to set but should be passed as + // a place holder + _, err = fs.Set(sourcePkgOpenAPIPath, destDir) + if err != nil { + return err + } + } + } + return nil +} diff --git a/kyaml/setters2/settersutil/fieldsetter_test.go b/kyaml/setters2/settersutil/fieldsetter_test.go new file mode 100644 index 000000000..7244b2bd4 --- /dev/null +++ b/kyaml/setters2/settersutil/fieldsetter_test.go @@ -0,0 +1,102 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package settersutil + +import ( + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSetAllSetterDefinitions(t *testing.T) { + srcOpenAPIFile := `openAPI: + definitions: + io.k8s.cli.setters.namespace: + x-k8s-cli: + setter: + name: namespace + value: "project-namespace" + io.k8s.cli.setters.replicas: + x-k8s-cli: + setter: + name: replicas + value: "4"` + + destFile1 := `apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: some-other-namespace # {"$ref": "#/definitions/io.k8s.cli.setters.namespace"} +spec: + replicas: 3 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}` + + destFile2 := `apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: some-other-namespace2 # {"$ref": "#/definitions/io.k8s.cli.setters.namespace"} +spec: + replicas: 2 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}` + + expectedDestFile := `apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: project-namespace # {"$ref": "#/definitions/io.k8s.cli.setters.namespace"} +spec: + replicas: 4 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}` + + srcDir, err := ioutil.TempDir("", "") + if !assert.NoError(t, err) { + t.Fail() + } + + destDir1, err := ioutil.TempDir("", "") + if !assert.NoError(t, err) { + t.Fail() + } + + destDir2, err := ioutil.TempDir("", "") + if !assert.NoError(t, err) { + t.Fail() + } + + defer os.RemoveAll(srcDir) + defer os.RemoveAll(destDir1) + defer os.RemoveAll(destDir2) + + err = ioutil.WriteFile(srcDir+"/OpenAPIFile", []byte(srcOpenAPIFile), 0600) + if !assert.NoError(t, err) { + t.Fail() + } + err = ioutil.WriteFile(destDir1+"/destFile.yaml", []byte(destFile1), 0600) + if !assert.NoError(t, err) { + t.Fail() + } + + err = ioutil.WriteFile(destDir2+"/destFile.yaml", []byte(destFile2), 0600) + if !assert.NoError(t, err) { + t.Fail() + } + + err = SetAllSetterDefinitions(srcDir, srcDir+"/OpenAPIFile", destDir1, destDir2) + if !assert.NoError(t, err) { + t.Fail() + } + + actualdestFile1, err := ioutil.ReadFile(destDir1 + "/destFile.yaml") + if !assert.NoError(t, err) { + t.Fail() + } + assert.Equal(t, strings.Trim(string(actualdestFile1), "\n"), expectedDestFile) + + actualdestFile2, err := ioutil.ReadFile(destDir2 + "/destFile.yaml") + if !assert.NoError(t, err) { + t.Fail() + } + assert.Equal(t, strings.Trim(string(actualdestFile2), "\n"), expectedDestFile) +}