summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2011-07-23 16:55:25 +0900
committerIsaku Yamahata <yamahata@valinux.co.jp>2011-07-23 16:55:25 +0900
commit9be2793c2e057a5e4f8c8c4dd2131ddcc3b11608 (patch)
tree99d7419ac0da2d3aa046c849bab3339f29b928ff
parentba6b6a20eeedb0311e06090d2f60d36964d67cf4 (diff)
db/api: block_device_mapping_update_or_create()
It is possible to have same virtual device name. So eliminate old entries whose entry has same virtual device name.
-rw-r--r--nova/db/sqlalchemy/api.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index ba03cabbc..ad51f5192 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -20,6 +20,7 @@ Implementation of SQLAlchemy backend.
"""
import warnings
+from nova import block_device
from nova import db
from nova import exception
from nova import flags
@@ -2264,6 +2265,20 @@ def block_device_mapping_update_or_create(context, values):
else:
result.update(values)
+ # NOTE(yamahata): same virtual device name can be specified multiple
+ # times. So delete the existing ones.
+ virtual_name = values['virtual_name']
+ if (virtual_name is not None and
+ block_device.is_swap_or_ephemeral(virtual_name)):
+ session.query(models.BlockDeviceMapping).\
+ filter_by(instance_id=values['instance_id']).\
+ filter_by(virtual_name=virtual_name).\
+ filter(models.BlockDeviceMapping.device_name !=
+ values['device_name']).\
+ update({'deleted': True,
+ 'deleted_at': utils.utcnow(),
+ 'updated_at': literal_column('updated_at')})
+
@require_context
def block_device_mapping_get_all_by_instance(context, instance_id):