From cdce6f49c116a381d1f8160f785fe2dc04199aaa Mon Sep 17 00:00:00 2001 From: Adil Fulara Date: Sun, 21 Aug 2022 14:22:31 -0700 Subject: [PATCH] Issue-4292: ConfigMaps items are generated with random order - Maintain input order of entries read from the KvPairSources Signed-off-by: Adil Fulara --- api/internal/generators/configmap.go | 4 ++-- api/internal/generators/configmap_test.go | 2 +- api/internal/generators/secret.go | 4 ++-- api/internal/generators/secret_test.go | 2 +- api/internal/generators/utils.go | 13 ++++++++----- kyaml/yaml/datamap.go | 16 ++++++++++++---- kyaml/yaml/rnode.go | 2 +- 7 files changed, 27 insertions(+), 16 deletions(-) diff --git a/api/internal/generators/configmap.go b/api/internal/generators/configmap.go index 47498aaa58..3e48e87b7d 100644 --- a/api/internal/generators/configmap.go +++ b/api/internal/generators/configmap.go @@ -33,11 +33,11 @@ func MakeConfigMap( if err != nil { return nil, err } - m, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) + m, o, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) if err != nil { return nil, err } - if err = rn.LoadMapIntoConfigMapData(m); err != nil { + if err = rn.LoadMapIntoConfigMapData(m, o); err != nil { return nil, err } err = copyLabelsAndAnnotations(rn, args.Options) diff --git a/api/internal/generators/configmap_test.go b/api/internal/generators/configmap_test.go index 8551963a4e..03b41957cf 100644 --- a/api/internal/generators/configmap_test.go +++ b/api/internal/generators/configmap_test.go @@ -59,8 +59,8 @@ kind: ConfigMap metadata: name: envConfigMap data: - DB_PASSWORD: qwerty DB_USERNAME: admin + DB_PASSWORD: qwerty `, }, }, diff --git a/api/internal/generators/secret.go b/api/internal/generators/secret.go index 9afaff156a..fcd99a6b1c 100644 --- a/api/internal/generators/secret.go +++ b/api/internal/generators/secret.go @@ -46,11 +46,11 @@ func MakeSecret( Value: yaml.NewStringRNode(t)}); err != nil { return nil, err } - m, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) + m, o, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) if err != nil { return nil, err } - if err = rn.LoadMapIntoSecretData(m); err != nil { + if err = rn.LoadMapIntoSecretData(m, o); err != nil { return nil, err } copyLabelsAndAnnotations(rn, args.Options) diff --git a/api/internal/generators/secret_test.go b/api/internal/generators/secret_test.go index 04829531eb..091281bea2 100644 --- a/api/internal/generators/secret_test.go +++ b/api/internal/generators/secret_test.go @@ -44,8 +44,8 @@ metadata: name: envSecret type: Opaque data: - DB_PASSWORD: cXdlcnR5 DB_USERNAME: YWRtaW4= + DB_PASSWORD: cXdlcnR5 `, }, }, diff --git a/api/internal/generators/utils.go b/api/internal/generators/utils.go index d6ea5fbf00..30d48275fb 100644 --- a/api/internal/generators/utils.go +++ b/api/internal/generators/utils.go @@ -34,25 +34,28 @@ kind: %s return rn, nil } +// Fetches data from types.KvPairSources and returns key value pairs along and order of keys read. func makeValidatedDataMap( - ldr ifc.KvLoader, name string, sources types.KvPairSources) (map[string]string, error) { + ldr ifc.KvLoader, name string, sources types.KvPairSources) (map[string]string, []string, error) { pairs, err := ldr.Load(sources) if err != nil { - return nil, errors.WrapPrefix(err, "loading KV pairs", 0) + return nil, nil, errors.WrapPrefix(err, "loading KV pairs", 0) } knownKeys := make(map[string]string) + keysOrder := make([]string, 0) for _, p := range pairs { // legal key: alphanumeric characters, '-', '_' or '.' if err := ldr.Validator().ErrIfInvalidKey(p.Key); err != nil { - return nil, err + return nil, nil, err } if _, ok := knownKeys[p.Key]; ok { - return nil, errors.Errorf( + return nil, nil, errors.Errorf( "configmap %s illegally repeats the key `%s`", name, p.Key) } knownKeys[p.Key] = p.Value + keysOrder = append(keysOrder, p.Key) } - return knownKeys, nil + return knownKeys, keysOrder, nil } // copyLabelsAndAnnotations copies labels and annotations from diff --git a/kyaml/yaml/datamap.go b/kyaml/yaml/datamap.go index f4b7e6664e..42dc10e422 100644 --- a/kyaml/yaml/datamap.go +++ b/kyaml/yaml/datamap.go @@ -23,8 +23,12 @@ func SortedMapKeys(m map[string]string) []string { return keys } -func (rn *RNode) LoadMapIntoConfigMapData(m map[string]string) error { - for _, k := range SortedMapKeys(m) { +func (rn *RNode) LoadMapIntoConfigMapData(m map[string]string, o []string) error { + keys := o + if o == nil { + keys = SortedMapKeys(m) + } + for _, k := range keys { fldName, vrN := makeConfigMapValueRNode(m[k]) if _, err := rn.Pipe( LookupCreate(MappingNode, fldName), @@ -65,12 +69,16 @@ func makeConfigMapValueRNode(s string) (field string, rN *RNode) { return field, NewRNode(yN) } -func (rn *RNode) LoadMapIntoSecretData(m map[string]string) error { +func (rn *RNode) LoadMapIntoSecretData(m map[string]string, o []string) error { mapNode, err := rn.Pipe(LookupCreate(MappingNode, DataField)) if err != nil { return err } - for _, k := range SortedMapKeys(m) { + keys := o + if keys == nil { + keys = SortedMapKeys(m) + } + for _, k := range keys { vrN := makeSecretValueRNode(m[k]) if _, err := mapNode.Pipe(SetField(k, vrN)); err != nil { return err diff --git a/kyaml/yaml/rnode.go b/kyaml/yaml/rnode.go index 01b2ef6dad..c0c8472d70 100644 --- a/kyaml/yaml/rnode.go +++ b/kyaml/yaml/rnode.go @@ -633,7 +633,7 @@ func (rn *RNode) SetDataMap(m map[string]string) { if len(m) == 0 { return } - if err := rn.LoadMapIntoConfigMapData(m); err != nil { + if err := rn.LoadMapIntoConfigMapData(m, nil); err != nil { log.Fatal(err) } }