Skip to content

Commit 90c88d7

Browse files
committed
skip filtering resmap when the resource is a cluster level resource
1 parent 66bbae5 commit 90c88d7

File tree

7 files changed

+139
-25
lines changed

7 files changed

+139
-25
lines changed

pkg/gvk/gvk.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,30 @@ func (x Gvk) IsSelected(selector *Gvk) bool {
136136
}
137137
return true
138138
}
139+
140+
var clusterLevelKinds = []string{
141+
"ClusterRoleBinding",
142+
"ClusterRole",
143+
"CustomResourceDefinition",
144+
"Namespace",
145+
"PersistentVolume",
146+
}
147+
148+
// IsClusterKind returns true if x is a cluster-level Gvk
149+
func (x Gvk) IsClusterKind() bool {
150+
for _, k := range clusterLevelKinds {
151+
if k == x.Kind {
152+
return true
153+
}
154+
}
155+
return false
156+
}
157+
158+
// ClusterLevelGvks returns a slice of cluster-level Gvks
159+
func ClusterLevelGvks() []Gvk {
160+
var result []Gvk
161+
for _, k := range clusterLevelKinds {
162+
result = append(result, Gvk{Kind: k})
163+
}
164+
return result
165+
}

pkg/resmap/resmap.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,11 @@ func (m ResMap) DeepCopy(rf *resource.Factory) ResMap {
123123

124124
// FilterBy returns a ResMap containing ResIds with the same namespace and nameprefix
125125
// with the inputId
126+
// If inputId is a cluster level resource, return the original resmap
126127
func (m ResMap) FilterBy(inputId resid.ResId) ResMap {
128+
if inputId.Gvk().IsClusterKind() {
129+
return m
130+
}
127131
result := ResMap{}
128132
for id, res := range m {
129133
if id.Namespace() == inputId.Namespace() && id.HasSameLeftmostPrefix(inputId) {

pkg/resmap/resmap_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ func TestFilterBy(t *testing.T) {
160160
if !reflect.DeepEqual(rm, ns1map) {
161161
t.Fatalf("Expected %v but got back %v", rm, ns1map)
162162
}
163+
164+
clmap := rm1.FilterBy(resid.NewResId(gvk.Gvk{Kind: "ClusterRoleBinding"}, "crb"))
165+
if !reflect.DeepEqual(rm1, clmap) {
166+
t.Fatalf("Expected %v but got back %v", rm1, clmap)
167+
}
163168
}
164169
func TestDeepCopy(t *testing.T) {
165170
rm1 := ResMap{

pkg/transformers/labelsandannotations_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ var statefulset = gvk.Gvk{Group: "apps", Version: "v1", Kind: "StatefulSet"}
3737
var crd = gvk.Gvk{Group: "apiwctensions.k8s.io", Version: "v1beta1", Kind: "CustomResourceDefinition"}
3838
var job = gvk.Gvk{Group: "batch", Version: "v1", Kind: "Job"}
3939
var cronjob = gvk.Gvk{Group: "batch", Version: "v1beta1", Kind: "CronJob"}
40+
var pv = gvk.Gvk{Version: "v1", Kind: "PersistentVolume"}
4041
var pvc = gvk.Gvk{Version: "v1", Kind: "PersistentVolumeClaim"}
42+
var cr = gvk.Gvk{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRole"}
4143
var crb = gvk.Gvk{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBinding"}
4244
var sa = gvk.Gvk{Version: "v1", Kind: "ServiceAccount"}
4345
var ingress = gvk.Gvk{Kind: "Ingress"}

pkg/transformers/namereference_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,30 @@ func TestNameReferenceRun(t *testing.T) {
190190
},
191191
},
192192
}),
193+
resid.NewResIdWithPrefixNamespace(sa, "sa", "", "test"): rf.FromMap(
194+
map[string]interface{}{
195+
"apiVersion": "v1",
196+
"kind": "ServiceAccount",
197+
"metadata": map[string]interface{}{
198+
"name": "someprefix-sa",
199+
"namespace": "test",
200+
},
201+
}),
202+
resid.NewResId(crb, "crb"): rf.FromMap(
203+
map[string]interface{}{
204+
"apiVersion": "rbac.authorization.k8s.io/v1",
205+
"kind": "ClusterRoleBinding",
206+
"metadata": map[string]interface{}{
207+
"name": "crb",
208+
},
209+
"subjects": []interface{}{
210+
map[string]interface{}{
211+
"kind": "ServiceAccount",
212+
"name": "sa",
213+
"namespace": "test",
214+
},
215+
},
216+
}),
193217
}
194218

195219
expected := resmap.ResMap{}
@@ -325,6 +349,21 @@ func TestNameReferenceRun(t *testing.T) {
325349
},
326350
},
327351
)
352+
expected[resid.NewResId(crb, "crb")] = rf.FromMap(
353+
map[string]interface{}{
354+
"apiVersion": "rbac.authorization.k8s.io/v1",
355+
"kind": "ClusterRoleBinding",
356+
"metadata": map[string]interface{}{
357+
"name": "crb",
358+
},
359+
"subjects": []interface{}{
360+
map[string]interface{}{
361+
"kind": "ServiceAccount",
362+
"name": "someprefix-sa",
363+
"namespace": "test",
364+
},
365+
},
366+
})
328367
nrt, err := NewNameReferenceTransformer(defaultTransformerConfig.NameReference)
329368
if err != nil {
330369
t.Fatalf("unexpected error: %v", err)

pkg/transformers/namespace.go

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,41 +28,21 @@ type namespaceTransformer struct {
2828
fieldSpecsToSkip []config.FieldSpec
2929
}
3030

31-
var namespaceFieldSpecsToSkip = []config.FieldSpec{
32-
{
33-
Gvk: gvk.Gvk{
34-
Kind: "Namespace",
35-
},
36-
},
37-
{
38-
Gvk: gvk.Gvk{
39-
Kind: "ClusterRoleBinding",
40-
},
41-
},
42-
{
43-
Gvk: gvk.Gvk{
44-
Kind: "ClusterRole",
45-
},
46-
},
47-
{
48-
Gvk: gvk.Gvk{
49-
Kind: "CustomResourceDefinition",
50-
},
51-
},
52-
}
53-
5431
var _ Transformer = &namespaceTransformer{}
5532

5633
// NewNamespaceTransformer construct a namespaceTransformer.
5734
func NewNamespaceTransformer(ns string, cf []config.FieldSpec) Transformer {
5835
if len(ns) == 0 {
5936
return NewNoOpTransformer()
6037
}
61-
38+
var skip []config.FieldSpec
39+
for _, g := range gvk.ClusterLevelGvks() {
40+
skip = append(skip, config.FieldSpec{Gvk: g})
41+
}
6242
return &namespaceTransformer{
6343
namespace: ns,
6444
fieldSpecsToUse: cf,
65-
fieldSpecsToSkip: namespaceFieldSpecsToSkip,
45+
fieldSpecsToSkip: skip,
6646
}
6747
}
6848

pkg/transformers/namespace_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,60 @@ func TestNamespaceRun(t *testing.T) {
197197
t.Fatalf("actual doesn't match expected: %v", err)
198198
}
199199
}
200+
201+
func TestNamespaceRunForClusterLevelKind(t *testing.T) {
202+
rf := resource.NewFactory(
203+
kunstruct.NewKunstructuredFactoryImpl())
204+
m := resmap.ResMap{
205+
resid.NewResId(ns, "ns1"): rf.FromMap(
206+
map[string]interface{}{
207+
"apiVersion": "v1",
208+
"kind": "Namespace",
209+
"metadata": map[string]interface{}{
210+
"name": "ns1",
211+
},
212+
}),
213+
resid.NewResId(crd, "crd1"): rf.FromMap(
214+
map[string]interface{}{
215+
"kind": "CustomResourceDefinition",
216+
"metadata": map[string]interface{}{
217+
"name": "crd1",
218+
},
219+
}),
220+
resid.NewResId(pv, "pv1"): rf.FromMap(
221+
map[string]interface{}{
222+
"kind": "PersistentVolume",
223+
"metadata": map[string]interface{}{
224+
"name": "pv1",
225+
},
226+
}),
227+
resid.NewResId(cr, "cr1"): rf.FromMap(
228+
map[string]interface{}{
229+
"kind": "ClusterRole",
230+
"metadata": map[string]interface{}{
231+
"name": "cr1",
232+
},
233+
}),
234+
resid.NewResId(crb, "crb1"): rf.FromMap(
235+
map[string]interface{}{
236+
"kind": "ClusterRoleBinding",
237+
"metadata": map[string]interface{}{
238+
"name": "crb1",
239+
},
240+
"subjects": []interface{}{},
241+
}),
242+
}
243+
244+
expected := m.DeepCopy(rf)
245+
246+
nst := NewNamespaceTransformer("test", defaultTransformerConfig.NameSpace)
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+
}

0 commit comments

Comments
 (0)