diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 774c236bcd202eb948548d609bcbfb9ed463744c..4845389be3401ae48ad5d795edfcc438bd7dc73b 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -4360,6 +4360,7 @@ class LUSetNodeParams(LogicalUnit): ("vm_capable", None, ht.TMaybeBool), ("secondary_ip", None, ht.TMaybeString), ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)), + ("powered", None, ht.TMaybeBool), _PForce, ] REQ_BGL = False @@ -4503,11 +4504,16 @@ class LUSetNodeParams(LogicalUnit): # away from the respective state, as only real changes are kept # TODO: We might query the real power state if it supports OOB - if _SupportsOob(self.cfg, node) and (self.op.offline is False and - not node.powered): - raise errors.OpPrereqError(("Please power on node %s first before you" - " can reset offline state") % - self.op.node_name) + if _SupportsOob(self.cfg, node): + if self.op.offline is False and not (node.powered or + self.op.powered == True): + raise errors.OpPrereqError(("Please power on node %s first before you" + " can reset offline state") % + self.op.node_name) + elif self.op.powered is not None: + raise errors.OpPrereqError(("Unable to change powered state for node %s" + " which does not support out-of-band" + " handling") % self.op.node_name) # If we're being deofflined/drained, we'll MC ourself if needed if (self.op.drained == False or self.op.offline == False or @@ -4598,6 +4604,9 @@ class LUSetNodeParams(LogicalUnit): if self.op.ndparams: node.ndparams = self.new_ndparams + if self.op.powered is not None: + node.powered = self.op.powered + for attr in ["master_capable", "vm_capable"]: val = getattr(self.op, attr) if val is not None: diff --git a/lib/opcodes.py b/lib/opcodes.py index 9ce1822aed40ac484ee75ede8c509af5ac0553fa..a5151316ca3d64b9e2fcd6b9574b22971f1081fa 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -490,6 +490,7 @@ class OpSetNodeParams(OpCode): "vm_capable", "secondary_ip", "ndparams", + "powered", ]