Skip to content

Commit bc08033

Browse files
controller: Prefer NetworkFenceClass for secrets and params
This patch adds support for reading the driver, secrets and parameters from NetworkFenceClass if specified in the spec for NetworkFence. A deprecation warning is logged if NetworkFenceClassName is missing. Signed-off-by: Niraj Yadav <niryadav@redhat.com>
1 parent 859f364 commit bc08033

File tree

1 file changed

+77
-11
lines changed

1 file changed

+77
-11
lines changed

internal/controller/csiaddons/networkfence_controller.go

+77-11
Original file line numberDiff line numberDiff line change
@@ -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

185188
func (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

Comments
 (0)