Пример #1
0
    def test_serializer(self):
        endpoint = _FakeEndpoint()
        serializer = msg_serializer.NoOpSerializer()
        target = oslo_messaging.Target()
        dispatcher = oslo_messaging.RPCDispatcher(target, [endpoint],
                                                  serializer)

        self.mox.StubOutWithMock(endpoint, 'foo')
        args = dict([(k, 'd' + v) for k, v in self.args.items()])
        endpoint.foo(self.dctxt, **args).AndReturn(self.retval)

        self.mox.StubOutWithMock(serializer, 'serialize_entity')
        self.mox.StubOutWithMock(serializer, 'deserialize_entity')
        self.mox.StubOutWithMock(serializer, 'deserialize_context')

        serializer.deserialize_context(self.ctxt).AndReturn(self.dctxt)

        for arg in self.args:
            serializer.deserialize_entity(self.dctxt, arg).AndReturn('d' + arg)

        serializer.serialize_entity(self.dctxt, self.retval).\
            AndReturn('s' + self.retval if self.retval else None)

        self.mox.ReplayAll()

        retval = dispatcher._dispatch(self.ctxt, dict(method='foo',
                                                      args=self.args))
        if self.retval is not None:
            self.assertEqual('s' + self.retval, retval)
Пример #2
0
    def test_dispatcher_with_ping(self):
        self.config(rpc_ping_enabled=True)
        dispatcher = oslo_messaging.RPCDispatcher([], None, None)
        incoming = mock.Mock(ctxt={},
                             message=dict(method='oslo_rpc_server_ping'),
                             client_timeout=0)

        res = dispatcher.dispatch(incoming)
        self.assertEqual('pong', res)
Пример #3
0
    def test_dispatcher(self):
        def _set_endpoint_mock_properties(endpoint):
            endpoint.foo = mock.Mock(spec=dir(_FakeEndpoint.foo))
            # mock doesn't pick up the decorated method.
            endpoint.bar = mock.Mock(spec=dir(_FakeEndpoint.bar))
            endpoint.bar.exposed = mock.PropertyMock(return_value=True)
            endpoint._foobar = mock.Mock(spec=dir(_FakeEndpoint._foobar))

            return endpoint

        endpoints = [
            _set_endpoint_mock_properties(
                mock.Mock(spec=_FakeEndpoint,
                          target=oslo_messaging.Target(**e)))
            for e in self.endpoints
        ]

        serializer = None
        dispatcher = oslo_messaging.RPCDispatcher(endpoints, serializer,
                                                  self.access_policy)

        incoming = mock.Mock(ctxt=self.ctxt,
                             message=self.msg,
                             client_timeout=0)

        res = None

        try:
            res = dispatcher.dispatch(incoming)
        except Exception as ex:
            self.assertFalse(self.success, ex)
            self.assertIsNotNone(self.ex, ex)
            self.assertIsInstance(ex, self.ex, ex)
            if isinstance(ex, oslo_messaging.NoSuchMethod):
                self.assertEqual(self.msg.get('method'), ex.method)
            elif isinstance(ex, oslo_messaging.UnsupportedVersion):
                self.assertEqual(self.msg.get('version', '1.0'), ex.version)
                if ex.method:
                    self.assertEqual(self.msg.get('method'), ex.method)
        else:
            self.assertTrue(self.success,
                            "Unexpected success of operation during testing")
            self.assertIsNotNone(res)

        for n, endpoint in enumerate(endpoints):
            for method_name in self.exposed_methods:
                method = getattr(endpoint, method_name)
                if self.dispatch_to and n == self.dispatch_to['endpoint'] and \
                        method_name == self.dispatch_to['method'] and \
                        method_name in self.exposed_methods:
                    method.assert_called_once_with(self.ctxt,
                                                   **self.msg.get('args', {}))
                else:
                    self.assertEqual(0, method.call_count,
                                     'method: {}'.format(method))
Пример #4
0
    def test_dispatcher_with_ping_already_used(self):
        class MockEndpoint(object):
            def oslo_rpc_server_ping(self, ctxt, **kwargs):
                return 'not_pong'

        mockEndpoint = MockEndpoint()

        self.config(rpc_ping_enabled=True)
        dispatcher = oslo_messaging.RPCDispatcher([mockEndpoint], None, None)
        incoming = mock.Mock(ctxt={},
                             message=dict(method='oslo_rpc_server_ping'),
                             client_timeout=0)

        res = dispatcher.dispatch(incoming)
        self.assertEqual('not_pong', res)
