Merge "Remove 'node' parameter from the Power interface"
This commit is contained in:
commit
c4b236b086
@ -211,7 +211,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
if 'instance_uuid' in delta:
|
if 'instance_uuid' in delta:
|
||||||
task.driver.power.validate(task, node_obj)
|
task.driver.power.validate(task, node_obj)
|
||||||
node_obj['power_state'] = \
|
node_obj['power_state'] = \
|
||||||
task.driver.power.get_power_state(task, node_obj)
|
task.driver.power.get_power_state(task)
|
||||||
|
|
||||||
if node_obj['power_state'] != states.POWER_OFF:
|
if node_obj['power_state'] != states.POWER_OFF:
|
||||||
raise exception.NodeInWrongPowerState(
|
raise exception.NodeInWrongPowerState(
|
||||||
@ -249,7 +249,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
with task_manager.acquire(context, node_id, shared=False) as task:
|
with task_manager.acquire(context, node_id, shared=False) as task:
|
||||||
task.driver.power.validate(task, task.node)
|
task.driver.power.validate(task, task.node)
|
||||||
task.spawn_after(self._spawn_worker, utils.node_power_action,
|
task.spawn_after(self._spawn_worker, utils.node_power_action,
|
||||||
task, task.node, new_state)
|
task, new_state)
|
||||||
|
|
||||||
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
|
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
|
||||||
exception.NodeLocked,
|
exception.NodeLocked,
|
||||||
@ -512,7 +512,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
power_state = task.driver.power.get_power_state(task, node)
|
power_state = task.driver.power.get_power_state(task)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# TODO(rloo): change to IronicException, after
|
# TODO(rloo): change to IronicException, after
|
||||||
# https://bugs.launchpad.net/ironic/+bug/1267693
|
# https://bugs.launchpad.net/ironic/+bug/1267693
|
||||||
@ -565,8 +565,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
try:
|
try:
|
||||||
# node_power_action will update the node record
|
# node_power_action will update the node record
|
||||||
# so don't do that again here.
|
# so don't do that again here.
|
||||||
utils.node_power_action(task, task.node,
|
utils.node_power_action(task, node.power_state)
|
||||||
node.power_state)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# TODO(rloo): change to IronicException after
|
# TODO(rloo): change to IronicException after
|
||||||
# https://bugs.launchpad.net/ironic/+bug/1267693
|
# https://bugs.launchpad.net/ironic/+bug/1267693
|
||||||
|
@ -43,13 +43,12 @@ def node_set_boot_device(task, device, persistent=False):
|
|||||||
|
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def node_power_action(task, node, state):
|
def node_power_action(task, state):
|
||||||
"""Change power state or reset for a node.
|
"""Change power state or reset for a node.
|
||||||
|
|
||||||
Perform the requested power action if the transition is required.
|
Perform the requested power action if the transition is required.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: the Node object to act upon.
|
|
||||||
:param state: Any power state from ironic.common.states. If the
|
:param state: Any power state from ironic.common.states. If the
|
||||||
state is 'REBOOT' then a reboot will be attempted, otherwise
|
state is 'REBOOT' then a reboot will be attempted, otherwise
|
||||||
the node power state is directly set to 'state'.
|
the node power state is directly set to 'state'.
|
||||||
@ -59,12 +58,13 @@ def node_power_action(task, node, state):
|
|||||||
wrong occurred during the power action.
|
wrong occurred during the power action.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
node = task.node
|
||||||
context = task.context
|
context = task.context
|
||||||
new_state = states.POWER_ON if state == states.REBOOT else state
|
new_state = states.POWER_ON if state == states.REBOOT else state
|
||||||
|
|
||||||
if state != states.REBOOT:
|
if state != states.REBOOT:
|
||||||
try:
|
try:
|
||||||
curr_state = task.driver.power.get_power_state(task, node)
|
curr_state = task.driver.power.get_power_state(task)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
node['last_error'] = \
|
node['last_error'] = \
|
||||||
@ -100,9 +100,9 @@ def node_power_action(task, node, state):
|
|||||||
# take power action
|
# take power action
|
||||||
try:
|
try:
|
||||||
if state != states.REBOOT:
|
if state != states.REBOOT:
|
||||||
task.driver.power.set_power_state(task, node, new_state)
|
task.driver.power.set_power_state(task, new_state)
|
||||||
else:
|
else:
|
||||||
task.driver.power.reboot(task, node)
|
task.driver.power.reboot(task)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
node['last_error'] = \
|
node['last_error'] = \
|
||||||
|
@ -192,6 +192,9 @@ class DeployInterface(object):
|
|||||||
class PowerInterface(object):
|
class PowerInterface(object):
|
||||||
"""Interface for power-related actions."""
|
"""Interface for power-related actions."""
|
||||||
|
|
||||||
|
# TODO(lucasagomes): The 'node' parameter needs to be passed to validate()
|
||||||
|
# because of the ConductorManager.validate_driver_interfaces().
|
||||||
|
# Remove it after all cleaning all the interfaces
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def validate(self, task, node):
|
def validate(self, task, node):
|
||||||
"""Validate the driver-specific Node power info.
|
"""Validate the driver-specific Node power info.
|
||||||
@ -200,30 +203,32 @@ class PowerInterface(object):
|
|||||||
supplied node contains the required information for this driver to
|
supplied node contains the required information for this driver to
|
||||||
manage the power state of the node.
|
manage the power state of the node.
|
||||||
|
|
||||||
:param task: a task from TaskManager.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: a single Node to validate.
|
:param node: a single Node to validate.
|
||||||
:raises: InvalidParameterValue
|
:raises: InvalidParameterValue
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
"""Return the power state of the node.
|
"""Return the power state of the task's node.
|
||||||
|
|
||||||
TODO
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
|
:returns: a power state. One of :mod:`ironic.common.states`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def set_power_state(self, task, node, power_state):
|
def set_power_state(self, task, power_state):
|
||||||
"""Set the power state of the node.
|
"""Set the power state of the task's node.
|
||||||
|
|
||||||
TODO
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
|
:param power_state: Any power state from :mod:`ironic.common.states`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
"""Perform a hard reboot of the node.
|
"""Perform a hard reboot of the task's node.
|
||||||
|
|
||||||
TODO
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,16 +45,16 @@ class FakePower(base.PowerInterface):
|
|||||||
def validate(self, task, node):
|
def validate(self, task, node):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
return node.power_state
|
return task.node.power_state
|
||||||
|
|
||||||
def set_power_state(self, task, node, power_state):
|
def set_power_state(self, task, power_state):
|
||||||
if power_state not in [states.POWER_ON, states.POWER_OFF]:
|
if power_state not in [states.POWER_ON, states.POWER_OFF]:
|
||||||
raise exception.InvalidParameterValue(_("set_power_state called "
|
raise exception.InvalidParameterValue(_("set_power_state called "
|
||||||
"with an invalid power state: %s.") % power_state)
|
"with an invalid power state: %s.") % power_state)
|
||||||
node.power_state = power_state
|
task.node.power_state = power_state
|
||||||
|
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,29 +205,27 @@ class NativeIPMIPower(base.PowerInterface):
|
|||||||
:raises: InvalidParameterValue when required ipmi credentials
|
:raises: InvalidParameterValue when required ipmi credentials
|
||||||
are missing.
|
are missing.
|
||||||
"""
|
"""
|
||||||
_parse_driver_info(node)
|
_parse_driver_info(task.node)
|
||||||
|
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
"""Get the current power state.
|
"""Get the current power state of the task's node.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: the node info.
|
|
||||||
:returns: power state POWER_ON, POWER_OFF or ERROR defined in
|
:returns: power state POWER_ON, POWER_OFF or ERROR defined in
|
||||||
:class:`ironic.common.states`.
|
:class:`ironic.common.states`.
|
||||||
:raises: InvalidParameterValue when required ipmi credentials
|
:raises: InvalidParameterValue when required ipmi credentials
|
||||||
are missing.
|
are missing.
|
||||||
:raises: IPMIFailure when the native ipmi call fails.
|
:raises: IPMIFailure when the native ipmi call fails.
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
return _power_status(driver_info)
|
return _power_status(driver_info)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def set_power_state(self, task, node, pstate):
|
def set_power_state(self, task, pstate):
|
||||||
"""Turn the power on or off.
|
"""Turn the power on or off.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: the node info.
|
:param pstate: a power state that will be set on the task's node.
|
||||||
:param pstate: a power state that will be set on the given node.
|
|
||||||
:raises: IPMIFailure when the native ipmi call fails.
|
:raises: IPMIFailure when the native ipmi call fails.
|
||||||
:raises: InvalidParameterValue when an invalid power state
|
:raises: InvalidParameterValue when an invalid power state
|
||||||
is specified or required ipmi credentials are missing.
|
is specified or required ipmi credentials are missing.
|
||||||
@ -235,7 +233,7 @@ class NativeIPMIPower(base.PowerInterface):
|
|||||||
from ipmi.
|
from ipmi.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
|
|
||||||
if pstate == states.POWER_ON:
|
if pstate == states.POWER_ON:
|
||||||
_power_on(driver_info)
|
_power_on(driver_info)
|
||||||
@ -247,11 +245,10 @@ class NativeIPMIPower(base.PowerInterface):
|
|||||||
) % pstate)
|
) % pstate)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
"""Cycles the power to a node.
|
"""Cycles the power to the task's node.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: the node info.
|
|
||||||
:raises: IPMIFailure when the native ipmi call fails.
|
:raises: IPMIFailure when the native ipmi call fails.
|
||||||
:raises: InvalidParameterValue when required ipmi credentials
|
:raises: InvalidParameterValue when required ipmi credentials
|
||||||
are missing.
|
are missing.
|
||||||
@ -259,7 +256,7 @@ class NativeIPMIPower(base.PowerInterface):
|
|||||||
from ipmi.
|
from ipmi.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
_reboot(driver_info)
|
_reboot(driver_info)
|
||||||
|
|
||||||
|
|
||||||
|
@ -295,26 +295,24 @@ class IPMIPower(base.PowerInterface):
|
|||||||
"%(error)s") % {'node': node.uuid, 'error': e}
|
"%(error)s") % {'node': node.uuid, 'error': e}
|
||||||
raise exception.InvalidParameterValue(msg)
|
raise exception.InvalidParameterValue(msg)
|
||||||
|
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
"""Get the current power state.
|
"""Get the current power state of the task's node.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: The Node.
|
|
||||||
:returns: one of ironic.common.states POWER_OFF, POWER_ON or ERROR.
|
:returns: one of ironic.common.states POWER_OFF, POWER_ON or ERROR.
|
||||||
:raises: InvalidParameterValue if required ipmi parameters are missing.
|
:raises: InvalidParameterValue if required ipmi parameters are missing.
|
||||||
:raises: IPMIFailure on an error from ipmitool (from _power_status
|
:raises: IPMIFailure on an error from ipmitool (from _power_status
|
||||||
call).
|
call).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
return _power_status(driver_info)
|
return _power_status(driver_info)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def set_power_state(self, task, node, pstate):
|
def set_power_state(self, task, pstate):
|
||||||
"""Turn the power on or off.
|
"""Turn the power on or off.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: The Node.
|
|
||||||
:param pstate: The desired power state, one of ironic.common.states
|
:param pstate: The desired power state, one of ironic.common.states
|
||||||
POWER_ON, POWER_OFF.
|
POWER_ON, POWER_OFF.
|
||||||
:raises: InvalidParameterValue if required ipmi parameters are missing
|
:raises: InvalidParameterValue if required ipmi parameters are missing
|
||||||
@ -322,7 +320,7 @@ class IPMIPower(base.PowerInterface):
|
|||||||
:raises: PowerStateFailure if the power couldn't be set to pstate.
|
:raises: PowerStateFailure if the power couldn't be set to pstate.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
|
|
||||||
if pstate == states.POWER_ON:
|
if pstate == states.POWER_ON:
|
||||||
state = _power_on(driver_info)
|
state = _power_on(driver_info)
|
||||||
@ -336,17 +334,16 @@ class IPMIPower(base.PowerInterface):
|
|||||||
raise exception.PowerStateFailure(pstate=pstate)
|
raise exception.PowerStateFailure(pstate=pstate)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
"""Cycles the power to a node.
|
"""Cycles the power to the task's node.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: The Node.
|
|
||||||
:raises: InvalidParameterValue if required ipmi parameters are missing.
|
:raises: InvalidParameterValue if required ipmi parameters are missing.
|
||||||
:raises: PowerStateFailure if the final state of the node is not
|
:raises: PowerStateFailure if the final state of the node is not
|
||||||
POWER_ON.
|
POWER_ON.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
_power_off(driver_info)
|
_power_off(driver_info)
|
||||||
state = _power_on(driver_info)
|
state = _power_on(driver_info)
|
||||||
|
|
||||||
|
@ -553,7 +553,7 @@ class PXEDeploy(base.DeployInterface):
|
|||||||
_create_token_file(task)
|
_create_token_file(task)
|
||||||
_update_neutron(task)
|
_update_neutron(task)
|
||||||
manager_utils.node_set_boot_device(task, 'pxe', persistent=True)
|
manager_utils.node_set_boot_device(task, 'pxe', persistent=True)
|
||||||
manager_utils.node_power_action(task, task.node, states.REBOOT)
|
manager_utils.node_power_action(task, states.REBOOT)
|
||||||
|
|
||||||
return states.DEPLOYWAIT
|
return states.DEPLOYWAIT
|
||||||
|
|
||||||
@ -567,7 +567,7 @@ class PXEDeploy(base.DeployInterface):
|
|||||||
:param task: a TaskManager instance containing the node to act on.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:returns: deploy state DELETED.
|
:returns: deploy state DELETED.
|
||||||
"""
|
"""
|
||||||
manager_utils.node_power_action(task, task.node, states.POWER_OFF)
|
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||||
_remove_internal_attrs(task)
|
_remove_internal_attrs(task)
|
||||||
|
|
||||||
return states.DELETED
|
return states.DELETED
|
||||||
@ -680,7 +680,7 @@ class VendorPassthru(base.VendorInterface):
|
|||||||
node.target_provision_state = states.NOSTATE
|
node.target_provision_state = states.NOSTATE
|
||||||
node.save(task.context)
|
node.save(task.context)
|
||||||
try:
|
try:
|
||||||
manager_utils.node_power_action(task, node, states.POWER_OFF)
|
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||||
except Exception:
|
except Exception:
|
||||||
msg = (_('Node %s failed to power off while handling deploy '
|
msg = (_('Node %s failed to power off while handling deploy '
|
||||||
'failure. This may be a serious condition. Node '
|
'failure. This may be a serious condition. Node '
|
||||||
|
@ -321,35 +321,33 @@ class Power(base.PowerInterface):
|
|||||||
|
|
||||||
Check that node 'driver_info' contains the required fields.
|
Check that node 'driver_info' contains the required fields.
|
||||||
|
|
||||||
:param task: A instance of `ironic.manager.task_manager.TaskManager`.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: Single node object.
|
:param node: Single node object.
|
||||||
:raises: InvalidParameterValue if required seamicro parameters are
|
:raises: InvalidParameterValue if required seamicro parameters are
|
||||||
missing.
|
missing.
|
||||||
"""
|
"""
|
||||||
_parse_driver_info(node)
|
_parse_driver_info(task.node)
|
||||||
|
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
"""Get the current power state.
|
"""Get the current power state of the task's node.
|
||||||
|
|
||||||
Poll the host for the current power state of the node.
|
Poll the host for the current power state of the node.
|
||||||
|
|
||||||
:param task: A instance of `ironic.manager.task_manager.TaskManager`.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: A single node.
|
|
||||||
:raises: InvalidParameterValue if required seamicro parameters are
|
:raises: InvalidParameterValue if required seamicro parameters are
|
||||||
missing.
|
missing.
|
||||||
:raises: ServiceUnavailable on an error from SeaMicro Client.
|
:raises: ServiceUnavailable on an error from SeaMicro Client.
|
||||||
:returns: power state. One of :class:`ironic.common.states`.
|
:returns: power state. One of :class:`ironic.common.states`.
|
||||||
"""
|
"""
|
||||||
return _get_power_status(node)
|
return _get_power_status(task.node)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def set_power_state(self, task, node, pstate):
|
def set_power_state(self, task, pstate):
|
||||||
"""Turn the power on or off.
|
"""Turn the power on or off.
|
||||||
|
|
||||||
Set the power state of a node.
|
Set the power state of a node.
|
||||||
|
|
||||||
:param task: A instance of `ironic.manager.task_manager.TaskManager`.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: A single node.
|
|
||||||
:param pstate: Either POWER_ON or POWER_OFF from :class:
|
:param pstate: Either POWER_ON or POWER_OFF from :class:
|
||||||
`ironic.common.states`.
|
`ironic.common.states`.
|
||||||
:raises: InvalidParameterValue if an invalid power state was specified.
|
:raises: InvalidParameterValue if an invalid power state was specified.
|
||||||
@ -357,9 +355,9 @@ class Power(base.PowerInterface):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if pstate == states.POWER_ON:
|
if pstate == states.POWER_ON:
|
||||||
state = _power_on(node)
|
state = _power_on(task.node)
|
||||||
elif pstate == states.POWER_OFF:
|
elif pstate == states.POWER_OFF:
|
||||||
state = _power_off(node)
|
state = _power_off(task.node)
|
||||||
else:
|
else:
|
||||||
raise exception.InvalidParameterValue(_(
|
raise exception.InvalidParameterValue(_(
|
||||||
"set_power_state called with invalid power state."))
|
"set_power_state called with invalid power state."))
|
||||||
@ -368,17 +366,16 @@ class Power(base.PowerInterface):
|
|||||||
raise exception.PowerStateFailure(pstate=pstate)
|
raise exception.PowerStateFailure(pstate=pstate)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
"""Cycles the power to a node.
|
"""Cycles the power to the task's node.
|
||||||
|
|
||||||
:param task: a TaskManager instance.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: An Ironic node object.
|
|
||||||
:raises: InvalidParameterValue if required seamicro parameters are
|
:raises: InvalidParameterValue if required seamicro parameters are
|
||||||
missing.
|
missing.
|
||||||
:raises: PowerStateFailure if the final state of the node is not
|
:raises: PowerStateFailure if the final state of the node is not
|
||||||
POWER_ON.
|
POWER_ON.
|
||||||
"""
|
"""
|
||||||
state = _reboot(node)
|
state = _reboot(task.node)
|
||||||
|
|
||||||
if state != states.POWER_ON:
|
if state != states.POWER_ON:
|
||||||
raise exception.PowerStateFailure(pstate=states.POWER_ON)
|
raise exception.PowerStateFailure(pstate=states.POWER_ON)
|
||||||
|
@ -369,19 +369,17 @@ class SSHPower(base.PowerInterface):
|
|||||||
raise exception.InvalidParameterValue(_("Node %s does not have "
|
raise exception.InvalidParameterValue(_("Node %s does not have "
|
||||||
"any port associated with it.") % node.uuid)
|
"any port associated with it.") % node.uuid)
|
||||||
try:
|
try:
|
||||||
_get_connection(node)
|
_get_connection(task.node)
|
||||||
except exception.SSHConnectFailed as e:
|
except exception.SSHConnectFailed as e:
|
||||||
raise exception.InvalidParameterValue(_("SSH connection cannot"
|
raise exception.InvalidParameterValue(_("SSH connection cannot"
|
||||||
" be established: %s") % e)
|
" be established: %s") % e)
|
||||||
|
|
||||||
def get_power_state(self, task, node):
|
def get_power_state(self, task):
|
||||||
"""Get the current power state.
|
"""Get the current power state of the task's node.
|
||||||
|
|
||||||
Poll the host for the current power state of the node.
|
Poll the host for the current power state of the task's node.
|
||||||
|
|
||||||
:param task: An instance of `ironic.manager.task_manager.TaskManager`.
|
|
||||||
:param node: A single node.
|
|
||||||
|
|
||||||
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:returns: power state. One of :class:`ironic.common.states`.
|
:returns: power state. One of :class:`ironic.common.states`.
|
||||||
:raises: InvalidParameterValue if any connection parameters are
|
:raises: InvalidParameterValue if any connection parameters are
|
||||||
incorrect.
|
incorrect.
|
||||||
@ -389,22 +387,20 @@ class SSHPower(base.PowerInterface):
|
|||||||
:raises: SSHCommandFailed on an error from ssh.
|
:raises: SSHCommandFailed on an error from ssh.
|
||||||
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
||||||
ssh_obj = _get_connection(node)
|
ssh_obj = _get_connection(task.node)
|
||||||
return _get_power_status(ssh_obj, driver_info)
|
return _get_power_status(ssh_obj, driver_info)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def set_power_state(self, task, node, pstate):
|
def set_power_state(self, task, pstate):
|
||||||
"""Turn the power on or off.
|
"""Turn the power on or off.
|
||||||
|
|
||||||
Set the power state of a node.
|
Set the power state of the task's node.
|
||||||
|
|
||||||
:param task: An instance of `ironic.manager.task_manager.TaskManager`.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: A single node.
|
|
||||||
:param pstate: Either POWER_ON or POWER_OFF from :class:
|
:param pstate: Either POWER_ON or POWER_OFF from :class:
|
||||||
`ironic.common.states`.
|
`ironic.common.states`.
|
||||||
|
|
||||||
:raises: InvalidParameterValue if any connection parameters are
|
:raises: InvalidParameterValue if any connection parameters are
|
||||||
incorrect, or if the desired power state is invalid.
|
incorrect, or if the desired power state is invalid.
|
||||||
:raises: NodeNotFound.
|
:raises: NodeNotFound.
|
||||||
@ -412,9 +408,9 @@ class SSHPower(base.PowerInterface):
|
|||||||
:raises: SSHCommandFailed on an error from ssh.
|
:raises: SSHCommandFailed on an error from ssh.
|
||||||
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
||||||
ssh_obj = _get_connection(node)
|
ssh_obj = _get_connection(task.node)
|
||||||
|
|
||||||
if pstate == states.POWER_ON:
|
if pstate == states.POWER_ON:
|
||||||
state = _power_on(ssh_obj, driver_info)
|
state = _power_on(ssh_obj, driver_info)
|
||||||
@ -428,14 +424,12 @@ class SSHPower(base.PowerInterface):
|
|||||||
raise exception.PowerStateFailure(pstate=pstate)
|
raise exception.PowerStateFailure(pstate=pstate)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def reboot(self, task, node):
|
def reboot(self, task):
|
||||||
"""Cycles the power to a node.
|
"""Cycles the power to the task's node.
|
||||||
|
|
||||||
Power cycles a node.
|
Power cycles a node.
|
||||||
|
|
||||||
:param task: An instance of `ironic.manager.task_manager.TaskManager`.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:param node: A single node.
|
|
||||||
|
|
||||||
:raises: InvalidParameterValue if any connection parameters are
|
:raises: InvalidParameterValue if any connection parameters are
|
||||||
incorrect.
|
incorrect.
|
||||||
:raises: NodeNotFound.
|
:raises: NodeNotFound.
|
||||||
@ -443,9 +437,9 @@ class SSHPower(base.PowerInterface):
|
|||||||
:raises: SSHCommandFailed on an error from ssh.
|
:raises: SSHCommandFailed on an error from ssh.
|
||||||
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
:raises: SSHConnectFailed if ssh failed to connect to the node.
|
||||||
"""
|
"""
|
||||||
driver_info = _parse_driver_info(node)
|
driver_info = _parse_driver_info(task.node)
|
||||||
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
driver_info['macs'] = driver_utils.get_node_mac_addresses(task)
|
||||||
ssh_obj = _get_connection(node)
|
ssh_obj = _get_connection(task.node)
|
||||||
current_pstate = _get_power_status(ssh_obj, driver_info)
|
current_pstate = _get_power_status(ssh_obj, driver_info)
|
||||||
if current_pstate == states.POWER_ON:
|
if current_pstate == states.POWER_ON:
|
||||||
_power_off(ssh_obj, driver_info)
|
_power_off(ssh_obj, driver_info)
|
||||||
|
@ -85,11 +85,10 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
as get_power_mock:
|
as get_power_mock:
|
||||||
get_power_mock.return_value = states.POWER_OFF
|
get_power_mock.return_value = states.POWER_OFF
|
||||||
|
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertEqual(states.POWER_ON, node['power_state'])
|
self.assertEqual(states.POWER_ON, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
self.assertIsNone(node['last_error'])
|
self.assertIsNone(node['last_error'])
|
||||||
@ -106,11 +105,10 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
as get_power_mock:
|
as get_power_mock:
|
||||||
get_power_mock.return_value = states.POWER_ON
|
get_power_mock.return_value = states.POWER_ON
|
||||||
|
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.POWER_OFF)
|
||||||
states.POWER_OFF)
|
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertEqual(states.POWER_OFF, node['power_state'])
|
self.assertEqual(states.POWER_OFF, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
self.assertIsNone(node['last_error'])
|
self.assertIsNone(node['last_error'])
|
||||||
@ -124,11 +122,10 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
task = task_manager.TaskManager(self.context, node.uuid)
|
task = task_manager.TaskManager(self.context, node.uuid)
|
||||||
|
|
||||||
with mock.patch.object(self.driver.power, 'reboot') as reboot_mock:
|
with mock.patch.object(self.driver.power, 'reboot') as reboot_mock:
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.REBOOT)
|
||||||
states.REBOOT)
|
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
reboot_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
reboot_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertEqual(states.POWER_ON, node['power_state'])
|
self.assertEqual(states.POWER_ON, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
self.assertIsNone(node['last_error'])
|
self.assertIsNone(node['last_error'])
|
||||||
@ -150,18 +147,16 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
self.assertRaises(exception.InvalidParameterValue,
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
conductor_utils.node_power_action,
|
conductor_utils.node_power_action,
|
||||||
task,
|
task,
|
||||||
task.node,
|
|
||||||
"INVALID_POWER_STATE")
|
"INVALID_POWER_STATE")
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertEqual(states.POWER_ON, node['power_state'])
|
self.assertEqual(states.POWER_ON, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
self.assertIsNotNone(node['last_error'])
|
self.assertIsNotNone(node['last_error'])
|
||||||
|
|
||||||
# last_error is cleared when a new transaction happens
|
# last_error is cleared when a new transaction happens
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.POWER_OFF)
|
||||||
states.POWER_OFF)
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
self.assertEqual(states.POWER_OFF, node['power_state'])
|
self.assertEqual(states.POWER_OFF, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
@ -181,8 +176,7 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
target_power_state=states.POWER_OFF)
|
target_power_state=states.POWER_OFF)
|
||||||
task = task_manager.TaskManager(self.context, node.uuid)
|
task = task_manager.TaskManager(self.context, node.uuid)
|
||||||
|
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.POWER_OFF)
|
||||||
states.POWER_OFF)
|
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
self.assertEqual(states.POWER_OFF, node['power_state'])
|
self.assertEqual(states.POWER_OFF, node['power_state'])
|
||||||
@ -206,11 +200,10 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
|
|
||||||
with mock.patch.object(self.driver.power, 'set_power_state') \
|
with mock.patch.object(self.driver.power, 'set_power_state') \
|
||||||
as set_power_mock:
|
as set_power_mock:
|
||||||
conductor_utils.node_power_action(task, task.node,
|
conductor_utils.node_power_action(task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertFalse(set_power_mock.called,
|
self.assertFalse(set_power_mock.called,
|
||||||
"set_power_state unexpectedly called")
|
"set_power_state unexpectedly called")
|
||||||
self.assertEqual(states.POWER_ON, node['power_state'])
|
self.assertEqual(states.POWER_ON, node['power_state'])
|
||||||
@ -235,11 +228,10 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
self.assertRaises(exception.InvalidParameterValue,
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
conductor_utils.node_power_action,
|
conductor_utils.node_power_action,
|
||||||
task,
|
task,
|
||||||
task.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_state_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_state_mock.assert_called_once_with(mock.ANY)
|
||||||
self.assertEqual(states.POWER_ON, node['power_state'])
|
self.assertEqual(states.POWER_ON, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
self.assertIsNotNone(node['last_error'])
|
self.assertIsNotNone(node['last_error'])
|
||||||
@ -265,12 +257,11 @@ class NodePowerActionTestCase(base.DbTestCase):
|
|||||||
exception.IronicException,
|
exception.IronicException,
|
||||||
conductor_utils.node_power_action,
|
conductor_utils.node_power_action,
|
||||||
task,
|
task,
|
||||||
task.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
set_power_mock.assert_called_once_with(mock.ANY, mock.ANY,
|
set_power_mock.assert_called_once_with(mock.ANY,
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
self.assertEqual(states.POWER_OFF, node['power_state'])
|
self.assertEqual(states.POWER_OFF, node['power_state'])
|
||||||
self.assertIsNone(node['target_power_state'])
|
self.assertIsNone(node['target_power_state'])
|
||||||
|
@ -164,7 +164,7 @@ class ManagerTestCase(tests_db_base.DbTestCase):
|
|||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
self.service._worker_pool.waitall()
|
self.service._worker_pool.waitall()
|
||||||
|
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
node.refresh()
|
node.refresh()
|
||||||
self.assertEqual(states.POWER_ON, node.power_state)
|
self.assertEqual(states.POWER_ON, node.power_state)
|
||||||
self.assertIsNone(node.target_power_state)
|
self.assertIsNone(node.target_power_state)
|
||||||
@ -223,7 +223,7 @@ class ManagerTestCase(tests_db_base.DbTestCase):
|
|||||||
self.assertEqual(exception.NoFreeConductorWorker, exc.exc_info[0])
|
self.assertEqual(exception.NoFreeConductorWorker, exc.exc_info[0])
|
||||||
|
|
||||||
spawn_mock.assert_called_once_with(mock.ANY, mock.ANY,
|
spawn_mock.assert_called_once_with(mock.ANY, mock.ANY,
|
||||||
mock.ANY, mock.ANY)
|
mock.ANY)
|
||||||
node.refresh()
|
node.refresh()
|
||||||
self.assertEqual(initial_state, node.power_state)
|
self.assertEqual(initial_state, node.power_state)
|
||||||
self.assertIsNone(node.target_power_state)
|
self.assertIsNone(node.target_power_state)
|
||||||
@ -256,9 +256,8 @@ class ManagerTestCase(tests_db_base.DbTestCase):
|
|||||||
new_state)
|
new_state)
|
||||||
self.service._worker_pool.waitall()
|
self.service._worker_pool.waitall()
|
||||||
|
|
||||||
get_power_mock.assert_called_once_with(mock.ANY, mock.ANY)
|
get_power_mock.assert_called_once_with(mock.ANY)
|
||||||
set_power_mock.assert_called_once_with(mock.ANY, mock.ANY,
|
set_power_mock.assert_called_once_with(mock.ANY, new_state)
|
||||||
new_state)
|
|
||||||
node.refresh()
|
node.refresh()
|
||||||
self.assertEqual(initial_state, node.power_state)
|
self.assertEqual(initial_state, node.power_state)
|
||||||
self.assertIsNone(node.target_power_state)
|
self.assertIsNone(node.target_power_state)
|
||||||
@ -1248,8 +1247,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
self._do_sync_power_state('fake-power', 'fake-power')
|
self._do_sync_power_state('fake-power', 'fake-power')
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.assertEqual('fake-power', self.node.power_state)
|
self.assertEqual('fake-power', self.node.power_state)
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
self.assertFalse(node_power_action.called)
|
self.assertFalse(node_power_action.called)
|
||||||
@ -1258,8 +1256,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
self._do_sync_power_state(None, states.POWER_ON)
|
self._do_sync_power_state(None, states.POWER_ON)
|
||||||
|
|
||||||
self.power.validate.assert_called_once_with(self.task, self.node)
|
self.power.validate.assert_called_once_with(self.task, self.node)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.node.save.assert_called_once_with(self.context)
|
self.node.save.assert_called_once_with(self.context)
|
||||||
self.assertFalse(node_power_action.called)
|
self.assertFalse(node_power_action.called)
|
||||||
self.assertEqual(states.POWER_ON, self.node.power_state)
|
self.assertEqual(states.POWER_ON, self.node.power_state)
|
||||||
@ -1268,7 +1265,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
self._do_sync_power_state(None, states.POWER_ON,
|
self._do_sync_power_state(None, states.POWER_ON,
|
||||||
fail_validate=True)
|
fail_validate=True)
|
||||||
|
|
||||||
self.power.validate.assert_called_once_with(self.task, self.node)
|
self.power.validate.assert_called_once_with(self.task, self.task.node)
|
||||||
self.assertFalse(self.power.get_power_state.called)
|
self.assertFalse(self.power.get_power_state.called)
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
self.assertFalse(node_power_action.called)
|
self.assertFalse(node_power_action.called)
|
||||||
@ -1279,8 +1276,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
exception.IronicException('foo'))
|
exception.IronicException('foo'))
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
self.assertFalse(node_power_action.called)
|
self.assertFalse(node_power_action.called)
|
||||||
self.assertEqual('fake', self.node.power_state)
|
self.assertEqual('fake', self.node.power_state)
|
||||||
@ -1291,8 +1287,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
self._do_sync_power_state(states.POWER_ON, states.POWER_OFF)
|
self._do_sync_power_state(states.POWER_ON, states.POWER_OFF)
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.node.save.assert_called_once_with(self.context)
|
self.node.save.assert_called_once_with(self.context)
|
||||||
self.assertFalse(node_power_action.called)
|
self.assertFalse(node_power_action.called)
|
||||||
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
||||||
@ -1304,11 +1299,9 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
self._do_sync_power_state(states.POWER_ON, states.POWER_OFF)
|
self._do_sync_power_state(states.POWER_ON, states.POWER_OFF)
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
node_power_action.assert_called_once_with(self.task, self.node,
|
node_power_action.assert_called_once_with(self.task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
|
||||||
self.assertEqual(states.POWER_ON, self.node.power_state)
|
self.assertEqual(states.POWER_ON, self.node.power_state)
|
||||||
|
|
||||||
def test_state_changed_sync_failed(self, node_power_action):
|
def test_state_changed_sync_failed(self, node_power_action):
|
||||||
@ -1319,11 +1312,9 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
|
|
||||||
# Just testing that this test doesn't raise.
|
# Just testing that this test doesn't raise.
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
self.power.get_power_state.assert_called_once_with(self.task,
|
self.power.get_power_state.assert_called_once_with(self.task)
|
||||||
self.node)
|
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
node_power_action.assert_called_once_with(self.task, self.node,
|
node_power_action.assert_called_once_with(self.task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
|
||||||
self.assertEqual(states.POWER_ON, self.node.power_state)
|
self.assertEqual(states.POWER_ON, self.node.power_state)
|
||||||
self.assertEqual(1,
|
self.assertEqual(1,
|
||||||
self.service.power_state_sync_count[self.node.uuid])
|
self.service.power_state_sync_count[self.node.uuid])
|
||||||
@ -1336,12 +1327,11 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
states.POWER_OFF])
|
states.POWER_OFF])
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
power_exp_calls = [mock.call(self.task, self.node)] * 2
|
power_exp_calls = [mock.call(self.task)] * 2
|
||||||
self.assertEqual(power_exp_calls,
|
self.assertEqual(power_exp_calls,
|
||||||
self.power.get_power_state.call_args_list)
|
self.power.get_power_state.call_args_list)
|
||||||
self.node.save.assert_called_once_with(self.context)
|
self.node.save.assert_called_once_with(self.context)
|
||||||
node_power_action.assert_called_once_with(self.task, self.node,
|
node_power_action.assert_called_once_with(self.task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
|
||||||
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
||||||
self.assertEqual(1,
|
self.assertEqual(1,
|
||||||
self.service.power_state_sync_count[self.node.uuid])
|
self.service.power_state_sync_count[self.node.uuid])
|
||||||
@ -1355,12 +1345,11 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
states.POWER_OFF])
|
states.POWER_OFF])
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
power_exp_calls = [mock.call(self.task, self.node)] * 3
|
power_exp_calls = [mock.call(self.task)] * 3
|
||||||
self.assertEqual(power_exp_calls,
|
self.assertEqual(power_exp_calls,
|
||||||
self.power.get_power_state.call_args_list)
|
self.power.get_power_state.call_args_list)
|
||||||
self.node.save.assert_called_once_with(self.context)
|
self.node.save.assert_called_once_with(self.context)
|
||||||
npa_exp_calls = [mock.call(self.task, self.node,
|
npa_exp_calls = [mock.call(self.task, states.POWER_ON)] * 2
|
||||||
states.POWER_ON)] * 2
|
|
||||||
self.assertEqual(npa_exp_calls, node_power_action.call_args_list)
|
self.assertEqual(npa_exp_calls, node_power_action.call_args_list)
|
||||||
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
self.assertEqual(states.POWER_OFF, self.node.power_state)
|
||||||
self.assertEqual(2,
|
self.assertEqual(2,
|
||||||
@ -1375,12 +1364,11 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
|
|||||||
states.POWER_ON])
|
states.POWER_ON])
|
||||||
|
|
||||||
self.assertFalse(self.power.validate.called)
|
self.assertFalse(self.power.validate.called)
|
||||||
power_exp_calls = [mock.call(self.task, self.node)] * 3
|
power_exp_calls = [mock.call(self.task)] * 3
|
||||||
self.assertEqual(power_exp_calls,
|
self.assertEqual(power_exp_calls,
|
||||||
self.power.get_power_state.call_args_list)
|
self.power.get_power_state.call_args_list)
|
||||||
self.assertFalse(self.node.save.called)
|
self.assertFalse(self.node.save.called)
|
||||||
npa_exp_calls = [mock.call(self.task, self.node,
|
npa_exp_calls = [mock.call(self.task, states.POWER_ON)] * 2
|
||||||
states.POWER_ON)] * 2
|
|
||||||
self.assertEqual(npa_exp_calls, node_power_action.call_args_list)
|
self.assertEqual(npa_exp_calls, node_power_action.call_args_list)
|
||||||
self.assertEqual(states.POWER_ON, self.node.power_state)
|
self.assertEqual(states.POWER_ON, self.node.power_state)
|
||||||
self.assertNotIn(self.node.uuid, self.service.power_state_sync_count)
|
self.assertNotIn(self.node.uuid, self.service.power_state_sync_count)
|
||||||
|
@ -55,13 +55,12 @@ class FakeDriverTestCase(base.TestCase):
|
|||||||
|
|
||||||
def test_power_interface(self):
|
def test_power_interface(self):
|
||||||
self.driver.power.validate(self.task, self.node)
|
self.driver.power.validate(self.task, self.node)
|
||||||
self.driver.power.get_power_state(self.task, self.node)
|
self.driver.power.get_power_state(self.task)
|
||||||
self.assertRaises(exception.InvalidParameterValue,
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
self.driver.power.set_power_state,
|
self.driver.power.set_power_state,
|
||||||
self.task, self.node, states.NOSTATE)
|
self.task, states.NOSTATE)
|
||||||
self.driver.power.set_power_state(self.task, self.node,
|
self.driver.power.set_power_state(self.task, states.POWER_ON)
|
||||||
states.POWER_ON)
|
self.driver.power.reboot(self.task)
|
||||||
self.driver.power.reboot(self.task, self.node)
|
|
||||||
|
|
||||||
def test_deploy_interface(self):
|
def test_deploy_interface(self):
|
||||||
self.driver.deploy.validate(None, self.node)
|
self.driver.deploy.validate(None, self.node)
|
||||||
|
@ -154,13 +154,14 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
get_power_mock.side_effect = lambda: return_values.pop()
|
get_power_mock.side_effect = lambda: return_values.pop()
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.POWER_OFF, pstate)
|
self.assertEqual(states.POWER_OFF, pstate)
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.POWER_ON, pstate)
|
self.assertEqual(states.POWER_ON, pstate)
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.ERROR, pstate)
|
self.assertEqual(states.ERROR, pstate)
|
||||||
self.assertEqual(3, get_power_mock.call_count,
|
self.assertEqual(3, get_power_mock.call_count,
|
||||||
"pyghmi.ipmi.command.Command.get_power was not"
|
"pyghmi.ipmi.command.Command.get_power was not"
|
||||||
@ -173,7 +174,7 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node.uuid]) as task:
|
[self.node.uuid]) as task:
|
||||||
self.driver.power.set_power_state(
|
self.driver.power.set_power_state(
|
||||||
task, self.node, states.POWER_ON)
|
task, states.POWER_ON)
|
||||||
power_on_mock.assert_called_once_with(self.info)
|
power_on_mock.assert_called_once_with(self.info)
|
||||||
|
|
||||||
@mock.patch.object(ipminative, '_power_off')
|
@mock.patch.object(ipminative, '_power_off')
|
||||||
@ -183,7 +184,7 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node.uuid]) as task:
|
[self.node.uuid]) as task:
|
||||||
self.driver.power.set_power_state(
|
self.driver.power.set_power_state(
|
||||||
task, self.node, states.POWER_OFF)
|
task, states.POWER_OFF)
|
||||||
power_off_mock.assert_called_once_with(self.info)
|
power_off_mock.assert_called_once_with(self.info)
|
||||||
|
|
||||||
@mock.patch('pyghmi.ipmi.command.Command')
|
@mock.patch('pyghmi.ipmi.command.Command')
|
||||||
@ -197,7 +198,6 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
self.driver.power.set_power_state,
|
self.driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
ipmicmd.set_power.assert_called_once_with('on', 500)
|
ipmicmd.set_power.assert_called_once_with('on', 500)
|
||||||
|
|
||||||
@ -224,7 +224,7 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node.uuid]) as task:
|
[self.node.uuid]) as task:
|
||||||
self.driver.power.reboot(task, self.node)
|
self.driver.power.reboot(task)
|
||||||
reboot_mock.assert_called_once_with(self.info)
|
reboot_mock.assert_called_once_with(self.info)
|
||||||
|
|
||||||
@mock.patch('pyghmi.ipmi.command.Command')
|
@mock.patch('pyghmi.ipmi.command.Command')
|
||||||
@ -237,8 +237,7 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
|
|||||||
[self.node.uuid]) as task:
|
[self.node.uuid]) as task:
|
||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
self.driver.power.reboot,
|
self.driver.power.reboot,
|
||||||
task,
|
task)
|
||||||
self.node)
|
|
||||||
ipmicmd.set_power.assert_called_once_with('boot', 500)
|
ipmicmd.set_power.assert_called_once_with('boot', 500)
|
||||||
|
|
||||||
def test_vendor_passthru_validate__set_boot_device_good(self):
|
def test_vendor_passthru_validate__set_boot_device_good(self):
|
||||||
|
@ -278,13 +278,14 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
mock.call(self.info, "power status")]
|
mock.call(self.info, "power status")]
|
||||||
mock_exec.side_effect = returns
|
mock_exec.side_effect = returns
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.POWER_OFF, pstate)
|
self.assertEqual(states.POWER_OFF, pstate)
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.POWER_ON, pstate)
|
self.assertEqual(states.POWER_ON, pstate)
|
||||||
|
|
||||||
pstate = self.driver.power.get_power_state(None, self.node)
|
pstate = self.driver.power.get_power_state(task)
|
||||||
self.assertEqual(states.ERROR, pstate)
|
self.assertEqual(states.ERROR, pstate)
|
||||||
|
|
||||||
self.assertEqual(mock_exec.call_args_list, expected)
|
self.assertEqual(mock_exec.call_args_list, expected)
|
||||||
@ -292,10 +293,10 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
|
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
|
||||||
def test_get_power_state_exception(self, mock_exec):
|
def test_get_power_state_exception(self, mock_exec):
|
||||||
mock_exec.side_effect = processutils.ProcessExecutionError("error")
|
mock_exec.side_effect = processutils.ProcessExecutionError("error")
|
||||||
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
self.assertRaises(exception.IPMIFailure,
|
self.assertRaises(exception.IPMIFailure,
|
||||||
self.driver.power.get_power_state,
|
self.driver.power.get_power_state,
|
||||||
None,
|
task)
|
||||||
self.node)
|
|
||||||
mock_exec.assert_called_once_with(self.info, "power status")
|
mock_exec.assert_called_once_with(self.info, "power status")
|
||||||
|
|
||||||
@mock.patch.object(ipmi, '_power_on', autospec=True)
|
@mock.patch.object(ipmi, '_power_on', autospec=True)
|
||||||
@ -307,7 +308,6 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node['uuid']]) as task:
|
[self.node['uuid']]) as task:
|
||||||
self.driver.power.set_power_state(task,
|
self.driver.power.set_power_state(task,
|
||||||
self.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
mock_on.assert_called_once_with(self.info)
|
mock_on.assert_called_once_with(self.info)
|
||||||
@ -323,7 +323,6 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node['uuid']]) as task:
|
[self.node['uuid']]) as task:
|
||||||
self.driver.power.set_power_state(task,
|
self.driver.power.set_power_state(task,
|
||||||
self.node,
|
|
||||||
states.POWER_OFF)
|
states.POWER_OFF)
|
||||||
|
|
||||||
mock_off.assert_called_once_with(self.info)
|
mock_off.assert_called_once_with(self.info)
|
||||||
@ -340,7 +339,6 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
self.driver.power.set_power_state,
|
self.driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
mock_on.assert_called_once_with(self.info)
|
mock_on.assert_called_once_with(self.info)
|
||||||
@ -351,7 +349,6 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.InvalidParameterValue,
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
self.driver.power.set_power_state,
|
self.driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
"fake state")
|
"fake state")
|
||||||
|
|
||||||
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
|
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
|
||||||
@ -384,7 +381,7 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context,
|
with task_manager.acquire(self.context,
|
||||||
[self.node['uuid']]) as task:
|
[self.node['uuid']]) as task:
|
||||||
self.driver.power.reboot(task, self.node)
|
self.driver.power.reboot(task)
|
||||||
|
|
||||||
self.assertEqual(manager.mock_calls, expected)
|
self.assertEqual(manager.mock_calls, expected)
|
||||||
|
|
||||||
@ -403,8 +400,7 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
|
|||||||
[self.node['uuid']]) as task:
|
[self.node['uuid']]) as task:
|
||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
self.driver.power.reboot,
|
self.driver.power.reboot,
|
||||||
task,
|
task)
|
||||||
self.node)
|
|
||||||
|
|
||||||
self.assertEqual(manager.mock_calls, expected)
|
self.assertEqual(manager.mock_calls, expected)
|
||||||
|
|
||||||
|
@ -698,8 +698,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
|
|||||||
mock_update_neutron.assert_called_once_with(task)
|
mock_update_neutron.assert_called_once_with(task)
|
||||||
mock_node_set_boot.assert_called_once_with(task, 'pxe',
|
mock_node_set_boot.assert_called_once_with(task, 'pxe',
|
||||||
persistent=True)
|
persistent=True)
|
||||||
mock_node_power_action.assert_called_once_with(task, task.node,
|
mock_node_power_action.assert_called_once_with(task, states.REBOOT)
|
||||||
states.REBOOT)
|
|
||||||
|
|
||||||
# ensure token file created
|
# ensure token file created
|
||||||
t_path = pxe._get_token_file_path(self.node.uuid)
|
t_path = pxe._get_token_file_path(self.node.uuid)
|
||||||
@ -732,8 +731,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
|
|||||||
self.node.uuid) as task:
|
self.node.uuid) as task:
|
||||||
state = task.driver.deploy.tear_down(task)
|
state = task.driver.deploy.tear_down(task)
|
||||||
self.assertEqual(states.DELETED, state)
|
self.assertEqual(states.DELETED, state)
|
||||||
node_power_mock.assert_called_once_with(task, task.node,
|
node_power_mock.assert_called_once_with(task, states.POWER_OFF)
|
||||||
states.POWER_OFF)
|
|
||||||
|
|
||||||
@mock.patch.object(manager_utils, 'node_power_action')
|
@mock.patch.object(manager_utils, 'node_power_action')
|
||||||
def test_tear_down_removes_internal_attrs(self, mock_npa):
|
def test_tear_down_removes_internal_attrs(self, mock_npa):
|
||||||
@ -746,7 +744,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
|
|||||||
self.node.save()
|
self.node.save()
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
task.driver.deploy.tear_down(task)
|
task.driver.deploy.tear_down(task)
|
||||||
mock_npa.assert_called_once_with(task, task.node, states.POWER_OFF)
|
mock_npa.assert_called_once_with(task, states.POWER_OFF)
|
||||||
|
|
||||||
self.node.refresh()
|
self.node.refresh()
|
||||||
self.assertNotIn('pxe_deploy_key', self.node.driver_info)
|
self.assertNotIn('pxe_deploy_key', self.node.driver_info)
|
||||||
|
@ -305,9 +305,9 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.reboot(task, self.node)
|
task.resources[0].driver.power.reboot(task)
|
||||||
|
|
||||||
mock_reboot.assert_called_once_with(self.node)
|
mock_reboot.assert_called_once_with(task.node)
|
||||||
|
|
||||||
def test_set_power_state_bad_state(self):
|
def test_set_power_state_bad_state(self):
|
||||||
info = seamicro ._parse_driver_info(self.node)
|
info = seamicro ._parse_driver_info(self.node)
|
||||||
@ -318,7 +318,7 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
self.assertRaises(exception.IronicException,
|
self.assertRaises(exception.IronicException,
|
||||||
task.resources[0].driver.power.set_power_state,
|
task.resources[0].driver.power.set_power_state,
|
||||||
task, self.node, "BAD_PSTATE")
|
task, "BAD_PSTATE")
|
||||||
self.get_server_patcher.stop()
|
self.get_server_patcher.stop()
|
||||||
|
|
||||||
@mock.patch.object(seamicro, '_power_on')
|
@mock.patch.object(seamicro, '_power_on')
|
||||||
@ -330,10 +330,9 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.set_power_state(task,
|
task.resources[0].driver.power.set_power_state(task,
|
||||||
self.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
mock_power_on.assert_called_once_with(self.node)
|
mock_power_on.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(seamicro, '_power_on')
|
@mock.patch.object(seamicro, '_power_on')
|
||||||
def test_set_power_state_on_fail(self, mock_power_on):
|
def test_set_power_state_on_fail(self, mock_power_on):
|
||||||
@ -346,9 +345,9 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
task.resources[0]
|
task.resources[0]
|
||||||
.driver.power.set_power_state,
|
.driver.power.set_power_state,
|
||||||
task, self.node, states.POWER_ON)
|
task, states.POWER_ON)
|
||||||
|
|
||||||
mock_power_on.assert_called_once_with(self.node)
|
mock_power_on.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(seamicro, '_power_off')
|
@mock.patch.object(seamicro, '_power_off')
|
||||||
def test_set_power_state_off_good(self, mock_power_off):
|
def test_set_power_state_off_good(self, mock_power_off):
|
||||||
@ -359,9 +358,9 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.\
|
task.resources[0].driver.power.\
|
||||||
set_power_state(task, self.node, states.POWER_OFF)
|
set_power_state(task, states.POWER_OFF)
|
||||||
|
|
||||||
mock_power_off.assert_called_once_with(self.node)
|
mock_power_off.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(seamicro, '_power_off')
|
@mock.patch.object(seamicro, '_power_off')
|
||||||
def test_set_power_state_off_fail(self, mock_power_off):
|
def test_set_power_state_off_fail(self, mock_power_off):
|
||||||
@ -374,9 +373,9 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
task.resources[0]
|
task.resources[0]
|
||||||
.driver.power.set_power_state,
|
.driver.power.set_power_state,
|
||||||
task, self.node, states.POWER_OFF)
|
task, states.POWER_OFF)
|
||||||
|
|
||||||
mock_power_off.assert_called_once_with(self.node)
|
mock_power_off.assert_called_once_with(task.node)
|
||||||
|
|
||||||
def test_vendor_passthru_validate_good(self):
|
def test_vendor_passthru_validate_good(self):
|
||||||
with task_manager.acquire(self.context, [self.node['uuid']],
|
with task_manager.acquire(self.context, [self.node['uuid']],
|
||||||
|
@ -614,12 +614,13 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
parse_drv_info_mock.return_value = info
|
parse_drv_info_mock.return_value = info
|
||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.reboot(task, self.node)
|
task.resources[0].driver.power.reboot(task)
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
get_power_stat_mock.assert_called_once_with(self.sshclient, info)
|
get_power_stat_mock.assert_called_once_with(self.sshclient,
|
||||||
|
info)
|
||||||
power_off_mock.assert_called_once_with(self.sshclient, info)
|
power_off_mock.assert_called_once_with(self.sshclient, info)
|
||||||
power_on_mock.assert_called_once_with(self.sshclient, info)
|
power_on_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
|
||||||
@ -645,12 +646,12 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
self.assertRaises(exception.PowerStateFailure,
|
self.assertRaises(exception.PowerStateFailure,
|
||||||
task.resources[0].driver.power.reboot,
|
task.resources[0].driver.power.reboot,
|
||||||
task,
|
task)
|
||||||
self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
get_power_stat_mock.assert_called_once_with(self.sshclient, info)
|
get_power_stat_mock.assert_called_once_with(self.sshclient,
|
||||||
|
info)
|
||||||
power_off_mock.assert_called_once_with(self.sshclient, info)
|
power_off_mock.assert_called_once_with(self.sshclient, info)
|
||||||
power_on_mock.assert_called_once_with(self.sshclient, info)
|
power_on_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
|
||||||
@ -671,12 +672,11 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
exception.InvalidParameterValue,
|
exception.InvalidParameterValue,
|
||||||
task.resources[0].driver.power.set_power_state,
|
task.resources[0].driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
"BAD_PSTATE")
|
"BAD_PSTATE")
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
||||||
@mock.patch.object(ssh, '_get_connection')
|
@mock.patch.object(ssh, '_get_connection')
|
||||||
@ -693,12 +693,12 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
parse_drv_info_mock.return_value = info
|
parse_drv_info_mock.return_value = info
|
||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.set_power_state(task, self.node,
|
task.resources[0].driver.power.set_power_state(task,
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
power_on_mock.assert_called_once_with(self.sshclient, info)
|
power_on_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
|
||||||
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
||||||
@ -720,12 +720,11 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
exception.PowerStateFailure,
|
exception.PowerStateFailure,
|
||||||
task.resources[0].driver.power.set_power_state,
|
task.resources[0].driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
states.POWER_ON)
|
states.POWER_ON)
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
power_on_mock.assert_called_once_with(self.sshclient, info)
|
power_on_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
|
||||||
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
||||||
@ -744,11 +743,11 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context, [info['uuid']],
|
with task_manager.acquire(self.context, [info['uuid']],
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.resources[0].driver.power.set_power_state(
|
task.resources[0].driver.power.set_power_state(
|
||||||
task, self.node, states.POWER_OFF)
|
task, states.POWER_OFF)
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
power_off_mock.assert_called_once_with(self.sshclient, info)
|
power_off_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
|
||||||
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
@mock.patch.object(driver_utils, 'get_node_mac_addresses')
|
||||||
@ -770,10 +769,9 @@ class SSHDriverTestCase(db_base.DbTestCase):
|
|||||||
exception.PowerStateFailure,
|
exception.PowerStateFailure,
|
||||||
task.resources[0].driver.power.set_power_state,
|
task.resources[0].driver.power.set_power_state,
|
||||||
task,
|
task,
|
||||||
self.node,
|
|
||||||
states.POWER_OFF)
|
states.POWER_OFF)
|
||||||
|
|
||||||
parse_drv_info_mock.assert_called_once_with(self.node)
|
parse_drv_info_mock.assert_called_once_with(task.node)
|
||||||
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
get_mac_addr_mock.assert_called_once_with(mock.ANY)
|
||||||
get_conn_mock.assert_called_once_with(self.node)
|
get_conn_mock.assert_called_once_with(task.node)
|
||||||
power_off_mock.assert_called_once_with(self.sshclient, info)
|
power_off_mock.assert_called_once_with(self.sshclient, info)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user