Retain element ordering when merge resources

This commit is contained in:
Phillip Wittrock
2020-11-12 08:29:07 -08:00
parent 1c009ca217
commit 5557e1ff3c
2 changed files with 121 additions and 1 deletions

View File

@@ -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 {

View 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()
}
}