Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions internal/controller/aggregates_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,15 @@ func slicesEqualUnordered(a, b []string) bool {
return true
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (ac *AggregatesController) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(AggregatesControllerName).
For(&kvmv1.Hypervisor{}, builder.WithPredicates(utils.LifecycleEnabledPredicate)).
Complete(ac)
}

// SetupWithManager sets up the controller with the Manager.
func (ac *AggregatesController) SetupWithManager(mgr ctrl.Manager) error {
ctx := context.Background()
Expand All @@ -226,8 +235,5 @@ func (ac *AggregatesController) SetupWithManager(mgr ctrl.Manager) error {
return err
}

return ctrl.NewControllerManagedBy(mgr).
Named(AggregatesControllerName).
For(&kvmv1.Hypervisor{}, builder.WithPredicates(utils.LifecycleEnabledPredicate)).
Complete(ac)
return ac.registerWithManager(mgr)
}
14 changes: 10 additions & 4 deletions internal/controller/eviction_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,15 @@ func (r *EvictionReconciler) coldMigrate(ctx context.Context, uuid string, evict
return nil
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (r *EvictionReconciler) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(EvictionControllerName).
For(&kvmv1.Eviction{}).
Complete(r)
}

// SetupWithManager sets up the controller with the Manager.
func (r *EvictionReconciler) SetupWithManager(mgr ctrl.Manager) error {
ctx := context.Background()
Expand All @@ -452,8 +461,5 @@ func (r *EvictionReconciler) SetupWithManager(mgr ctrl.Manager) error {
}
r.computeClient.Microversion = "2.90" // Xena (or later)

return ctrl.NewControllerManagedBy(mgr).
Named(EvictionControllerName).
For(&kvmv1.Eviction{}).
Complete(r)
return r.registerWithManager(mgr)
}
16 changes: 11 additions & 5 deletions internal/controller/hypervisor_maintenance_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,16 @@ func (hec *HypervisorMaintenanceController) ensureEviction(ctx context.Context,
}
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (hec *HypervisorMaintenanceController) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(HypervisorMaintenanceControllerName).
For(&kvmv1.Hypervisor{}).
Owns(&kvmv1.Eviction{}). // trigger Reconcile whenever an Own-ed eviction is created/updated/deleted
Complete(hec)
}

// SetupWithManager sets up the controller with the Manager.
func (hec *HypervisorMaintenanceController) SetupWithManager(mgr ctrl.Manager) error {
ctx := context.Background()
Expand All @@ -257,9 +267,5 @@ func (hec *HypervisorMaintenanceController) SetupWithManager(mgr ctrl.Manager) e
}
hec.computeClient.Microversion = "2.90" // Xena (or later)

return ctrl.NewControllerManagedBy(mgr).
Named(HypervisorMaintenanceControllerName).
For(&kvmv1.Hypervisor{}).
Owns(&kvmv1.Eviction{}). // trigger Reconcile whenever an Own-ed eviction is created/updated/deleted
Complete(hec)
return hec.registerWithManager(mgr)
}
14 changes: 10 additions & 4 deletions internal/controller/offboarding_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,15 @@ func (r *HypervisorOffboardingReconciler) markOffboarded(ctx context.Context, hv
return nil
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (r *HypervisorOffboardingReconciler) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(OffboardingControllerName).
For(&kvmv1.Hypervisor{}).
Complete(r)
}

// SetupWithManager sets up the controller with the Manager.
func (r *HypervisorOffboardingReconciler) SetupWithManager(mgr ctrl.Manager) error {
ctx := context.Background()
Expand All @@ -204,8 +213,5 @@ func (r *HypervisorOffboardingReconciler) SetupWithManager(mgr ctrl.Manager) err
}
r.placementClient.Microversion = "1.39" // yoga, or later

return ctrl.NewControllerManagedBy(mgr).
Named(OffboardingControllerName).
For(&kvmv1.Hypervisor{}).
Complete(r)
return r.registerWithManager(mgr)
}
38 changes: 26 additions & 12 deletions internal/controller/onboarding_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ type OnboardingController struct {
testComputeClient *gophercloud.ServiceClient
testImageClient *gophercloud.ServiceClient
testNetworkClient *gophercloud.ServiceClient
requeueInterval time.Duration
}

func (r *OnboardingController) getRequeueInterval() time.Duration {
if r.requeueInterval > 0 {
return r.requeueInterval
}
return defaultWaitTime
}

