From 2fc4b6ccafb1770e6f6c0c4d0c86b456529e5603 Mon Sep 17 00:00:00 2001 From: Surya Date: Tue, 14 Aug 2018 13:24:34 +0200 Subject: [PATCH] Add get_by_cell_and_project() method to InstanceMappingList Adds a new query method to query for instance_mappings in the provided cell for the provided project_id. Related to blueprint handling-down-cell Change-Id: I4b4466de9160267c23b88c2b35673745fd989f4d --- nova/objects/instance_mapping.py | 16 ++++++++ .../functional/db/test_instance_mapping.py | 37 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/nova/objects/instance_mapping.py b/nova/objects/instance_mapping.py index ef389735799b..162b4da49f1f 100644 --- a/nova/objects/instance_mapping.py +++ b/nova/objects/instance_mapping.py @@ -249,3 +249,19 @@ class InstanceMappingList(base.ObjectListBase, base.NovaObject): @classmethod def destroy_bulk(cls, context, instance_uuids): return cls._destroy_bulk_in_db(context, instance_uuids) + + @staticmethod + @db_api.api_context_manager.reader + def _get_by_cell_and_project_from_db(context, cell_id, project_id): + return (context.session.query(api_models.InstanceMapping) + .options(joinedload('cell_mapping')) + .filter_by(cell_id=cell_id) + .filter_by(project_id=project_id) + .all()) + + @classmethod + def get_by_cell_and_project(cls, context, cell_id, project_id): + db_mappings = cls._get_by_cell_and_project_from_db(context, cell_id, + project_id) + return base.obj_make_list(context, cls(), objects.InstanceMapping, + db_mappings) diff --git a/nova/tests/functional/db/test_instance_mapping.py b/nova/tests/functional/db/test_instance_mapping.py index 9e0ed3821c1b..2a5dd2cab875 100644 --- a/nova/tests/functional/db/test_instance_mapping.py +++ b/nova/tests/functional/db/test_instance_mapping.py @@ -255,3 +255,40 @@ class InstanceMappingListTestCase(test.NoDBTestCase): self.context, uuids + [uuidsentinel.deleted_instance]) self.assertEqual(sorted(uuids), sorted([m.instance_uuid for m in mappings])) + + def test_get_by_cell_and_project(self): + cells = [] + # Create two cells + for uuid in (uuidsentinel.cell1, uuidsentinel.cell2): + cm = cell_mapping.CellMapping(context=self.context, uuid=uuid, + database_connection="fake:///", + transport_url='fake://') + cm.create() + cells.append(cm) + # With each cell having two instance_mappings of two project_ids. + uuids = {cells[0].id: [uuidsentinel.c1i1, uuidsentinel.c1i2], + cells[1].id: [uuidsentinel.c2i1, uuidsentinel.c2i2]} + project_ids = ['fake-project-1', 'fake-project-2'] + for cell_id, uuid in uuids.items(): + instance_mapping.InstanceMapping._create_in_db( + self.context, + {'project_id': project_ids[0], + 'cell_id': cell_id, + 'instance_uuid': uuid[0]}) + instance_mapping.InstanceMapping._create_in_db( + self.context, + {'project_id': project_ids[1], + 'cell_id': cell_id, + 'instance_uuid': uuid[1]}) + + ims = instance_mapping.InstanceMappingList.get_by_cell_and_project( + self.context, cells[0].id, 'fake-project-2') + self.assertEqual([uuidsentinel.c1i2], + sorted([m.instance_uuid for m in ims])) + ims = instance_mapping.InstanceMappingList.get_by_cell_and_project( + self.context, cells[1].id, 'fake-project-1') + self.assertEqual([uuidsentinel.c2i1], + sorted([m.instance_uuid for m in ims])) + ims = instance_mapping.InstanceMappingList.get_by_cell_and_project( + self.context, cells[0].id, 'fake-project-3') + self.assertEqual([], sorted([m.instance_uuid for m in ims]))