Skip to content

Commit 2fe8b0b

Browse files
committed
refactor reconcileNormal to reduce cyclomatic complexity
Signed-off-by: Gregory Detal <[email protected]>
1 parent 631b1ff commit 2fe8b0b

File tree

1 file changed

+76
-65
lines changed

1 file changed

+76
-65
lines changed

controllers/openstackcluster_controller.go

Lines changed: 76 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import (
2121
"fmt"
2222

2323
"github.com/go-logr/logr"
24+
"github.com/gophercloud/gophercloud"
2425
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
2526
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
27+
"github.com/gophercloud/utils/openstack/clientconfig"
2628
"github.com/pkg/errors"
2729
apierrors "k8s.io/apimachinery/pkg/api/errors"
2830
"k8s.io/client-go/tools/record"
@@ -189,8 +191,6 @@ func contains(arr []string, target string) bool {
189191
func (r *OpenStackClusterReconciler) reconcileNormal(ctx context.Context, log logr.Logger, patchHelper *patch.Helper, cluster *clusterv1.Cluster, openStackCluster *infrav1.OpenStackCluster) (ctrl.Result, error) {
190192
log.Info("Reconciling Cluster")
191193

192-
clusterName := fmt.Sprintf("%s-%s", cluster.Namespace, cluster.Name)
193-
194194
// If the OpenStackCluster doesn't have our finalizer, add it.
195195
controllerutil.AddFinalizer(openStackCluster, infrav1.ClusterFinalizer)
196196
// Register the finalizer immediately to avoid orphaning OpenStack resources on delete
@@ -208,73 +208,11 @@ func (r *OpenStackClusterReconciler) reconcileNormal(ctx context.Context, log lo
208208
return reconcile.Result{}, err
209209
}
210210

211-
networkingService, err := networking.NewService(osProviderClient, clientOpts, log)
212-
if err != nil {
213-
return reconcile.Result{}, err
214-
}
215-
216-
loadBalancerService, err := loadbalancer.NewService(osProviderClient, clientOpts, log, openStackCluster.Spec.UseOctavia)
211+
err = r.reconcileNetworkComponents(log, osProviderClient, clientOpts, cluster, openStackCluster)
217212
if err != nil {
218213
return reconcile.Result{}, err
219214
}
220215

221-
log.Info("Reconciling network components")
222-
if openStackCluster.Spec.NodeCIDR == "" {
223-
log.V(4).Info("No need to reconcile network, searching network and subnet instead")
224-
225-
netOpts := networks.ListOpts(openStackCluster.Spec.Network)
226-
networkList, err := networkingService.GetNetworksByFilter(&netOpts)
227-
if err != nil && len(networkList) == 0 {
228-
return reconcile.Result{}, errors.Errorf("failed to find network: %v", err)
229-
}
230-
if len(networkList) > 1 {
231-
return reconcile.Result{}, errors.Errorf("failed to find only one network (result: %v): %v", networkList, err)
232-
}
233-
openStackCluster.Status.Network = &infrav1.Network{
234-
ID: networkList[0].ID,
235-
Name: networkList[0].Name,
236-
}
237-
238-
subnetOpts := subnets.ListOpts(openStackCluster.Spec.Subnet)
239-
subnetOpts.NetworkID = networkList[0].ID
240-
subnetList, err := networkingService.GetSubnetsByFilter(&subnetOpts)
241-
if err != nil || len(subnetList) == 0 {
242-
return reconcile.Result{}, errors.Errorf("failed to find subnet: %v", err)
243-
}
244-
if len(subnetList) > 1 {
245-
return reconcile.Result{}, errors.Errorf("failed to find only one subnet (result: %v): %v", subnetList, err)
246-
}
247-
openStackCluster.Status.Network.Subnet = &infrav1.Subnet{
248-
ID: subnetList[0].ID,
249-
Name: subnetList[0].Name,
250-
CIDR: subnetList[0].CIDR,
251-
}
252-
} else {
253-
err := networkingService.ReconcileNetwork(clusterName, openStackCluster)
254-
if err != nil {
255-
return reconcile.Result{}, errors.Errorf("failed to reconcile network: %v", err)
256-
}
257-
err = networkingService.ReconcileSubnet(clusterName, openStackCluster)
258-
if err != nil {
259-
return reconcile.Result{}, errors.Errorf("failed to reconcile subnets: %v", err)
260-
}
261-
err = networkingService.ReconcileRouter(clusterName, openStackCluster)
262-
if err != nil {
263-
return reconcile.Result{}, errors.Errorf("failed to reconcile router: %v", err)
264-
}
265-
if openStackCluster.Spec.ManagedAPIServerLoadBalancer {
266-
err = loadBalancerService.ReconcileLoadBalancer(clusterName, openStackCluster)
267-
if err != nil {
268-
return reconcile.Result{}, errors.Errorf("failed to reconcile load balancer: %v", err)
269-
}
270-
}
271-
}
272-
273-
err = networkingService.ReconcileSecurityGroups(clusterName, openStackCluster)
274-
if err != nil {
275-
return reconcile.Result{}, errors.Errorf("failed to reconcile security groups: %v", err)
276-
}
277-
278216
// Set APIEndpoints so the Cluster API Cluster Controller can pull them
279217
if openStackCluster.Spec.ManagedAPIServerLoadBalancer {
280218
openStackCluster.Spec.ControlPlaneEndpoint = clusterv1.APIEndpoint{
@@ -339,6 +277,79 @@ func (r *OpenStackClusterReconciler) reconcileNormal(ctx context.Context, log lo
339277
return ctrl.Result{}, nil
340278
}
341279

280+
func (r *OpenStackClusterReconciler) reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.ProviderClient, clientOpts *clientconfig.ClientOpts, cluster *clusterv1.Cluster, openStackCluster *infrav1.OpenStackCluster) error {
281+
clusterName := fmt.Sprintf("%s-%s", cluster.Namespace, cluster.Name)
282+
283+
networkingService, err := networking.NewService(osProviderClient, clientOpts, log)
284+
if err != nil {
285+
return err
286+
}
287+
288+
loadBalancerService, err := loadbalancer.NewService(osProviderClient, clientOpts, log, openStackCluster.Spec.UseOctavia)
289+
if err != nil {
290+
return err
291+
}
292+
293+
log.Info("Reconciling network components")
294+
if openStackCluster.Spec.NodeCIDR == "" {
295+
log.V(4).Info("No need to reconcile network, searching network and subnet instead")
296+
297+
netOpts := networks.ListOpts(openStackCluster.Spec.Network)
298+
networkList, err := networkingService.GetNetworksByFilter(&netOpts)
299+
if err != nil && len(networkList) == 0 {
300+
return errors.Errorf("failed to find network: %v", err)
301+
}
302+
if len(networkList) > 1 {
303+
return errors.Errorf("failed to find only one network (result: %v): %v", networkList, err)
304+
}
305+
openStackCluster.Status.Network = &infrav1.Network{
306+
ID: networkList[0].ID,
307+
Name: networkList[0].Name,
308+
}
309+
310+
subnetOpts := subnets.ListOpts(openStackCluster.Spec.Subnet)
311+
subnetOpts.NetworkID = networkList[0].ID
312+
subnetList, err := networkingService.GetSubnetsByFilter(&subnetOpts)
313+
if err != nil || len(subnetList) == 0 {
314+
return errors.Errorf("failed to find subnet: %v", err)
315+
}
316+
if len(subnetList) > 1 {
317+
return errors.Errorf("failed to find only one subnet (result: %v): %v", subnetList, err)
318+
}
319+
openStackCluster.Status.Network.Subnet = &infrav1.Subnet{
320+
ID: subnetList[0].ID,
321+
Name: subnetList[0].Name,
322+
CIDR: subnetList[0].CIDR,
323+
}
324+
} else {
325+
err := networkingService.ReconcileNetwork(clusterName, openStackCluster)
326+
if err != nil {
327+
return errors.Errorf("failed to reconcile network: %v", err)
328+
}
329+
err = networkingService.ReconcileSubnet(clusterName, openStackCluster)
330+
if err != nil {
331+
return errors.Errorf("failed to reconcile subnets: %v", err)
332+
}
333+
err = networkingService.ReconcileRouter(clusterName, openStackCluster)
334+
if err != nil {
335+
return errors.Errorf("failed to reconcile router: %v", err)
336+
}
337+
if openStackCluster.Spec.ManagedAPIServerLoadBalancer {
338+
err = loadBalancerService.ReconcileLoadBalancer(clusterName, openStackCluster)
339+
if err != nil {
340+
return errors.Errorf("failed to reconcile load balancer: %v", err)
341+
}
342+
}
343+
}
344+
345+
err = networkingService.ReconcileSecurityGroups(clusterName, openStackCluster)
346+
if err != nil {
347+
return errors.Errorf("failed to reconcile security groups: %v", err)
348+
}
349+
350+
return nil
351+
}
352+
342353
func (r *OpenStackClusterReconciler) SetupWithManager(mgr ctrl.Manager, options controller.Options) error {
343354
return ctrl.NewControllerManagedBy(mgr).
344355
WithOptions(options).

0 commit comments

Comments
 (0)