Raise MissingParameterValue instead of Invalid

There are several functions that were raising InvalidParameterValue,
when it should be a MissingParamenteValue. This way we can differentiate
both exceptions when needed.

Change-Id: Ia5ce05e30b3fb00261854857aeef46238a8b00f8
This commit is contained in:
Ghe Rivero 2014-07-22 15:23:44 +00:00
parent e8fc1cf7c5
commit 3419b38b11
22 changed files with 191 additions and 98 deletions

View File

@ -589,7 +589,7 @@ class NodesController(rest.RestController):
maintenance, marker, limit, sort_key, sort_dir,
expand=False, resource_url=None):
if self.from_chassis and not chassis_uuid:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Chassis id not specified."))
limit = api_utils.validate_limit(limit)

View File

@ -177,7 +177,7 @@ class PortsController(rest.RestController):
sort_key, sort_dir, expand=False,
resource_url=None):
if self.from_nodes and not node_uuid:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Node id not specified."))
limit = api_utils.validate_limit(limit)

View File

@ -181,6 +181,10 @@ class InvalidParameterValue(Invalid):
message = _("%(err)s")
class MissingParameterValue(InvalidParameterValue):
message = _("%(err)s")
class NotFound(IronicException):
message = _("Resource could not be found.")
code = 404

View File

