diff --git a/controllers/metal3.io/baremetalhost_controller.go b/controllers/metal3.io/baremetalhost_controller.go index 502116e22a..d940abbf55 100644 --- a/controllers/metal3.io/baremetalhost_controller.go +++ b/controllers/metal3.io/baremetalhost_controller.go @@ -612,26 +612,28 @@ func clearHostProvisioningSettings(host *metal3v1alpha1.BareMetalHost) { } func (r *BareMetalHostReconciler) actionDeprovisioning(prov provisioner.Provisioner, info *reconcileInfo) actionResult { - // Adopt the host in case it has been re-registered during the - // deprovisioning process before it completed - provResult, err := prov.Adopt(info.host.Status.ErrorType == metal3v1alpha1.RegistrationError) - if err != nil { - return actionError{err} - } - if provResult.ErrorMessage != "" { - return recordActionFailure(info, metal3v1alpha1.RegistrationError, provResult.ErrorMessage) - } - if provResult.Dirty { - result := actionContinue{provResult.RequeueAfter} - if clearError(info.host) { - return actionUpdate{result} + if info.host.Status.Provisioning.Image.URL != "" { + // Adopt the host in case it has been re-registered during the + // deprovisioning process before it completed + provResult, err := prov.Adopt(info.host.Status.ErrorType == metal3v1alpha1.RegistrationError) + if err != nil { + return actionError{err} + } + if provResult.ErrorMessage != "" { + return recordActionFailure(info, metal3v1alpha1.RegistrationError, provResult.ErrorMessage) + } + if provResult.Dirty { + result := actionContinue{provResult.RequeueAfter} + if clearError(info.host) { + return actionUpdate{result} + } + return result } - return result } info.log.Info("deprovisioning") - provResult, err = prov.Deprovision(info.host.Status.ErrorType == metal3v1alpha1.ProvisioningError) + provResult, err := prov.Deprovision(info.host.Status.ErrorType == metal3v1alpha1.ProvisioningError) if err != nil { return actionError{errors.Wrap(err, "failed to deprovision")} } diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go index 8dc7c6fe44..22379f70fe 100644 --- a/pkg/provisioner/ironic/ironic.go +++ b/pkg/provisioner/ironic/ironic.go @@ -1329,7 +1329,7 @@ func (p *ironicProvisioner) Deprovision(force bool) (result provisioner.Result, p.log.Info("cleaning") return operationContinuing(deprovisionRequeueDelay) - case nodes.Active: + case nodes.Active, nodes.DeployFail: p.log.Info("starting deprovisioning") p.publisher("DeprovisioningStarted", "Image deprovisioning started") return p.changeNodeProvisionState( diff --git a/pkg/provisioner/ironic/provision_test.go b/pkg/provisioner/ironic/provision_test.go index 947cecab83..a8f3d69344 100644 --- a/pkg/provisioner/ironic/provision_test.go +++ b/pkg/provisioner/ironic/provision_test.go @@ -145,6 +145,15 @@ func TestDeprovision(t *testing.T) { expectedRequestAfter: 10, expectedDirty: true, }, + { + name: "deploy failed state", + ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{ + ProvisionState: string(nodes.DeployFail), + UUID: nodeUUID, + }), + expectedRequestAfter: 10, + expectedDirty: true, + }, { name: "error state", ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{