Skip to content

Commit

Permalink
retain quotes in namespace transformer filter (#4421)
Browse files Browse the repository at this point in the history
* check tag values for double quoting

* reuse setentry

* don't override single quotes in merge and fix cm generator immutable val

* get rid of comment

* starlark annotation tests

* don't commit test image changes

* set network to bool

* isSet bool

* updating e2e config tool

* leave createtag

* fn command failing unmarshal test

* fn command test

* don't set style in run-fs

* use setentry to set tag

* remove e2e test changes and make IsStringValue an RNode method
  • Loading branch information
shanalily committed Mar 23, 2022
1 parent fbfcb04 commit 7b0ec99
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 18 deletions.
3 changes: 0 additions & 3 deletions api/filters/filtersutil/setters.go
Expand Up @@ -21,9 +21,6 @@ func SetEntry(key, value, tag string) SetFn {
Value: value,
Tag: tag,
}
if tag == yaml.NodeTagString && yaml.IsYaml1_1NonString(n) {
n.Style = yaml.DoubleQuotedStyle
}
return func(node *yaml.RNode) error {
return node.PipeE(yaml.FieldSetter{
Name: key,
Expand Down
6 changes: 3 additions & 3 deletions api/filters/namespace/namespace.go
Expand Up @@ -52,7 +52,7 @@ func (ns Filter) run(node *yaml.RNode) (*yaml.RNode, error) {
// transformations based on data -- :)
err := node.PipeE(fsslice.Filter{
FsSlice: ns.FsSlice,
SetValue: ns.trackableSetter.SetScalar(ns.Namespace),
SetValue: ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString),
CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode
CreateTag: yaml.NodeTagString,
})
Expand Down Expand Up @@ -85,7 +85,7 @@ func (ns Filter) metaNamespaceHack(obj *yaml.RNode, gvk resid.Gvk) error {
FsSlice: []types.FieldSpec{
{Path: types.MetadataNamespacePath, CreateIfNotPresent: true},
},
SetValue: ns.trackableSetter.SetScalar(ns.Namespace),
SetValue: ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString),
CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode
}
_, err := f.Filter(obj)
Expand Down Expand Up @@ -138,7 +138,7 @@ func (ns Filter) roleBindingHack(obj *yaml.RNode, gvk resid.Gvk) error {
return err
}

return ns.trackableSetter.SetScalar(ns.Namespace)(node)
return ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString)(node)

})

Expand Down
34 changes: 34 additions & 0 deletions api/filters/namespace/namespace_test.go
Expand Up @@ -332,26 +332,60 @@ a:
expectedSetValueArgs: []filtertest_test.SetValueArg{
{
Value: "bar",
Tag: "!!str",
NodePath: []string{"metadata", "namespace"},
},
{
Value: "bar",
Tag: "!!str",
NodePath: []string{"a", "b", "c"},
},
{
Value: "bar",
Tag: "!!str",
NodePath: []string{"metadata", "namespace"},
},
{
Value: "bar",
Tag: "!!str",
NodePath: []string{"namespace"},
},
{
Value: "bar",
Tag: "!!str",
NodePath: []string{"a", "b", "c"},
},
},
},

{
name: "numeric",
input: `
apiVersion: example.com/v1
kind: Foo
metadata:
name: instance
---
apiVersion: example.com/v1
kind: Bar
metadata:
name: instance
`,
expected: `
apiVersion: example.com/v1
kind: Foo
metadata:
name: instance
namespace: "01234"
---
apiVersion: example.com/v1
kind: Bar
metadata:
name: instance
namespace: "01234"
`,
filter: namespace.Filter{Namespace: "01234"},
},
}

