Add driver_validate()
vendor.driver_vendor_passthru() should be validated before called on Ironic conductor, like vendor_passthru(). Add a new method driver_validate() to support this. Change-Id: Idff802cece01940b8ade34fa343f1bc8e76f1630 Closes-Bug: #1391580
This commit is contained in:
parent
6e91483fa5
commit
d0e7bd2973
@ -506,6 +506,8 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
"of driver_vendor_passthru() has been "
|
"of driver_vendor_passthru() has been "
|
||||||
"deprecated. Please update the code to use "
|
"deprecated. Please update the code to use "
|
||||||
"the @driver_passthru decorator."))
|
"the @driver_passthru decorator."))
|
||||||
|
|
||||||
|
driver.vendor.driver_validate(method=driver_method, **info)
|
||||||
ret = driver.vendor.driver_vendor_passthru(
|
ret = driver.vendor.driver_vendor_passthru(
|
||||||
context, method=driver_method, **info)
|
context, method=driver_method, **info)
|
||||||
# DriverVendorPassthru was always sync
|
# DriverVendorPassthru was always sync
|
||||||
@ -527,16 +529,11 @@ class ConductorManager(periodic_task.PeriodicTasks):
|
|||||||
# Inform the vendor method which HTTP method it was invoked with
|
# Inform the vendor method which HTTP method it was invoked with
|
||||||
info['http_method'] = http_method
|
info['http_method'] = http_method
|
||||||
|
|
||||||
# FIXME(lucasagomes): This code should be able to call
|
|
||||||
# validate(). The problem is that at the moment the validate()
|
|
||||||
# expects a task object as the first parameter and in this
|
|
||||||
# method we don't have it because we don't have a Node to
|
|
||||||
# acquire.
|
|
||||||
# See: https://bugs.launchpad.net/ironic/+bug/1391580
|
|
||||||
|
|
||||||
# Invoke the vendor method accordingly with the mode
|
# Invoke the vendor method accordingly with the mode
|
||||||
is_async = vendor_opts['async']
|
is_async = vendor_opts['async']
|
||||||
ret = None
|
ret = None
|
||||||
|
driver.vendor.driver_validate(method=driver_method, **info)
|
||||||
|
|
||||||
if is_async:
|
if is_async:
|
||||||
self._spawn_worker(vendor_func, context, **info)
|
self._spawn_worker(vendor_func, context, **info)
|
||||||
else:
|
else:
|
||||||
|
@ -481,6 +481,19 @@ class VendorInterface(object):
|
|||||||
:raises: MissingParameterValue
|
:raises: MissingParameterValue
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def driver_validate(self, method, **kwargs):
|
||||||
|
"""Validate driver-vendor-passthru actions.
|
||||||
|
|
||||||
|
If invalid, raises an exception; otherwise returns None.
|
||||||
|
|
||||||
|
:param method: method to be validated
|
||||||
|
:param kwargs: info for action.
|
||||||
|
:raises: MissingParameterValue if kwargs does not contain
|
||||||
|
certain parameter.
|
||||||
|
:raises: InvalidParameterValue if parameter does not match.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
class ManagementInterface(object):
|
class ManagementInterface(object):
|
||||||
|
@ -328,6 +328,21 @@ class AgentVendorInterface(base.VendorInterface):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def driver_validate(self, method, **kwargs):
|
||||||
|
"""Validate the driver deployment info.
|
||||||
|
|
||||||
|
:param method: method to be validated.
|
||||||
|
"""
|
||||||
|
version = kwargs.get('version')
|
||||||
|
|
||||||
|
if not version:
|
||||||
|
raise exception.MissingParameterValue(_('Missing parameter '
|
||||||
|
'version'))
|
||||||
|
if version not in self.supported_payload_versions:
|
||||||
|
raise exception.InvalidParameterValue(_('Unknown lookup '
|
||||||
|
'payload version: %s')
|
||||||
|
% version)
|
||||||
|
|
||||||
@base.passthru(['POST'])
|
@base.passthru(['POST'])
|
||||||
def heartbeat(self, task, **kwargs):
|
def heartbeat(self, task, **kwargs):
|
||||||
"""Method for agent to periodically check in.
|
"""Method for agent to periodically check in.
|
||||||
@ -476,11 +491,6 @@ class AgentVendorInterface(base.VendorInterface):
|
|||||||
:raises: NotFound if no matching node is found.
|
:raises: NotFound if no matching node is found.
|
||||||
:raises: InvalidParameterValue with unknown payload version
|
:raises: InvalidParameterValue with unknown payload version
|
||||||
"""
|
"""
|
||||||
version = kwargs.get('version')
|
|
||||||
|
|
||||||
if version not in self.supported_payload_versions:
|
|
||||||
raise exception.InvalidParameterValue(_('Unknown lookup payload '
|
|
||||||
'version: %s') % version)
|
|
||||||
inventory = kwargs.get('inventory')
|
inventory = kwargs.get('inventory')
|
||||||
interfaces = self._get_interfaces(inventory)
|
interfaces = self._get_interfaces(inventory)
|
||||||
mac_addresses = self._get_mac_addresses(interfaces)
|
mac_addresses = self._get_mac_addresses(interfaces)
|
||||||
|
@ -841,6 +841,23 @@ class VendorPassthruTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
|
|||||||
self.assertEqual(exception.UnsupportedDriverExtension,
|
self.assertEqual(exception.UnsupportedDriverExtension,
|
||||||
exc.exc_info[0])
|
exc.exc_info[0])
|
||||||
|
|
||||||
|
@mock.patch.object(drivers_base.VendorInterface, 'driver_validate')
|
||||||
|
def test_driver_vendor_passthru_validation_failed(self, validate_mock):
|
||||||
|
validate_mock.side_effect = exception.MissingParameterValue('error')
|
||||||
|
test_method = mock.Mock()
|
||||||
|
self.driver.vendor.driver_routes = {'test_method':
|
||||||
|
{'func': test_method,
|
||||||
|
'async': False,
|
||||||
|
'http_methods': ['POST']}}
|
||||||
|
self.service.init_host()
|
||||||
|
exc = self.assertRaises(messaging.ExpectedException,
|
||||||
|
self.service.driver_vendor_passthru,
|
||||||
|
self.context, 'fake', 'test_method',
|
||||||
|
'POST', {})
|
||||||
|
self.assertEqual(exception.MissingParameterValue,
|
||||||
|
exc.exc_info[0])
|
||||||
|
self.assertFalse(test_method.called)
|
||||||
|
|
||||||
|
|
||||||
@_mock_record_keepalive
|
@_mock_record_keepalive
|
||||||
class DoNodeDeployTearDownTestCase(_ServiceSetUpMixin,
|
class DoNodeDeployTearDownTestCase(_ServiceSetUpMixin,
|
||||||
|
@ -135,6 +135,25 @@ class TestAgentVendor(db_base.DbTestCase):
|
|||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
self.passthru.validate(task)
|
self.passthru.validate(task)
|
||||||
|
|
||||||
|
def test_driver_validate(self):
|
||||||
|
kwargs = {'version': '2'}
|
||||||
|
method = 'lookup'
|
||||||
|
self.passthru.driver_validate(method, **kwargs)
|
||||||
|
|
||||||
|
def test_driver_validate_invalid_paremeter(self):
|
||||||
|
method = 'lookup'
|
||||||
|
kwargs = {'version': '1'}
|
||||||
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
|
self.passthru.driver_validate,
|
||||||
|
method, **kwargs)
|
||||||
|
|
||||||
|
def test_driver_validate_missing_parameter(self):
|
||||||
|
method = 'lookup'
|
||||||
|
kwargs = {}
|
||||||
|
self.assertRaises(exception.MissingParameterValue,
|
||||||
|
self.passthru.driver_validate,
|
||||||
|
method, **kwargs)
|
||||||
|
|
||||||
@mock.patch('ironic.common.image_service.Service')
|
@mock.patch('ironic.common.image_service.Service')
|
||||||
def test_continue_deploy(self, image_service_mock):
|
def test_continue_deploy(self, image_service_mock):
|
||||||
test_temp_url = 'http://image'
|
test_temp_url = 'http://image'
|
||||||
|
@ -39,6 +39,9 @@ class FakeVendorInterface(driver_base.VendorInterface):
|
|||||||
def validate(self, task, **kwargs):
|
def validate(self, task, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def driver_validate(self, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class PassthruDecoratorTestCase(base.TestCase):
|
class PassthruDecoratorTestCase(base.TestCase):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user