// +kubebuilder:rbac:groups=kvm.cloud.sap,resources=hypervisors,verbs=get;list;watch;patch
Expand Down Expand Up @@ -101,7 +109,7 @@ func (r *OnboardingController) Reconcile(ctx context.Context, req ctrl.Request)
if hv.Status.HypervisorID == "" || hv.Status.ServiceID == "" {
if err := r.ensureNovaProperties(ctx, hv); err != nil {
if errors.Is(err, errRequeue) {
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}
return ctrl.Result{}, err
}
Expand Down Expand Up @@ -239,7 +247,7 @@ func (r *OnboardingController) smokeTest(ctx context.Context, hv *kvmv1.Hypervis
if err != nil {
// should not happened
log.Error(err, "failed to get test instance, instance vanished", "id", id)
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}

// Set condition back to testing
Expand All @@ -260,7 +268,7 @@ func (r *OnboardingController) smokeTest(ctx context.Context, hv *kvmv1.Hypervis
log.Error(err, "failed to delete test instance", "id", id)
}

return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
case "ACTIVE":
consoleOutput, err := servers.
ShowConsoleOutput(ctx, r.testComputeClient, server.ID, servers.ShowConsoleOutputOpts{Length: 11}).
Expand All @@ -277,7 +285,7 @@ func (r *OnboardingController) smokeTest(ctx context.Context, hv *kvmv1.Hypervis
}); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}

if !strings.Contains(consoleOutput, server.Name) {
Expand All @@ -299,7 +307,7 @@ func (r *OnboardingController) smokeTest(ctx context.Context, hv *kvmv1.Hypervis
}
}
}
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}

if err = servers.Delete(ctx, r.testComputeClient, server.ID).ExtractErr(); err != nil {
Expand All @@ -314,12 +322,12 @@ func (r *OnboardingController) smokeTest(ctx context.Context, hv *kvmv1.Hypervis
}); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}

return r.completeOnboarding(ctx, host, hv)
default:
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}
}

Expand All @@ -332,7 +340,7 @@ func (r *OnboardingController) completeOnboarding(ctx context.Context, host stri
return ctrl.Result{}, nil
}
if !meta.IsStatusConditionTrue(hv.Status.Conditions, kvmv1.ConditionTypeTraitsUpdated) {
return ctrl.Result{RequeueAfter: defaultWaitTime}, nil
return ctrl.Result{RequeueAfter: r.getRequeueInterval()}, nil
}

// Wait for HypervisorInstanceHa controller to enable HA
Expand Down Expand Up @@ -582,6 +590,15 @@ func (r *OnboardingController) findTestImage(ctx context.Context) (string, error
return "", fmt.Errorf("couldn't find image with name %v", testImageName)
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (r *OnboardingController) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(OnboardingControllerName).
For(&kvmv1.Hypervisor{}).
Complete(r)
}

// SetupWithManager sets up the controller with the Manager.
func (r *OnboardingController) SetupWithManager(mgr ctrl.Manager) error {
if r.TestFlavorID == "" {
Expand Down Expand Up @@ -621,8 +638,5 @@ func (r *OnboardingController) SetupWithManager(mgr ctrl.Manager) error {
r.Clock = clock.RealClock{}
}

return ctrl.NewControllerManagedBy(mgr).
Named(OnboardingControllerName).
For(&kvmv1.Hypervisor{}).
Complete(r)
return r.registerWithManager(mgr)
}
14 changes: 10 additions & 4 deletions internal/controller/traits_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,15 @@ func getTraitCondition(err error, msg string) metav1.Condition {
}
}

// registerWithManager registers the controller with the Manager without acquiring OpenStack clients.
// This is useful for testing where clients are injected directly.
func (tc *TraitsController) registerWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named(TraitsControllerName).
For(&kvmv1.Hypervisor{}).
Complete(tc)
}

// SetupWithManager sets up the controller with the Manager.
func (tc *TraitsController) SetupWithManager(mgr ctrl.Manager) error {
ctx := context.Background()
Expand All @@ -186,8 +195,5 @@ func (tc *TraitsController) SetupWithManager(mgr ctrl.Manager) error {
}
tc.serviceClient.Microversion = "1.39" // yoga, or later

return ctrl.NewControllerManagedBy(mgr).
Named(TraitsControllerName).
For(&kvmv1.Hypervisor{}).
Complete(tc)
return tc.registerWithManager(mgr)
}
Loading