diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-09-11 12:16:16 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-09-11 12:16:16 +0000 |
commit | 5671e7c2df455f97ef996c47c9c4f461a82e1c38 (patch) | |
tree | b93e56943f2891b2e9dee2fc9510fe17fcd5d131 /ironic | |
parent | 5488687368a0eff5fae8bfeee8ebce26c0b52109 (diff) | |
parent | dc61c9604de25263a16aa378e0120a2c13c92610 (diff) | |
download | ironic-5671e7c2df455f97ef996c47c9c4f461a82e1c38.tar.gz |
Merge "Cache the description of RAID properties"
Diffstat (limited to 'ironic')
-rw-r--r-- | ironic/api/controllers/v1/driver.py | 33 | ||||
-rw-r--r-- | ironic/tests/api/v1/test_drivers.py | 20 |
2 files changed, 44 insertions, 9 deletions
diff --git a/ironic/api/controllers/v1/driver.py b/ironic/api/controllers/v1/driver.py index 855555218..d28376db9 100644 --- a/ironic/api/controllers/v1/driver.py +++ b/ironic/api/controllers/v1/driver.py @@ -47,6 +47,16 @@ _DRIVER_PROPERTIES = {} # versions, the API service should be restarted. _VENDOR_METHODS = {} +# RAID (logical disk) configuration information for drivers: +# key = driver name; +# value = dictionary of RAID configuration information of that driver: +# key = property name. +# value = description of the property +# NOTE(rloo). This is cached for the lifetime of the API service. If one or +# more conductor services are restarted with new driver versions, the API +# service should be restarted. +_RAID_PROPERTIES = {} + class Driver(base.APIBase): """API representation of a driver.""" @@ -171,15 +181,20 @@ class DriverRaidController(rest.RestController): """ if not api_utils.allow_raid_config(): raise exception.NotAcceptable() - topic = pecan.request.rpcapi.get_topic_for_driver(driver_name) - try: - return pecan.request.rpcapi.get_raid_logical_disk_properties( - pecan.request.context, driver_name, topic=topic) - except exception.UnsupportedDriverExtension as e: - # Change error code as 404 seems appropriate because RAID is a - # standard interface and all drivers might not have it. - e.code = http_client.NOT_FOUND - raise + + if driver_name not in _RAID_PROPERTIES: + topic = pecan.request.rpcapi.get_topic_for_driver(driver_name) + try: + info = pecan.request.rpcapi.get_raid_logical_disk_properties( + pecan.request.context, driver_name, topic=topic) + except exception.UnsupportedDriverExtension as e: + # Change error code as 404 seems appropriate because RAID is a + # standard interface and all drivers might not have it. + e.code = http_client.NOT_FOUND + raise + + _RAID_PROPERTIES[driver_name] = info + return _RAID_PROPERTIES[driver_name] class DriversController(rest.RestController): diff --git a/ironic/tests/api/v1/test_drivers.py b/ironic/tests/api/v1/test_drivers.py index 13a227c68..1c47feb82 100644 --- a/ironic/tests/api/v1/test_drivers.py +++ b/ironic/tests/api/v1/test_drivers.py @@ -176,6 +176,7 @@ class TestListDrivers(base.FunctionalTest): @mock.patch.object(rpcapi.ConductorAPI, 'get_raid_logical_disk_properties') def test_raid_logical_disk_properties(self, disk_prop_mock): + driver._RAID_PROPERTIES = {} self.register_fake_conductors() properties = {'foo': 'description of foo'} disk_prop_mock.return_value = properties @@ -188,6 +189,7 @@ class TestListDrivers(base.FunctionalTest): @mock.patch.object(rpcapi.ConductorAPI, 'get_raid_logical_disk_properties') def test_raid_logical_disk_properties_older_version(self, disk_prop_mock): + driver._RAID_PROPERTIES = {} self.register_fake_conductors() properties = {'foo': 'description of foo'} disk_prop_mock.return_value = properties @@ -198,8 +200,26 @@ class TestListDrivers(base.FunctionalTest): self.assertEqual(406, ret.status_code) @mock.patch.object(rpcapi.ConductorAPI, 'get_raid_logical_disk_properties') + def test_raid_logical_disk_properties_cached(self, disk_prop_mock): + # only one RPC-conductor call will be made and the info cached + # for subsequent requests + driver._RAID_PROPERTIES = {} + self.register_fake_conductors() + properties = {'foo': 'description of foo'} + disk_prop_mock.return_value = properties + path = '/drivers/%s/raid/logical_disk_properties' % self.d1 + for i in range(3): + data = self.get_json(path, + headers={api_base.Version.string: "1.12"}) + self.assertEqual(properties, data) + disk_prop_mock.assert_called_once_with(mock.ANY, self.d1, + topic=mock.ANY) + self.assertEqual(properties, driver._RAID_PROPERTIES[self.d1]) + + @mock.patch.object(rpcapi.ConductorAPI, 'get_raid_logical_disk_properties') def test_raid_logical_disk_properties_iface_not_supported( self, disk_prop_mock): + driver._RAID_PROPERTIES = {} self.register_fake_conductors() disk_prop_mock.side_effect = iter( [exception.UnsupportedDriverExtension( |