Skip to content

Commit 18a2321

Browse files
authored
Merge pull request #500 from Liujingfang1/namespace
create namespace resource if not found
2 parents 368b7f3 + a5f0d45 commit 18a2321

3 files changed

Lines changed: 59 additions & 8 deletions

File tree

pkg/target/kusttarget.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ func (kt *KustTarget) newTransformer(patches []*resource.Resource) (transformers
275275
}
276276
r = append(r, t)
277277
r = append(r, transformers.NewNamespaceTransformer(
278-
string(kt.kustomization.Namespace), kt.tcfg.NameSpace))
278+
string(kt.kustomization.Namespace), kt.tcfg.NameSpace, kt.rf.RF()))
279279
t, err = transformers.NewNamePrefixTransformer(
280280
string(kt.kustomization.NamePrefix), kt.tcfg.NamePrefix)
281281
if err != nil {

pkg/transformers/namespace.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ package transformers
1818

1919
import (
2020
"sigs.k8s.io/kustomize/pkg/gvk"
21+
"sigs.k8s.io/kustomize/pkg/resid"
2122
"sigs.k8s.io/kustomize/pkg/resmap"
23+
"sigs.k8s.io/kustomize/pkg/resource"
2224
"sigs.k8s.io/kustomize/pkg/transformers/config"
2325
)
2426

2527
type namespaceTransformer struct {
2628
namespace string
2729
fieldSpecsToUse []config.FieldSpec
2830
fieldSpecsToSkip []config.FieldSpec
31+
factory *resource.Factory
2932
}
3033

3134
var _ Transformer = &namespaceTransformer{}
3235

3336
// NewNamespaceTransformer construct a namespaceTransformer.
34-
func NewNamespaceTransformer(ns string, cf []config.FieldSpec) Transformer {
37+
func NewNamespaceTransformer(ns string, cf []config.FieldSpec, f *resource.Factory) Transformer {
3538
if len(ns) == 0 {
3639
return NewNoOpTransformer()
3740
}
@@ -43,11 +46,13 @@ func NewNamespaceTransformer(ns string, cf []config.FieldSpec) Transformer {
4346
namespace: ns,
4447
fieldSpecsToUse: cf,
4548
fieldSpecsToSkip: skip,
49+
factory: f,
4650
}
4751
}
4852

4953
// Transform adds the namespace.
5054
func (o *namespaceTransformer) Transform(m resmap.ResMap) error {
55+
o.createNamespaceIfNotFound(m)
5156
mf := resmap.ResMap{}
5257

5358
for id := range m {
@@ -119,3 +124,22 @@ func (o *namespaceTransformer) updateClusterRoleBinding(m resmap.ResMap) {
119124
objMap["subjects"] = subjects
120125
}
121126
}
127+
128+
func (o *namespaceTransformer) createNamespaceIfNotFound(m resmap.ResMap) {
129+
id := resid.NewResId(gvk.Gvk{
130+
Version: "v1",
131+
Kind: "Namespace",
132+
}, o.namespace)
133+
ids := m.FindByGVKN(id)
134+
if len(ids) == 0 {
135+
m[id] = o.factory.FromMap(
136+
map[string]interface{}{
137+
"apiVersion": "v1",
138+
"kind": "Namespace",
139+
"metadata": map[string]interface{}{
140+
"name": o.namespace,
141+
},
142+
},
143+
)
144+
}
145+
}

pkg/transformers/namespace_test.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ func TestNamespaceRun(t *testing.T) {
4747
"namespace": "foo",
4848
},
4949
}),
50-
resid.NewResId(ns, "ns1"): rf.FromMap(
50+
resid.NewResId(ns, "test"): rf.FromMap(
5151
map[string]interface{}{
5252
"apiVersion": "v1",
5353
"kind": "Namespace",
5454
"metadata": map[string]interface{}{
55-
"name": "ns1",
55+
"name": "test",
5656
},
5757
}),
5858
resid.NewResId(sa, "default"): rf.FromMap(
@@ -108,12 +108,12 @@ func TestNamespaceRun(t *testing.T) {
108108
}),
109109
}
110110
expected := resmap.ResMap{
111-
resid.NewResIdWithPrefixNamespace(ns, "ns1", "", ""): rf.FromMap(
111+
resid.NewResIdWithPrefixNamespace(ns, "test", "", ""): rf.FromMap(
112112
map[string]interface{}{
113113
"apiVersion": "v1",
114114
"kind": "Namespace",
115115
"metadata": map[string]interface{}{
116-
"name": "ns1",
116+
"name": "test",
117117
},
118118
}),
119119
resid.NewResIdWithPrefixNamespace(cmap, "cm1", "", "test"): rf.FromMap(
@@ -187,7 +187,7 @@ func TestNamespaceRun(t *testing.T) {
187187
}),
188188
}
189189

190-
nst := NewNamespaceTransformer("test", defaultTransformerConfig.NameSpace)
190+
nst := NewNamespaceTransformer("test", defaultTransformerConfig.NameSpace, rf)
191191
err := nst.Transform(m)
192192
if err != nil {
193193
t.Fatalf("unexpected error: %v", err)
@@ -243,8 +243,35 @@ func TestNamespaceRunForClusterLevelKind(t *testing.T) {
243243

244244
expected := m.DeepCopy(rf)
245245

246-
nst := NewNamespaceTransformer("test", defaultTransformerConfig.NameSpace)
246+
nst := NewNamespaceTransformer("ns1", defaultTransformerConfig.NameSpace, rf)
247+
248+
err := nst.Transform(m)
249+
if err != nil {
250+
t.Fatalf("unexpected error: %v", err)
251+
}
252+
if !reflect.DeepEqual(m, expected) {
253+
err = expected.ErrorIfNotEqual(m)
254+
t.Fatalf("actual doesn't match expected: %v", err)
255+
}
256+
}
257+
258+
func TestNamespaceNotFound(t *testing.T) {
259+
rf := resource.NewFactory(
260+
kunstruct.NewKunstructuredFactoryImpl())
261+
262+
m := resmap.ResMap{}
263+
expected := resmap.ResMap{
264+
resid.NewResId(ns, "test"): rf.FromMap(
265+
map[string]interface{}{
266+
"apiVersion": "v1",
267+
"kind": "Namespace",
268+
"metadata": map[string]interface{}{
269+
"name": "test",
270+
},
271+
}),
272+
}
247273

274+
nst := NewNamespaceTransformer("test", defaultTransformerConfig.NameSpace, rf)
248275
err := nst.Transform(m)
249276
if err != nil {
250277
t.Fatalf("unexpected error: %v", err)

0 commit comments

Comments
 (0)