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} +} 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) + } +}