diff --git a/nova/tests/functional/integrated_helpers.py b/nova/tests/functional/integrated_helpers.py index d2793f3158..d596d71669 100644 --- a/nova/tests/functional/integrated_helpers.py +++ b/nova/tests/functional/integrated_helpers.py @@ -79,7 +79,7 @@ class _IntegratedTestBase(test.TestCase): nova.tests.unit.image.fake.stub_out_image_service(self) self._setup_services() - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.useFixture(nova_fixtures.PlacementFixture()) self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) diff --git a/nova/tests/functional/regressions/test_bug_1522536.py b/nova/tests/functional/regressions/test_bug_1522536.py index 3a2c864d88..2f335c011f 100644 --- a/nova/tests/functional/regressions/test_bug_1522536.py +++ b/nova/tests/functional/regressions/test_bug_1522536.py @@ -42,7 +42,7 @@ class TestServerGet(test.TestCase): self.start_service('scheduler') self.compute = self.start_service('compute') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1548980.py b/nova/tests/functional/regressions/test_bug_1548980.py index 5dfbe00983..1bf472ccdd 100644 --- a/nova/tests/functional/regressions/test_bug_1548980.py +++ b/nova/tests/functional/regressions/test_bug_1548980.py @@ -51,7 +51,7 @@ class TestServerGet(test.TestCase): self.compute = self.start_service('compute') self.consoleauth = self.start_service('consoleauth') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1595962.py b/nova/tests/functional/regressions/test_bug_1595962.py index c3e54c5421..df0fb6af7a 100644 --- a/nova/tests/functional/regressions/test_bug_1595962.py +++ b/nova/tests/functional/regressions/test_bug_1595962.py @@ -72,7 +72,7 @@ class TestSerialConsoleLiveMigrate(test.TestCase): self.compute = self.start_service('compute', host='test_compute1') self.consoleauth = self.start_service('consoleauth') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1620248.py b/nova/tests/functional/regressions/test_bug_1620248.py index 8bcc606ef6..72360b1bae 100644 --- a/nova/tests/functional/regressions/test_bug_1620248.py +++ b/nova/tests/functional/regressions/test_bug_1620248.py @@ -35,7 +35,7 @@ class TestServerUpdate(test.TestCase): # the image fake backend needed for image discovery nova.tests.unit.image.fake.stub_out_image_service(self) - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1670627.py b/nova/tests/functional/regressions/test_bug_1670627.py index 5fc37e4526..4c01c01ac3 100644 --- a/nova/tests/functional/regressions/test_bug_1670627.py +++ b/nova/tests/functional/regressions/test_bug_1670627.py @@ -64,7 +64,7 @@ class TestDeleteFromCell0CheckQuota(test.TestCase): # compute hosts to schedule the instance to and will go into error and # be put into cell0. - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1671648.py b/nova/tests/functional/regressions/test_bug_1671648.py index 19c9476579..e013f0a2d6 100644 --- a/nova/tests/functional/regressions/test_bug_1671648.py +++ b/nova/tests/functional/regressions/test_bug_1671648.py @@ -84,7 +84,7 @@ class TestRetryBetweenComputeNodeBuilds(test.TestCase): self.addCleanup(fake.restore_nodes) self.start_service('compute', host='host2') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.image_id = self.admin_api.get_images()[0]['id'] self.flavor_id = self.admin_api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1675570.py b/nova/tests/functional/regressions/test_bug_1675570.py index 51a550621e..d39602c776 100644 --- a/nova/tests/functional/regressions/test_bug_1675570.py +++ b/nova/tests/functional/regressions/test_bug_1675570.py @@ -67,7 +67,7 @@ class TestLocalDeleteAttachedVolumes(test.TestCase): # The consoleauth service is needed for deleting console tokens. self.start_service('consoleauth') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1689692.py b/nova/tests/functional/regressions/test_bug_1689692.py index f70bcec891..820d2837d1 100644 --- a/nova/tests/functional/regressions/test_bug_1689692.py +++ b/nova/tests/functional/regressions/test_bug_1689692.py @@ -56,7 +56,7 @@ class ServerListLimitMarkerCell0Test(test.TestCase, self.start_service('scheduler') # We don't start the compute service because we want NoValidHost so # all of the instances go into ERROR state and get put into cell0. - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) def test_list_servers_marker_in_cell0_more_limit(self): """Creates three servers, then lists them with a marker on the first diff --git a/nova/tests/functional/test_compute_mgr.py b/nova/tests/functional/test_compute_mgr.py index f2808f83b7..0680173c02 100644 --- a/nova/tests/functional/test_compute_mgr.py +++ b/nova/tests/functional/test_compute_mgr.py @@ -29,7 +29,7 @@ class ComputeManagerTestCase(test.TestCase): def setUp(self): super(ComputeManagerTestCase, self).setUp() self.useFixture(fixtures.SpawnIsSynchronousFixture()) - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.conductor = self.start_service('conductor') self.start_service('scheduler') self.compute = self.start_service('compute') diff --git a/nova/tests/functional/test_list_servers_ip_filter.py b/nova/tests/functional/test_list_servers_ip_filter.py index ed06dc4b4f..b9719ad54b 100644 --- a/nova/tests/functional/test_list_servers_ip_filter.py +++ b/nova/tests/functional/test_list_servers_ip_filter.py @@ -45,7 +45,7 @@ class TestListServersIpFilter(test.TestCase): self.start_service('compute') self.start_service('consoleauth') - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.useFixture(nova_fixtures.PlacementFixture()) self.image_id = self.api.get_images()[0]['id'] diff --git a/nova/tests/unit/cast_as_call.py b/nova/tests/unit/cast_as_call.py index a81bbeb806..067c00a38f 100644 --- a/nova/tests/unit/cast_as_call.py +++ b/nova/tests/unit/cast_as_call.py @@ -12,6 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. +import sys + import fixtures import oslo_messaging as messaging @@ -28,13 +30,16 @@ class CastAsCall(fixtures.Fixture): See Ia7f40718533e450f00cd3e7d753ac65755c70588 for more background. """ - def __init__(self, stubs): + def __init__(self, testcase): super(CastAsCall, self).__init__() - self.stubs = stubs + self.testcase = testcase @staticmethod - def _stub_out(stubs, obj): - orig_prepare = obj.prepare + def _stub_out(testcase, obj=None): + if obj: + orig_prepare = obj.prepare + else: + orig_prepare = messaging.RPCClient.prepare def prepare(self, *args, **kwargs): # Casts with fanout=True would throw errors if its monkeypatched to @@ -42,12 +47,23 @@ class CastAsCall(fixtures.Fixture): if 'fanout' in kwargs: kwargs['fanout'] = False cctxt = orig_prepare(self, *args, **kwargs) - CastAsCall._stub_out(stubs, cctxt) # woo, recurse! + CastAsCall._stub_out(testcase, cctxt) # woo, recurse! return cctxt - stubs.Set(obj, 'prepare', prepare) - stubs.Set(obj, 'cast', obj.call) + if obj: + cls = getattr(sys.modules[obj.__class__.__module__], + obj.__class__.__name__) + testcase.stub_out('%s.%s.prepare' % (obj.__class__.__module__, + obj.__class__.__name__), + prepare) + testcase.stub_out('%s.%s.cast' % (obj.__class__.__module__, + obj.__class__.__name__), + cls.call) + else: + testcase.stub_out('oslo_messaging.RPCClient.prepare', prepare) + testcase.stub_out('oslo_messaging.RPCClient.cast', + messaging.RPCClient.call) def setUp(self): super(CastAsCall, self).setUp() - self._stub_out(self.stubs, messaging.RPCClient) + self._stub_out(self.testcase) diff --git a/nova/tests/unit/conductor/test_conductor.py b/nova/tests/unit/conductor/test_conductor.py index fabb9d8d5e..629232b10f 100644 --- a/nova/tests/unit/conductor/test_conductor.py +++ b/nova/tests/unit/conductor/test_conductor.py @@ -462,7 +462,7 @@ class _BaseTaskTestCase(object): self.mox.ReplayAll() # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) mock_getaz.return_value = 'myaz' @@ -508,7 +508,7 @@ class _BaseTaskTestCase(object): updates = {'vm_state': vm_states.ERROR, 'task_state': None} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.conductor.build_instances( self.context, @@ -552,7 +552,7 @@ class _BaseTaskTestCase(object): set_vm_state_and_notify, cleanup_mock): # build_instances() is a cast, we need to wait for it to # complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) populate_retry.side_effect = exc.MaxRetriesExceeded( reason="Too many try") @@ -599,7 +599,7 @@ class _BaseTaskTestCase(object): updates = {'vm_state': vm_states.ERROR, 'task_state': None} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.conductor.build_instances( context=self.context, @@ -645,7 +645,7 @@ class _BaseTaskTestCase(object): image = {'fake-data': 'should_pass_silently'} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) with mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance'): @@ -690,7 +690,7 @@ class _BaseTaskTestCase(object): image = {'fake-data': 'should_pass_silently'} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) with mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance'): @@ -742,7 +742,7 @@ class _BaseTaskTestCase(object): image = {'fake-data': 'should_pass_silently'} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) with mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance'): @@ -790,7 +790,7 @@ class _BaseTaskTestCase(object): image = {'fake-data': 'should_pass_silently'} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) @mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance', new=mock.MagicMock()) @@ -833,7 +833,7 @@ class _BaseTaskTestCase(object): image = {'fake-data': 'should_pass_silently'} # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) @mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance') @@ -926,7 +926,7 @@ class _BaseTaskTestCase(object): host = {'host': 'host1', 'nodename': 'node1', 'limits': []} # unshelve_instance() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) @mock.patch.object(objects.InstanceMapping, 'get_by_instance_uuid') @mock.patch.object(self.conductor_manager.compute_rpcapi, @@ -1278,7 +1278,7 @@ class _BaseTaskTestCase(object): sig_mock.side_effect = exception # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.assertRaises(exc.UnsupportedPolicyException, self.conductor.rebuild_instance, @@ -2354,7 +2354,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): self.mox.ReplayAll() # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.conductor.build_instances(self.context, instances=instances, @@ -2398,7 +2398,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): build_and_run_instance, get_buildreq): # build_instances() is a cast, we need to wait for it to complete - self.useFixture(cast_as_call.CastAsCall(self.stubs)) + self.useFixture(cast_as_call.CastAsCall(self)) self.conductor.build_instances(self.context, instances=instances,