summaryrefslogtreecommitdiff
path: root/ironic
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-09-11 12:16:16 +0000
committerGerrit Code Review <review@openstack.org>2015-09-11 12:16:16 +0000
commit5671e7c2df455f97ef996c47c9c4f461a82e1c38 (patch)
treeb93e56943f2891b2e9dee2fc9510fe17fcd5d131 /ironic
parent5488687368a0eff5fae8bfeee8ebce26c0b52109 (diff)
parentdc61c9604de25263a16aa378e0120a2c13c92610 (diff)
downloadironic-5671e7c2df455f97ef996c47c9c4f461a82e1c38.tar.gz
Merge "Cache the description of RAID properties"
Diffstat (limited to 'ironic')
-rw-r--r--ironic/api/controllers/v1/driver.py33
-rw-r--r--ironic/tests/api/v1/test_drivers.py20
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(