From 39094f2aebe152207cf0fd043734979deebca46e Mon Sep 17 00:00:00 2001 From: Jingfang Liu Date: Thu, 27 Feb 2020 12:09:49 -0800 Subject: [PATCH 1/2] add SetLabel function in kyaml library --- kyaml/yaml/filters.go | 1 + kyaml/yaml/kfns.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/kyaml/yaml/filters.go b/kyaml/yaml/filters.go index 46f22821a..7d6d00fad 100644 --- a/kyaml/yaml/filters.go +++ b/kyaml/yaml/filters.go @@ -15,6 +15,7 @@ var Filters = map[string]func() Filter{ "AnnotationClearer": func() Filter { return &AnnotationClearer{} }, "AnnotationGetter": func() Filter { return &AnnotationGetter{} }, "AnnotationSetter": func() Filter { return &AnnotationSetter{} }, + "LabelSetter": func() Filter { return &LabelSetter{} }, "ElementAppender": func() Filter { return &ElementAppender{} }, "ElementMatcher": func() Filter { return &ElementMatcher{} }, "FieldClearer": func() Filter { return &FieldClearer{} }, diff --git a/kyaml/yaml/kfns.go b/kyaml/yaml/kfns.go index 564682c64..84d3f2af7 100644 --- a/kyaml/yaml/kfns.go +++ b/kyaml/yaml/kfns.go @@ -68,3 +68,25 @@ func (g AnnotationGetter) Filter(rn *RNode) (*RNode, error) { func GetAnnotation(key string) AnnotationGetter { return AnnotationGetter{Key: key} } + +// LabelSetter sets a label at metadata.labels. +// Creates metadata.labels if does not exist. +type LabelSetter struct { + Kind string `yaml:"kind,omitempty"` + Key string `yaml:"key,omitempty"` + Value string `yaml:"value,omitempty"` +} + +func (s LabelSetter) Filter(rn *RNode) (*RNode, error) { + // some tools get confused about the type if labels are not quoted + v := NewScalarRNode(s.Value) + v.YNode().Tag = "!!str" + v.YNode().Style = yaml.SingleQuotedStyle + return rn.Pipe( + PathGetter{Path: []string{"metadata", "labels"}, Create: yaml.MappingNode}, + FieldSetter{Name: s.Key, Value: v}) +} + +func SetLabel(key, value string) LabelSetter { + return LabelSetter{Key: key, Value: value} +} From ef76575ab61c70e4057ecd5378b329a149a43230 Mon Sep 17 00:00:00 2001 From: Jingfang Liu Date: Thu, 27 Feb 2020 13:37:36 -0800 Subject: [PATCH 2/2] add test for SetLabel and SetAnnotation --- kyaml/yaml/kfns_test.go | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 kyaml/yaml/kfns_test.go diff --git a/kyaml/yaml/kfns_test.go b/kyaml/yaml/kfns_test.go new file mode 100644 index 000000000..7b0e0cb8f --- /dev/null +++ b/kyaml/yaml/kfns_test.go @@ -0,0 +1,60 @@ +package yaml + +import ( + "testing" +) + +var input = `apiVersion: v1 +kind: ConfigMap +metadata: + name: the-map +data: + altGreeting: "Good Morning!" + enableRisky: "false" +` + +func TestSetLabel(t *testing.T) { + rn := MustParse(input) + _, err := rn.Pipe(SetLabel("foo", "bar")) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + output := rn.MustString() + + expected := `apiVersion: v1 +kind: ConfigMap +metadata: + name: the-map + labels: + foo: 'bar' +data: + altGreeting: "Good Morning!" + enableRisky: "false" +` + if output != expected { + t.Fatalf("expected \n%s\nbut got \n%s\n", expected, output) + } +} + +func TestAnnotation(t *testing.T) { + rn := MustParse(input) + _, err := rn.Pipe(SetAnnotation("foo", "bar")) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + output := rn.MustString() + + expected := `apiVersion: v1 +kind: ConfigMap +metadata: + name: the-map + annotations: + foo: 'bar' +data: + altGreeting: "Good Morning!" + enableRisky: "false" +` + if output != expected { + t.Fatalf("expected \n%s\nbut got \n%s\n", expected, output) + } +}