diff options
| author | Yunhong, Jiang <yunhong.jiang@intel.com> | 2012-07-31 18:15:59 +0800 |
|---|---|---|
| committer | Yunhong, Jiang <yunhong.jiang@intel.com> | 2012-08-06 18:26:15 +0800 |
| commit | 9575a426fa4adcd79f1fa0c3a1d1008d8010c44c (patch) | |
| tree | ee4dd1bf68d5b97e5ee0f147809eba9f5d14ff6a /nova/db | |
| parent | 9142e11580e901875617400c62e9f18aeb7d3b21 (diff) | |
Flavor extra specs extension use instance_type id
bug 1031263
The nova database API use instance_type id as parameter to access flavor
extra spec. However, the flavor extra_specs API extension use flavor_id as
parameter wrongly.
As the instance_type ID is a purely nova internal ID, the database should
not expose it and instead use flavor_id as the parameter
Change-Id: I5f509cb7c4457d8c399df32f559a874d498be762
Signed-off-by: Yunhong, Jiang <yunhong.jiang@intel.com>
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/api.py | 12 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 40 |
2 files changed, 30 insertions, 22 deletions
diff --git a/nova/db/api.py b/nova/db/api.py index 5e390d9f9..d270ba9dd 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1542,21 +1542,21 @@ def bw_usage_update(context, #################### -def instance_type_extra_specs_get(context, instance_type_id): +def instance_type_extra_specs_get(context, flavor_id): """Get all extra specs for an instance type.""" - return IMPL.instance_type_extra_specs_get(context, instance_type_id) + return IMPL.instance_type_extra_specs_get(context, flavor_id) -def instance_type_extra_specs_delete(context, instance_type_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, instance_type_id, key) + IMPL.instance_type_extra_specs_delete(context, flavor_id, key) -def instance_type_extra_specs_update_or_create(context, instance_type_id, +def instance_type_extra_specs_update_or_create(context, flavor_id, extra_specs): """Create or update instance type extra specs. This adds or modifies the key/value pairs specified in the extra specs dict argument""" - IMPL.instance_type_extra_specs_update_or_create(context, instance_type_id, + IMPL.instance_type_extra_specs_update_or_create(context, flavor_id, extra_specs) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 1f5b07643..36e39868b 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -4193,17 +4193,23 @@ def bw_usage_update(context, #################### -def _instance_type_extra_specs_get_query(context, instance_type_id, +def _instance_type_extra_specs_get_query(context, flavor_id, session=None): + # Two queries necessary because join with update doesn't work. + t = model_query(context, models.InstanceTypes.id, + session=session, read_deleted="no").\ + filter(models.InstanceTypes.flavorid == flavor_id).\ + subquery() return model_query(context, models.InstanceTypeExtraSpecs, session=session, read_deleted="no").\ - filter_by(instance_type_id=instance_type_id) + filter(models.InstanceTypeExtraSpecs.\ + instance_type_id.in_(t)) @require_context -def instance_type_extra_specs_get(context, instance_type_id): +def instance_type_extra_specs_get(context, flavor_id): rows = _instance_type_extra_specs_get_query( - context, instance_type_id).\ + context, flavor_id).\ all() result = {} @@ -4214,43 +4220,45 @@ def instance_type_extra_specs_get(context, instance_type_id): @require_context -def instance_type_extra_specs_delete(context, instance_type_id, key): +def instance_type_extra_specs_delete(context, flavor_id, key): + # Don't need synchronize the session since we will not use the query result _instance_type_extra_specs_get_query( - context, instance_type_id).\ - filter_by(key=key).\ + context, flavor_id).\ + filter(models.InstanceTypeExtraSpecs.key == key).\ update({'deleted': True, 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) + 'updated_at': literal_column('updated_at')}, + synchronize_session=False) @require_context -def instance_type_extra_specs_get_item(context, instance_type_id, key, +def instance_type_extra_specs_get_item(context, flavor_id, key, session=None): result = _instance_type_extra_specs_get_query( - context, instance_type_id, session=session).\ - filter_by(key=key).\ + context, flavor_id, session=session).\ + filter(models.InstanceTypeExtraSpecs.key == key).\ first() - if not result: raise exception.InstanceTypeExtraSpecsNotFound( - extra_specs_key=key, instance_type_id=instance_type_id) + extra_specs_key=key, instance_type_id=flavor_id) return result @require_context -def instance_type_extra_specs_update_or_create(context, instance_type_id, +def instance_type_extra_specs_update_or_create(context, flavor_id, specs): session = get_session() spec_ref = None + instance_type = instance_type_get_by_flavor_id(context, flavor_id) for key, value in specs.iteritems(): try: spec_ref = instance_type_extra_specs_get_item( - context, instance_type_id, key, session) + context, flavor_id, key, session) except exception.InstanceTypeExtraSpecsNotFound, e: spec_ref = models.InstanceTypeExtraSpecs() spec_ref.update({"key": key, "value": value, - "instance_type_id": instance_type_id, + "instance_type_id": instance_type["id"], "deleted": 0}) spec_ref.save(session=session) return specs |