@ -230,6 +230,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
return self.run_periodic_tasks(context, raise_on_error=raise_on_error)
@messaging.expected_exceptions(exception.InvalidParameterValue,
exception.MissingParameterValue,
exception.NodeLocked,
exception.NodeInWrongPowerState)
def update_node(self, context, node_obj):
@ -273,6 +274,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
return node_obj
@messaging.expected_exceptions(exception.InvalidParameterValue,
exception.MissingParameterValue,
exception.NoFreeConductorWorker,
exception.NodeLocked)
def change_node_power_state(self, context, node_id, new_state):
@ -303,7 +305,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
exception.NodeLocked,
exception.InvalidParameterValue,
exception.UnsupportedDriverExtension)
exception.UnsupportedDriverExtension,
exception.MissingParameterValue)
def vendor_passthru(self, context, node_id, driver_method, info):
"""RPC method to encapsulate vendor action.
@ -316,6 +319,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
:param driver_method: the name of the vendor method.
:param info: vendor method args.
:raises: InvalidParameterValue if supplied info is not valid.
:raises: MissingParameterValue if missing supplied info
:raises: UnsupportedDriverExtension if current driver does not have
vendor interface or method is unsupported.
:raises: NoFreeConductorWorker when there is no free worker to start
@ -340,6 +344,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
method=driver_method, **info)
@messaging.expected_exceptions(exception.InvalidParameterValue,
exception.MissingParameterValue,
exception.UnsupportedDriverExtension,
exception.DriverNotFound)
def driver_vendor_passthru(self, context, driver_name, driver_method,
@ -352,6 +357,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
:param driver_name: name of the driver on which to call the method.
:param driver_method: name of the vendor method, for use by the driver.
:param info: user-supplied data to pass through to the driver.
:raises: MissingParameterValue if missing supplied info
:raises: InvalidParameterValue if supplied info is not valid.
:raises: UnsupportedDriverExtension if current driver does not have
vendor interface, if the vendor interface does not implement
@ -404,7 +410,9 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
exception.NodeLocked,
exception.NodeInMaintenance,
exception.InstanceDeployFailure)
exception.InstanceDeployFailure,
exception.InvalidParameterValue,
exception.MissingParameterValue)
def do_node_deploy(self, context, node_id, rebuild=False):
"""RPC method to initiate deployment to a node.
@ -451,7 +459,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
try:
task.driver.deploy.validate(task)
except exception.InvalidParameterValue as e:
except (exception.InvalidParameterValue,
exception.MissingParameterValue) as e:
raise exception.InstanceDeployFailure(_(
"RPC do_node_deploy failed to validate deploy info. "
"Error: %(msg)s") % {'msg': e})
@ -503,7 +512,9 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
exception.NodeLocked,
exception.InstanceDeployFailure)
exception.InstanceDeployFailure,
exception.InvalidParameterValue,
exception.MissingParameterValue)
def do_node_tear_down(self, context, node_id):
"""RPC method to tear down an existing node deployment.
@ -532,7 +543,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
try:
task.driver.deploy.validate(task)
except exception.InvalidParameterValue as e:
except (exception.InvalidParameterValue,
exception.MissingParameterValue) as e:
raise exception.InstanceDeployFailure(_(
"RPC do_node_tear_down failed to validate deploy info. "
"Error: %(msg)s") % {'msg': e})
@ -614,7 +626,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
if node.power_state is None:
try:
task.driver.power.validate(task)
except exception.InvalidParameterValue:
except (exception.InvalidParameterValue,
exception.MissingParameterValue) as e:
return
try:
@ -838,7 +851,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
iface.validate(task)
result = True
except (exception.InvalidParameterValue,
exception.UnsupportedDriverExtension) as e:
exception.UnsupportedDriverExtension,
exception.MissingParameterValue) as e:
result = False
reason = str(e)
else:
@ -927,7 +941,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NodeLocked,
exception.UnsupportedDriverExtension,
exception.NodeConsoleNotEnabled,
exception.InvalidParameterValue)
exception.InvalidParameterValue,
exception.MissingParameterValue)
def get_console_information(self, context, node_id):
"""Get connection information about the console.
@ -937,6 +952,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
support console.
:raises: NodeConsoleNotEnabled if the console is not enabled.
:raises: InvalidParameterValue when the wrong driver info is specified.
:raises: MissingParameterValue if missing supplied info.
"""
LOG.debug('RPC get_console_information called for node %s' % node_id)
@ -955,7 +971,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NoFreeConductorWorker,
exception.NodeLocked,
exception.UnsupportedDriverExtension,
exception.InvalidParameterValue)
exception.InvalidParameterValue,
exception.MissingParameterValue)
def set_console_mode(self, context, node_id, enabled):
"""Enable/Disable the console.
@ -969,6 +986,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
:raises: UnsupportedDriverExtension if the node's driver doesn't
support console.
:raises: InvalidParameterValue when the wrong driver info is specified.
:raises: MissingParameterValue if missing supplied info.
:raises: NoFreeConductorWorker when there is no free worker to start
async task
"""
@ -1135,7 +1153,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NodeLocked,
exception.UnsupportedDriverExtension,
exception.InvalidParameterValue)
exception.InvalidParameterValue,
exception.MissingParameterValue)
def set_boot_device(self, context, node_id, device, persistent=False):
"""Set the boot device for a node.
@ -1152,7 +1171,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified or an invalid boot device is specified.
:raises: MissingParameterValue if missing supplied info.
"""
LOG.debug('RPC set_boot_device called for node %(node)s with '
'device %(device)s', {'node': node_id, 'device': device})
@ -1167,7 +1186,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NodeLocked,
exception.UnsupportedDriverExtension,
exception.InvalidParameterValue)
exception.InvalidParameterValue,
exception.MissingParameterValue)
def get_boot_device(self, context, node_id):
"""Get the current boot device.
@ -1180,6 +1200,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified.
:raises: MissingParameterValue if missing supplied info.
:returns: a dictionary containing:
:boot_device: the boot device, one of
@ -1198,7 +1219,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
@messaging.expected_exceptions(exception.NodeLocked,
exception.UnsupportedDriverExtension,
exception.InvalidParameterValue)
exception.InvalidParameterValue,
exception.MissingParameterValue)
def get_supported_boot_devices(self, context, node_id):
"""Get the list of supported devices.
@ -1211,6 +1233,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified.
:raises: MissingParameterValue if missing supplied info.
:returns: A list with the supported boot devices defined
in :mod:`ironic.common.boot_devices`.

View File

@ -156,6 +156,7 @@ class ConductorAPI(object):
:param info: info for node driver.
:param topic: RPC topic. Defaults to self.topic.
:raises: InvalidParameterValue if supplied info is not valid.
:raises: MissingParameterValue if a required parameter is missing
:raises: UnsupportedDriverExtension if current driver does not have
vendor interface.
:raises: NoFreeConductorWorker when there is no free worker to start
@ -176,6 +177,7 @@ class ConductorAPI(object):
:param info: data to pass through to the driver.
:param topic: RPC topic. Defaults to self.topic.
:raises: InvalidParameterValue for parameter errors.
:raises: MissingParameterValue if a required parameter is missing
:raises: UnsupportedDriverExtension if the driver doesn't have a vendor
interface, or if the vendor interface does not support the
specified driver_method.
@ -196,6 +198,7 @@ class ConductorAPI(object):
:param topic: RPC topic. Defaults to self.topic.
:raises: InstanceDeployFailure
:raises: InvalidParameterValue if validation fails
:raises: MissingParameterValue if a required parameter is missing
:raises: NoFreeConductorWorker when there is no free worker to start
async task.
@ -215,6 +218,7 @@ class ConductorAPI(object):
:param topic: RPC topic. Defaults to self.topic.
:raises: InstanceDeployFailure
:raises: InvalidParameterValue if validation fails
:raises: MissingParameterValue if a required parameter is missing
:raises: NoFreeConductorWorker when there is no free worker to start
async task.
@ -277,6 +281,7 @@ class ConductorAPI(object):
:raises: UnsupportedDriverExtension if the node's driver doesn't
support console.
:raises: InvalidParameterValue when the wrong driver info is specified.
:raises: MissingParameterValue if a required parameter is missing
"""
cctxt = self.client.prepare(topic=topic or self.topic, version='1.11')
return cctxt.call(context, 'get_console_information', node_id=node_id)
@ -292,6 +297,7 @@ class ConductorAPI(object):
:raises: UnsupportedDriverExtension if the node's driver doesn't
support console.
:raises: InvalidParameterValue when the wrong driver info is specified.
:raises: MissingParameterValue if a required parameter is missing
:raises: NoFreeConductorWorker when there is no free worker to start
async task.
"""
@ -348,6 +354,7 @@ class ConductorAPI(object):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified or an invalid boot device is specified.
:raises: MissingParameterValue if missing supplied info.
"""
cctxt = self.client.prepare(topic=topic or self.topic, version='1.17')
return cctxt.call(context, 'set_boot_device', node_id=node_id,
@ -365,6 +372,7 @@ class ConductorAPI(object):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified.
:raises: MissingParameterValue if missing supplied info.
:returns: a dictionary containing:
:boot_device: the boot device, one of
@ -388,6 +396,7 @@ class ConductorAPI(object):
support management.
:raises: InvalidParameterValue when the wrong driver info is
specified.
:raises: MissingParameterValue if missing supplied info.
:returns: A list with the supported boot devices defined
in :mod:`ironic.common.boot_devices`.

View File

@ -126,6 +126,7 @@ class DeployInterface(object):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -229,6 +230,7 @@ class PowerInterface(object):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -236,6 +238,7 @@ class PowerInterface(object):
"""Return the power state of the task's node.
:param task: a TaskManager instance containing the node to act on.
:raises: MissingParameterValue if a required parameter is missing.
:returns: a power state. One of :mod:`ironic.common.states`.
"""
@ -245,6 +248,7 @@ class PowerInterface(object):
:param task: a TaskManager instance containing the node to act on.
:param power_state: Any power state from :mod:`ironic.common.states`.
:raises: MissingParameterValue if a required parameter is missing.
"""
@abc.abstractmethod
@ -252,6 +256,7 @@ class PowerInterface(object):
"""Perform a hard reboot of the task's node.
:param task: a TaskManager instance containing the node to act on.
:raises: MissingParameterValue if a required parameter is missing.
"""
@ -277,6 +282,7 @@ class ConsoleInterface(object):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -324,6 +330,7 @@ class RescueInterface(object):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -371,6 +378,7 @@ class VendorInterface(object):
:raises: UnsupportedDriverExtension if 'method' can not be mapped to
the supported interfaces.
:raises: InvalidParameterValue if **kwargs does not contain 'method'.
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -383,6 +391,7 @@ class VendorInterface(object):
:raises: UnsupportedDriverExtension if 'method' can not be mapped to
the supported interfaces.
:raises: InvalidParameterValue if **kwargs does not contain 'method'.
:raises: MissingParameterValue when a required parameter is missing
"""
def driver_vendor_passthru(self, context, method, **kwargs):
@ -422,6 +431,7 @@ class ManagementInterface(object):
:param task: a task from TaskManager.
:raises: InvalidParameterValue
:raises: MissingParameterValue
"""
@abc.abstractmethod
@ -446,6 +456,7 @@ class ManagementInterface(object):
Default: False.
:raises: InvalidParameterValue if an invalid boot device is
specified.
:raises: MissingParameterValue if a required parameter is missing
"""
@abc.abstractmethod
@ -456,6 +467,7 @@ class ManagementInterface(object):
all drivers support this.
:param task: a task from TaskManager.
:raises: MissingParameterValue if a required parameter is missing
:returns: a dictionary containing:
:boot_device: the boot device, one of
:mod:`ironic.common.boot_devices` or None if it is unknown.

View File

@ -35,7 +35,7 @@ def _raise_unsupported_error(method=None):
raise exception.InvalidParameterValue(_(
"Unsupported method (%s) passed through to vendor extension.")
% method)
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Method not specified when calling vendor extension."))
@ -100,7 +100,7 @@ class FakeVendorA(base.VendorInterface):
if method == 'first_method':
bar = kwargs.get('bar')
if not bar:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Parameter 'bar' not passed to method 'first_method'."))
return
_raise_unsupported_error(method)
@ -128,7 +128,7 @@ class FakeVendorB(base.VendorInterface):
if method == 'second_method':
bar = kwargs.get('bar')
if not bar:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Parameter 'bar' not passed to method 'second_method'."))
return
_raise_unsupported_error(method)

View File

@ -67,8 +67,9 @@ def parse_driver_info(node):
:param node: an ironic node object.
:returns: a dict containing information from driver_info
and default values.
:raises: InvalidParameterValue if some mandatory information
is missing on the node or on invalid inputs.
:raises: InvalidParameterValue on invalid inputs.
:raises: MissingParameterValue if some mandatory information
is missing on the node
"""
info = node.driver_info
d_info = {}
@ -79,6 +80,10 @@ def parse_driver_info(node):
d_info[param] = info[param]
except KeyError:
error_msgs.append(_("'%s' not supplied to IloDriver.") % param)
if error_msgs:
msg = (_("The following parameters were mising while parsing "
"driver_info:\n%s") % "\n".join(error_msgs))
raise exception.MissingParameterValue(msg)
for param in OPTIONAL_PROPERTIES:
value = info.get(param, CONF.ilo.get(param))
@ -105,8 +110,9 @@ def get_ilo_object(node):
:param node: an ironic node object.
:returns: an IloClient object.
:raises: InvalidParameterValue if some mandatory information
is missing on the node or on invalid inputs.
:raises: InvalidParameterValue on invalid inputs.
:raises: MissingParameterValue if some mandatory information
is missing on the node
"""
driver_info = parse_driver_info(node)
ilo_object = ilo_client.IloClient(driver_info['ilo_address'],
@ -126,8 +132,9 @@ def get_ilo_license(node):
:param node: an ironic node object.
:returns: a constant defined in this module which
refers to the current license installed on the node.
:raises: InvalidParameterValue if some mandatory information
is missing on the node or on invalid inputs.
:raises: InvalidParameterValue on invalid inputs.
:raises: MissingParameterValue if some mandatory information
is missing on the node
:raises: IloOperationError if it failed to retrieve the
installed licenses from the iLO.
"""

View File

@ -69,14 +69,14 @@ _BOOT_DEVICES_MAP = {
def _parse_driver_info(node):
"""Gets the bmc access info for the given node.
:raises: InvalidParameterValue when required ipmi credentials
:raises: MissingParameterValue when required ipmi credentials
are missing.
"""
info = node.driver_info or {}
missing_info = [key for key in REQUIRED_PROPERTIES if not info.get(key)]
if missing_info:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"The following IPMI credentials are not supplied"
" to IPMI driver: %s."
) % missing_info)
@ -229,7 +229,7 @@ class NativeIPMIPower(base.PowerInterface):
"""Check that node['driver_info'] contains IPMI credentials.
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue when required ipmi credentials
:raises: MissingParameterValue when required ipmi credentials
are missing.
"""
_parse_driver_info(task.node)
@ -240,7 +240,7 @@ class NativeIPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:returns: power state POWER_ON, POWER_OFF or ERROR defined in
:class:`ironic.common.states`.
:raises: InvalidParameterValue when required ipmi credentials
:raises: MissingParameterValue when required ipmi credentials
are missing.
:raises: IPMIFailure when the native ipmi call fails.
"""
@ -254,8 +254,10 @@ class NativeIPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:param pstate: a power state that will be set on the task's node.
:raises: IPMIFailure when the native ipmi call fails.
:raises: MissingParameterValue when required ipmi credentials
are missing.
:raises: InvalidParameterValue when an invalid power state
is specified or required ipmi credentials are missing.
is specified
:raises: PowerStateFailure when invalid power state is returned
from ipmi.
"""
@ -277,7 +279,7 @@ class NativeIPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:raises: IPMIFailure when the native ipmi call fails.
:raises: InvalidParameterValue when required ipmi credentials
:raises: MissingParameterValue when required ipmi credentials
are missing.
:raises: PowerStateFailure when invalid power state is returned
from ipmi.
@ -299,7 +301,7 @@ class NativeIPMIManagement(base.ManagementInterface):
task's node contains the required credentials information.
:param task: a task from TaskManager.
:raises: InvalidParameterValue when required ipmi credentials
:raises: MissingParameterValue when required ipmi credentials
are missing.
"""
@ -326,10 +328,11 @@ class NativeIPMIManagement(base.ManagementInterface):
:param persistent: Boolean value. True if the boot device will
persist to all future boots, False if not.
Default: False.
:raises: InvalidParameterValue if an invalid boot device is
specified or if required ipmi parameters are missing.
:raises: InvalidParameterValue if an invalid boot device is specified
or required ipmi credentials are missing.
:raises: MissingParameterValue when required ipmi credentials
are missing.
:raises: IPMIFailure on an error from pyghmi.
"""
if device not in self.get_supported_boot_devices():
raise exception.InvalidParameterValue(_(
@ -353,7 +356,7 @@ class NativeIPMIManagement(base.ManagementInterface):
Returns the current boot device of the node.
:param task: a task from TaskManager.
:raises: InvalidParameterValue if required IPMI parameters
:raises: MissingParameterValue if required IPMI parameters
are missing.
:raises: IPMIFailure on an error from pyghmi.
:returns: a dictionary containing:

View File

@ -158,13 +158,14 @@ def _parse_driver_info(node):
:param node: the Node of interest.
:returns: dictionary of parameters.
:raises: InvalidParameterValue if any required parameters are missing.
:raises: InvalidParameterValue when an invalid value is specified
:raises: MissingParameterValue when a required ipmi parameter is missing.
"""
info = node.driver_info or {}
missing_info = [key for key in REQUIRED_PROPERTIES if not info.get(key)]
if missing_info:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"The following IPMI credentials are not supplied"
" to IPMI driver: %s."
) % missing_info)
@ -465,6 +466,7 @@ class IPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if required ipmi parameters are missing.
:raises: MissingParameterValue if a required parameter is missing.
"""
_parse_driver_info(task.node)
@ -479,6 +481,7 @@ class IPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:returns: one of ironic.common.states POWER_OFF, POWER_ON or ERROR.
:raises: InvalidParameterValue if required ipmi parameters are missing.
:raises: MissingParameterValue if a required parameter is missing.
:raises: IPMIFailure on an error from ipmitool (from _power_status
call).
@ -493,8 +496,8 @@ class IPMIPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:param pstate: The desired power state, one of ironic.common.states
POWER_ON, POWER_OFF.
:raises: InvalidParameterValue if required ipmi parameters are missing
or if an invalid power state was specified.
:raises: InvalidParameterValue if an invalid power state was specified.
:raises: MissingParameterValue if required ipmi parameters are missing
:raises: PowerStateFailure if the power couldn't be set to pstate.
"""
@ -516,7 +519,8 @@ class IPMIPower(base.PowerInterface):
"""Cycles the power to the task's node.
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if required ipmi parameters are missing.
:raises: MissingParameterValue if required ipmi parameters are missing.
:raises: InvalidParameterValue if an invalid power state was specified.
:raises: PowerStateFailure if the final state of the node is not
POWER_ON.
@ -552,6 +556,7 @@ class IPMIManagement(base.ManagementInterface):
:param task: a task from TaskManager.
:raises: InvalidParameterValue if required IPMI parameters
are missing.
:raises: MissingParameterValue if a required parameter is missing.
"""
_parse_driver_info(task.node)
@ -578,8 +583,8 @@ class IPMIManagement(base.ManagementInterface):
:param persistent: Boolean value. True if the boot device will
persist to all future boots, False if not.
Default: False.
:raises: InvalidParameterValue if an invalid boot device is
specified or if required ipmi parameters are missing.
:raises: InvalidParameterValue if an invalid boot device is specified
:raises: MissingParameterValue if required ipmi parameters are missing.
:raises: IPMIFailure on an error from ipmitool.
"""
@ -609,6 +614,7 @@ class IPMIManagement(base.ManagementInterface):
:raises: InvalidParameterValue if required IPMI parameters
are missing.
:raises: IPMIFailure on an error from ipmitool.
:raises: MissingParameterValue if a required parameter is missing.
:returns: a dictionary containing:
:boot_device: the boot device, one of
@ -655,6 +661,7 @@ class IPMIManagement(base.ManagementInterface):
:raises: FailedToGetSensorData when getting the sensor data fails.
:raises: FailedToParseSensorData when parsing sensor data fails.
:raises: InvalidParameterValue if required ipmi parameters are missing
:raises: MissingParameterValue if a required parameter is missing.
:returns: returns a dict of sensor data group by sensor type.
"""
@ -680,6 +687,8 @@ class VendorPassthru(base.VendorInterface):
:param task: a TaskManager instance.
:param raw_bytes: a string of raw bytes to send, e.g. '0x00 0x01'
:raises: IPMIFailure on an error from ipmitool.
:raises: MissingParameterValue if a required parameter is missing.
:raises: InvalidParameterValue when an invalid value is specified.
"""
node_uuid = task.node.uuid
@ -705,6 +714,8 @@ class VendorPassthru(base.VendorInterface):
:param task: a TaskManager instance.
:param warm: boolean parameter to decide on warm or cold reset.
:raises: IPMIFailure on an error from ipmitool.
:raises: MissingParameterValue if a required parameter is missing.
:raises: InvalidParameterValue when an invalid value is specified
"""
node_uuid = task.node.uuid
@ -745,7 +756,9 @@ class VendorPassthru(base.VendorInterface):
:param kwargs: info for action.
:raises: InvalidParameterValue if **kwargs does not contain 'method',
'method' is not supported or a byte string is not given for
'raw_bytes', or required IPMI credentials are missing.
'raw_bytes'.
:raises: MissingParameterValue if a required parameter is missing.
"""
method = kwargs['method']
if method == 'send_raw':
@ -775,6 +788,8 @@ class VendorPassthru(base.VendorInterface):
:raises: InvalidParameterValue if required IPMI credentials
are missing.
:raises: IPMIFailure if ipmitool fails for any method.
:raises: MissingParameterValue when a required parameter is missing
"""
method = kwargs['method']
@ -808,10 +823,12 @@ class IPMIShellinaboxConsole(base.ConsoleInterface):
:param task: a task from TaskManager.
:raises: InvalidParameterValue
:raises: MissingParameterValue when a required parameter is missing
"""
driver_info = _parse_driver_info(task.node)
if not driver_info['port']:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"IPMI terminal port not supplied to IPMI driver."))
def start_console(self, task):

View File

@ -122,7 +122,7 @@ def _check_for_missing_params(info_dict, param_prefix=''):
missing_info.append(param_prefix + label)
if missing_info:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Can not validate PXE bootloader. The following parameters "
"were not passed to ironic: %s") % missing_info)
@ -136,6 +136,7 @@ def _parse_driver_info(node):
:param node: a single Node.
:returns: A dict with the driver_info values.
:raises: MissingParameterValue
"""
info = node.driver_info
d_info = {}
@ -156,6 +157,8 @@ def _parse_instance_info(node):
:param node: a single Node.
:returns: A dict with the instance_info values.
:raises: MissingParameterValue
:raises: InvalidParameterValue
"""
info = node.instance_info
@ -204,6 +207,8 @@ def _parse_deploy_info(node):
:param node: a single Node.
:returns: A dict with the instance_info and driver_info values.
:raises: MissingParameterValue
:raises: InvalidParameterValue
"""
info = {}
info.update(_parse_instance_info(node))
@ -471,6 +476,7 @@ def _validate_glance_image(ctx, deploy_info):
'kernel_id' and 'ramdisk_id' properties.
:raises: InvalidParameterValue.
:raises: MissingParameterValue
"""
image_id = deploy_info['image_source']
try:
@ -493,7 +499,7 @@ def _validate_glance_image(ctx, deploy_info):
if missing_props:
props = ', '.join(missing_props)
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Image %(image)s is missing the following properties: "
"%(properties)s") % {'image': image_id, 'properties': props})
@ -509,17 +515,18 @@ class PXEDeploy(base.DeployInterface):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue.
:raises: MissingParameterValue
"""
node = task.node
if not driver_utils.get_node_mac_addresses(task):
raise exception.InvalidParameterValue(_("Node %s does not have "
raise exception.MissingParameterValue(_("Node %s does not have "
"any port associated with it.") % node.uuid)
d_info = _parse_deploy_info(node)
if CONF.pxe.ipxe_enabled:
if not CONF.pxe.http_url or not CONF.pxe.http_root:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"iPXE boot is enabled but no HTTP URL or HTTP "
"root was specified."))
@ -652,7 +659,7 @@ class VendorPassthru(base.VendorInterface):
missing = [key for key in params.keys() if params[key] is None]
if missing:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Parameters %s were not passed to ironic"
" for deploy.") % missing)

