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
This commit is contained in:
@@ -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).\
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
"""Unit tests for the DB API."""
|
||||
|
||||
import copy
|
||||
import datetime
|
||||
import types
|
||||
import uuid as stdlib_uuid
|
||||
@@ -3344,6 +3345,22 @@ class BlockDeviceMappingTestCase(test.TestCase):
|
||||
if bdm['device_name'] == values['device_name']:
|
||||
return bdm
|
||||
|
||||
def test_scrub_empty_str_values_no_effect(self):
|
||||
values = {'volume_size': 5}
|
||||
expected = copy.copy(values)
|
||||
sqlalchemy_api._scrub_empty_str_values(values, ['volume_size'])
|
||||
self.assertEqual(values, expected)
|
||||
|
||||
def test_scrub_empty_str_values_empty_string(self):
|
||||
values = {'volume_size': ''}
|
||||
sqlalchemy_api._scrub_empty_str_values(values, ['volume_size'])
|
||||
self.assertEqual(values, {})
|
||||
|
||||
def test_scrub_empty_str_values_empty_unicode(self):
|
||||
values = {'volume_size': u''}
|
||||
sqlalchemy_api._scrub_empty_str_values(values, ['volume_size'])
|
||||
self.assertEqual(values, {})
|
||||
|
||||
def test_block_device_mapping_create(self):
|
||||
bdm = self._create_bdm({})
|
||||
self.assertFalse(bdm is None)
|
||||
|
||||
Reference in New Issue
Block a user