mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-13 18:10:59 +00:00
Merge pull request #3433 from monopole/anotherTowards3412
Improve handling of empty resource maps.
This commit is contained in:
@@ -15,6 +15,7 @@ type Filter struct {
|
|||||||
|
|
||||||
var _ kio.Filter = Filter{}
|
var _ kio.Filter = Filter{}
|
||||||
|
|
||||||
|
// Filter does a strategic merge patch, which can delete nodes.
|
||||||
func (pf Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
func (pf Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||||
var result []*yaml.RNode
|
var result []*yaml.RNode
|
||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
|
|||||||
@@ -163,12 +163,7 @@ func (wn *WNode) GetString(path string) (string, error) {
|
|||||||
|
|
||||||
// Map implements ifc.Kunstructured.
|
// Map implements ifc.Kunstructured.
|
||||||
func (wn *WNode) Map() map[string]interface{} {
|
func (wn *WNode) Map() map[string]interface{} {
|
||||||
var result map[string]interface{}
|
return wn.node.Map()
|
||||||
if err := wn.node.YNode().Decode(&result); err != nil {
|
|
||||||
// Log and die since interface doesn't allow error.
|
|
||||||
log.Fatalf("failed to decode ynode: %v", err)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON implements ifc.Kunstructured.
|
// MarshalJSON implements ifc.Kunstructured.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"sigs.k8s.io/kustomize/api/resid"
|
"sigs.k8s.io/kustomize/api/resid"
|
||||||
kyaml "sigs.k8s.io/kustomize/kyaml/yaml"
|
kyaml "sigs.k8s.io/kustomize/kyaml/yaml"
|
||||||
@@ -480,6 +481,10 @@ func TestGetSlice(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMapEmpty(t *testing.T) {
|
||||||
|
assert.Equal(t, 0, len(NewWNode().Map()))
|
||||||
|
}
|
||||||
|
|
||||||
func TestMap(t *testing.T) {
|
func TestMap(t *testing.T) {
|
||||||
wn := NewWNode()
|
wn := NewWNode()
|
||||||
if err := wn.UnmarshalJSON([]byte(deploymentLittleJson)); err != nil {
|
if err := wn.UnmarshalJSON([]byte(deploymentLittleJson)); err != nil {
|
||||||
|
|||||||
@@ -1100,18 +1100,21 @@ $patch: delete
|
|||||||
finalMapSize: 0,
|
finalMapSize: 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for name, test := range tests {
|
for name := range tests {
|
||||||
|
tc := tests[name]
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
m, err := rmF.NewResMapFromBytes([]byte(target))
|
m, err := rmF.NewResMapFromBytes([]byte(target))
|
||||||
assert.NoError(t, err, name)
|
assert.NoError(t, err, name)
|
||||||
idSet := resource.MakeIdSet(m.Resources())
|
idSet := resource.MakeIdSet(m.Resources())
|
||||||
assert.Equal(t, 1, idSet.Size(), name)
|
assert.Equal(t, 1, idSet.Size(), name)
|
||||||
p, err := rf.FromBytes([]byte(test.patch))
|
p, err := rf.FromBytes([]byte(tc.patch))
|
||||||
assert.NoError(t, err, name)
|
assert.NoError(t, err, name)
|
||||||
assert.NoError(t, m.ApplySmPatch(idSet, p), name)
|
assert.NoError(t, m.ApplySmPatch(idSet, p), name)
|
||||||
assert.Equal(t, test.finalMapSize, m.Size(), name)
|
assert.Equal(t, tc.finalMapSize, m.Size(), name)
|
||||||
yml, err := m.AsYaml()
|
yml, err := m.AsYaml()
|
||||||
assert.NoError(t, err, name)
|
assert.NoError(t, err, name)
|
||||||
assert.Equal(t, test.expected, string(yml), name)
|
assert.Equal(t, tc.expected, string(yml), name)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -423,9 +423,12 @@ func (r *Resource) ApplySmPatch(patch *Resource) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
n, ns := r.GetName(), r.GetNamespace()
|
n, ns := r.GetName(), r.GetNamespace()
|
||||||
r.ApplyFilter(patchstrategicmerge.Filter{
|
err = r.ApplyFilter(patchstrategicmerge.Filter{
|
||||||
Patch: node,
|
Patch: node,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if !r.IsEmpty() {
|
if !r.IsEmpty() {
|
||||||
r.SetName(n)
|
r.SetName(n)
|
||||||
r.SetNamespace(ns)
|
r.SetNamespace(ns)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ require (
|
|||||||
github.com/go-openapi/spec v0.19.5
|
github.com/go-openapi/spec v0.19.5
|
||||||
github.com/go-openapi/strfmt v0.19.5
|
github.com/go-openapi/strfmt v0.19.5
|
||||||
github.com/go-openapi/validate v0.19.8
|
github.com/go-openapi/validate v0.19.8
|
||||||
|
github.com/google/go-cmp v0.3.0
|
||||||
github.com/markbates/pkger v0.17.1
|
github.com/markbates/pkger v0.17.1
|
||||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00
|
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00
|
||||||
github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d
|
github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d
|
||||||
|
|||||||
@@ -785,6 +785,19 @@ func FromMap(m map[string]interface{}) (*RNode, error) {
|
|||||||
return Parse(string(c))
|
return Parse(string(c))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rn *RNode) Map() map[string]interface{} {
|
||||||
|
if rn == nil || rn.value == nil {
|
||||||
|
return make(map[string]interface{})
|
||||||
|
}
|
||||||
|
var result map[string]interface{}
|
||||||
|
if err := rn.value.Decode(&result); err != nil {
|
||||||
|
// Should not be able to create an RNode that cannot be decoded;
|
||||||
|
// this is an unrecoverable error.
|
||||||
|
log.Fatalf("failed to decode ynode: %v", err)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// ConvertJSONToYamlNode parses input json string and returns equivalent yaml node
|
// ConvertJSONToYamlNode parses input json string and returns equivalent yaml node
|
||||||
func ConvertJSONToYamlNode(jsonStr string) (*RNode, error) {
|
func ConvertJSONToYamlNode(jsonStr string) (*RNode, error) {
|
||||||
var body map[string]interface{}
|
var body map[string]interface{}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -384,6 +385,38 @@ func TestRNodeGetValidatedMetadata(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRNodeMapEmpty(t *testing.T) {
|
||||||
|
assert.Equal(t, 0, len(NewRNode(nil).Map()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRNodeMap(t *testing.T) {
|
||||||
|
wn := NewRNode(nil)
|
||||||
|
if err := wn.UnmarshalJSON([]byte(`{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"name": "homer",
|
||||||
|
"namespace": "simpsons"
|
||||||
|
}
|
||||||
|
}`)); err != nil {
|
||||||
|
t.Fatalf("unexpected unmarshaljson err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := map[string]interface{}{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": map[string]interface{}{
|
||||||
|
"name": "homer",
|
||||||
|
"namespace": "simpsons",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := wn.Map()
|
||||||
|
if diff := cmp.Diff(expected, actual); diff != "" {
|
||||||
|
t.Fatalf("actual map does not deep equal expected map:\n%v", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRNodeFromMap(t *testing.T) {
|
func TestRNodeFromMap(t *testing.T) {
|
||||||
testConfigMap := map[string]interface{}{
|
testConfigMap := map[string]interface{}{
|
||||||
"apiVersion": "v1",
|
"apiVersion": "v1",
|
||||||
|
|||||||
Reference in New Issue
Block a user