diff --git a/kyaml/setters2/setterdefinition_test.go b/kyaml/setters2/setterdefinition_test.go index 2ea8ea151..f233271e2 100644 --- a/kyaml/setters2/setterdefinition_test.go +++ b/kyaml/setters2/setterdefinition_test.go @@ -11,32 +11,31 @@ import ( "github.com/stretchr/testify/assert" ) -var kptfile = `apiVersion: kpt.dev/v1alpha1 -kind: Kptfile +var resourcefile = `apiVersion: resource.dev/v1alpha1 +kind: resourcefile metadata: name: hello-world-set upstream: type: git git: commit: 5c1c019b59299a4f6c7edd1ff5ff54d720621bbe - repo: git@github.com:GoogleContainerTools/kpt directory: /package-examples/helloworld-set ref: v0.1.0 packageMetadata: shortDescription: example package using setters` func TestAddUpdateSetter(t *testing.T) { - path := os.TempDir() + "Kptfile" + path := os.TempDir() + "/resourcefile" - //write initial kptfile to temp path - err := ioutil.WriteFile(path, []byte(kptfile), 0600) + //write initial resourcefile to temp path + err := ioutil.WriteFile(path, []byte(resourcefile), 0666) if !assert.NoError(t, err) { t.FailNow() } //add a setter definition sd := SetterDefinition{ - Name: "no-match-1", + Name: "image", Value: "1", } @@ -48,7 +47,7 @@ func TestAddUpdateSetter(t *testing.T) { // update setter definition sd2 := SetterDefinition{ - Name: "no-match-1", + Name: "image", Value: "2", } @@ -63,25 +62,24 @@ func TestAddUpdateSetter(t *testing.T) { t.FailNow() } - expected := `apiVersion: kpt.dev/v1alpha1 -kind: Kptfile + expected := `apiVersion: resource.dev/v1alpha1 +kind: resourcefile metadata: name: hello-world-set upstream: type: git git: commit: 5c1c019b59299a4f6c7edd1ff5ff54d720621bbe - repo: git@github.com:GoogleContainerTools/kpt directory: /package-examples/helloworld-set ref: v0.1.0 packageMetadata: shortDescription: example package using setters openAPI: definitions: - io.k8s.cli.setters.no-match-1: + io.k8s.cli.setters.image: x-k8s-cli: setter: - name: no-match-1 + name: image value: 2 ` assert.Equal(t, expected, string(b)) diff --git a/kyaml/setters2/substitutiondefinition.go b/kyaml/setters2/substitutiondefinition.go new file mode 100644 index 000000000..17d4ff34e --- /dev/null +++ b/kyaml/setters2/substitutiondefinition.go @@ -0,0 +1,60 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package setters2 + +import ( + "io/ioutil" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type SubstitutionDefinition struct { + Name string `yaml:"name"` + Pattern string `yaml:"pattern"` + Values []Value `yaml:"value"` +} + +type Value struct { + Marker string `yaml:"marker"` + Ref string `yaml:"ref"` +} + +func (subd SubstitutionDefinition) AddSubstitutionToFile(path string) error { + b, err := ioutil.ReadFile(path) + if err != nil { + return err + } + y, err := yaml.Parse(string(b)) + if err != nil { + return err + } + if err := y.PipeE(subd); err != nil { + return err + } + out, err := y.String() + if err != nil { + return err + } + if err := ioutil.WriteFile(path, []byte(out), 0666); err != nil { + return err + } + return nil +} + +func (subd SubstitutionDefinition) Filter(object *yaml.RNode) (*yaml.RNode, error) { + key := DefinitionPrefix + subd.Name + + def, err := object.Pipe(yaml.LookupCreate( + yaml.MappingNode, "openAPI", "definitions", key, "x-k8s-cli", "substitution")) + if err != nil { + return nil, err + } + if err := def.PipeE(yaml.FieldSetter{Name: "name", StringValue: subd.Name}); err != nil { + return nil, err + } + if err := def.PipeE(yaml.FieldSetter{Name: "pattern", StringValue: subd.Pattern}); err != nil { + return nil, err + } + return object, nil +} diff --git a/kyaml/setters2/substitutiondefinition_test.go b/kyaml/setters2/substitutiondefinition_test.go new file mode 100644 index 000000000..9b239bd89 --- /dev/null +++ b/kyaml/setters2/substitutiondefinition_test.go @@ -0,0 +1,86 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package setters2 + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAddUpdateSubstitution(t *testing.T) { + path := os.TempDir() + "/resourcefile" + + //write initial resourcefile to temp path + err := ioutil.WriteFile(path, []byte(resourcefile), 0666) + if !assert.NoError(t, err) { + t.FailNow() + } + + value1 := Value{ + Marker: "IMAGE_NAME", + Ref: "#/definitions/io.k8s.cli.setters.image-name", + } + + value2 := Value{ + Marker: "IMAGE_TAG", + Ref: "#/definitions/io.k8s.cli.setters.image-tag", + } + + values := []Value{value1, value2} + + //add a setter definition + subd := SubstitutionDefinition{ + Name: "image", + Pattern: "IMAGE_NAME:IMAGE_TAG", + Values: values, + } + + err = subd.AddSubstitutionToFile(path) + + if !assert.NoError(t, err) { + t.FailNow() + } + + // update setter definition + subd2 := SubstitutionDefinition{ + Name: "image", + Pattern: "IMAGE_NAME:IMAGE_TAG2", + } + + err = subd2.AddSubstitutionToFile(path) + + if !assert.NoError(t, err) { + t.FailNow() + } + + b, err := ioutil.ReadFile(path) + if err != nil { + t.FailNow() + } + + expected := `apiVersion: resource.dev/v1alpha1 +kind: resourcefile +metadata: + name: hello-world-set +upstream: + type: git + git: + commit: 5c1c019b59299a4f6c7edd1ff5ff54d720621bbe + directory: /package-examples/helloworld-set + ref: v0.1.0 +packageMetadata: + shortDescription: example package using setters +openAPI: + definitions: + io.k8s.cli.setters.image: + x-k8s-cli: + substitution: + name: image + pattern: IMAGE_NAME:IMAGE_TAG2 +` + assert.Equal(t, expected, string(b)) +}