From 934e036b99355376ee29fafb8dd816b777f765b0 Mon Sep 17 00:00:00 2001 From: Jerome Brette Date: Tue, 18 Jun 2019 14:51:09 -0500 Subject: [PATCH] Attempting to patch K8s objects across different namespaces. - Return an error when findTarget fails. - Add unit test testing the change. --- k8sdeps/transformer/patch/transformer.go | 3 + k8sdeps/transformer/patch/transformer_test.go | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/k8sdeps/transformer/patch/transformer.go b/k8sdeps/transformer/patch/transformer.go index a554fe68d..ba402149b 100644 --- a/k8sdeps/transformer/patch/transformer.go +++ b/k8sdeps/transformer/patch/transformer.go @@ -45,6 +45,9 @@ func (tf *transformer) Transform(m resmap.ResMap) error { } for _, patch := range patches.Resources() { target, err := tf.findPatchTarget(m, patch.OrgId()) + if err != nil { + return err + } merged := map[string]interface{}{} versionedObj, err := scheme.Scheme.New( toSchemaGvk(patch.OrgId().Gvk)) diff --git a/k8sdeps/transformer/patch/transformer_test.go b/k8sdeps/transformer/patch/transformer_test.go index a21e2b054..aa3541c3e 100644 --- a/k8sdeps/transformer/patch/transformer_test.go +++ b/k8sdeps/transformer/patch/transformer_test.go @@ -326,6 +326,65 @@ func TestMultiplePatchesWithConflict(t *testing.T) { } } +func TestPatchesWithWrongNamespace(t *testing.T) { + base := resmaptest_test.NewRmBuilder(t, rf). + Add(map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "deploy1", + "namespace": "namespace1", + }, + "spec": map[string]interface{}{ + "template": map[string]interface{}{ + "spec": map[string]interface{}{ + "containers": []interface{}{ + map[string]interface{}{ + "name": "nginx", + "image": "nginx", + }, + }, + }, + }, + }, + }).ResMap() + + patch := []*resource.Resource{ + rf.FromMap(map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "deploy1", + "namespace": "namespace2", + }, + "spec": map[string]interface{}{ + "template": map[string]interface{}{ + "spec": map[string]interface{}{ + "containers": []interface{}{ + map[string]interface{}{ + "name": "nginx", + "image": "nginx:1.7.9", + }, + }, + }, + }, + }, + }), + } + + lt, err := NewTransformer(patch, rf) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + err = lt.Transform(base) + if err == nil { + t.Fatalf("did not get expected error") + } + if !strings.Contains(err.Error(), "failed to find target for patch") { + t.Fatalf("expected error to contain %q but get %v", "failed to find target for patch", err) + } +} + func TestNoSchemaOverlayRun(t *testing.T) { base := resmaptest_test.NewRmBuilder(t, rf). Add(map[string]interface{}{