diff --git a/senlin/api/common/wsgi.py b/senlin/api/common/wsgi.py index 0ed62868a..1c203f139 100644 --- a/senlin/api/common/wsgi.py +++ b/senlin/api/common/wsgi.py @@ -745,7 +745,7 @@ class Controller(object): def __init__(self, options): self.options = options - self.rpc_client = rpc_client.EngineClient() + self.rpc_client = rpc_client.get_engine_client() def __getattribute__(self, key): diff --git a/senlin/api/middleware/trust.py b/senlin/api/middleware/trust.py index bb4f2342c..d61e5ca0e 100644 --- a/senlin/api/middleware/trust.py +++ b/senlin/api/middleware/trust.py @@ -30,7 +30,7 @@ class TrustMiddleware(wsgi.Middleware): :param req: The WSGI request object. :return: ID of the trust or exception of InternalError. """ - rpcc = rpc.EngineClient() + rpcc = rpc.get_engine_client() ctx = req.context params = {'user': ctx.user_id, 'project': ctx.project_id} diff --git a/senlin/api/middleware/webhook.py b/senlin/api/middleware/webhook.py index 61565bc9e..1ec86a51f 100644 --- a/senlin/api/middleware/webhook.py +++ b/senlin/api/middleware/webhook.py @@ -50,7 +50,7 @@ class WebhookMiddleware(wsgi.Middleware): obj = util.parse_request( 'ReceiverGetRequest', req, {'identity': receiver_id}) - rpcc = rpc.EngineClient() + rpcc = rpc.get_engine_client() receiver = rpcc.call(ctx, 'receiver_get', obj) svc_ctx = context.get_service_credentials() diff --git a/senlin/api/openstack/v1/build_info.py b/senlin/api/openstack/v1/build_info.py index 2f11331aa..fb6fac784 100644 --- a/senlin/api/openstack/v1/build_info.py +++ b/senlin/api/openstack/v1/build_info.py @@ -27,7 +27,7 @@ class BuildInfoController(wsgi.Controller): def __init__(self, options): self.options = options - self.rpc_client = rpc_client.EngineClient() + self.rpc_client = rpc_client.get_engine_client() @util.policy_enforce def build_info(self, req): diff --git a/senlin/engine/health_manager.py b/senlin/engine/health_manager.py index e824de01b..9606cff32 100644 --- a/senlin/engine/health_manager.py +++ b/senlin/engine/health_manager.py @@ -292,7 +292,7 @@ class HealthCheck(object): def __init__(self, ctx, engine_id, cluster_id, check_type, interval, node_update_timeout, params, enabled): - self.rpc_client = rpc_client.EngineClient() + self.rpc_client = rpc_client.get_engine_client() self.ctx = ctx self.engine_id = engine_id diff --git a/senlin/engine/notifications/heat_endpoint.py b/senlin/engine/notifications/heat_endpoint.py index a30353676..faabf655e 100644 --- a/senlin/engine/notifications/heat_endpoint.py +++ b/senlin/engine/notifications/heat_endpoint.py @@ -36,7 +36,7 @@ class HeatNotificationEndpoint(base.Endpoints): publisher_id='^orchestration.*', event_type='^orchestration\.stack\..*', context={'project_id': '^%s$' % project_id}) - self.rpc = rpc_client.EngineClient() + self.rpc = rpc_client.get_engine_client() self.target = messaging.Target( topic=cfg.CONF.health_manager.heat_notification_topic, exchange=cfg.CONF.health_manager.heat_control_exchange, diff --git a/senlin/engine/notifications/nova_endpoint.py b/senlin/engine/notifications/nova_endpoint.py index c631d7385..2447db4af 100644 --- a/senlin/engine/notifications/nova_endpoint.py +++ b/senlin/engine/notifications/nova_endpoint.py @@ -40,7 +40,7 @@ class NovaNotificationEndpoint(base.Endpoints): publisher_id='^compute.*', event_type='^compute\.instance\..*', context={'project_id': '^%s$' % project_id}) - self.rpc = rpc_client.EngineClient() + self.rpc = rpc_client.get_engine_client() self.target = messaging.Target( topic=cfg.CONF.health_manager.nova_notification_topic, exchange=cfg.CONF.health_manager.nova_control_exchange, diff --git a/senlin/rpc/client.py b/senlin/rpc/client.py index 7df91433a..3b02d69e5 100644 --- a/senlin/rpc/client.py +++ b/senlin/rpc/client.py @@ -20,6 +20,15 @@ from senlin.common import consts from senlin.common import messaging from senlin.objects import base as object_base +_CLIENT = None + + +def get_engine_client(): + global _CLIENT + if not _CLIENT: + _CLIENT = EngineClient() + return _CLIENT + class EngineClient(object): """Client side of the senlin engine rpc API. diff --git a/senlin/tests/unit/api/common/test_wsgi.py b/senlin/tests/unit/api/common/test_wsgi.py index ca22d356d..7aab003e4 100644 --- a/senlin/tests/unit/api/common/test_wsgi.py +++ b/senlin/tests/unit/api/common/test_wsgi.py @@ -212,7 +212,7 @@ class ResourceTest(base.SenlinTestCase): class ControllerTest(base.SenlinTestCase): - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_init(self, mock_client): x_client = mock.Mock() mock_client.return_value = x_client diff --git a/senlin/tests/unit/api/middleware/test_trust.py b/senlin/tests/unit/api/middleware/test_trust.py index 146b25cd8..e18510cba 100644 --- a/senlin/tests/unit/api/middleware/test_trust.py +++ b/senlin/tests/unit/api/middleware/test_trust.py @@ -30,7 +30,7 @@ class TestTrustMiddleware(base.SenlinTestCase): self.req.context = self.context self.middleware = trust.TrustMiddleware(None) - @mock.patch("senlin.rpc.client.EngineClient") + @mock.patch("senlin.rpc.client.get_engine_client") def test_get_trust_already_exists(self, mock_rpc): x_cred = {'trust': 'FAKE_TRUST_ID'} x_rpc = mock.Mock() @@ -50,7 +50,7 @@ class TestTrustMiddleware(base.SenlinTestCase): @mock.patch.object(context, "get_service_credentials") @mock.patch("senlin.drivers.base.SenlinDriver") - @mock.patch("senlin.rpc.client.EngineClient") + @mock.patch("senlin.rpc.client.get_engine_client") def test_get_trust_bad(self, mock_rpc, mock_driver, mock_creds): x_cred = {'foo': 'bar'} x_rpc = mock.Mock() @@ -98,7 +98,7 @@ class TestTrustMiddleware(base.SenlinTestCase): @mock.patch.object(context, "get_service_credentials") @mock.patch("senlin.drivers.base.SenlinDriver") - @mock.patch("senlin.rpc.client.EngineClient") + @mock.patch("senlin.rpc.client.get_engine_client") def test_get_trust_not_found(self, mock_rpc, mock_driver, mock_creds): x_rpc = mock.Mock() x_rpc.call.return_value = None @@ -136,7 +136,7 @@ class TestTrustMiddleware(base.SenlinTestCase): @mock.patch.object(context, "get_service_credentials") @mock.patch("senlin.drivers.base.SenlinDriver") - @mock.patch("senlin.rpc.client.EngineClient") + @mock.patch("senlin.rpc.client.get_engine_client") def test_get_trust_do_create(self, mock_rpc, mock_driver, mock_creds): x_rpc = mock.Mock() x_rpc.call.return_value = None @@ -178,7 +178,7 @@ class TestTrustMiddleware(base.SenlinTestCase): @mock.patch.object(context, "get_service_credentials") @mock.patch("senlin.drivers.base.SenlinDriver") - @mock.patch("senlin.rpc.client.EngineClient") + @mock.patch("senlin.rpc.client.get_engine_client") def test_get_trust_fatal(self, mock_rpc, mock_driver, mock_creds): x_rpc = mock.Mock() x_rpc.call.return_value = None diff --git a/senlin/tests/unit/api/middleware/test_webhook.py b/senlin/tests/unit/api/middleware/test_webhook.py index 452fca02c..f5e982af9 100644 --- a/senlin/tests/unit/api/middleware/test_webhook.py +++ b/senlin/tests/unit/api/middleware/test_webhook.py @@ -142,7 +142,7 @@ class TestWebhookMiddleware(base.SenlinTestCase): @mock.patch.object(common_util, 'parse_request') @mock.patch.object(context, 'RequestContext') - @mock.patch.object(rpc, 'EngineClient') + @mock.patch.object(rpc, 'get_engine_client') def test_process_request(self, mock_client, mock_ctx, mock_parse): cfg.CONF.set_override('auth_url', 'AUTH_URL', group='authentication') cfg.CONF.set_override('service_username', 'USERNAME', diff --git a/senlin/tests/unit/engine/notifications/test_heat_endpoint.py b/senlin/tests/unit/engine/notifications/test_heat_endpoint.py index cf209623d..934c29769 100644 --- a/senlin/tests/unit/engine/notifications/test_heat_endpoint.py +++ b/senlin/tests/unit/engine/notifications/test_heat_endpoint.py @@ -20,7 +20,7 @@ from senlin.tests.unit.common import base @mock.patch('oslo_messaging.NotificationFilter') class TestHeatNotificationEndpoint(base.SenlinTestCase): - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_init(self, mock_rpc, mock_filter): x_filter = mock_filter.return_value event_map = { @@ -45,7 +45,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertEqual('CLUSTER_ID', endpoint.cluster_id) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -85,7 +85,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): } self.assertEqual(expected_params, req.params) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_event_type_not_interested(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -103,7 +103,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_tag(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -120,7 +120,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_empty_tag(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -137,7 +137,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_cluster_in_tag(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -154,7 +154,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_node_in_tag(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -171,7 +171,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_cluster_id_not_match(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -192,7 +192,7 @@ class TestHeatNotificationEndpoint(base.SenlinTestCase): self.assertEqual(0, x_rpc.node_recover.call_count) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_default_values(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} diff --git a/senlin/tests/unit/engine/notifications/test_nova_endpoint.py b/senlin/tests/unit/engine/notifications/test_nova_endpoint.py index 5198c103f..19a150ce5 100644 --- a/senlin/tests/unit/engine/notifications/test_nova_endpoint.py +++ b/senlin/tests/unit/engine/notifications/test_nova_endpoint.py @@ -20,7 +20,7 @@ from senlin.tests.unit.common import base @mock.patch('oslo_messaging.NotificationFilter') class TestNovaNotificationEndpoint(base.SenlinTestCase): - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_init(self, mock_rpc, mock_filter): x_filter = mock_filter.return_value event_map = { @@ -49,7 +49,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertEqual('CLUSTER_ID', endpoint.cluster_id) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -89,7 +89,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): } self.assertEqual(expected_params, req.params) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_metadata(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -106,7 +106,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_cluster_in_metadata(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -123,7 +123,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_cluster_id_not_match(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -140,7 +140,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_event_type_not_interested(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -157,7 +157,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_node_id(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -175,7 +175,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertEqual(0, x_rpc.node_recover.call_count) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_default_values(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} diff --git a/senlin/tests/unit/engine/test_health_manager.py b/senlin/tests/unit/engine/test_health_manager.py index b74bf7f1b..333eb548e 100644 --- a/senlin/tests/unit/engine/test_health_manager.py +++ b/senlin/tests/unit/engine/test_health_manager.py @@ -54,7 +54,7 @@ class TestChaseUp(base.SenlinTestCase): @mock.patch('oslo_messaging.NotificationFilter') class TestNovaNotificationEndpoint(base.SenlinTestCase): - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_init(self, mock_rpc, mock_filter): x_filter = mock_filter.return_value event_map = { @@ -83,7 +83,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertEqual('CLUSTER_ID', endpoint.cluster_id) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -123,7 +123,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): } self.assertEqual(expected_params, req.params) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_metadata(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -140,7 +140,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_cluster_in_metadata(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -157,7 +157,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_cluster_id_not_match(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -174,7 +174,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_event_type_not_interested(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -191,7 +191,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count) - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_no_node_id(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -209,7 +209,7 @@ class TestNovaNotificationEndpoint(base.SenlinTestCase): self.assertEqual(0, x_rpc.node_recover.call_count) @mock.patch.object(context.RequestContext, 'from_dict') - @mock.patch('senlin.rpc.client.EngineClient') + @mock.patch('senlin.rpc.client.get_engine_client') def test_info_default_values(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} @@ -756,7 +756,7 @@ class TestHealthCheck(base.SenlinTestCase): super(TestHealthCheck, self).setUp() ctx = mock.Mock() self.fake_rpc = mock.Mock() - with mock.patch.object(rpc_client, 'EngineClient', + with mock.patch.object(rpc_client, 'get_engine_client', return_value=self.fake_rpc): self.hc = hm.HealthCheck( ctx=ctx, diff --git a/senlin/tests/unit/policies/test_health_policy.py b/senlin/tests/unit/policies/test_health_policy.py index 76317d36b..46579eced 100644 --- a/senlin/tests/unit/policies/test_health_policy.py +++ b/senlin/tests/unit/policies/test_health_policy.py @@ -61,7 +61,7 @@ class TestHealthPolicy(base.SenlinTestCase): fake_cluster = mock.Mock(id='CLUSTER_ID', nodes=[fake_node], rt={'profile': fake_profile}) self.cluster = fake_cluster - self.patch('senlin.rpc.client.EngineClient') + self.patch('senlin.rpc.client.get_engine_client') self.hp = health_policy.HealthPolicy('test-policy', self.spec) def test_policy_init(self):