summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-04-30 13:38:18 +0000
committerGerrit Code Review <review@openstack.org>2013-04-30 13:38:18 +0000
commitf582052f97e091cb3cd27cc577b7067577ad723a (patch)
treefcae4da6a846dfd1c97f7c19989c2b5b4cc3c1fd /nova
parentad5f3e927334144599a6c73c4ba1f7f80f7b64e4 (diff)
parent48621685389a491d0519faf8fe52dc682e020c67 (diff)
Merge "Performance optimization for contrib.flavorextraspecs"
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/compute/contrib/flavorextraspecs.py14
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py12
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py8
-rw-r--r--nova/tests/test_db_api.py10
5 files changed, 39 insertions, 10 deletions
diff --git a/nova/api/openstack/compute/contrib/flavorextraspecs.py b/nova/api/openstack/compute/contrib/flavorextraspecs.py
index de68eb7d6..6e33d3603 100644
--- a/nova/api/openstack/compute/contrib/flavorextraspecs.py
+++ b/nova/api/openstack/compute/contrib/flavorextraspecs.py
@@ -48,10 +48,7 @@ class FlavorExtraSpecsController(object):
def _get_extra_specs(self, context, flavor_id):
extra_specs = db.instance_type_extra_specs_get(context, flavor_id)
- specs_dict = {}
- for key, value in extra_specs.iteritems():
- specs_dict[key] = value
- return dict(extra_specs=specs_dict)
+ return dict(extra_specs=extra_specs)
def _check_body(self, body):
if body is None or body == "":
@@ -103,10 +100,11 @@ class FlavorExtraSpecsController(object):
"""Return a single extra spec item."""
context = req.environ['nova.context']
authorize(context, action='show')
- specs = self._get_extra_specs(context, flavor_id)
- if id in specs['extra_specs']:
- return {id: specs['extra_specs'][id]}
- else:
+ try:
+ extra_spec = db.instance_type_extra_specs_get_item(context,
+ flavor_id, id)
+ return extra_spec
+ except exception.InstanceTypeExtraSpecsNotFound as e:
raise exc.HTTPNotFound()
def delete(self, req, flavor_id, id):
diff --git a/nova/db/api.py b/nova/db/api.py
index f454a2d15..81350ec20 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -1313,6 +1313,11 @@ def instance_type_extra_specs_get(context, flavor_id):
return IMPL.instance_type_extra_specs_get(context, flavor_id)
+def instance_type_extra_specs_get_item(context, flavor_id, key):
+ """Get extra specs by key and flavor_id."""
+ return IMPL.instance_type_extra_specs_get_item(context, flavor_id, key)
+
+
def instance_type_extra_specs_delete(context, flavor_id, key):
"""Delete the given extra specs item."""
IMPL.instance_type_extra_specs_delete(context, flavor_id, key)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 55be0da2d..a269dd263 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3875,6 +3875,18 @@ def instance_type_extra_specs_get(context, flavor_id):
@require_context
+def instance_type_extra_specs_get_item(context, flavor_id, key):
+ result = _instance_type_extra_specs_get_query(context, flavor_id).\
+ filter(models.InstanceTypeExtraSpecs.key == key).\
+ first()
+ if not result:
+ raise exception.InstanceTypeExtraSpecsNotFound(
+ extra_specs_key=key, instance_type_id=flavor_id)
+
+ return {result["key"]: result["value"]}
+
+
+@require_context
def instance_type_extra_specs_delete(context, flavor_id, key):
_instance_type_extra_specs_get_query(context, flavor_id).\
filter(models.InstanceTypeExtraSpecs.key == key).\
diff --git a/nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py b/nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py
index 269937b82..f0f064f4f 100644
--- a/nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py
+++ b/nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py
@@ -32,6 +32,10 @@ def return_flavor_extra_specs(context, flavor_id):
return stub_flavor_extra_specs()
+def return_flavor_extra_specs_item(context, flavor_id, key):
+ return {key: stub_flavor_extra_specs()[key]}
+
+
def return_empty_flavor_extra_specs(context, flavor_id):
return {}
@@ -76,8 +80,8 @@ class FlavorsExtraSpecsTest(test.TestCase):
self.assertEqual(0, len(res_dict['extra_specs']))
def test_show(self):
- self.stubs.Set(nova.db, 'instance_type_extra_specs_get',
- return_flavor_extra_specs)
+ self.stubs.Set(nova.db, 'instance_type_extra_specs_get_item',
+ return_flavor_extra_specs_item)
req = fakes.HTTPRequest.blank('/v2/fake/flavors/1/os-extra_specs' +
'/key5')
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 5f9a8a038..efdba9b78 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -2241,6 +2241,16 @@ class InstanceTypeExtraSpecsTestCase(BaseInstanceTypeTestCase):
it['flavorid'])
self._assertEqualObjects(it['extra_specs'], real_specs)
+ def test_instance_type_extra_specs_get_item(self):
+ expected = dict(f1=dict(a='a', b='b', c='c'),
+ f2=dict(d='d', e='e', f='f'))
+
+ for flavor, specs in expected.iteritems():
+ for key, val in specs.iteritems():
+ spec = db.instance_type_extra_specs_get_item(self.ctxt, flavor,
+ key)
+ self.assertEqual(spec[key], val)
+
def test_instance_type_extra_specs_delete(self):
for it in self.inst_types:
specs = it['extra_specs']