diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go index 14a2a15944..c2f0581cbe 100644 --- a/pkg/provisioner/ironic/ironic.go +++ b/pkg/provisioner/ironic/ironic.go @@ -946,7 +946,7 @@ func buildCapabilitiesValue(ironicNode *nodes.Node, bootMode metal3v1alpha1.Boot return } -func (p *ironicProvisioner) startProvisioning(ironicNode *nodes.Node, hostConf provisioner.HostConfigData) (result provisioner.Result, err error) { +func (p *ironicProvisioner) setUpForProvisioning(ironicNode *nodes.Node, hostConf provisioner.HostConfigData) (result provisioner.Result, err error) { p.log.Info("starting provisioning", "node properties", ironicNode.Properties) @@ -1096,7 +1096,7 @@ func (p *ironicProvisioner) Provision(hostConf provisioner.HostConfigData) (resu return result, nil } p.log.Info("recovering from previous failure") - if provResult, err := p.startProvisioning(ironicNode, hostConf); err != nil || provResult.Dirty || provResult.ErrorMessage != "" { + if provResult, err := p.setUpForProvisioning(ironicNode, hostConf); err != nil || provResult.Dirty || provResult.ErrorMessage != "" { return provResult, err } @@ -1107,8 +1107,18 @@ func (p *ironicProvisioner) Provision(hostConf provisioner.HostConfigData) (resu return p.changeNodeProvisionState(ironicNode, nodes.ProvisionStateOpts{Target: nodes.TargetProvide}) + case nodes.CleanFail: + if ironicNode.Maintenance { + p.log.Info("clearing maintenance flag") + return p.setMaintenanceFlag(ironicNode, false) + } + return p.changeNodeProvisionState( + ironicNode, + nodes.ProvisionStateOpts{Target: nodes.TargetManage}, + ) + case nodes.Available: - if provResult, err := p.startProvisioning(ironicNode, hostConf); err != nil || provResult.Dirty || provResult.ErrorMessage != "" { + if provResult, err := p.setUpForProvisioning(ironicNode, hostConf); err != nil || provResult.Dirty || provResult.ErrorMessage != "" { return provResult, err } diff --git a/pkg/provisioner/ironic/provision_test.go b/pkg/provisioner/ironic/provision_test.go index d924b9b729..6b6038ffc6 100644 --- a/pkg/provisioner/ironic/provision_test.go +++ b/pkg/provisioner/ironic/provision_test.go @@ -33,6 +33,15 @@ func TestProvision(t *testing.T) { expectedRequestAfter: 0, expectedDirty: true, }, + { + name: "cleanFail state", + ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{ + ProvisionState: string(nodes.CleanFail), + UUID: nodeUUID, + }), + expectedRequestAfter: 10, + expectedDirty: true, + }, { name: "manageable state", ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{