diff options
Diffstat (limited to 'ironic/drivers/modules/ipminative.py')
-rw-r--r-- | ironic/drivers/modules/ipminative.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/ironic/drivers/modules/ipminative.py b/ironic/drivers/modules/ipminative.py index 801b4a5a7..f4b28bb3f 100644 --- a/ironic/drivers/modules/ipminative.py +++ b/ironic/drivers/modules/ipminative.py @@ -263,6 +263,9 @@ class NativeIPMIPower(base.PowerInterface): driver_info = _parse_driver_info(node) _reboot(driver_info) + +class VendorPassthru(base.VendorInterface): + @task_manager.require_exclusive_lock def _set_boot_device(self, task, node, device, persistent=False): """Set the boot device for a node. @@ -292,3 +295,38 @@ class NativeIPMIPower(base.PowerInterface): "with the following error: %(error)s") % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) + + def validate(self, node, **kwargs): + """Validate vendor-specific actions. + :param node: The node + :param kwargs: the keyword arguments supplied + + :raises: InvalidParameterValue if an invalid boot device is specified, + required ipmi credentials are missing or and invalid method + is requested to the driver. + """ + method = kwargs['method'] + if method == 'set_boot_device': + device = kwargs.get('device', None) + if device not in ipmi_command.boot_devices: + raise exception.InvalidParameterValue(_( + "Invalid boot device %s specified.") % device) + else: + raise exception.InvalidParameterValue(_( + "Unsupported method (%s) passed to IPMINative driver.") + % method) + _parse_driver_info(node) + return True + + def vendor_passthru(self, task, node, **kwargs): + """Receive requests for vendor-specific actions. + :param task: a TaskManager instance. + :param node: The node + :param kwargs: the keyword arguments supplied + """ + method = kwargs['method'] + if method == 'set_boot_device': + return self._set_boot_device( + task, node, + kwargs.get('device'), + kwargs.get('persistent', False)) |