11package kube_inventory
22
33import (
4+ "reflect"
5+ "strings"
46 "testing"
57 "time"
68
@@ -12,6 +14,8 @@ import (
1214
1315func TestDaemonSet (t * testing.T ) {
1416 cli := & client {}
17+ selectInclude := []string {}
18+ selectExclude := []string {}
1519 now := time .Now ()
1620 now = time .Date (now .Year (), now .Month (), now .Day (), now .Hour (), 1 , 36 , 0 , now .Location ())
1721 tests := []struct {
@@ -55,6 +59,14 @@ func TestDaemonSet(t *testing.T) {
5559 },
5660 CreationTimestamp : & metav1.Time {Seconds : toInt64Ptr (now .Unix ())},
5761 },
62+ Spec : & v1.DaemonSetSpec {
63+ Selector : & metav1.LabelSelector {
64+ MatchLabels : map [string ]string {
65+ "select1" : "s1" ,
66+ "select2" : "s2" ,
67+ },
68+ },
69+ },
5870 },
5971 },
6072 },
@@ -75,8 +87,10 @@ func TestDaemonSet(t *testing.T) {
7587 "created" : now .UnixNano (),
7688 },
7789 Tags : map [string ]string {
78- "daemonset_name" : "daemon1" ,
79- "namespace" : "ns1" ,
90+ "daemonset_name" : "daemon1" ,
91+ "namespace" : "ns1" ,
92+ "selector_select1" : "s1" ,
93+ "selector_select2" : "s2" ,
8094 },
8195 },
8296 },
@@ -87,8 +101,11 @@ func TestDaemonSet(t *testing.T) {
87101
88102 for _ , v := range tests {
89103 ks := & KubernetesInventory {
90- client : cli ,
104+ client : cli ,
105+ SelectorInclude : selectInclude ,
106+ SelectorExclude : selectExclude ,
91107 }
108+ ks .createSelectorFilters ()
92109 acc := new (testutil.Accumulator )
93110 for _ , dset := range ((v .handler .responseMap ["/daemonsets/" ]).(* v1.DaemonSetList )).Items {
94111 err := ks .gatherDaemonSet (* dset , acc )
@@ -121,3 +138,170 @@ func TestDaemonSet(t *testing.T) {
121138 }
122139 }
123140}
141+
142+ func TestDaemonSetSelectorFilter (t * testing.T ) {
143+ cli := & client {}
144+ now := time .Now ()
145+ now = time .Date (now .Year (), now .Month (), now .Day (), now .Hour (), 1 , 36 , 0 , now .Location ())
146+
147+ responseMap := map [string ]interface {}{
148+ "/daemonsets/" : & v1.DaemonSetList {
149+ Items : []* v1.DaemonSet {
150+ {
151+ Status : & v1.DaemonSetStatus {
152+ CurrentNumberScheduled : toInt32Ptr (3 ),
153+ DesiredNumberScheduled : toInt32Ptr (5 ),
154+ NumberAvailable : toInt32Ptr (2 ),
155+ NumberMisscheduled : toInt32Ptr (2 ),
156+ NumberReady : toInt32Ptr (1 ),
157+ NumberUnavailable : toInt32Ptr (1 ),
158+ UpdatedNumberScheduled : toInt32Ptr (2 ),
159+ },
160+ Metadata : & metav1.ObjectMeta {
161+ Generation : toInt64Ptr (11221 ),
162+ Namespace : toStrPtr ("ns1" ),
163+ Name : toStrPtr ("daemon1" ),
164+ Labels : map [string ]string {
165+ "lab1" : "v1" ,
166+ "lab2" : "v2" ,
167+ },
168+ CreationTimestamp : & metav1.Time {Seconds : toInt64Ptr (now .Unix ())},
169+ },
170+ Spec : & v1.DaemonSetSpec {
171+ Selector : & metav1.LabelSelector {
172+ MatchLabels : map [string ]string {
173+ "select1" : "s1" ,
174+ "select2" : "s2" ,
175+ },
176+ },
177+ },
178+ },
179+ },
180+ },
181+ }
182+
183+ tests := []struct {
184+ name string
185+ handler * mockHandler
186+ hasError bool
187+ include []string
188+ exclude []string
189+ expected map [string ]string
190+ }{
191+ {
192+ name : "nil filters equals all selectors" ,
193+ handler : & mockHandler {
194+ responseMap : responseMap ,
195+ },
196+ hasError : false ,
197+ include : nil ,
198+ exclude : nil ,
199+ expected : map [string ]string {
200+ "selector_select1" : "s1" ,
201+ "selector_select2" : "s2" ,
202+ },
203+ },
204+ {
205+ name : "empty filters equals all selectors" ,
206+ handler : & mockHandler {
207+ responseMap : responseMap ,
208+ },
209+ hasError : false ,
210+ include : []string {},
211+ exclude : []string {},
212+ expected : map [string ]string {
213+ "selector_select1" : "s1" ,
214+ "selector_select2" : "s2" ,
215+ },
216+ },
217+ {
218+ name : "include filter equals only include-matched selectors" ,
219+ handler : & mockHandler {
220+ responseMap : responseMap ,
221+ },
222+ hasError : false ,
223+ include : []string {"select1" },
224+ exclude : []string {},
225+ expected : map [string ]string {
226+ "selector_select1" : "s1" ,
227+ },
228+ },
229+ {
230+ name : "exclude filter equals only non-excluded selectors (overrides include filter)" ,
231+ handler : & mockHandler {
232+ responseMap : responseMap ,
233+ },
234+ hasError : false ,
235+ include : []string {},
236+ exclude : []string {"select2" },
237+ expected : map [string ]string {
238+ "selector_select1" : "s1" ,
239+ },
240+ },
241+ {
242+ name : "include glob filter equals only include-matched selectors" ,
243+ handler : & mockHandler {
244+ responseMap : responseMap ,
245+ },
246+ hasError : false ,
247+ include : []string {"*1" },
248+ exclude : []string {},
249+ expected : map [string ]string {
250+ "selector_select1" : "s1" ,
251+ },
252+ },
253+ {
254+ name : "exclude glob filter equals only non-excluded selectors" ,
255+ handler : & mockHandler {
256+ responseMap : responseMap ,
257+ },
258+ hasError : false ,
259+ include : []string {},
260+ exclude : []string {"*2" },
261+ expected : map [string ]string {
262+ "selector_select1" : "s1" ,
263+ },
264+ },
265+ {
266+ name : "exclude glob filter equals only non-excluded selectors" ,
267+ handler : & mockHandler {
268+ responseMap : responseMap ,
269+ },
270+ hasError : false ,
271+ include : []string {},
272+ exclude : []string {"*2" },
273+ expected : map [string ]string {
274+ "selector_select1" : "s1" ,
275+ },
276+ },
277+ }
278+ for _ , v := range tests {
279+ ks := & KubernetesInventory {
280+ client : cli ,
281+ }
282+ ks .SelectorInclude = v .include
283+ ks .SelectorExclude = v .exclude
284+ ks .createSelectorFilters ()
285+ acc := new (testutil.Accumulator )
286+ for _ , dset := range ((v .handler .responseMap ["/daemonsets/" ]).(* v1.DaemonSetList )).Items {
287+ err := ks .gatherDaemonSet (* dset , acc )
288+ if err != nil {
289+ t .Errorf ("Failed to gather daemonset - %s" , err .Error ())
290+ }
291+ }
292+
293+ // Grab selector tags
294+ actual := map [string ]string {}
295+ for _ , metric := range acc .Metrics {
296+ for key , val := range metric .Tags {
297+ if strings .Contains (key , "selector_" ) {
298+ actual [key ] = val
299+ }
300+ }
301+ }
302+
303+ if ! reflect .DeepEqual (v .expected , actual ) {
304+ t .Fatalf ("actual selector tags (%v) do not match expected selector tags (%v)" , actual , v .expected )
305+ }
306+ }
307+ }
0 commit comments