From dd72ea1e6a5949d58053f283786a71c2791ee68e Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Thu, 11 Feb 2021 13:33:16 -0800 Subject: [PATCH 1/2] add functions for binaryData --- kyaml/yaml/datamap.go | 14 ++++++++++++++ kyaml/yaml/rnode.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/kyaml/yaml/datamap.go b/kyaml/yaml/datamap.go index 3181ff30f..f4b7e6664 100644 --- a/kyaml/yaml/datamap.go +++ b/kyaml/yaml/datamap.go @@ -35,6 +35,20 @@ func (rn *RNode) LoadMapIntoConfigMapData(m map[string]string) error { return nil } +func (rn *RNode) LoadMapIntoConfigMapBinaryData(m map[string]string) error { + for _, k := range SortedMapKeys(m) { + _, vrN := makeConfigMapValueRNode(m[k]) + // we know this is binary data + fldName := BinaryDataField + if _, err := rn.Pipe( + LookupCreate(MappingNode, fldName), + SetField(k, vrN)); err != nil { + return err + } + } + return nil +} + func makeConfigMapValueRNode(s string) (field string, rN *RNode) { yN := &Node{Kind: ScalarNode} yN.Tag = NodeTagString diff --git a/kyaml/yaml/rnode.go b/kyaml/yaml/rnode.go index f0e001cfe..d317bb5c4 100644 --- a/kyaml/yaml/rnode.go +++ b/kyaml/yaml/rnode.go @@ -434,6 +434,19 @@ func (rn *RNode) GetDataMap() map[string]string { return result } +func (rn *RNode) GetBinaryDataMap() map[string]string { + n, err := rn.Pipe(Lookup(BinaryDataField)) + if err != nil { + return nil + } + result := map[string]string{} + _ = n.VisitFields(func(node *MapNode) error { + result[GetValue(node.Key)] = GetValue(node.Value) + return nil + }) + return result +} + func (rn *RNode) SetDataMap(m map[string]string) { if rn == nil { log.Fatal("cannot set data map on nil Rnode") @@ -449,6 +462,21 @@ func (rn *RNode) SetDataMap(m map[string]string) { } } +func (rn *RNode) SetBinaryDataMap(m map[string]string) { + if rn == nil { + log.Fatal("cannot set binaryData map on nil Rnode") + } + if err := rn.PipeE(Clear(BinaryDataField)); err != nil { + log.Fatal(err) + } + if len(m) == 0 { + return + } + if err := rn.LoadMapIntoConfigMapBinaryData(m); err != nil { + log.Fatal(err) + } +} + // AppendToFieldPath appends a field name to the FieldPath. func (rn *RNode) AppendToFieldPath(parts ...string) { rn.fieldPath = append(rn.fieldPath, parts...) From 6518393f5d0e2c6dced984ee377bc8ff1fa71911 Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Thu, 11 Feb 2021 13:33:28 -0800 Subject: [PATCH 2/2] support binaryData merge --- api/ifc/ifc.go | 5 ++++ api/internal/wrappy/wnode.go | 10 +++++++ api/krusty/configmaps_test.go | 49 +++++++++++++++++++++++++++++++++++ api/resmap/reswrangler.go | 1 + api/resource/resource.go | 12 +++++++++ 5 files changed, 77 insertions(+) diff --git a/api/ifc/ifc.go b/api/ifc/ifc.go index e4321b5a6..d13043e3a 100644 --- a/api/ifc/ifc.go +++ b/api/ifc/ifc.go @@ -49,6 +49,9 @@ type Kunstructured interface { // GetData returns a top-level "data" field, as in a ConfigMap. GetDataMap() map[string]string + // GetData returns a top-level "binaryData" field, as in a ConfigMap. + GetBinaryDataMap() map[string]string + // Used by ResAccumulator and ReplacementTransformer. GetFieldValue(string) (interface{}, error) @@ -90,6 +93,8 @@ type Kunstructured interface { // SetDataMap sets a top-level "data" field, as in a ConfigMap. SetDataMap(map[string]string) + // SetDataMap sets a top-level "binaryData" field, as in a ConfigMap. + SetBinaryDataMap(map[string]string) // Used by PatchStrategicMergeTransformer. SetGvk(resid.Gvk) diff --git a/api/internal/wrappy/wnode.go b/api/internal/wrappy/wnode.go index cf8626e21..3459f0302 100644 --- a/api/internal/wrappy/wnode.go +++ b/api/internal/wrappy/wnode.go @@ -170,6 +170,16 @@ func (wn *WNode) SetDataMap(m map[string]string) { wn.node.SetDataMap(m) } +// GetBinaryDataMap implements ifc.Kunstructured. +func (wn *WNode) GetBinaryDataMap() map[string]string { + return wn.node.GetBinaryDataMap() +} + +// SetBinaryDataMap implements ifc.Kunstructured. +func (wn *WNode) SetBinaryDataMap(m map[string]string) { + wn.node.SetBinaryDataMap(m) +} + // GetKind implements ifc.Kunstructured. func (wn *WNode) GetKind() string { return wn.demandMetaData("GetKind").Kind diff --git a/api/krusty/configmaps_test.go b/api/krusty/configmaps_test.go index 076a29931..888288970 100644 --- a/api/krusty/configmaps_test.go +++ b/api/krusty/configmaps_test.go @@ -345,6 +345,55 @@ metadata: `) } +var binaryHello = []byte{ + 0xff, // non-utf8 + 0x68, // h + 0x65, // e + 0x6c, // l + 0x6c, // l + 0x6f, // o +} + +func manyHellos(count int) (result []byte) { + for i := 0; i < count; i++ { + result = append(result, binaryHello...) + } + return +} + +func TestGeneratorOverlaysBinaryData(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteF("/app/base/data.bin", string(manyHellos(30))) + th.WriteK("/app/base", ` +namePrefix: p1- +configMapGenerator: +- name: com1 + behavior: create + files: + - data.bin +`) + th.WriteK("/app/overlay", ` +resources: +- ../base +configMapGenerator: +- name: com1 + behavior: merge +`) + m := th.Run("/app/overlay", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: v1 +binaryData: + data.bin: | + /2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbG + xv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hl + bGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv/2 + hlbGxv/2hlbGxv/2hlbGxv/2hlbGxv +kind: ConfigMap +metadata: + name: p1-com1-96gmmt6gt5 +`) +} + func TestGeneratorOverlays(t *testing.T) { th := kusttest_test.MakeHarness(t) th.WriteK("/app/base1", ` diff --git a/api/resmap/reswrangler.go b/api/resmap/reswrangler.go index dceba29ad..e803488d5 100644 --- a/api/resmap/reswrangler.go +++ b/api/resmap/reswrangler.go @@ -489,6 +489,7 @@ func (m *resWrangler) appendReplaceOrMerge(res *resource.Resource) error { case types.BehaviorMerge: res.CopyMergeMetaDataFieldsFrom(old) res.MergeDataMapFrom(old) + res.MergeBinaryDataMapFrom(old) default: return fmt.Errorf( "id %#v exists; behavior must be merge or replace", id) diff --git a/api/resource/resource.go b/api/resource/resource.go index 53a62dffd..5d545e780 100644 --- a/api/resource/resource.go +++ b/api/resource/resource.go @@ -70,6 +70,10 @@ func (r *Resource) GetDataMap() map[string]string { return r.kunStr.GetDataMap() } +func (r *Resource) GetBinaryDataMap() map[string]string { + return r.kunStr.GetBinaryDataMap() +} + func (r *Resource) GetGvk() resid.Gvk { return r.kunStr.GetGvk() } @@ -127,6 +131,10 @@ func (r *Resource) SetDataMap(m map[string]string) { r.kunStr.SetDataMap(m) } +func (r *Resource) SetBinaryDataMap(m map[string]string) { + r.kunStr.SetBinaryDataMap(m) +} + func (r *Resource) SetGvk(gvk resid.Gvk) { r.kunStr.SetGvk(gvk) } @@ -196,6 +204,10 @@ func (r *Resource) MergeDataMapFrom(o *Resource) { r.SetDataMap(mergeStringMaps(o.GetDataMap(), r.GetDataMap())) } +func (r *Resource) MergeBinaryDataMapFrom(o *Resource) { + r.SetBinaryDataMap(mergeStringMaps(o.GetBinaryDataMap(), r.GetBinaryDataMap())) +} + func (r *Resource) ErrIfNotEquals(o *Resource) error { meYaml, err := r.AsYAML() if err != nil {