Skip to content

Commit

Permalink
Reboot instead of power on/off
Browse files Browse the repository at this point in the history
If DisablePowerOff is enabled we can't power off for the
reboot annotation, instead we call a reboot action and clear the
annotation.
  • Loading branch information
derekhiggins committed Jan 31, 2025
1 parent 15fa0b2 commit 8d727f7
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
12 changes: 12 additions & 0 deletions controllers/metal3.io/baremetalhost_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1594,6 +1594,18 @@ func (r *BareMetalHostReconciler) manageHostPower(prov provisioner.Provisioner,
return actionError{errors.Wrap(err, "failed to manage power state of host")}
}

// If DisablePowerOff was enabled then prov.PowerOff above will have rebooted instead of powering off, in this case
// the operation is complete (no need to power on) and any reboot annotation can be removed
if info.host.Spec.DisablePowerOff {
if _, suffixlessAnnotationExists := info.host.Annotations[metal3api.RebootAnnotationPrefix]; suffixlessAnnotationExists {
delete(info.host.Annotations, metal3api.RebootAnnotationPrefix)
if err = r.Update(info.ctx, info.host); err != nil {
return actionError{errors.Wrap(err, "failed to remove reboot annotation from host")}
}
return actionContinue{}
}
}

if provResult.ErrorMessage != "" {
if !desiredPowerOnState && desiredRebootMode == metal3api.RebootModeSoft &&
info.host.Status.ErrorType != metal3api.PowerManagementError {
Expand Down
12 changes: 10 additions & 2 deletions pkg/provisioner/ironic/ironic.go
Original file line number Diff line number Diff line change
Expand Up @@ -1642,13 +1642,21 @@ func (p *ironicProvisioner) PowerOff(rebootMode metal3api.RebootMode, force bool
}

if rebootMode == metal3api.RebootModeSoft && !force {
result, err = p.changePower(ironicNode, nodes.SoftPowerOff)
powerTarget := nodes.SoftPowerOff
if ironicNode.DisablePowerOff {
powerTarget = nodes.SoftRebooting
}
result, err = p.changePower(ironicNode, powerTarget)
if !errors.As(err, &softPowerOffUnsupportedError{}) {
return result, err
}
}
// Reboot mode is hard, force flag is set, or soft power off is not supported
return p.changePower(ironicNode, nodes.PowerOff)
powerTarget := nodes.PowerOff
if ironicNode.DisablePowerOff {
powerTarget = nodes.Rebooting
}
return p.changePower(ironicNode, powerTarget)
}

return operationComplete()
Expand Down

0 comments on commit 8d727f7

Please sign in to comment.