Skip to content

Commit 9b92287

Browse files
committed
Fix panic when OpenStack server is deleted by an external agent
The panic happened because we did not correctly handle that GetInstanceStatus returns a nil server if the server does not exist, rather than a 404 error. We had the same oversight in the OpenStackServer controller. It looks like this would have resulted in recreating the server.
1 parent e303937 commit 9b92287

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

controllers/openstackmachine_controller.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,11 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
365365
return ctrl.Result{}, err
366366
}
367367

368+
result := r.reconcileMachineState(scope, openStackMachine, machine, machineServer)
369+
if result != nil {
370+
return *result, nil
371+
}
372+
368373
computeService, err := compute.NewService(scope)
369374
if err != nil {
370375
return ctrl.Result{}, err
@@ -377,6 +382,12 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
377382
return ctrl.Result{}, err
378383
}
379384

385+
if instanceStatus == nil {
386+
msg := "server has been unexpectedly deleted"
387+
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceDeletedReason, clusterv1.ConditionSeverityError, msg)
388+
openStackMachine.SetFailure(capoerrors.DeprecatedCAPIUpdateMachineError, errors.New(msg))
389+
}
390+
380391
instanceNS, err := instanceStatus.NetworkStatus()
381392
if err != nil {
382393
return ctrl.Result{}, fmt.Errorf("get network status: %w", err)
@@ -393,22 +404,15 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
393404
})
394405
openStackMachine.Status.Addresses = addresses
395406

396-
result := r.reconcileMachineState(scope, openStackMachine, machine, machineServer)
397-
if result != nil {
398-
return *result, nil
399-
}
400-
401-
if !util.IsControlPlaneMachine(machine) {
402-
scope.Logger().Info("Not a Control plane machine, no floating ip reconcile needed, Reconciled Machine create successfully")
403-
return ctrl.Result{}, nil
404-
}
407+
if util.IsControlPlaneMachine(machine) {
408+
err = r.reconcileAPIServerLoadBalancer(scope, openStackCluster, openStackMachine, instanceStatus, instanceNS, clusterResourceName)
409+
if err != nil {
410+
return ctrl.Result{}, err
411+
}
405412

406-
err = r.reconcileAPIServerLoadBalancer(scope, openStackCluster, openStackMachine, instanceStatus, instanceNS, clusterResourceName)
407-
if err != nil {
408-
return ctrl.Result{}, err
413+
conditions.MarkTrue(openStackMachine, infrav1.APIServerIngressReadyCondition)
409414
}
410415

411-
conditions.MarkTrue(openStackMachine, infrav1.APIServerIngressReadyCondition)
412416
scope.Logger().Info("Reconciled Machine create successfully")
413417
return ctrl.Result{}, nil
414418
}

controllers/openstackserver_controller.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,15 @@ func (r *OpenStackServerReconciler) getOrCreateServer(ctx context.Context, logge
433433

434434
if openStackServer.Status.InstanceID != nil {
435435
instanceStatus, err = computeService.GetInstanceStatus(*openStackServer.Status.InstanceID)
436-
if err != nil {
437-
logger.Info("Unable to get OpenStack instance", "name", openStackServer.Name)
438-
conditions.MarkFalse(openStackServer, infrav1.InstanceReadyCondition, infrav1.OpenStackErrorReason, clusterv1.ConditionSeverityError, "%s", err.Error())
436+
if err != nil || instanceStatus == nil {
437+
logger.Info("Unable to get OpenStack instance", "name", openStackServer.Name, "id", *openStackServer.Status.InstanceID)
438+
var msg string
439+
if err != nil {
440+
msg = err.Error()
441+
} else {
442+
msg = "server has been unexpectedly deleted"
443+
}
444+
conditions.MarkFalse(openStackServer, infrav1.InstanceReadyCondition, infrav1.OpenStackErrorReason, clusterv1.ConditionSeverityError, "%s", msg)
439445
return nil, err
440446
}
441447
}

0 commit comments

Comments
 (0)