From edf09b0fd5e978f089d1ead6ef1fe88df9add44a Mon Sep 17 00:00:00 2001 From: Kostiantyn Kalynovskyi Date: Wed, 1 Jul 2020 14:04:54 -0500 Subject: [PATCH] Add Append method to bundle interface This method would allow us to append bundle with new documents Change-Id: I201a2a0f2e7f707556a53495538c0f075ce6fe17 Relates-To: #238 --- pkg/document/bundle.go | 17 +++++++++++++++++ pkg/document/bundle_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/pkg/document/bundle.go b/pkg/document/bundle.go index b64e5b4dd..e54176133 100644 --- a/pkg/document/bundle.go +++ b/pkg/document/bundle.go @@ -18,8 +18,10 @@ import ( "io" "strings" + "sigs.k8s.io/kustomize/api/k8sdeps/kunstruct" "sigs.k8s.io/kustomize/api/krusty" "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" "opendev.org/airship/airshipctl/pkg/environment" @@ -53,6 +55,7 @@ type Bundle interface { GetByAnnotation(annotationSelector string) ([]Document, error) GetByLabel(labelSelector string) ([]Document, error) GetAllDocuments() ([]Document, error) + Append(Document) error } // NewBundleByPath helper function that returns new document.Bundle interface based on clusterType and @@ -338,6 +341,20 @@ func (b *BundleFactory) GetByGvk(group, version, kind string) ([]Document, error return b.Select(selector) } +// Append bundle with the document, this only works with document interface implementation +// that is provided by this package +func (b *BundleFactory) Append(doc Document) error { + yaml, err := doc.AsYAML() + if err != nil { + return err + } + res, err := resource.NewFactory(kunstruct.NewKunstructuredFactoryImpl()).FromBytes(yaml) + if err != nil { + return nil + } + return b.ResMap.Append(res) +} + // Write will write out the entire bundle resource map func (b *BundleFactory) Write(out io.Writer) error { for _, res := range b.ResMap.Resources() { diff --git a/pkg/document/bundle_test.go b/pkg/document/bundle_test.go index b59e239b6..287f3181f 100644 --- a/pkg/document/bundle_test.go +++ b/pkg/document/bundle_test.go @@ -151,6 +151,30 @@ func TestBundleDocumentFiltering(t *testing.T) { // obviously, this should be improved assert.Contains(b.String(), "workflow-controller") }) + + t.Run("BundleAppend", func(t *testing.T) { + doc, err := document.NewDocumentFromBytes([]byte(`apiVersion: v1 +kind: Secret +metadata: + name: append-secret + namespace: metal3 +type: Opaque +stringData: + username: append-username + password: append-password`)) + require.NoError(err) + err = bundle.Append(doc) + require.NoError(err) + secretDoc, err := bundle.SelectOne(document.NewSelector().ByKind("Secret").ByName("append-secret")) + require.NoError(err) + require.NotNil(t, secretDoc) + password, err := secretDoc.GetString("stringData.password") + require.NoError(err) + username, err := secretDoc.GetString("stringData.username") + require.NoError(err) + assert.Equal(password, "append-password") + assert.Equal(username, "append-username") + }) } func TestBundleOrder(t *testing.T) {