diff --git a/pkg/app/application_test.go b/pkg/app/application_test.go index 854dd1ac9..555f38111 100644 --- a/pkg/app/application_test.go +++ b/pkg/app/application_test.go @@ -91,7 +91,7 @@ var svc = schema.GroupVersionKind{Version: "v1", Kind: "Service"} func TestResources1(t *testing.T) { expected := resmap.ResMap{ - resource.NewResIdWithPrefix(deploy, "dply1", "foo-"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(deploy, "dply1", "foo-", "ns1"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "apps/v1", "kind": "Deployment", @@ -123,7 +123,7 @@ func TestResources1(t *testing.T) { }, }, }), - resource.NewResIdWithPrefix(cmap, "literalConfigMap", "foo-"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(cmap, "literalConfigMap", "foo-", "ns1"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "ConfigMap", @@ -143,7 +143,7 @@ func TestResources1(t *testing.T) { "DB_PASSWORD": "somepw", }, }).SetBehavior(resource.BehaviorCreate), - resource.NewResIdWithPrefix(secret, "secret", "foo-"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(secret, "secret", "foo-", "ns1"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "Secret", @@ -164,7 +164,7 @@ func TestResources1(t *testing.T) { "DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")), }, }).SetBehavior(resource.BehaviorCreate), - resource.NewResIdWithPrefix(ns, "ns1", "foo-"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(ns, "ns1", "foo-", ""): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "Namespace", diff --git a/pkg/resource/resid.go b/pkg/resource/resid.go index 00c2f35cc..5104a81cd 100644 --- a/pkg/resource/resid.go +++ b/pkg/resource/resid.go @@ -32,6 +32,15 @@ type ResId struct { // an untransformed resource has no prefix, fully transformed resource has an arbitrary number of prefixes // concatenated together. prefix string + // namespace the resource belongs to + // an untransformed resource has no namespace, fully transformed resource has the namespace from + // the top most overlay + namespace string +} + +// NewResIdWithPrefixNamespace creates new resource identifier with a prefix and a namespace +func NewResIdWithPrefixNamespace(g schema.GroupVersionKind, n, p, ns string) ResId { + return ResId{gvk: g, name: n, prefix: p, namespace: ns} } // NewResIdWithPrefix creates new resource identifier with a prefix @@ -46,7 +55,7 @@ func NewResId(g schema.GroupVersionKind, n string) ResId { // String of ResId based on GVK, name and prefix func (n ResId) String() string { - fields := []string{n.gvk.Group, n.gvk.Version, n.gvk.Kind, n.prefix, n.name} + fields := []string{n.gvk.Group, n.gvk.Version, n.gvk.Kind, n.namespace, n.prefix, n.name} return strings.Join(fields, "_") + ".yaml" } @@ -81,7 +90,17 @@ func (n ResId) Prefix() string { return n.prefix } +// Namespace returns resource namespace. +func (n ResId) Namespace() string { + return n.namespace +} + // CopyWithNewPrefix make a new copy from current ResId and append a new prefix func (n ResId) CopyWithNewPrefix(p string) ResId { - return ResId{gvk: n.gvk, name: n.name, prefix: p + n.prefix} + return ResId{gvk: n.gvk, name: n.name, prefix: p + n.prefix, namespace: n.namespace} +} + +// CopyWithNewNamespace make a new copy from current ResId and set a new namespace +func (n ResId) CopyWithNewNamespace(ns string) ResId { + return ResId{gvk: n.gvk, name: n.name, prefix: n.prefix, namespace: ns} } diff --git a/pkg/transformers/namespace.go b/pkg/transformers/namespace.go index f15273bdc..6efa46792 100644 --- a/pkg/transformers/namespace.go +++ b/pkg/transformers/namespace.go @@ -77,17 +77,21 @@ func (o *namespaceTransformer) Transform(m resmap.ResMap) error { mf := resmap.ResMap{} for id := range m { - mf[id] = m[id] + found := false for _, path := range o.skipPathConfigs { if selectByGVK(id.Gvk(), path.GroupVersionKind) { - delete(mf, id) + found = true break } } + if !found { + mf[id] = m[id] + delete(m, id) + } } for id := range mf { - objMap := m[id].UnstructuredContent() + objMap := mf[id].UnstructuredContent() for _, path := range o.pathConfigs { if !selectByGVK(id.Gvk(), path.GroupVersionKind) { continue @@ -99,6 +103,8 @@ func (o *namespaceTransformer) Transform(m resmap.ResMap) error { if err != nil { return err } + newid := id.CopyWithNewNamespace(o.namespace) + m[newid] = mf[id] } } diff --git a/pkg/transformers/namespace_test.go b/pkg/transformers/namespace_test.go index df23278f5..a76887a8d 100644 --- a/pkg/transformers/namespace_test.go +++ b/pkg/transformers/namespace_test.go @@ -104,7 +104,7 @@ func TestNamespaceRun(t *testing.T) { }), } expected := resmap.ResMap{ - resource.NewResId(ns, "ns1"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(ns, "ns1", "", ""): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "Namespace", @@ -112,7 +112,7 @@ func TestNamespaceRun(t *testing.T) { "name": "ns1", }, }), - resource.NewResId(cmap, "cm1"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(cmap, "cm1", "", "test"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "ConfigMap", @@ -121,7 +121,7 @@ func TestNamespaceRun(t *testing.T) { "namespace": "test", }, }), - resource.NewResId(cmap, "cm2"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(cmap, "cm2", "", "test"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "ConfigMap", @@ -130,7 +130,7 @@ func TestNamespaceRun(t *testing.T) { "namespace": "test", }, }), - resource.NewResId(sa, "default"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(sa, "default", "", "test"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "ServiceAccount", @@ -139,7 +139,7 @@ func TestNamespaceRun(t *testing.T) { "namespace": "test", }, }), - resource.NewResId(sa, "service-account"): resource.NewResourceFromMap( + resource.NewResIdWithPrefixNamespace(sa, "service-account", "", "test"): resource.NewResourceFromMap( map[string]interface{}{ "apiVersion": "v1", "kind": "ServiceAccount",