mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
Retain element ordering when merge resources
This commit is contained in:
@@ -41,6 +41,8 @@ func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
|
||||
// index the Resources by G/V/K/NS/N
|
||||
index := map[mergeKey][]*yaml.RNode{}
|
||||
// retain the original ordering
|
||||
var order []mergeKey
|
||||
for i := range input {
|
||||
meta, err := input[i].GetMeta()
|
||||
if err != nil {
|
||||
@@ -52,13 +54,16 @@ func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
namespace: meta.Namespace,
|
||||
name: meta.Name,
|
||||
}
|
||||
if _, found := index[key]; !found {
|
||||
order = append(order, key)
|
||||
}
|
||||
index[key] = append(index[key], input[i])
|
||||
}
|
||||
|
||||
// merge each of the G/V/K/NS/N lists
|
||||
var output []*yaml.RNode
|
||||
var err error
|
||||
for k := range index {
|
||||
for _, k := range order {
|
||||
var merged *yaml.RNode
|
||||
resources := index[k]
|
||||
for i := range resources {
|
||||
|
||||
115
kyaml/kio/filters/merge_test.go
Normal file
115
kyaml/kio/filters/merge_test.go
Normal file
@@ -0,0 +1,115 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio/filters"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
// TestMerge_Merge_order tests that the original order of elements
|
||||
// retained after merge
|
||||
func TestMerge_Merge_order(t *testing.T) {
|
||||
r1, err := yaml.Parse(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-1
|
||||
namespace: bar-1
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
`)
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
r2, err := yaml.Parse(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-2
|
||||
namespace: bar-2
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
`)
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
var b bytes.Buffer
|
||||
err = kio.Pipeline{
|
||||
Inputs: []kio.Reader{&kio.PackageBuffer{Nodes: []*yaml.RNode{r1, r2}}},
|
||||
Filters: []kio.Filter{filters.MatchFilter{}},
|
||||
Outputs: []kio.Writer{&kio.ByteWriter{Writer: &b}},
|
||||
}.Execute()
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
expected := strings.TrimSpace(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-1
|
||||
namespace: bar-1
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-2
|
||||
namespace: bar-2
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
`)
|
||||
|
||||
if !assert.Equal(t, expected, strings.TrimSpace(b.String())) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
b.Reset()
|
||||
err = kio.Pipeline{
|
||||
Inputs: []kio.Reader{&kio.PackageBuffer{Nodes: []*yaml.RNode{r2, r1}}},
|
||||
Filters: []kio.Filter{filters.MatchFilter{}},
|
||||
Outputs: []kio.Writer{&kio.ByteWriter{Writer: &b}},
|
||||
}.Execute()
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
expected = strings.TrimSpace(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-2
|
||||
namespace: bar-2
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: foo-1
|
||||
namespace: bar-1
|
||||
spec:
|
||||
template:
|
||||
spec: {}
|
||||
`)
|
||||
|
||||
if !assert.Equal(t, expected, strings.TrimSpace(b.String())) {
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user