@@ -11,6 +11,7 @@ import (
11
11
"github.com/kubernetes-sigs/kernel-module-management/internal/daemonset"
12
12
"github.com/kubernetes-sigs/kernel-module-management/internal/metrics"
13
13
"github.com/kubernetes-sigs/kernel-module-management/internal/module"
14
+ "github.com/kubernetes-sigs/kernel-module-management/internal/rbac"
14
15
"github.com/kubernetes-sigs/kernel-module-management/internal/registry"
15
16
"github.com/kubernetes-sigs/kernel-module-management/internal/statusupdater"
16
17
. "github.com/onsi/ginkgo/v2"
@@ -34,6 +35,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
34
35
ctrl * gomock.Controller
35
36
clnt * client.MockClient
36
37
mockBM * build.MockManager
38
+ mockRC * rbac.MockRBACCreator
37
39
mockDC * daemonset.MockDaemonSetCreator
38
40
mockKM * module.MockKernelMapper
39
41
mockMetrics * metrics.MockMetrics
@@ -45,6 +47,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
45
47
ctrl = gomock .NewController (GinkgoT ())
46
48
clnt = client .NewMockClient (ctrl )
47
49
mockBM = build .NewMockManager (ctrl )
50
+ mockRC = rbac .NewMockRBACCreator (ctrl )
48
51
mockDC = daemonset .NewMockDaemonSetCreator (ctrl )
49
52
mockKM = module .NewMockKernelMapper (ctrl )
50
53
mockMetrics = metrics .NewMockMetrics (ctrl )
@@ -71,22 +74,95 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
71
74
apierrors .NewNotFound (schema.GroupResource {}, moduleName ),
72
75
)
73
76
74
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
77
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
75
78
Expect (
76
79
mr .Reconcile (ctx , req ),
77
80
).To (
78
81
Equal (reconcile.Result {}),
79
82
)
80
83
})
81
84
85
+ It ("should add the module loader and device plugin ServiceAccounts if they are not set" , func () {
86
+ mod := kmmv1beta1.Module {
87
+ ObjectMeta : metav1.ObjectMeta {
88
+ Name : moduleName ,
89
+ Namespace : namespace ,
90
+ },
91
+ Spec : kmmv1beta1.ModuleSpec {
92
+ Selector : map [string ]string {"key" : "value" },
93
+ ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
94
+ ServiceAccountName : "" ,
95
+ },
96
+ DevicePlugin : & kmmv1beta1.DevicePluginSpec {
97
+ ServiceAccountName : "" ,
98
+ },
99
+ },
100
+ }
101
+ ds := appsv1.DaemonSet {
102
+ ObjectMeta : metav1.ObjectMeta {
103
+ Name : moduleName + "-device-plugin" ,
104
+ Namespace : namespace ,
105
+ },
106
+ }
107
+
108
+ gomock .InOrder (
109
+ clnt .EXPECT ().Get (ctx , req .NamespacedName , gomock .Any ()).DoAndReturn (
110
+ func (_ interface {}, _ interface {}, m * kmmv1beta1.Module ) error {
111
+ m .ObjectMeta = mod .ObjectMeta
112
+ m .Spec = mod .Spec
113
+ return nil
114
+ },
115
+ ),
116
+ clnt .EXPECT ().List (ctx , gomock .Any (), gomock .Any ()).DoAndReturn (
117
+ func (_ interface {}, list * kmmv1beta1.ModuleList , _ ... interface {}) error {
118
+ list .Items = []kmmv1beta1.Module {mod }
119
+ return nil
120
+ },
121
+ ),
122
+ mockMetrics .EXPECT ().SetExistingKMMOModules (1 ),
123
+ mockRC .EXPECT ().CreateModuleLoaderRBAC (ctx , gomock .Any ()).Return (nil ),
124
+ mockRC .EXPECT ().CreateDevicePluginRBAC (ctx , gomock .Any ()).Return (nil ),
125
+ clnt .EXPECT ().List (ctx , gomock .Any (), gomock .Any ()).DoAndReturn (
126
+ func (_ interface {}, list * v1.NodeList , _ ... interface {}) error {
127
+ list .Items = []v1.Node {}
128
+ return nil
129
+ },
130
+ ),
131
+ clnt .EXPECT ().Get (ctx , gomock .Any (), gomock .Any ()).Return (apierrors .NewNotFound (schema.GroupResource {}, "whatever" )),
132
+ clnt .EXPECT ().Get (ctx , gomock .Any (), gomock .Any ()).Return (apierrors .NewNotFound (schema.GroupResource {}, "whatever" )),
133
+ mockDC .EXPECT ().SetDevicePluginAsDesired (context .Background (), & ds , gomock .AssignableToTypeOf (& mod )),
134
+ clnt .EXPECT ().Create (ctx , gomock .Any ()).Return (nil ),
135
+ mockMetrics .EXPECT ().SetCompletedStage (moduleName , namespace , "" , metrics .DevicePluginStage , false ),
136
+ )
137
+
138
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
139
+
140
+ dsByKernelVersion := make (map [string ]* appsv1.DaemonSet )
141
+
142
+ gomock .InOrder (
143
+ mockDC .EXPECT ().ModuleDaemonSetsByKernelVersion (ctx , moduleName , namespace ).Return (dsByKernelVersion , nil ),
144
+ mockDC .EXPECT ().GarbageCollect (ctx , dsByKernelVersion , sets .NewString ()),
145
+ mockSU .EXPECT ().ModuleUpdateStatus (ctx , & mod , []v1.Node {}, []v1.Node {}, dsByKernelVersion ).Return (nil ),
146
+ )
147
+
148
+ res , err := mr .Reconcile (context .Background (), req )
149
+ Expect (err ).NotTo (HaveOccurred ())
150
+ Expect (res ).To (Equal (reconcile.Result {}))
151
+ })
152
+
82
153
It ("should do nothing when no nodes match the selector" , func () {
154
+ const serviceAccountName = "module-loader-service-account"
155
+
83
156
mod := kmmv1beta1.Module {
84
157
ObjectMeta : metav1.ObjectMeta {
85
158
Name : moduleName ,
86
159
Namespace : namespace ,
87
160
},
88
161
Spec : kmmv1beta1.ModuleSpec {
89
162
Selector : map [string ]string {"key" : "value" },
163
+ ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
164
+ ServiceAccountName : serviceAccountName ,
165
+ },
90
166
},
91
167
}
92
168
@@ -113,7 +189,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
113
189
),
114
190
)
115
191
116
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
192
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
117
193
118
194
dsByKernelVersion := make (map [string ]* appsv1.DaemonSet )
119
195
@@ -129,7 +205,10 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
129
205
})
130
206
131
207
It ("should remove obsolete DaemonSets when no nodes match the selector" , func () {
132
- const kernelVersion = "1.2.3"
208
+ const (
209
+ kernelVersion = "1.2.3"
210
+ serviceAccountName = "module-loader-service-account"
211
+ )
133
212
134
213
mod := kmmv1beta1.Module {
135
214
ObjectMeta : metav1.ObjectMeta {
@@ -138,6 +217,9 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
138
217
},
139
218
Spec : kmmv1beta1.ModuleSpec {
140
219
Selector : map [string ]string {"key" : "value" },
220
+ ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
221
+ ServiceAccountName : serviceAccountName ,
222
+ },
141
223
},
142
224
}
143
225
@@ -171,7 +253,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
171
253
),
172
254
)
173
255
174
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
256
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
175
257
176
258
dsByKernelVersion := map [string ]* appsv1.DaemonSet {kernelVersion : & ds }
177
259
@@ -188,8 +270,9 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
188
270
189
271
It ("should create a DaemonSet when a node matches the selector" , func () {
190
272
const (
191
- imageName = "test-image"
192
- kernelVersion = "1.2.3"
273
+ imageName = "test-image"
274
+ kernelVersion = "1.2.3"
275
+ serviceAccountName = "module-loader-service-account"
193
276
)
194
277
195
278
mappings := []kmmv1beta1.KernelMapping {
@@ -208,6 +291,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
208
291
},
209
292
Spec : kmmv1beta1.ModuleSpec {
210
293
ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
294
+ ServiceAccountName : serviceAccountName ,
211
295
Container : kmmv1beta1.ModuleLoaderContainerSpec {
212
296
KernelMappings : mappings ,
213
297
},
@@ -232,7 +316,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
232
316
233
317
dsByKernelVersion := make (map [string ]* appsv1.DaemonSet )
234
318
235
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
319
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
236
320
237
321
ds := appsv1.DaemonSet {
238
322
ObjectMeta : metav1.ObjectMeta {
@@ -280,8 +364,9 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
280
364
281
365
It ("should patch the DaemonSet when it already exists" , func () {
282
366
const (
283
- imageName = "test-image"
284
- kernelVersion = "1.2.3"
367
+ imageName = "test-image"
368
+ kernelVersion = "1.2.3"
369
+ serviceAccountName = "module-loader-service-account"
285
370
)
286
371
287
372
osConfig := module.NodeOSConfig {}
@@ -302,6 +387,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
302
387
},
303
388
Spec : kmmv1beta1.ModuleSpec {
304
389
ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
390
+ ServiceAccountName : serviceAccountName ,
305
391
Container : kmmv1beta1.ModuleLoaderContainerSpec {
306
392
KernelMappings : mappings ,
307
393
},
@@ -361,7 +447,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
361
447
clnt .EXPECT ().Patch (ctx , gomock .Any (), gomock .Any ()),
362
448
)
363
449
364
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
450
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
365
451
366
452
dsByKernelVersion := map [string ]* appsv1.DaemonSet {kernelVersion : & ds }
367
453
@@ -387,6 +473,9 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
387
473
const (
388
474
imageName = "test-image"
389
475
kernelVersion = "1.2.3"
476
+
477
+ moduleLoaderServiceAccountName = "module-loader-service-account"
478
+ devicePluginServiceAccountName = "device-plugin-service-account"
390
479
)
391
480
392
481
mappings := []kmmv1beta1.KernelMapping {
@@ -402,8 +491,11 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
402
491
Namespace : namespace ,
403
492
},
404
493
Spec : kmmv1beta1.ModuleSpec {
405
- DevicePlugin : & kmmv1beta1.DevicePluginSpec {},
494
+ DevicePlugin : & kmmv1beta1.DevicePluginSpec {
495
+ ServiceAccountName : devicePluginServiceAccountName ,
496
+ },
406
497
ModuleLoader : kmmv1beta1.ModuleLoaderSpec {
498
+ ServiceAccountName : moduleLoaderServiceAccountName ,
407
499
Container : kmmv1beta1.ModuleLoaderContainerSpec {
408
500
KernelMappings : mappings ,
409
501
},
@@ -412,7 +504,7 @@ var _ = Describe("ModuleReconciler_Reconcile", func() {
412
504
},
413
505
}
414
506
415
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
507
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
416
508
417
509
ds := appsv1.DaemonSet {
418
510
ObjectMeta : metav1.ObjectMeta {
@@ -462,6 +554,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
462
554
ctrl * gomock.Controller
463
555
clnt * client.MockClient
464
556
mockBM * build.MockManager
557
+ mockRC * rbac.MockRBACCreator
465
558
mockDC * daemonset.MockDaemonSetCreator
466
559
mockKM * module.MockKernelMapper
467
560
mockMetrics * metrics.MockMetrics
@@ -473,6 +566,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
473
566
ctrl = gomock .NewController (GinkgoT ())
474
567
clnt = client .NewMockClient (ctrl )
475
568
mockBM = build .NewMockManager (ctrl )
569
+ mockRC = rbac .NewMockRBACCreator (ctrl )
476
570
mockDC = daemonset .NewMockDaemonSetCreator (ctrl )
477
571
mockKM = module .NewMockKernelMapper (ctrl )
478
572
mockMetrics = metrics .NewMockMetrics (ctrl )
@@ -494,7 +588,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
494
588
495
589
mod := & kmmv1beta1.Module {}
496
590
497
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
591
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
498
592
499
593
res , err := mr .handleBuild (context .Background (), mod , km , kernelVersion )
500
594
Expect (err ).NotTo (HaveOccurred ())
@@ -524,7 +618,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
524
618
},
525
619
)
526
620
527
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
621
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
528
622
res , err := mr .handleBuild (context .Background (), mod , km , kernelVersion )
529
623
Expect (err ).NotTo (HaveOccurred ())
530
624
Expect (res ).To (BeFalse ())
@@ -550,7 +644,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
550
644
mockMetrics .EXPECT ().SetCompletedStage (mod .Name , mod .Namespace , kernelVersion , metrics .BuildStage , false ),
551
645
)
552
646
553
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
647
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
554
648
res , err := mr .handleBuild (context .Background (), mod , km , kernelVersion )
555
649
Expect (err ).NotTo (HaveOccurred ())
556
650
Expect (res ).To (BeTrue ())
@@ -576,7 +670,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
576
670
mockMetrics .EXPECT ().SetCompletedStage (mod .Name , mod .Namespace , kernelVersion , metrics .BuildStage , false ),
577
671
)
578
672
579
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
673
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
580
674
res , err := mr .handleBuild (context .Background (), mod , km , kernelVersion )
581
675
Expect (err ).NotTo (HaveOccurred ())
582
676
Expect (res ).To (BeTrue ())
@@ -602,7 +696,7 @@ var _ = Describe("ModuleReconciler_handleBuild", func() {
602
696
mockMetrics .EXPECT ().SetCompletedStage (mod .Name , mod .Namespace , kernelVersion , metrics .BuildStage , true ),
603
697
)
604
698
605
- mr := NewModuleReconciler (clnt , mockBM , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
699
+ mr := NewModuleReconciler (clnt , mockBM , mockRC , mockDC , mockKM , mockMetrics , nil , mockRegistry , mockSU )
606
700
res , err := mr .handleBuild (context .Background (), mod , km , kernelVersion )
607
701
Expect (err ).NotTo (HaveOccurred ())
608
702
Expect (res ).To (BeFalse ())
0 commit comments