diff --git a/nova/objects/cell_mapping.py b/nova/objects/cell_mapping.py index 74bdccd01882..00273ee33041 100644 --- a/nova/objects/cell_mapping.py +++ b/nova/objects/cell_mapping.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo_utils import versionutils from sqlalchemy.sql.expression import asc from nova.db.sqlalchemy import api as db_api @@ -22,7 +23,8 @@ from nova.objects import fields @base.NovaObjectRegistry.register class CellMapping(base.NovaTimestampObject, base.NovaObject): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added disabled field + VERSION = '1.1' CELL0_UUID = '00000000-0000-0000-0000-000000000000' @@ -32,7 +34,15 @@ class CellMapping(base.NovaTimestampObject, base.NovaObject): 'name': fields.StringField(nullable=True), 'transport_url': fields.StringField(), 'database_connection': fields.StringField(), - } + 'disabled': fields.BooleanField(default=False), + } + + def obj_make_compatible(self, primitive, target_version): + super(CellMapping, self).obj_make_compatible(primitive, target_version) + target_version = versionutils.convert_version_to_tuple(target_version) + if target_version < (1, 1): + if 'disabled' in primitive: + del primitive['disabled'] @property def identity(self): diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index fbc9be16f9f4..9928b7f58d99 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -346,7 +346,8 @@ class SingleCellSimple(fixtures.Fixture): 'uuid': uuidsentinel.cell1, 'name': 'onlycell', 'transport_url': 'fake://nowhere/', - 'database_connection': 'sqlite:///'}] + 'database_connection': 'sqlite:///', + 'disabled': False}] @contextmanager def _fake_target_cell(self, context, target_cell): diff --git a/nova/tests/unit/objects/test_cell_mapping.py b/nova/tests/unit/objects/test_cell_mapping.py index 9b8dc31f6bd2..241dde241a73 100644 --- a/nova/tests/unit/objects/test_cell_mapping.py +++ b/nova/tests/unit/objects/test_cell_mapping.py @@ -29,7 +29,8 @@ def get_db_mapping(**updates): 'database_connection': 'sqlite:///', 'created_at': None, 'updated_at': None, - } + 'disabled': False, + } db_mapping.update(updates) return db_mapping @@ -116,6 +117,14 @@ class _TestCellMappingObject(object): cm = objects.CellMapping(uuid=uuids.cell1, name='foo') self.assertEqual('%s(foo)' % uuids.cell1, cm.identity) + def test_obj_make_compatible(self): + cell_mapping_obj = cell_mapping.CellMapping(context=self.context) + fake_cell_mapping_copy = dict(get_db_mapping()) + self.assertIn('disabled', fake_cell_mapping_copy) + cell_mapping_obj.obj_make_compatible(fake_cell_mapping_copy, '1.0') + self.assertIn('uuid', fake_cell_mapping_copy) + self.assertNotIn('disabled', fake_cell_mapping_copy) + class TestCellMappingObject(test_objects._LocalTest, _TestCellMappingObject): diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index f1975e55257e..741bef3adb86 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -1064,7 +1064,7 @@ object_data = { 'BlockDeviceMappingList': '1.17-1e568eecb91d06d4112db9fd656de235', 'BuildRequest': '1.3-077dee42bed93f8a5b62be77657b7152', 'BuildRequestList': '1.0-cd95608eccb89fbc702c8b52f38ec738', - 'CellMapping': '1.0-7f1a7e85a22bbb7559fc730ab658b9bd', + 'CellMapping': '1.1-5d652928000a5bc369d79d5bde7e497d', 'CellMappingList': '1.0-4ee0d9efdfd681fed822da88376e04d2', 'ComputeNode': '1.18-431fafd8ac4a5f3559bd9b1f1332cc22', 'ComputeNodeList': '1.17-52f3b0962b1c86b98590144463ebb192',