View File

@ -96,13 +96,13 @@ def _parse_driver_info(node):
:param node: An Ironic node object.
:returns: SeaMicro driver info.
:raises: InvalidParameterValue if any required parameters are missing.
:raises: MissingParameterValue if any required parameters are missing.
"""
info = node.driver_info or {}
missing_info = [key for key in REQUIRED_PROPERTIES if not info.get(key)]
if missing_info:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"SeaMicro driver requires the following to be set: %s.")
% missing_info)
@ -140,7 +140,7 @@ def _get_power_status(node):
"""Get current power state of this node
:param node: Ironic node one of :class:`ironic.db.models.Node`
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
:raises: ServiceUnavailable on an error from SeaMicro Client.
:returns: Power state of the given node
@ -169,7 +169,7 @@ def _power_on(node, timeout=None):
:param node: An Ironic node object.
:param timeout: Time in seconds to wait till power on is complete.
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
:returns: Power state of the given node.
"""
@ -208,7 +208,7 @@ def _power_off(node, timeout=None):
:param node: Ironic node one of :class:`ironic.db.models.Node`
:param timeout: Time in seconds to wait till power off is compelete
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
:returns: Power state of the given node
"""
@ -246,7 +246,7 @@ def _reboot(node, timeout=None):
"""Reboot this node
:param node: Ironic node one of :class:`ironic.db.models.Node`
:param timeout: Time in seconds to wait till reboot is compelete
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
:returns: Power state of the given node
"""
@ -338,7 +338,7 @@ class Power(base.PowerInterface):
Check that node 'driver_info' contains the required fields.
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
"""
_parse_driver_info(task.node)
@ -349,10 +349,10 @@ class Power(base.PowerInterface):
Poll the host for the current power state of the node.
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if required seamicro parameters are
missing.
:raises: ServiceUnavailable on an error from SeaMicro Client.
:raises: MissingParameterValue when a required parameter is missing
:returns: power state. One of :class:`ironic.common.states`.
"""
return _get_power_status(task.node)
@ -366,6 +366,7 @@ class Power(base.PowerInterface):
:param pstate: Either POWER_ON or POWER_OFF from :class:
`ironic.common.states`.
:raises: InvalidParameterValue if an invalid power state was specified.
:raises: MissingParameterValue when a required parameter is missing
:raises: PowerStateFailure if the desired power state couldn't be set.
"""
@ -385,7 +386,7 @@ class Power(base.PowerInterface):
"""Cycles the power to the task's node.
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if required seamicro parameters are
:raises: MissingParameterValue if required seamicro parameters are
missing.
:raises: PowerStateFailure if the final state of the node is not
POWER_ON.
@ -424,7 +425,7 @@ class VendorPassthru(base.VendorInterface):
node = task.node
vlan_id = kwargs.get('vlan_id')
if not vlan_id:
raise exception.InvalidParameterValue(_("No vlan id provided"))
raise exception.MissingParameterValue(_("No vlan id provided"))
seamicro_info = _parse_driver_info(node)
try:
@ -461,7 +462,7 @@ class VendorPassthru(base.VendorInterface):
if volume_id is None:
volume_size = kwargs.get('volume_size')
if volume_size is None:
raise exception.InvalidParameterValue(
raise exception.MissingParameterValue(
_("No volume size provided for creating volume"))
volume_id = _create_volume(seamicro_info, volume_size)
@ -493,8 +494,7 @@ class Management(base.ManagementInterface):
task's node contains the required credentials information.
:param task: a task from TaskManager.
:raises: InvalidParameterValue if required seamicro parameters
are missing.
:raises: MissingParameterValue when a required parameter is missing
"""
_parse_driver_info(task.node)
@ -523,6 +523,7 @@ class Management(base.ManagementInterface):
:raises: InvalidParameterValue if an invalid boot device is
specified or if required seamicro parameters are missing.
:raises: IronicException on an error from seamicro-client.
:raises: MissingParameterValue when a required parameter is missing
"""
if device not in self.get_supported_boot_devices():

View File

@ -237,14 +237,14 @@ def _parse_driver_info(node):
:param node: the Node of interest.
:returns: dictionary of information.
:raises: InvalidParameterValue if any required parameters are missing
or incorrect.
:raises: InvalidParameterValue if any required parameters are incorrect.
:raises: MissingParameterValue if any required parameters are missing.
"""
info = node.driver_info or {}
missing_info = [key for key in REQUIRED_PROPERTIES if not info.get(key)]
if missing_info:
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"SSHPowerDriver requires the following to be set: %s.")
% missing_info)
@ -471,6 +471,7 @@ class SSHPower(base.PowerInterface):
:returns: power state. One of :class:`ironic.common.states`.
:raises: InvalidParameterValue if any connection parameters are
incorrect.
:raises: MissingParameterValue when a required parameter is missing
:raises: NodeNotFound.
:raises: SSHCommandFailed on an error from ssh.
:raises: SSHConnectFailed if ssh failed to connect to the node.
@ -491,6 +492,7 @@ class SSHPower(base.PowerInterface):
`ironic.common.states`.
:raises: InvalidParameterValue if any connection parameters are
incorrect, or if the desired power state is invalid.
:raises: MissingParameterValue when a required parameter is missing
:raises: NodeNotFound.
:raises: PowerStateFailure if it failed to set power state to pstate.
:raises: SSHCommandFailed on an error from ssh.
@ -520,6 +522,7 @@ class SSHPower(base.PowerInterface):
:param task: a TaskManager instance containing the node to act on.
:raises: InvalidParameterValue if any connection parameters are
incorrect.
:raises: MissingParameterValue when a required parameter is missing
:raises: NodeNotFound.
:raises: PowerStateFailure if it failed to set power state to POWER_ON.
:raises: SSHCommandFailed on an error from ssh.
@ -552,7 +555,7 @@ class SSHManagement(base.ManagementInterface):
:param task: a task from TaskManager.
:raises: InvalidParameterValue if any connection parameters are
incorrect.
:raises: MissingParameterValue if a required parameter is missing
"""
_parse_driver_info(task.node)
@ -579,6 +582,7 @@ class SSHManagement(base.ManagementInterface):
Default: False. Ignored by this driver.
:raises: InvalidParameterValue if an invalid boot device is
specified or if any connection parameters are incorrect.
:raises: MissingParameterValue if a required parameter is missing
:raises: SSHConnectFailed if ssh failed to connect to the node.
:raises: SSHCommandFailed on an error from ssh.
:raises: NotImplementedError if the virt_type does not support
@ -610,6 +614,7 @@ class SSHManagement(base.ManagementInterface):
:param task: a task from TaskManager.
:raises: InvalidParameterValue if any connection parameters are
incorrect.
:raises: MissingParameterValue if a required parameter is missing
:raises: SSHConnectFailed if ssh failed to connect to the node.
:raises: SSHCommandFailed on an error from ssh.
:returns: a dictionary containing:

View File

@ -21,7 +21,7 @@ def _raise_unsupported_error(method=None):
raise exception.UnsupportedDriverExtension(_(
"Unsupported method (%s) passed through to vendor extension.")
% method)
raise exception.InvalidParameterValue(_(
raise exception.MissingParameterValue(_(
"Method not specified when calling vendor extension."))
@ -64,6 +64,7 @@ class MixinVendorInterface(base.VendorInterface):
:raises: UnsupportedDriverExtension if 'method' can not be mapped to
the supported interfaces.
:raises: InvalidParameterValue if **kwargs does not contain 'method'.
:raisee: MissingParameterValue if missing parameters in kwargs.
"""
route = self._map(**kwargs)
@ -76,7 +77,7 @@ class MixinVendorInterface(base.VendorInterface):
:raises: UnsupportedDriverExtension if 'method' can not be mapped to
the supported interfaces.
:raises: InvalidParameterValue if **kwargs does not contain 'method'.
:raises: MissingParameterValue if **kwargs does not contain 'method'.
"""
route = self._map(**kwargs)

View File

@ -37,9 +37,11 @@ class NodeSetBootDeviceTestCase(base.DbTestCase):
def test_node_set_boot_device_non_existent_device(self):
mgr_utils.mock_the_extension_manager(driver="fake_ipmitool")
self.driver = driver_factory.get_driver("fake_ipmitool")
ipmi_info = utils.get_test_ipmi_info()
node = obj_utils.create_test_node(self.context,
uuid=cmn_utils.generate_uuid(),
driver='fake_ipmitool')
driver='fake_ipmitool',
driver_info=ipmi_info)
task = task_manager.TaskManager(self.context, node.uuid)
self.assertRaises(exception.InvalidParameterValue,
conductor_utils.node_set_boot_device,

View File

@ -519,7 +519,7 @@ class VendorPassthruTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
# Verify reservation has been cleared.
self.assertIsNone(node.reservation)
def test_vendor_passthru_invalid_method_parameters(self):
def test_vendor_passthru_missing_method_parameters(self):
node = obj_utils.create_test_node(self.context, driver='fake')
info = {'invalid_param': 'whatever'}
self._start_service()
@ -528,7 +528,7 @@ class VendorPassthruTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
self.service.vendor_passthru,
self.context, node.uuid, 'first_method', info)
# Compare true exception hidden by @messaging.expected_exceptions
self.assertEqual(exception.InvalidParameterValue, exc.exc_info[0])
self.assertEqual(exception.MissingParameterValue, exc.exc_info[0])
node.refresh()
self.assertIsNone(node.last_error)

View File

@ -59,7 +59,7 @@ class IloCommonMethodsTestCase(base.TestCase):
driver='ilo',
driver_info=INFO_DICT)
del node.driver_info['ilo_address']
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ilo_common.parse_driver_info, node)
def test_parse_driver_info_missing_username(self):
@ -67,7 +67,7 @@ class IloCommonMethodsTestCase(base.TestCase):
driver='ilo',
driver_info=INFO_DICT)
del node.driver_info['ilo_username']
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ilo_common.parse_driver_info, node)
def test_parse_driver_info_missing_password(self):
@ -75,7 +75,7 @@ class IloCommonMethodsTestCase(base.TestCase):
driver='ilo',
driver_info=INFO_DICT)
del node.driver_info['ilo_password']
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ilo_common.parse_driver_info, node)
def test_parse_driver_info_invalid_timeout(self):
@ -99,13 +99,13 @@ class IloCommonMethodsTestCase(base.TestCase):
driver='ilo',
driver_info=INFO_DICT)
del node.driver_info['ilo_password']
node.driver_info['client_port'] = 'qwe'
del node.driver_info['ilo_address']
try:
ilo_common.parse_driver_info(node)
self.fail("parse_driver_info did not throw exception.")
except exception.InvalidParameterValue as e:
except exception.MissingParameterValue as e:
self.assertIn('ilo_password', str(e))
self.assertIn('client_port', str(e))
self.assertIn('ilo_address', str(e))
@mock.patch.object(ilo_common, 'ilo_client')
def test_get_ilo_object(self, ilo_client_mock):

