@@ -59,6 +59,16 @@ func validateNetworkFenceSpec(nwFence *csiaddonsv1alpha1.NetworkFence) error {
59
59
if nwFence == nil {
60
60
return errors .New ("NetworkFence resource is empty" )
61
61
}
62
+
63
+ if nwFence .Spec .NetworkFenceClassName != "" {
64
+ if nwFence .Spec .Cidrs == nil {
65
+ return errors .New ("required parameter spec.cidrs is not specified" )
66
+ }
67
+
68
+ // Driver name and secrets will be read (and validated) in NetworkFenceClass
69
+ return nil
70
+ }
71
+
62
72
if nwFence .Spec .Driver == "" {
63
73
return errors .New ("required parameter driver is not specified" )
64
74
}
@@ -108,19 +118,11 @@ func (r *NetworkFenceReconciler) Reconcile(ctx context.Context, req ctrl.Request
108
118
return ctrl.Result {}, nil
109
119
}
110
120
111
- logger = logger .WithValues ("DriverName" , nwFence .Spec .Driver , "CIDRs" , nwFence .Spec .Cidrs )
112
-
113
- client , err := r .getNetworkFenceClient (ctx , nwFence .Spec .Driver )
121
+ nf , err := r .getNetworkFenceInstance (ctx , logger , nwFence )
114
122
if err != nil {
115
- logger .Error (err , "Failed to get NetworkFenceClient" )
116
- return ctrl.Result {}, err
117
- }
123
+ logger .Error (err , "failed to get the networkfenceinstance" )
118
124
119
- nf := NetworkFenceInstance {
120
- reconciler : r ,
121
- logger : logger ,
122
- instance : nwFence ,
123
- controllerClient : client ,
125
+ return ctrl.Result {}, err
124
126
}
125
127
126
128
// check if the networkfence object is getting deleted and handle it.
@@ -180,6 +182,7 @@ type NetworkFenceInstance struct {
180
182
controllerClient proto.NetworkFenceClient
181
183
logger logr.Logger
182
184
instance * csiaddonsv1alpha1.NetworkFence
185
+ nfClass * csiaddonsv1alpha1.NetworkFenceClass
183
186
}
184
187
185
188
func (nf * NetworkFenceInstance ) updateStatus (ctx context.Context ,
@@ -228,6 +231,25 @@ func (nf *NetworkFenceInstance) processFencingRequest(ctx context.Context) error
228
231
Cidrs : nf .instance .Spec .Cidrs ,
229
232
}
230
233
234
+ if nf .nfClass != nil {
235
+ nfParams := nf .nfClass .Spec .Parameters
236
+
237
+ request .SecretName = nfParams [prefixedNetworkFenceSecretNameKey ]
238
+ request .SecretNamespace = nfParams [prefixedNetworkFenceSecretNamespaceKey ]
239
+
240
+ if request .Parameters == nil {
241
+ request .Parameters = make (map [string ]string )
242
+ }
243
+
244
+ for k , v := range nfParams {
245
+ if k == prefixedNetworkFenceSecretNameKey ||
246
+ k == prefixedNetworkFenceSecretNamespaceKey {
247
+ continue
248
+ }
249
+ request .Parameters [k ] = v
250
+ }
251
+ }
252
+
231
253
if nf .instance .Spec .FenceState == csiaddonsv1alpha1 .Fenced {
232
254
return nf .fenceClusterNetwork (ctx , request )
233
255
}
@@ -325,3 +347,47 @@ func (r *NetworkFenceReconciler) getNetworkFenceClient(ctx context.Context, driv
325
347
326
348
return nil , fmt .Errorf ("leading CSIAddonsNode %q for driver %q does not support NetworkFence" , conn .Name , drivername )
327
349
}
350
+
351
+ // getNetworkFenceInstance returns a new NetworkFenceInstance object
352
+ // by setting its logger and controller client. If NetworkFenceClassName is
353
+ // present, it uses the values from NetworkFenceClass else it uses the
354
+ // spec of the NetworkFence object.
355
+ func (r * NetworkFenceReconciler ) getNetworkFenceInstance (
356
+ ctx context.Context ,
357
+ logger logr.Logger ,
358
+ nf * csiaddonsv1alpha1.NetworkFence ,
359
+ ) (* NetworkFenceInstance , error ) {
360
+ nfInstance := & NetworkFenceInstance {
361
+ reconciler : r ,
362
+ instance : nf ,
363
+ }
364
+
365
+ var driverName string
366
+ var err error
367
+
368
+ // If NetworkFenceClassName is empty, use the driver from NetworkFence spec
369
+ // and log a warning for the same.
370
+ if nf .Spec .NetworkFenceClassName == "" {
371
+ logger .Info ("WARNING: Specifying driver, secrets and parameters inside NetworkFence is deprecated, please use NetworkFenceClass instead" )
372
+
373
+ driverName = nf .Spec .Driver
374
+ } else {
375
+ // We need to fetch the driverName from the NetworkFenceClass
376
+ nfc := & csiaddonsv1alpha1.NetworkFenceClass {}
377
+ if err = r .Get (ctx , client.ObjectKey {Name : nf .Spec .NetworkFenceClassName }, nfc ); err != nil {
378
+ return nil , fmt .Errorf ("failed to get networkfenceclass with name %q due to error: %w" , nf .Spec .NetworkFenceClassName , err )
379
+ }
380
+
381
+ nfInstance .nfClass = nfc
382
+ driverName = nfc .Spec .Provisioner
383
+ }
384
+
385
+ // Set the logger and client
386
+ nfInstance .logger = logger .WithValues ("DriverName" , driverName , "CIDRs" , nf .Spec .Cidrs )
387
+ nfInstance .controllerClient , err = r .getNetworkFenceClient (ctx , driverName )
388
+ if err != nil {
389
+ return nil , fmt .Errorf ("failed to get networkfenceclient using driver %q due to error: %w" , driverName , err )
390
+ }
391
+
392
+ return nfInstance , nil
393
+ }
0 commit comments