From 188a94c898bcf07f9fe42ef2f3b5ee4aa8859b49 Mon Sep 17 00:00:00 2001 From: David Ripton Date: Wed, 8 May 2013 14:20:29 -0400 Subject: Remove invalid block_device_mapping volume_size of '' Fixes bug #1171190 Parsing block_device_mapping from strings sometimes results in volume_size being set to '' or u''. This causes a problem when inserting into PostgreSQL, which insists that integer columns actually contain integers. Remove invalid device_size before inserting or updating block_device_mapping database records. Change-Id: If9132a96604b5b0e3a6df96624e565e016d5c9a3 --- nova/db/sqlalchemy/api.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 9213b36b3..52d25293a 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -3018,8 +3018,19 @@ def _block_device_mapping_get_query(context, session=None): return model_query(context, models.BlockDeviceMapping, session=session) +def _scrub_empty_str_values(dct, keys_to_scrub): + """ + Remove any keys found in sequence keys_to_scrub from the dict + if they have the value ''. + """ + for key in keys_to_scrub: + if key in dct and dct[key] == '': + del dct[key] + + @require_context def block_device_mapping_create(context, values): + _scrub_empty_str_values(values, ['volume_size']) bdm_ref = models.BlockDeviceMapping() bdm_ref.update(values) bdm_ref.save() @@ -3027,6 +3038,7 @@ def block_device_mapping_create(context, values): @require_context def block_device_mapping_update(context, bdm_id, values): + _scrub_empty_str_values(values, ['volume_size']) _block_device_mapping_get_query(context).\ filter_by(id=bdm_id).\ update(values) @@ -3034,6 +3046,7 @@ def block_device_mapping_update(context, bdm_id, values): @require_context def block_device_mapping_update_or_create(context, values): + _scrub_empty_str_values(values, ['volume_size']) session = get_session() with session.begin(): result = _block_device_mapping_get_query(context, session=session).\ -- cgit