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