diff options
| author | Isaku Yamahata <yamahata@valinux.co.jp> | 2011-06-22 12:48:30 +0900 |
|---|---|---|
| committer | Isaku Yamahata <yamahata@valinux.co.jp> | 2011-06-22 12:48:30 +0900 |
| commit | 4020e0dab41caf22de629c94cf94f5ea2101faee (patch) | |
| tree | d30d6683e95351e2d19a70a0a4913c910919ff73 | |
| parent | 96fc985878cd52813aa07a4843e5928031b1501a (diff) | |
| download | nova-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.py | 8 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 17 |
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).\ |
