Skip to content

Commit 15998fc

Browse files
committed
Add unit-tests and fix a trailing comma bug in generateExcludeNamespacesFieldSelector
Signed-off-by: Richard Wall <[email protected]>
1 parent 29efc5d commit 15998fc

File tree

2 files changed

+64
-17
lines changed

2 files changed

+64
-17
lines changed

pkg/datagatherer/k8s/dynamic.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,13 @@ func (c *ConfigDynamic) validate() error {
8383
errors = append(errors, "invalid configuration: GroupVersionResource.Resource cannot be empty")
8484
}
8585

86-
for _, selectorString := range c.FieldSelectors {
86+
for i, selectorString := range c.FieldSelectors {
87+
if selectorString == "" {
88+
errors = append(errors, fmt.Sprintf("invalid field selector %d: must not be empty", i))
89+
}
8790
_, err := fields.ParseSelector(selectorString)
8891
if err != nil {
89-
errors = append(errors, fmt.Sprintf("invalid field selector %q: %s", selectorString, err))
92+
errors = append(errors, fmt.Sprintf("invalid field selector %d: %s", i, err))
9093
}
9194
}
9295

@@ -161,9 +164,11 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
161164
return nil, err
162165
}
163166
// init shared informer for selected namespaces
164-
fieldSelector := generateFieldSelector(c.ExcludeNamespaces)
167+
fieldSelector := generateExcludedNamespacesFieldSelector(c.ExcludeNamespaces)
165168

166-
// add any custom field selectors to the namespace selector
169+
// Add any custom field selectors to the excluded namespaces selector
170+
// The selectors have already been validated, so it is safe to use
171+
// ParseSelectorOrDie here.
167172
for _, selectorString := range c.FieldSelectors {
168173
fieldSelector = fields.AndSelectors(fieldSelector, fields.ParseSelectorOrDie(selectorString))
169174
}
@@ -437,17 +442,17 @@ func namespaceResourceInterface(iface dynamic.NamespaceableResourceInterface, na
437442
return iface.Namespace(namespace)
438443
}
439444

