summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2011-06-22 12:48:30 +0900
committerIsaku Yamahata <yamahata@valinux.co.jp>2011-06-22 12:48:30 +0900
commit4020e0dab41caf22de629c94cf94f5ea2101faee (patch)
treed30d6683e95351e2d19a70a0a4913c910919ff73
parent96fc985878cd52813aa07a4843e5928031b1501a (diff)
downloadnova-4020e0dab41caf22de629c94cf94f5ea2101faee.tar.gz
nova-4020e0dab41caf22de629c94cf94f5ea2101faee.tar.xz
nova-4020e0dab41caf22de629c94cf94f5ea2101faee.zip
db/block_device_mapping/api: introduce update_or_create
introduce db.block_device_mapping_udpate_or_create() which update the colume if exists. Create new column if not existed. This api will be used later for block device mapping tracking.
-rw-r--r--nova/db/api.py8
-rw-r--r--nova/db/sqlalchemy/api.py17
2 files changed, 24 insertions, 1 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index 8f8e856b8..d77d0c352 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -936,10 +936,16 @@ def block_device_mapping_create(context, values):
def block_device_mapping_update(context, bdm_id, values):
- """Create an entry of block device mapping"""
+ """Update an entry of block device mapping"""
return IMPL.block_device_mapping_update(context, bdm_id, values)
+def block_device_mapping_update_or_create(context, values):
+ """Update an entry of block device mapping.
+ If not existed, create a new entry"""
+ return IMPL.block_device_mapping_update_or_create(context, values)
+
+
def block_device_mapping_get_all_by_instance(context, instance_id):
"""Get all block device mapping belonging to a instance"""
return IMPL.block_device_mapping_get_all_by_instance(context, instance_id)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index a2500a38d..7108c7a7a 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1933,6 +1933,23 @@ def block_device_mapping_update(context, bdm_id, values):
@require_context
+def block_device_mapping_update_or_create(context, values):
+ session = get_session()
+ with session.begin():
+ result = session.query(models.BlockDeviceMapping).\
+ filter_by(instance_id=values['instance_id']).\
+ filter_by(device_name=values['device_name']).\
+ filter_by(deleted=False).\
+ first()
+ if not result:
+ bdm_ref = models.BlockDeviceMapping()
+ bdm_ref.update(values)
+ bdm_ref.save(session=session)
+ else:
+ result.update(values)
+
+
+@require_context
def block_device_mapping_get_all_by_instance(context, instance_id):
session = get_session()
result = session.query(models.BlockDeviceMapping).\