def test_migration_multiple_cells_new_instances_in_meantime(self): """This test if marker is created per-cell and we're able to verify instanced that were added in meantime. """ # Create 2 instances in cell0 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[0]) # Create 2 instances in cell1 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[1]) # Migrate instances in both cells. match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(2, done) # Add new instances to cell1 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[1]) # Try again, should find instances in cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(2, match) self.assertEqual(0, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_multiple_cells(self): """This test if marker and max_rows limit works properly while running in multi-cell environment. """ # Create 2 instances in cell0 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[0]) # Create 4 instances in cell1 self._create_instances( pre_newton=3, total=5, target_cell=self.cells[1]) # Fill vif list limiting to 4 instances - it should # touch cell0 and cell1 instances (migrate 3 due 1 is post newton). match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(3, done) # Try again - should fill 3 left instances from cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(3, match) self.assertEqual(1, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_multiple_cells(self): """This test if marker and max_rows limit works properly while running in multi-cell environment. """ # Create 2 instances in cell0 self._create_instances(pre_newton=1, total=2, target_cell=self.cells[0]) # Create 4 instances in cell1 self._create_instances(pre_newton=3, total=5, target_cell=self.cells[1]) # Fill vif list limiting to 4 instances - it should # touch cell0 and cell1 instances (migrate 3 due 1 is post newton). match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(3, done) # Try again - should fill 3 left instances from cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(3, match) self.assertEqual(1, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_fill_vifs_migration(self): # Create a test server. self._create_server( flavor_id=1, networks=[{ 'uuid': nova_fixtures.NeutronFixture.network_1['id'], }], ) # Run the online data migration which will create a (soft-deleted) # marker record. ctxt = nova_context.get_admin_context() virtual_interface.fill_virtual_interface_list(ctxt, max_count=50) # Now archive the deleted instance record. # The following (archive stuff) is used to prove that the migration # created a "fake instance". It is not necessary to trigger the bug. table_to_rows_archived, deleted_instance_uuids, total_rows_archived = ( db_api.archive_deleted_rows(max_rows=1000)) self.assertIn('instances', table_to_rows_archived) self.assertEqual(1, table_to_rows_archived['instances']) self.assertEqual(1, len(deleted_instance_uuids)) self.assertEqual(virtual_interface.FAKE_UUID, deleted_instance_uuids[0]) # Since the above (archive stuff) removed the fake instance, do the # migration again to recreate it so we can exercise the code path. virtual_interface.fill_virtual_interface_list(ctxt, max_count=50) # Now list deleted servers. The fake marker instance should be excluded # from the API results. for detail in (True, False): servers = self.api.get_servers(detail=detail, search_opts={ 'all_tenants': 1, 'deleted': 1 }) self.assertEqual(0, len(servers))
def test_migration_multiple_cells_new_instances_in_meantime(self): """This test if marker is created per-cell and we're able to verify instanced that were added in meantime. """ # Create 2 instances in cell0 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[0]) # Create 2 instances in cell1 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[1]) # Migrate instances in both cells. match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(2, done) # Add new instances to cell1 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[1]) # Try again, should find instances in cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(2, match) self.assertEqual(0, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_inconsistent_data(self): """This test when vif (db) are in completely different comparing to network cache and we don't know how to deal with it. It's the corner-case. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Change order of interfaces in NetworkInfo to fake # inconsistency between cache and db. nwinfo = instance_info_cache.network_info interface = nwinfo.pop() nwinfo.insert(0, interface) instance_info_cache.updated_at = datetime.datetime(2015, 1, 1) instance_info_cache.network_info = nwinfo # Update the cache instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # Cache is corrupted, so must be rewritten self.assertEqual(1, match) self.assertEqual(1, done)
def test_migration_inconsistent_data(self): """This test when vif (db) are in completely different comparing to network cache and we don't know how to deal with it. It's the corner-case. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Change order of interfaces in NetworkInfo to fake # inconsistency between cache and db. nwinfo = instance_info_cache.network_info interface = nwinfo.pop() nwinfo.insert(0, interface) instance_info_cache.updated_at = datetime.datetime(2015, 1, 1) instance_info_cache.network_info = nwinfo # Update the cache instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # Cache is corrupted, so must be rewritten self.assertEqual(1, match) self.assertEqual(1, done)
def test_migration_verify_max_count(self): """This verifies if max_count is respected to avoid migration of bigger set of data, than user specified. """ self._create_instances(pre_newton=0, total=3) match, done = virtual_interface.fill_virtual_interface_list( self.context, 2) self.assertEqual(2, match) self.assertEqual(0, done)
def test_migration_verify_max_count(self): """This verifies if max_count is respected to avoid migration of bigger set of data, than user specified. """ self._create_instances(pre_newton=0, total=3) match, done = virtual_interface.fill_virtual_interface_list( self.context, 2) self.assertEqual(2, match) self.assertEqual(0, done)
def test_migration_nothing_to_migrate(self): """This test when there already populated VirtualInterfaceList objects for created instances. """ self._create_instances(pre_newton=0, total=5) match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(5, match) self.assertEqual(0, done)
def test_migration_dont_touch_deleted_objects(self): """This test if deleted instances are skipped during migration. """ self._create_instances(pre_newton=1, deleted=1, total=3) match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(2, match) self.assertEqual(1, done)
def test_migration_nothing_to_migrate(self): """This test when there already populated VirtualInterfaceList objects for created instances. """ self._create_instances(pre_newton=0, total=5) match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(5, match) self.assertEqual(0, done)
def test_migration_dont_touch_deleted_objects(self): """This test if deleted instances are skipped during migration. """ self._create_instances( pre_newton=1, deleted=1, total=3) match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(2, match) self.assertEqual(1, done)
def test_migration_multiple_cells(self): """This test if marker and max_rows limit works properly while running in multi-cell environment. """ # Create 2 instances in cell0 self._create_instances(pre_newton=1, total=2, target_cell=self.cells[0]) # Create 4 instances in cell1 self._create_instances(pre_newton=3, total=5, target_cell=self.cells[1]) # Fill vif list limiting to 4 instances - it should # touch cell0 and cell1 instances (migrate 3 due 1 is post newton). match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(3, done) # Verify that the marker instance has project_id/user_id set properly. with context.target_cell(self.context, self.cells[1]) as cctxt: # The marker record is destroyed right after it's created, since # only the presence of the row is needed to satisfy the fkey # constraint. cctxt = cctxt.elevated(read_deleted='yes') marker_instance = objects.Instance.get_by_uuid(cctxt, FAKE_UUID) self.assertEqual(FAKE_UUID, marker_instance.project_id) self.assertEqual(FAKE_UUID, marker_instance.user_id) # Try again - should fill 3 left instances from cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(3, match) self.assertEqual(1, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_pre_newton_instances(self): """This test when there is an instance created in release older than Newton. For those instances the VirtualInterfaceList needs to be re-created from cache. """ # Lets spawn 3 pre-newton instances and 2 new ones self._create_instances(pre_newton=3, total=5) match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(5, match) self.assertEqual(3, done) # Make sure we ran over all the instances - verify if marker works match, done = virtual_interface.fill_virtual_interface_list( self.context, 50) self.assertEqual(0, match) self.assertEqual(0, done) for i in range(0, 5): _verify_list_fulfillment(self.context, self.instances[i].uuid)
def test_migration_pre_newton_instances(self): """This test when there is an instance created in release older than Newton. For those instances the VirtualInterfaceList needs to be re-created from cache. """ # Lets spawn 3 pre-newton instances and 2 new ones self._create_instances(pre_newton=3, total=5) match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(5, match) self.assertEqual(3, done) # Make sure we ran over all the instances - verify if marker works match, done = virtual_interface.fill_virtual_interface_list( self.context, 50) self.assertEqual(0, match) self.assertEqual(0, done) for i in range(0, 5): _verify_list_fulfillment(self.context, self.instances[i].uuid)
def test_migration_multiple_cells(self): """This test if marker and max_rows limit works properly while running in multi-cell environment. """ # Create 2 instances in cell0 self._create_instances( pre_newton=1, total=2, target_cell=self.cells[0]) # Create 4 instances in cell1 self._create_instances( pre_newton=3, total=5, target_cell=self.cells[1]) # Fill vif list limiting to 4 instances - it should # touch cell0 and cell1 instances (migrate 3 due 1 is post newton). match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(4, match) self.assertEqual(3, done) # Verify that the marker instance has project_id/user_id set properly. with context.target_cell(self.context, self.cells[1]) as cctxt: # The marker record is destroyed right after it's created, since # only the presence of the row is needed to satisfy the fkey # constraint. cctxt = cctxt.elevated(read_deleted='yes') marker_instance = objects.Instance.get_by_uuid(cctxt, FAKE_UUID) self.assertEqual(FAKE_UUID, marker_instance.project_id) self.assertEqual(FAKE_UUID, marker_instance.user_id) # Try again - should fill 3 left instances from cell1 match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(3, match) self.assertEqual(1, done) # Try again - should be nothing to migrate match, done = virtual_interface.fill_virtual_interface_list( self.context, 4) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_empty_network_info(self): """This test if migration is not executed while NetworkInfo is empty, like instance without interfaces attached. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Clean NetworkInfo. Pretend instance without interfaces. instance_info_cache.network_info = None instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_empty_network_info(self): """This test if migration is not executed while NetworkInfo is empty, like instance without interfaces attached. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Clean NetworkInfo. Pretend instance without interfaces. instance_info_cache.network_info = None instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) self.assertEqual(0, match) self.assertEqual(0, done)
def test_migration_pre_newton_instance_new_vifs(self): """This test when instance was created before Newton but in meantime new interfaces where attached and VirtualInterfaceList is not populated. """ self._create_instances(pre_newton=0, total=1) vif_list = objects.VirtualInterfaceList.get_by_instance_uuid( self.context, self.instances[0].uuid) # Drop first vif from list to pretend old instance vif_list[0].destroy() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # The whole VirtualInterfaceList should be rewritten and base # on cache. self.assertEqual(1, match) self.assertEqual(1, done) _verify_list_fulfillment(self.context, self.instances[0].uuid)
def test_migration_pre_newton_instance_new_vifs(self): """This test when instance was created before Newton but in meantime new interfaces where attached and VirtualInterfaceList is not populated. """ self._create_instances(pre_newton=0, total=1) vif_list = objects.VirtualInterfaceList.get_by_instance_uuid( self.context, self.instances[0].uuid) # Drop first vif from list to pretend old instance vif_list[0].destroy() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # The whole VirtualInterfaceList should be rewritten and base # on cache. self.assertEqual(1, match) self.assertEqual(1, done) _verify_list_fulfillment(self.context, self.instances[0].uuid)
def test_migration_attach_in_progress(self): """This test when number of vifs (db) is bigger than number taken from network cache. Potential port-attach is taking place. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Delete last interface to pretend that's still in progress instance_info_cache.network_info.pop() instance_info_cache.updated_at = datetime.datetime(2015, 1, 1) instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # I don't know whats going on so instance VirtualInterfaceList # should stay untouched. self.assertEqual(1, match) self.assertEqual(0, done)
def test_migration_do_not_step_to_next_cell(self): """This verifies if script doesn't step into next cell when max_count is reached. """ # Create 2 instances in cell0 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[0]) # Create 2 instances in cell1 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[1]) with mock.patch('nova.objects.InstanceList.get_by_filters', side_effect=[self.instances[0:2], self.instances[2:]]) \ as mock_get: match, done = virtual_interface.fill_virtual_interface_list( self.context, 2) self.assertEqual(2, match) self.assertEqual(0, done) mock_get.assert_called_once()
def test_migration_do_not_step_to_next_cell(self): """This verifies if script doesn't step into next cell when max_count is reached. """ # Create 2 instances in cell0 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[0]) # Create 2 instances in cell1 self._create_instances( pre_newton=0, total=2, target_cell=self.cells[1]) with mock.patch('nova.objects.InstanceList.get_by_filters', side_effect=[self.instances[0:2], self.instances[2:]]) \ as mock_get: match, done = virtual_interface.fill_virtual_interface_list( self.context, 2) self.assertEqual(2, match) self.assertEqual(0, done) mock_get.assert_called_once()
def test_migration_attach_in_progress(self): """This test when number of vifs (db) is bigger than number taken from network cache. Potential port-attach is taking place. """ self._create_instances(pre_newton=0, total=1) instance_info_cache = objects.InstanceInfoCache.get_by_instance_uuid( self.context, self.instances[0].uuid) # Delete last interface to pretend that's still in progress instance_info_cache.network_info.pop() instance_info_cache.updated_at = datetime.datetime(2015, 1, 1) instance_info_cache.save() match, done = virtual_interface.fill_virtual_interface_list( self.context, 5) # I don't know whats going on so instance VirtualInterfaceList # should stay untouched. self.assertEqual(1, match) self.assertEqual(0, done)