diff options
Diffstat (limited to 'nova/tests/cells/test_cells_messaging.py')
-rw-r--r-- | nova/tests/cells/test_cells_messaging.py | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/nova/tests/cells/test_cells_messaging.py b/nova/tests/cells/test_cells_messaging.py index d4d9b052e..734fecf0e 100644 --- a/nova/tests/cells/test_cells_messaging.py +++ b/nova/tests/cells/test_cells_messaging.py @@ -23,6 +23,7 @@ from nova.compute import vm_states from nova import context from nova import db from nova import exception +from nova.objects import instance as instance_obj from nova.openstack.common import rpc from nova.openstack.common import timeutils from nova import test @@ -641,6 +642,60 @@ class CellsTargetedMethodsTestCase(test.TestCase): result = response.value_or_raise() self.assertEqual('fake_result', result) + def test_run_compute_api_method_expects_obj(self): + instance_uuid = 'fake_instance_uuid' + method_info = {'method': 'start', + 'method_args': (instance_uuid, 2, 3), + 'method_kwargs': {'arg1': 'val1', 'arg2': 'val2'}} + self.mox.StubOutWithMock(self.tgt_compute_api, 'start') + self.mox.StubOutWithMock(self.tgt_db_inst, 'instance_get_by_uuid') + + self.tgt_db_inst.instance_get_by_uuid(self.ctxt, + instance_uuid).AndReturn('fake_instance') + + def get_instance_mock(): + # NOTE(comstud): This block of code simulates the following + # mox code: + # + # self.mox.StubOutWithMock(instance_obj, 'Instance', + # use_mock_anything=True) + # self.mox.StubOutWithMock(instance_obj.Instance, + # '_from_db_object') + # instance_mock = self.mox.CreateMock(instance_obj.Instance) + # instance_obj.Instance().AndReturn(instance_mock) + # + # Unfortunately, the above code fails on py27 do to some + # issue with the Mock object do to similar issue as this: + # https://code.google.com/p/pymox/issues/detail?id=35 + # + class FakeInstance(object): + def _from_db_object(obj, db_obj): + pass + + instance_mock = FakeInstance() + + def fake_instance(): + return instance_mock + + self.stubs.Set(instance_obj, 'Instance', fake_instance) + self.mox.StubOutWithMock(instance_mock, '_from_db_object') + return instance_mock + + instance = get_instance_mock() + instance._from_db_object( + instance, 'fake_instance').AndReturn(instance) + self.tgt_compute_api.start(self.ctxt, instance, 2, 3, + arg1='val1', arg2='val2').AndReturn('fake_result') + self.mox.ReplayAll() + + response = self.src_msg_runner.run_compute_api_method( + self.ctxt, + self.tgt_cell_name, + method_info, + True) + result = response.value_or_raise() + self.assertEqual('fake_result', result) + def test_run_compute_api_method_unknown_instance(self): # Unknown instance should send a broadcast up that instance # is gone. @@ -1426,3 +1481,173 @@ class CellsBroadcastMethodsTestCase(test.TestCase): self.mox.ReplayAll() self.src_msg_runner.consoleauth_delete_tokens(self.ctxt, fake_uuid) + + def test_bdm_update_or_create_with_none_create(self): + fake_bdm = {'id': 'fake_id', + 'volume_id': 'fake_volume_id'} + expected_bdm = fake_bdm.copy() + expected_bdm.pop('id') + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_update_or_create') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_update_or_create') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_update_or_create') + self.tgt_db_inst.block_device_mapping_update_or_create( + self.ctxt, expected_bdm, legacy=False) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_update_or_create_at_top(self.ctxt, + fake_bdm, + create=None) + + def test_bdm_update_or_create_with_true_create(self): + fake_bdm = {'id': 'fake_id', + 'volume_id': 'fake_volume_id'} + expected_bdm = fake_bdm.copy() + expected_bdm.pop('id') + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_create') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_create') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_create') + self.tgt_db_inst.block_device_mapping_create( + self.ctxt, fake_bdm, legacy=False) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_update_or_create_at_top(self.ctxt, + fake_bdm, + create=True) + + def test_bdm_update_or_create_with_false_create_vol_id(self): + fake_bdm = {'id': 'fake_id', + 'instance_uuid': 'fake_instance_uuid', + 'device_name': 'fake_device_name', + 'volume_id': 'fake_volume_id'} + expected_bdm = fake_bdm.copy() + expected_bdm.pop('id') + + fake_inst_bdms = [{'id': 1, + 'volume_id': 'not-a-match', + 'device_name': 'not-a-match'}, + {'id': 2, + 'volume_id': 'fake_volume_id', + 'device_name': 'not-a-match'}, + {'id': 3, + 'volume_id': 'not-a-match', + 'device_name': 'not-a-match'}] + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_update') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_update') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_get_all_by_instance') + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_update') + + self.tgt_db_inst.block_device_mapping_get_all_by_instance( + self.ctxt, 'fake_instance_uuid').AndReturn( + fake_inst_bdms) + # Should try to update ID 2. + self.tgt_db_inst.block_device_mapping_update( + self.ctxt, 2, expected_bdm, legacy=False) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_update_or_create_at_top(self.ctxt, + fake_bdm, + create=False) + + def test_bdm_update_or_create_with_false_create_dev_name(self): + fake_bdm = {'id': 'fake_id', + 'instance_uuid': 'fake_instance_uuid', + 'device_name': 'fake_device_name', + 'volume_id': 'fake_volume_id'} + expected_bdm = fake_bdm.copy() + expected_bdm.pop('id') + + fake_inst_bdms = [{'id': 1, + 'volume_id': 'not-a-match', + 'device_name': 'not-a-match'}, + {'id': 2, + 'volume_id': 'not-a-match', + 'device_name': 'fake_device_name'}, + {'id': 3, + 'volume_id': 'not-a-match', + 'device_name': 'not-a-match'}] + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_update') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_update') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_get_all_by_instance') + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_update') + + self.tgt_db_inst.block_device_mapping_get_all_by_instance( + self.ctxt, 'fake_instance_uuid').AndReturn( + fake_inst_bdms) + # Should try to update ID 2. + self.tgt_db_inst.block_device_mapping_update( + self.ctxt, 2, expected_bdm, legacy=False) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_update_or_create_at_top(self.ctxt, + fake_bdm, + create=False) + + def test_bdm_destroy_by_volume(self): + fake_instance_uuid = 'fake-instance-uuid' + fake_volume_id = 'fake-volume-name' + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_destroy_by_instance_and_volume') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_destroy_by_instance_and_volume') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_destroy_by_instance_and_volume') + self.tgt_db_inst.block_device_mapping_destroy_by_instance_and_volume( + self.ctxt, fake_instance_uuid, fake_volume_id) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_destroy_at_top(self.ctxt, fake_instance_uuid, + volume_id=fake_volume_id) + + def test_bdm_destroy_by_device(self): + fake_instance_uuid = 'fake-instance-uuid' + fake_device_name = 'fake-device-name' + + # Shouldn't be called for these 2 cells + self.mox.StubOutWithMock(self.src_db_inst, + 'block_device_mapping_destroy_by_instance_and_device') + self.mox.StubOutWithMock(self.mid_db_inst, + 'block_device_mapping_destroy_by_instance_and_device') + + self.mox.StubOutWithMock(self.tgt_db_inst, + 'block_device_mapping_destroy_by_instance_and_device') + self.tgt_db_inst.block_device_mapping_destroy_by_instance_and_device( + self.ctxt, fake_instance_uuid, fake_device_name) + + self.mox.ReplayAll() + + self.src_msg_runner.bdm_destroy_at_top(self.ctxt, fake_instance_uuid, + device_name=fake_device_name) |