View File

@ -68,7 +68,7 @@ class IPMINativePrivateMethodTestCase(base.TestCase):
del info['ipmi_username']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ipminative._parse_driver_info,
node)
@ -312,5 +312,5 @@ class IPMINativeDriverTestCase(db_base.DbTestCase):
uuid=utils.generate_uuid(),
driver='fake_ipminative')
with task_manager.acquire(self.context, node.uuid) as task:
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
task.driver.management.validate, task)

View File

@ -134,14 +134,16 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
ipmi._parse_driver_info(node)
# make sure error is raised when ipmi_address is missing
info = dict(INFO_DICT)
del info['ipmi_address']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ipmi._parse_driver_info,
node)
# test the invalid priv_level value
self.info['priv_level'] = 'ABCD'
info = dict(INFO_DICT)
info['ipmi_priv_level'] = 'ABCD'
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
ipmi._parse_driver_info,
@ -915,7 +917,7 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
uuid=utils.generate_uuid(),
driver='fake_ipmitool')
with task_manager.acquire(self.context, node.uuid) as task:
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
task.driver.management.validate, task)
def test__parse_ipmi_sensor_data_ok(self):

View File

@ -78,7 +78,7 @@ class PXEValidateParametersTestCase(base.TestCase):
info = dict(DRV_INFO_DICT)
del info['pxe_deploy_kernel']
node = obj_utils.create_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
pxe._parse_driver_info,
node)
@ -87,7 +87,7 @@ class PXEValidateParametersTestCase(base.TestCase):
info = dict(DRV_INFO_DICT)
del info['pxe_deploy_ramdisk']
node = obj_utils.create_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
pxe._parse_driver_info,
node)
@ -115,7 +115,7 @@ class PXEValidateParametersTestCase(base.TestCase):
info = dict(INST_INFO_DICT)
del info['image_source']
node = obj_utils.create_test_node(self.context, instance_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
pxe._parse_instance_info,
node)
@ -124,7 +124,7 @@ class PXEValidateParametersTestCase(base.TestCase):
info = dict(INST_INFO_DICT)
del info['root_gb']
node = obj_utils.create_test_node(self.context, instance_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
pxe._parse_instance_info,
node)
@ -590,7 +590,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.uuid,
shared=True) as task:
task.node['instance_info'] = json.dumps(info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
task.driver.deploy.validate, task)
def test_validate_fail_no_port(self):

