def test_send_message_to_cell_cast(self):
        msg_runner = fakes.get_message_runner('api-cell')
        cell_state = fakes.get_cell_state('api-cell', 'child-cell2')
        message = messaging._TargetedMessage(msg_runner,
                self.ctxt, 'fake', {}, 'down', cell_state, fanout=False)

        expected_server_params = {'hostname': 'rpc_host2',
                                  'password': '******',
                                  'port': 3092,
                                  'username': '******',
                                  'virtual_host': 'rpc_vhost2'}
        expected_url = ('rabbit://%(username)s:%(password)s@'
                        '%(hostname)s:%(port)d/%(virtual_host)s' %
                        expected_server_params)

        def check_transport_url(cell_state):
            return cell_state.db_info['transport_url'] == expected_url

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = self.mox.CreateMockAnything()

        self.mox.StubOutWithMock(rpcapi, '_get_client')
        rpcapi._get_client(
            mox.Func(check_transport_url),
            'cells.intercell.targeted').AndReturn(rpcclient)

        rpcclient.cast(mox.IgnoreArg(), 'process_message',
                       message=message.to_json())

        self.mox.ReplayAll()

        self.driver.send_message_to_cell(cell_state, message)
    def test_rpc_topic_uses_message_type(self):
        self.flags(rpc_driver_queue_base='cells.intercell42', group='cells')
        msg_runner = fakes.get_message_runner('api-cell')
        cell_state = fakes.get_cell_state('api-cell', 'child-cell2')
        message = messaging._BroadcastMessage(msg_runner,
                self.ctxt, 'fake', {}, 'down', fanout=True)
        message.message_type = 'fake-message-type'

        expected_server_params = {'hostname': 'rpc_host2',
                                  'password': '******',
                                  'port': 3092,
                                  'username': '******',
                                  'virtual_host': 'rpc_vhost2'}
        expected_url = ('rabbit://%(username)s:%(password)s@'
                        '%(hostname)s:%(port)d/%(virtual_host)s' %
                        expected_server_params)

        def check_transport_url(cell_state):
            return cell_state.db_info['transport_url'] == expected_url

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = self.mox.CreateMockAnything()

        self.mox.StubOutWithMock(rpcapi, '_get_client')
        rpcapi._get_client(
            mox.Func(check_transport_url),
            'cells.intercell42.fake-message-type').AndReturn(rpcclient)

        rpcclient.prepare(fanout=True).AndReturn(rpcclient)
        rpcclient.cast(mox.IgnoreArg(), 'process_message',
                       message=message.to_json())

        self.mox.ReplayAll()

        self.driver.send_message_to_cell(cell_state, message)
    def test_send_message_to_cell_cast(self):
        msg_runner = fakes.get_message_runner("api-cell")
        cell_state = fakes.get_cell_state("api-cell", "child-cell2")
        message = messaging._TargetedMessage(msg_runner, self.ctxt, "fake", {}, "down", cell_state, fanout=False)

        expected_server_params = {
            "hostname": "rpc_host2",
            "password": "******",
            "port": 3092,
            "username": "******",
            "virtual_host": "rpc_vhost2",
        }
        expected_url = (
            "rabbit://%(username)s:%(password)s@" "%(hostname)s:%(port)d/%(virtual_host)s" % expected_server_params
        )

        def check_transport_url(cell_state):
            return cell_state.db_info["transport_url"] == expected_url

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = self.mox.CreateMockAnything()

        self.mox.StubOutWithMock(rpcapi, "_get_client")
        rpcapi._get_client(mox.Func(check_transport_url), "cells.intercell.targeted").AndReturn(rpcclient)

        rpcclient.cast(mox.IgnoreArg(), "process_message", message=message.to_json())

        self.mox.ReplayAll()

        self.driver.send_message_to_cell(cell_state, message)
    def test_rpc_topic_uses_message_type(self):
        self.flags(rpc_driver_queue_base="cells.intercell42", group="cells")
        msg_runner = fakes.get_message_runner("api-cell")
        cell_state = fakes.get_cell_state("api-cell", "child-cell2")
        message = messaging._BroadcastMessage(msg_runner, self.ctxt, "fake", {}, "down", fanout=True)
        message.message_type = "fake-message-type"

        expected_server_params = {
            "hostname": "rpc_host2",
            "password": "******",
            "port": 3092,
            "username": "******",
            "virtual_host": "rpc_vhost2",
        }
        expected_url = (
            "rabbit://%(username)s:%(password)s@" "%(hostname)s:%(port)d/%(virtual_host)s" % expected_server_params
        )

        def check_transport_url(cell_state):
            return cell_state.db_info["transport_url"] == expected_url

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = self.mox.CreateMockAnything()

        self.mox.StubOutWithMock(rpcapi, "_get_client")
        rpcapi._get_client(mox.Func(check_transport_url), "cells.intercell42.fake-message-type").AndReturn(rpcclient)

        rpcclient.prepare(fanout=True).AndReturn(rpcclient)
        rpcclient.cast(mox.IgnoreArg(), "process_message", message=message.to_json())

        self.mox.ReplayAll()

        self.driver.send_message_to_cell(cell_state, message)
    def test_rpc_topic_uses_message_type(self):
        self.flags(rpc_driver_queue_base='cells.intercell42', group='cells')
        msg_runner = fakes.get_message_runner('api-cell')
        cell_state = fakes.get_cell_state('api-cell', 'child-cell2')
        message = messaging._BroadcastMessage(msg_runner,
                self.ctxt, 'fake', {}, 'down', fanout=True)
        message.message_type = 'fake-message-type'

        expected_server_params = {'hostname': 'rpc_host2',
                                  'password': '******',
                                  'port': 3092,
                                  'username': '******',
                                  'virtual_host': 'rpc_vhost2'}
        expected_url = ('rabbit://%(username)s:%(password)s@'
                        '%(hostname)s:%(port)d/%(virtual_host)s' %
                        expected_server_params)

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = mock.Mock()

        with mock.patch.object(rpcapi, '_get_client') as m_get_client:
            m_get_client.return_value = rpcclient

            rpcclient.prepare(fanout=True)
            rpcclient.prepare.return_value = rpcclient

            self.driver.send_message_to_cell(cell_state, message)
            m_get_client.assert_called_with(cell_state,
                    'cells.intercell42.fake-message-type')
            self.assertEqual(expected_url,
                             cell_state.db_info['transport_url'])
            rpcclient.prepare.assert_called_with(fanout=True)
            rpcclient.cast.assert_called_with(mock.ANY,
                                              'process_message',
                                              message=message.to_json())
    def test_send_message_to_cell_cast(self):
        msg_runner = fakes.get_message_runner('api-cell')
        cell_state = fakes.get_cell_state('api-cell', 'child-cell2')
        message = messaging._TargetedMessage(msg_runner,
                self.ctxt, 'fake', {}, 'down', cell_state, fanout=False)

        expected_server_params = {'hostname': 'rpc_host2',
                                  'password': '******',
                                  'port': 3092,
                                  'username': '******',
                                  'virtual_host': 'rpc_vhost2'}
        expected_url = ('rabbit://%(username)s:%(password)s@'
                        '%(hostname)s:%(port)d/%(virtual_host)s' %
                        expected_server_params)

        rpcapi = self.driver.intercell_rpcapi
        rpcclient = mock.Mock()

        with mock.patch.object(rpcapi, '_get_client') as m_get_client:
            m_get_client.return_value = rpcclient

            self.driver.send_message_to_cell(cell_state, message)
            m_get_client.assert_called_with(cell_state,
                                            'cells.intercell.targeted')
            self.assertEqual(expected_url,
                             cell_state.db_info['transport_url'])
            rpcclient.cast.assert_called_with(mock.ANY,
                                              'process_message',
                                              message=message.to_json())