def acquire_source(self, msg, connector_type, direction, push_hops=True): """Determine the `str(go_connector)` value that a msg came in on by looking at the connector_type and fetching the appropriate values from the `msg` helper_metadata. Raises `UnroutableMessageError` if the connector_type has a value not appropriate for the direction. Note: `str(go_connector)` is what is stored in Go routing tables. """ msg_mdh = self.get_metadata_helper(msg) if direction == self.INBOUND: allowed_types = (self.TRANSPORT_TAG, self.ROUTER, self.BILLING) else: allowed_types = (self.CONVERSATION, self.ROUTER, self.OPT_OUT, self.BILLING) if connector_type not in allowed_types: raise UnroutableMessageError( "Source connector of invalid type: %s" % connector_type, msg) if connector_type == self.CONVERSATION: conv_info = msg_mdh.get_conversation_info() src_conn = str(GoConnector.for_conversation( conv_info['conversation_type'], conv_info['conversation_key'])) elif connector_type == self.ROUTER: router_info = msg_mdh.get_router_info() src_conn = str(GoConnector.for_router( router_info['router_type'], router_info['router_key'], self.router_direction(direction))) elif connector_type == self.TRANSPORT_TAG: src_conn = str(GoConnector.for_transport_tag(*msg_mdh.tag)) elif connector_type == self.OPT_OUT: src_conn = str(GoConnector.for_opt_out()) elif connector_type == self.BILLING: # when the source is a billing router, outbound messages # are always received from the inbound billing connector # and inbound messages are always received from the outbound # billing connector. src_conn = str( GoConnector.for_billing(self.router_direction(direction))) else: raise UnroutableMessageError( "Serious error. Reached apparently unreachable state" " in which source connector type is both valid" " but unknown. Bad connector type is: %s" % connector_type, msg) src_conn_str = str(src_conn) if push_hops: rmeta = RoutingMetadata(msg) rmeta.push_source(src_conn_str, msg.get_routing_endpoint()) return src_conn_str
def test_remove_conversation(self): rt = self.make_rt({}) conv = FakeConversation("conv_type_1", "12345") conv_conn = str( GoConnector.for_conversation(conv.conversation_type, conv.key)) rt.add_entry(conv_conn, "default", self.CHANNEL_2, "default") rt.add_entry(self.CHANNEL_2, "default", conv_conn, "default") rt.remove_conversation(conv) self.assert_routing_entries(rt, [])
def test_remove_conversation(self): rt = self.make_rt({}) conv = FakeConversation("conv_type_1", "12345") conv_conn = str( GoConnector.for_conversation(conv.conversation_type, conv.key)) rt.add_entry(conv_conn, "default", self.CHANNEL_2, "default") rt.add_entry(self.CHANNEL_2, "default", conv_conn, "default") rt.remove_conversation(conv) self.assert_routing_entries(rt, [])
def test_connector_direction(self): def assert_inbound(conn): self.assertEqual(GoConnector.INBOUND, conn.direction) def assert_outbound(conn): self.assertEqual(GoConnector.OUTBOUND, conn.direction) assert_inbound(GoConnector.for_opt_out()) assert_inbound(GoConnector.for_conversation("conv_type_1", "12345")) assert_outbound(GoConnector.for_transport_tag("tagpool_1", "tag_1")) assert_inbound( GoConnector.for_router("rb_type_1", "12345", GoConnector.INBOUND)) assert_outbound( GoConnector.for_router("rb_type_1", "12345", GoConnector.OUTBOUND))
def test_connector_direction(self): def assert_inbound(conn): self.assertEqual(GoConnector.INBOUND, conn.direction) def assert_outbound(conn): self.assertEqual(GoConnector.OUTBOUND, conn.direction) assert_inbound(GoConnector.for_opt_out()) assert_inbound(GoConnector.for_conversation("conv_type_1", "12345")) assert_outbound(GoConnector.for_transport_tag("tagpool_1", "tag_1")) assert_inbound( GoConnector.for_router("rb_type_1", "12345", GoConnector.INBOUND)) assert_outbound( GoConnector.for_router("rb_type_1", "12345", GoConnector.OUTBOUND))
def setup_routing(self, user, account_objects): connectors = {} for conv in account_objects['conversations']: connectors[conv['key']] = GoConnector.for_conversation( conv['conversation_type'], conv['key']) for tag in account_objects['channels']: connectors[tag] = GoConnector.for_transport_tag(*(tag.split(':'))) for router in account_objects['routers']: connectors[router['key'] + ':INBOUND'] = GoConnector.for_router( router['router_type'], router['key'], GoConnector.INBOUND) connectors[router['key'] + ':OUTBOUND'] = GoConnector.for_router( router['router_type'], router['key'], GoConnector.OUTBOUND) rt = RoutingTable() for src, src_ep, dst, dst_ep in account_objects['routing_entries']: rt.add_entry( str(connectors[src]), src_ep, str(connectors[dst]), dst_ep) user_account = vumi_api_for_user(user).get_user_account() user_account.routing_table = rt user_account.save() self.stdout.write('Routing table for %s built\n' % (user.email,))
def test_flip_non_router_connector(self): c = GoConnector.for_conversation("dummy", "1") self.assertRaises(GoConnectorError, c.flip_direction)
def test_create_conversation_connector(self): c = GoConnector.for_conversation("conv_type_1", "12345") self.assertEqual(c.ctype, GoConnector.CONVERSATION) self.assertEqual(c.conv_type, "conv_type_1") self.assertEqual(c.conv_key, "12345") self.assertEqual(str(c), "CONVERSATION:conv_type_1:12345")
def get_connector(self): return GoConnector.for_conversation(self.conversation_type, self.key)
def test_flip_non_router_connector(self): c = GoConnector.for_conversation("dummy", "1") self.assertRaises(GoConnectorError, c.flip_direction)
def test_create_conversation_connector(self): c = GoConnector.for_conversation("conv_type_1", "12345") self.assertEqual(c.ctype, GoConnector.CONVERSATION) self.assertEqual(c.conv_type, "conv_type_1") self.assertEqual(c.conv_key, "12345") self.assertEqual(str(c), "CONVERSATION:conv_type_1:12345")
def acquire_source(self, msg, connector_type, direction, push_hops=True): """Determine the `str(go_connector)` value that a msg came in on by looking at the connector_type and fetching the appropriate values from the `msg` helper_metadata. Raises `UnroutableMessageError` if the connector_type has a value not appropriate for the direction. Note: `str(go_connector)` is what is stored in Go routing tables. """ msg_mdh = self.get_metadata_helper(msg) if direction == self.INBOUND: allowed_types = (self.TRANSPORT_TAG, self.ROUTER, self.BILLING) else: allowed_types = (self.CONVERSATION, self.ROUTER, self.OPT_OUT, self.BILLING) if connector_type not in allowed_types: raise UnroutableMessageError( "Source connector of invalid type: %s" % connector_type, msg) if connector_type == self.CONVERSATION: conv_info = msg_mdh.get_conversation_info() src_conn = str( GoConnector.for_conversation(conv_info['conversation_type'], conv_info['conversation_key'])) elif connector_type == self.ROUTER: router_info = msg_mdh.get_router_info() src_conn = str( GoConnector.for_router(router_info['router_type'], router_info['router_key'], self.router_direction(direction))) elif connector_type == self.TRANSPORT_TAG: src_conn = str(GoConnector.for_transport_tag(*msg_mdh.tag)) elif connector_type == self.OPT_OUT: src_conn = str(GoConnector.for_opt_out()) elif connector_type == self.BILLING: # when the source is a billing router, outbound messages # are always received from the inbound billing connector # and inbound messages are always received from the outbound # billing connector. src_conn = str( GoConnector.for_billing(self.router_direction(direction))) else: raise UnroutableMessageError( "Serious error. Reached apparently unreachable state" " in which source connector type is both valid" " but unknown. Bad connector type is: %s" % connector_type, msg) src_conn_str = str(src_conn) if push_hops: rmeta = RoutingMetadata(msg) rmeta.push_source(src_conn_str, msg.get_routing_endpoint()) return src_conn_str