View File

@ -101,7 +101,7 @@ class SeaMicroValidateParametersTestCase(base.TestCase):
info = dict(INFO_DICT)
del info['seamicro_api_endpoint']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
seamicro._parse_driver_info,
node)
@ -110,7 +110,7 @@ class SeaMicroValidateParametersTestCase(base.TestCase):
info = dict(INFO_DICT)
del info['seamicro_username']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
seamicro._parse_driver_info,
node)
@ -119,7 +119,7 @@ class SeaMicroValidateParametersTestCase(base.TestCase):
info = dict(INFO_DICT)
del info['seamicro_password']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
seamicro._parse_driver_info,
node)
@ -128,7 +128,7 @@ class SeaMicroValidateParametersTestCase(base.TestCase):
info = dict(INFO_DICT)
del info['seamicro_server_id']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
seamicro._parse_driver_info,
node)
@ -584,5 +584,5 @@ class SeaMicroPowerDriverTestCase(db_base.DbTestCase):
uuid=utils.generate_uuid(),
driver='fake_seamicro')
with task_manager.acquire(self.context, node.uuid) as task:
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
task.driver.management.validate, task)

View File

@ -120,7 +120,7 @@ class SSHValidateParametersTestCase(base.TestCase):
info = db_utils.get_test_ssh_info()
del info['ssh_address']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ssh._parse_driver_info,
node)
@ -129,11 +129,11 @@ class SSHValidateParametersTestCase(base.TestCase):
info = db_utils.get_test_ssh_info()
del info['ssh_username']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ssh._parse_driver_info,
node)
def test__parse_driver_info_missing_creds(self):
def test__parse_driver_info_invalid_creds(self):
# make sure error is raised when info is missing
info = db_utils.get_test_ssh_info('no-creds')
node = obj_utils.get_test_node(self.context, driver_info=info)
@ -146,7 +146,7 @@ class SSHValidateParametersTestCase(base.TestCase):
info = db_utils.get_test_ssh_info()
del info['ssh_virt_type']
node = obj_utils.get_test_node(self.context, driver_info=info)
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
ssh._parse_driver_info,
node)
@ -864,5 +864,5 @@ class SSHDriverTestCase(db_base.DbTestCase):
uuid=utils.generate_uuid(),
driver='fake_ssh')
with task_manager.acquire(self.context, node.uuid) as task:
self.assertRaises(exception.InvalidParameterValue,
self.assertRaises(exception.MissingParameterValue,
task.driver.management.validate, task)