440-
// generateFieldSelector creates a field selector string from a list of
441-
// namespaces to exclude.
442-
func generateFieldSelector(excludeNamespaces []string) fields.Selector {
443-
fieldSelector := fields.Nothing()
445+
// generateExcludedNamespacesFieldSelector creates a field selector string from
446+
// a list of namespaces to exclude.
447+
func generateExcludedNamespacesFieldSelector(excludeNamespaces []string) fields.Selector {
448+
var selectors []fields.Selector
444449
for _, excludeNamespace := range excludeNamespaces {
445450
if excludeNamespace == "" {
446451
continue
447452
}
448-
fieldSelector = fields.AndSelectors(fields.OneTermNotEqualSelector("metadata.namespace", excludeNamespace), fieldSelector)
453+
selectors = append(selectors, fields.OneTermNotEqualSelector("metadata.namespace", excludeNamespace))
449454
}
450-
return fieldSelector
455+
return fields.AndSelectors(selectors...)
451456
}
452457

453458
func isIncludedNamespace(namespace string, namespaces []string) bool {

pkg/datagatherer/k8s/dynamic_test.go

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,12 @@ func sortGatheredResources(list []*api.GatheredResource) {
105105
func TestNewDataGathererWithClientAndDynamicInformer(t *testing.T) {
106106
ctx := context.Background()
107107
config := ConfigDynamic{
108-
IncludeNamespaces: []string{"a"},
108+
ExcludeNamespaces: []string{"kube-system"},
109109
GroupVersionResource: schema.GroupVersionResource{Group: "foobar", Version: "v1", Resource: "foos"},
110+
FieldSelectors: []string{
111+
"type!=kubernetes.io/service-account-token",
112+
"type!=kubernetes.io/dockercfg",
113+
},
110114
}
111115
cl := fake.NewSimpleDynamicClient(runtime.NewScheme())
112116
dg, err := config.newDataGathererWithClient(ctx, cl, nil)
@@ -121,7 +125,8 @@ func TestNewDataGathererWithClientAndDynamicInformer(t *testing.T) {
121125
groupVersionResource: config.GroupVersionResource,
122126
// it's important that the namespaces are set as the IncludeNamespaces
123127
// during initialization
124-
namespaces: config.IncludeNamespaces,
128+
namespaces: config.IncludeNamespaces,
129+
fieldSelector: "metadata.namespace!=kube-system,type!=kubernetes.io/service-account-token,type!=kubernetes.io/dockercfg",
125130
}
126131

127132
gatherer := dg.(*DataGathererDynamic)
@@ -150,6 +155,9 @@ func TestNewDataGathererWithClientAndDynamicInformer(t *testing.T) {
150155
if gatherer.nativeSharedInformer != nil {
151156
t.Errorf("unexpected nativeSharedInformer value: %v. should be nil", gatherer.nativeSharedInformer)
152157
}
158+
if !reflect.DeepEqual(gatherer.fieldSelector, expected.fieldSelector) {
159+
t.Errorf("expected %v, got %v", expected.fieldSelector, gatherer.fieldSelector)
160+
}
153161
}
154162

155163
func TestNewDataGathererWithClientAndSharedIndexInformer(t *testing.T) {
@@ -216,6 +224,8 @@ exclude-namespaces:
216224
# from the config file
217225
include-namespaces:
218226
- default
227+
field-selectors:
228+
- type!=kubernetes.io/service-account-token
219229
`
220230

221231
expectedGVR := schema.GroupVersionResource{
@@ -231,6 +241,10 @@ include-namespaces:
231241

232242
expectedIncludeNamespaces := []string{"default"}
233243

244+
expectedFieldSelectors := []string{
245+
"type!=kubernetes.io/service-account-token",
246+
}
247+
234248
cfg := ConfigDynamic{}
235249
err := yaml.Unmarshal([]byte(textCfg), &cfg)
236250
if err != nil {
@@ -251,6 +265,9 @@ include-namespaces:
251265
if got, want := cfg.IncludeNamespaces, expectedIncludeNamespaces; !reflect.DeepEqual(got, want) {
252266
t.Errorf("IncludeNamespaces does not match: got=%+v want=%+v", got, want)
253267
}
268+
if got, want := cfg.FieldSelectors, expectedFieldSelectors; !reflect.DeepEqual(got, want) {
269+
t.Errorf("FieldSelectors does not match: got=%+v want=%+v", got, want)
270+
}
254271
}
255272

256273
func TestConfigDynamicValidate(t *testing.T) {
@@ -275,17 +292,42 @@ func TestConfigDynamicValidate(t *testing.T) {
275292
},
276293
ExpectedError: "cannot set excluded and included namespaces",
277294
},
295+
{
296+
Config: ConfigDynamic{
297+
GroupVersionResource: schema.GroupVersionResource{
298+
Group: "",
299+
Version: "v1",
300+
Resource: "secrets",
301+
},
302+
FieldSelectors: []string{""},
303+
},
304+
ExpectedError: "invalid field selector 0: must not be empty",
305+
},
306+
{
307+
Config: ConfigDynamic{
308+
GroupVersionResource: schema.GroupVersionResource{
309+
Group: "",
310+
Version: "v1",
311+
Resource: "secrets",
312+
},
313+
FieldSelectors: []string{"foo"},
314+
},
315+
ExpectedError: "invalid field selector 0: invalid selector: 'foo'; can't understand 'foo'",
316+
},
278317
}
279318

280319
for _, test := range tests {
281320
err := test.Config.validate()
282-
if !strings.Contains(err.Error(), test.ExpectedError) {
321+
if err == nil && test.ExpectedError != "" {
322+
t.Errorf("expected error: %q, got: nil", test.ExpectedError)
323+
}
324+
if err != nil && !strings.Contains(err.Error(), test.ExpectedError) {
283325
t.Errorf("expected %s, got %s", test.ExpectedError, err.Error())
284326
}
285327
}
286328
}
287329

288-
func TestGenerateFieldSelector(t *testing.T) {
330+
func TestGenerateExcludedNamespacesFieldSelector(t *testing.T) {
289331
tests := []struct {
290332
ExcludeNamespaces []string
291333
ExpectedFieldSelector string
@@ -300,19 +342,19 @@ func TestGenerateFieldSelector(t *testing.T) {
300342
ExcludeNamespaces: []string{
301343
"kube-system",
302344
},
303-
ExpectedFieldSelector: "metadata.namespace!=kube-system,",
345+
ExpectedFieldSelector: "metadata.namespace!=kube-system",
304346
},
305347
{
306348
ExcludeNamespaces: []string{
307349
"kube-system",
308350
"my-namespace",
309351
},
310-
ExpectedFieldSelector: "metadata.namespace!=my-namespace,metadata.namespace!=kube-system,",
352+
ExpectedFieldSelector: "metadata.namespace!=kube-system,metadata.namespace!=my-namespace",
311353
},
312354
}
313355

314356
for _, test := range tests {
315-
fieldSelector := generateFieldSelector(test.ExcludeNamespaces).String()
357+
fieldSelector := generateExcludedNamespacesFieldSelector(test.ExcludeNamespaces).String()
316358
if fieldSelector != test.ExpectedFieldSelector {
317359
t.Errorf("ExpectedFieldSelector does not match: got=%+v want=%+v", fieldSelector, test.ExpectedFieldSelector)
318360
}

0 commit comments

Comments
 (0)