@@ -59,6 +59,16 @@ func validateNetworkFenceSpec(nwFence *csiaddonsv1alpha1.NetworkFence) error {
5959 if nwFence == nil {
6060 return errors .New ("NetworkFence resource is empty" )
6161 }
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+
6272 if nwFence .Spec .Driver == "" {
6373 return errors .New ("required parameter driver is not specified" )
6474 }
@@ -108,19 +118,11 @@ func (r *NetworkFenceReconciler) Reconcile(ctx context.Context, req ctrl.Request
108118 return ctrl.Result {}, nil
109119 }
110120
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 )
114122 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" )
118124
119- nf := NetworkFenceInstance {
120- reconciler : r ,
121- logger : logger ,
122- instance : nwFence ,
123- controllerClient : client ,
125+ return ctrl.Result {}, err
124126 }
125127
126128 // check if the networkfence object is getting deleted and handle it.
@@ -180,6 +182,7 @@ type NetworkFenceInstance struct {
180182 controllerClient proto.NetworkFenceClient
181183 logger logr.Logger
182184 instance * csiaddonsv1alpha1.NetworkFence
185+ nfClass * csiaddonsv1alpha1.NetworkFenceClass
183186}
184187
185188func (nf * NetworkFenceInstance ) updateStatus (ctx context.Context ,
@@ -228,6 +231,25 @@ func (nf *NetworkFenceInstance) processFencingRequest(ctx context.Context) error
228231 Cidrs : nf .instance .Spec .Cidrs ,
229232 }
230233
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+
231253 if nf .instance .Spec .FenceState == csiaddonsv1alpha1 .Fenced {
232254 return nf .fenceClusterNetwork (ctx , request )
233255 }
@@ -325,3 +347,47 @@ func (r *NetworkFenceReconciler) getNetworkFenceClient(ctx context.Context, driv
325347
326348 return nil , fmt .Errorf ("leading CSIAddonsNode %q for driver %q does not support NetworkFence" , conn .Name , drivername )
327349}
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