Пример #5
0
    def test_dispatcher(self):
        endpoints = [
            mock.Mock(spec=_FakeEndpoint, target=oslo_messaging.Target(**e))
            for e in self.endpoints
        ]

        serializer = None
        target = oslo_messaging.Target()
        dispatcher = oslo_messaging.RPCDispatcher(target, endpoints,
                                                  serializer)

        def check_reply(reply=None, failure=None, log_failure=True):
            if self.ex and failure is not None:
                ex = failure[1]
                self.assertFalse(self.success, ex)
                self.assertIsNotNone(self.ex, ex)
                self.assertIsInstance(ex, self.ex, ex)
                if isinstance(ex, oslo_messaging.NoSuchMethod):
                    self.assertEqual(self.msg.get('method'), ex.method)
                elif isinstance(ex, oslo_messaging.UnsupportedVersion):
                    self.assertEqual(self.msg.get('version', '1.0'),
                                     ex.version)
                    if ex.method:
                        self.assertEqual(self.msg.get('method'), ex.method)
            else:
                self.assertTrue(self.success, failure)
                self.assertIsNone(failure)

        incoming = mock.Mock(ctxt=self.ctxt, message=self.msg)
        incoming.reply.side_effect = check_reply

        callback = dispatcher(incoming)
        callback.run()
        callback.done()

        for n, endpoint in enumerate(endpoints):
            for method_name in ['foo', 'bar']:
                method = getattr(endpoint, method_name)
                if self.dispatch_to and n == self.dispatch_to['endpoint'] and \
                        method_name == self.dispatch_to['method']:
                    method.assert_called_once_with(self.ctxt,
                                                   **self.msg.get('args', {}))
                else:
                    self.assertEqual(0, method.call_count)

        self.assertEqual(1, incoming.reply.call_count)
Пример #6
0
    def test_heartbeat_failure(self):

        endpoints = [self._SleepyEndpoint()]
        dispatcher = oslo_messaging.RPCDispatcher(endpoints, serializer=None)

        # sleep long enough for the client_timeout to expire multiple times
        # the timeout is (client_timeout/2) and must be > 1.0
        message = {'method': 'sleep', 'args': {'timeout': 3.5}}
        ctxt = {'test': 'value'}

        incoming = mock.Mock(ctxt=ctxt, message=message, client_timeout=2.0)
        incoming.heartbeat = mock.Mock(side_effect=Exception('BOOM!'))
        res = dispatcher.dispatch(incoming)
        self.assertTrue(res)

        # only one call to heartbeat should be made since the watchdog thread
        # should exit on the first exception thrown
        self.assertEqual(1, incoming.heartbeat.call_count)
Пример #7
0
    def test_serializer(self):
        endpoint = _FakeEndpoint()
        serializer = msg_serializer.NoOpSerializer()
        dispatcher = oslo_messaging.RPCDispatcher([endpoint], serializer)

        endpoint.foo = mock.Mock()

        args = dict([(k, 'd' + v) for k, v in self.args.items()])
        endpoint.foo.return_value = self.retval

        serializer.serialize_entity = mock.Mock()
        serializer.deserialize_entity = mock.Mock()
        serializer.deserialize_context = mock.Mock()

        serializer.deserialize_context.return_value = self.dctxt

        expected_side_effect = ['d' + arg for arg in self.args]
        serializer.deserialize_entity.side_effect = expected_side_effect

        serializer.serialize_entity.return_value = None
        if self.retval:
            serializer.serialize_entity.return_value = 's' + self.retval

        incoming = mock.Mock()
        incoming.ctxt = self.ctxt
        incoming.message = dict(method='foo', args=self.args)
        incoming.client_timeout = 0
        retval = dispatcher.dispatch(incoming)
        if self.retval is not None:
            self.assertEqual('s' + self.retval, retval)

        endpoint.foo.assert_called_once_with(self.dctxt, **args)
        serializer.deserialize_context.assert_called_once_with(self.ctxt)

        expected_calls = [mock.call(self.dctxt, arg) for arg in self.args]
        self.assertEqual(expected_calls,
                         serializer.deserialize_entity.mock_calls)

        serializer.serialize_entity.assert_called_once_with(
            self.dctxt, self.retval)
Пример #8
0
    def test_dispatcher(self):
        endpoints = [mock.Mock(spec=_FakeEndpoint,
                               target=oslo_messaging.Target(**e))
                     for e in self.endpoints]

        serializer = None
        dispatcher = oslo_messaging.RPCDispatcher(endpoints, serializer)

        incoming = mock.Mock(ctxt=self.ctxt, message=self.msg)

        res = None

        try:
            res = dispatcher.dispatch(incoming)
        except Exception as ex:
            self.assertFalse(self.success, ex)
            self.assertIsNotNone(self.ex, ex)
            self.assertIsInstance(ex, self.ex, ex)
            if isinstance(ex, oslo_messaging.NoSuchMethod):
                self.assertEqual(self.msg.get('method'), ex.method)
            elif isinstance(ex, oslo_messaging.UnsupportedVersion):
                self.assertEqual(self.msg.get('version', '1.0'),
                                 ex.version)
                if ex.method:
                    self.assertEqual(self.msg.get('method'), ex.method)
        else:
            self.assertTrue(self.success,
                            "Not expected success of operation durung testing")
            self.assertIsNotNone(res)

        for n, endpoint in enumerate(endpoints):
            for method_name in ['foo', 'bar']:
                method = getattr(endpoint, method_name)
                if self.dispatch_to and n == self.dispatch_to['endpoint'] and \
                        method_name == self.dispatch_to['method']:
                    method.assert_called_once_with(
                        self.ctxt, **self.msg.get('args', {}))
                else:
                    self.assertEqual(0, method.call_count)