diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-04-30 13:38:18 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-04-30 13:38:18 +0000 |
| commit | f582052f97e091cb3cd27cc577b7067577ad723a (patch) | |
| tree | fcae4da6a846dfd1c97f7c19989c2b5b4cc3c1fd /nova | |
| parent | ad5f3e927334144599a6c73c4ba1f7f80f7b64e4 (diff) | |
| parent | 48621685389a491d0519faf8fe52dc682e020c67 (diff) | |
Merge "Performance optimization for contrib.flavorextraspecs"
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/api/openstack/compute/contrib/flavorextraspecs.py | 14 | ||||
| -rw-r--r-- | nova/db/api.py | 5 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 12 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_flavors_extra_specs.py | 8 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 10 |
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'] |