type TestCase struct {
Expand Down
2 changes: 1 addition & 1 deletion api/filters/replicacount/replicacount.go
Expand Up @@ -41,5 +41,5 @@ func (rc Filter) run(node *yaml.RNode) (*yaml.RNode, error) {
}

func (rc Filter) set(node *yaml.RNode) error {
return rc.trackableSetter.SetScalar(strconv.FormatInt(rc.Replica.Count, 10))(node)
return rc.trackableSetter.SetEntry("", strconv.FormatInt(rc.Replica.Count, 10), yaml.NodeTagInt)(node)
}
1 change: 1 addition & 0 deletions api/filters/replicacount/replicacount_test.go
Expand Up @@ -192,6 +192,7 @@ spec:
expectedSetValueArgs: []filtertest_test.SetValueArg{
{
Value: "42",
Tag: "!!int",
NodePath: []string{"spec", "replicas"},
},
},
Expand Down
4 changes: 2 additions & 2 deletions api/internal/generators/configmap_test.go
Expand Up @@ -140,7 +140,7 @@ metadata:
foo: 'bar'
data:
a: x
b: y
b: "y"
c: Hello World
d: "true"
`,
Expand Down Expand Up @@ -181,7 +181,7 @@ metadata:
river: 'Missouri'
data:
a: x
b: y
b: "y"
c: Hello World
d: "true"
immutable: true
Expand Down
8 changes: 7 additions & 1 deletion api/internal/generators/utils.go
Expand Up @@ -83,9 +83,15 @@ func setImmutable(
return nil
}
if opts.Immutable {
if _, err := rn.Pipe(yaml.SetField("immutable", yaml.NewScalarRNode("true"))); err != nil {
n := &yaml.Node{
Kind: yaml.ScalarNode,
Value: "true",
Tag: yaml.NodeTagBool,
}
if _, err := rn.Pipe(yaml.FieldSetter{Name: "immutable", Value: yaml.NewRNode(n)}); err != nil {
return err
}
}

return nil
}
11 changes: 9 additions & 2 deletions cmd/config/internal/commands/run-fns.go
Expand Up @@ -135,9 +135,14 @@ func (r *RunFnRunner) getContainerFunctions(c *cobra.Command, dataItems []string
return nil, err
}
if r.Network {
n := &yaml.Node{
Kind: yaml.ScalarNode,
Value: "true",
Tag: yaml.NodeTagBool,
}
err = fn.PipeE(
yaml.Lookup("container"),
yaml.SetField("network", yaml.NewScalarRNode("true")))
yaml.SetField("network", yaml.NewRNode(n)))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -231,7 +236,9 @@ data: {}
if len(kv) != 2 {
return nil, fmt.Errorf("args must have keys and values separated by =")
}
err := dataField.PipeE(yaml.SetField(kv[0], yaml.NewScalarRNode(kv[1])))
// do not set style since function should determine tag and style
err := dataField.PipeE(
yaml.FieldSetter{Name: kv[0], Value: yaml.NewScalarRNode(kv[1]), OverrideStyle: true})
if err != nil {
return nil, err
}
Expand Down
17 changes: 15 additions & 2 deletions kyaml/fn/framework/command/command_test.go
Expand Up @@ -5,6 +5,7 @@ package command_test

import (
"bytes"
"fmt"
"io/ioutil"
"os"
"path/filepath"
Expand Down Expand Up @@ -66,6 +67,7 @@ ENTRYPOINT ["function"]
func TestCommand_standalone(t *testing.T) {
var config struct {
A string `json:"a" yaml:"a"`
B int `json:"b" yaml:"b"`
}

fn := func(items []*yaml.RNode) ([]*yaml.RNode, error) {
Expand All @@ -83,6 +85,10 @@ metadata:
if err != nil {
return nil, err
}
err = items[i].PipeE(yaml.SetAnnotation("b", fmt.Sprintf("%v", config.B)))
if err != nil {
return nil, err
}
}

return items, nil
Expand All @@ -99,6 +105,7 @@ metadata:
func TestCommand_standalone_stdin(t *testing.T) {
var config struct {
A string `json:"a" yaml:"a"`
B int `json:"b" yaml:"b"`
}

p := &framework.SimpleProcessor{
Expand All @@ -119,6 +126,10 @@ metadata:
if err != nil {
return nil, err
}
err = items[i].PipeE(yaml.SetAnnotation("b", fmt.Sprintf("%v", config.B)))
if err != nil {
return nil, err
}
}

return items, nil
Expand Down Expand Up @@ -150,7 +161,8 @@ metadata:
namespace: default
annotations:
foo: bar1
a: 'b'
a: 'c'
b: '1'
spec:
replicas: 1
---
Expand All @@ -161,6 +173,7 @@ metadata:
namespace: default
annotations:
foo: bar2
a: 'b'
a: 'c'
b: '1'
`), strings.TrimSpace(out.String()))
}
3 changes: 2 additions & 1 deletion kyaml/fn/framework/command/testdata/standalone/config.yaml
Expand Up @@ -3,4 +3,5 @@

apiVersion: example.com/v1alpha1
kind: Foo
a: b
a: c
b: 1
6 changes: 4 additions & 2 deletions kyaml/fn/framework/command/testdata/standalone/expected.yaml
Expand Up @@ -8,7 +8,8 @@ metadata:
namespace: default
annotations:
foo: bar2
a: 'b'
a: 'c'
b: '1'
---
apiVersion: apps/v1
kind: Deployment
Expand All @@ -17,4 +18,5 @@ metadata:
namespace: default
annotations:
foo: bar1
a: 'b'
a: 'c'
b: '1'
7 changes: 6 additions & 1 deletion kyaml/setters2/set.go
Expand Up @@ -479,7 +479,12 @@ func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) {
}

if s.IsSet {
if err := def.PipeE(&yaml.FieldSetter{Name: "isSet", StringValue: "true"}); err != nil {
n := &yaml.Node{
Kind: yaml.ScalarNode,
Value: "true",
Tag: yaml.NodeTagBool,
}
if err := def.PipeE(&yaml.FieldSetter{Name: "isSet", Value: yaml.NewRNode(n)}); err != nil {
return nil, err
}
}
Expand Down
6 changes: 6 additions & 0 deletions kyaml/yaml/fns.go
Expand Up @@ -685,6 +685,12 @@ func (s FieldSetter) Filter(rn *RNode) (*RNode, error) {
s.Value = NewScalarRNode(s.StringValue)
}

// need to set style for strings not recognized by yaml 1.1 to quoted if not previously set
// TODO: fix in upstream yaml library so this can be handled with yaml SetString
if s.Value.IsStringValue() && !s.OverrideStyle && s.Value.YNode().Style == 0 && IsYaml1_1NonString(s.Value.YNode()) {
s.Value.YNode().Style = yaml.DoubleQuotedStyle
}

if s.Name == "" {
if err := ErrorIfInvalid(rn, yaml.ScalarNode); err != nil {
return rn, err
Expand Down
5 changes: 5 additions & 0 deletions kyaml/yaml/rnode.go
Expand Up @@ -248,6 +248,11 @@ func (rn *RNode) IsNilOrEmpty() bool {
IsYNodeZero(rn.YNode())
}

// IsStringValue is true if the RNode is not nil and is scalar string node
func (rn *RNode) IsStringValue() bool {
return !rn.IsNil() && IsYNodeString(rn.YNode())
}

// GetMeta returns the ResourceMeta for an RNode
func (rn *RNode) GetMeta() (ResourceMeta, error) {
if IsMissingOrNull(rn) {
Expand Down

0 comments on commit 7b0ec99

Please sign in to comment.