def relay_event(issuer, key, namespace, queuename, event): # TODO can do this faster by persisting something? Maybe the Messenger? How to do that with celery threading? messenger = Messenger() message = Message() message.address = "amqps://{issuer}:{key}@{namespace}.servicebus.windows.net/{queuename}".format( issuer = issuer, key = urllib.quote(key, ""), namespace = namespace, queuename = queuename) message.properties = {} # TODO align with Service Bus / Service Tool team message.properties[u"DefineProject"] = event['project'] del event['project'] message.properties[u"EventCategory"] = event['category'] del event['category'] if 'ticket' in event: message.properties[u"Ticket"] = event['ticket'] del event['ticket'] message.properties[u"Actor"] = event['author'] del event['author'] message.body = event messenger.put(message) messenger.send()
def test_09_management(self): M = self.messenger() M.start() M.route("amqp:/*", self.routers[0].addresses[0]+"/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() request.address = "amqp:/_local/$management" request.reply_to = reply request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-MGMT-NODES'} M.put(request) M.send() M.recv() M.get(response) assert response.properties['statusCode'] == 200, response.properties['statusDescription'] self.assertIn('amqp:/_topo/0/QDR.B/$management', response.body) request.address = "amqp:/_topo/0/QDR.B/$management" request.reply_to = reply request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-MGMT-NODES'} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 200) self.assertTrue('amqp:/_topo/0/QDR.A/$management' in response.body) M.stop()
def on_sendable(self, event): if self.num_messages < 2: request = Message() request.correlation_id = "C1" request.address = "amqp:/_local/$management" request.properties = { u'type': u'org.amqp.management', u'name': u'self', u'operation': u'GET-MGMT-NODES' } request.reply_to = self.receiver.remote_source.address event.sender.send(request) self.num_messages += 1 request = Message() request.address = "amqp:/_topo/0/QDR.B/$management" request.correlation_id = "C2" request.reply_to = self.receiver.remote_source.address request.properties = { u'type': u'org.amqp.management', u'name': u'self', u'operation': u'GET-MGMT-NODES' } event.sender.send(request) self.num_messages += 1
def test_09_management(self): M = self.messenger() M.start() M.route("amqp:/*", self.routers[0].addresses[0] + "/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() request.address = "amqp:/_local/$management" request.reply_to = reply request.properties = {u"type": u"org.amqp.management", u"name": u"self", u"operation": u"GET-MGMT-NODES"} M.put(request) M.send() M.recv() M.get(response) assert response.properties["statusCode"] == 200, response.properties["statusDescription"] self.assertIn("amqp:/_topo/0/QDR.B/$management", response.body) request.address = "amqp:/_topo/0/QDR.B/$management" request.reply_to = reply request.properties = {u"type": u"org.amqp.management", u"name": u"self", u"operation": u"GET-MGMT-NODES"} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties["statusCode"], 200) self.assertTrue("amqp:/_topo/0/QDR.A/$management" in response.body) M.stop()
def test_09_management(self): addr = "amqp:/$management" M = self.messenger() M.start() M.route("amqp:/*", self.address+"/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() request.address = addr request.reply_to = reply request.correlation_id = "C1" request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-MGMT-NODES'} M.put(request) M.send() M.recv() M.get(response) assert response.properties['statusCode'] == 200, response.properties['statusCode'] self.assertEqual(response.correlation_id, "C1") self.assertEqual(response.body, []) request.address = addr request.reply_to = reply request.correlation_id = 135 request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-MGMT-NODES'} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 200) self.assertEqual(response.correlation_id, 135) self.assertEqual(response.body, []) request.address = addr request.reply_to = reply request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-MGMT-NODES'} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 200) self.assertEqual(response.body, []) M.stop()
def zaqar_to_proton(message): """Convert a message retrieved from storage to a Proton message""" msg = Message() msg.ttl = message.get('ttl') msg.body = message.get('body') # NOTE(vkmc) This won't work for now - there is no 'amqp10' field yet if message.get('amqp10'): msg.priority = message.get('amqp10').get('priority') msg.first_acquirer = message.get('amqp10').get('first_acquirer') msg.delivery_count = message.get('amqp10').get('delivery_count') msg.id = message.get('amqp10').get('id'), msg.user_id = message.get('amqp10').get('user_id') msg.address = message.get('amqp10').get('address') msg.subject = message.get('amqp10').get('subject') msg.reply_to = message.get('amqp10').get('reply_to') msg.correlation_id = message.get('amqp10').get('correlation_id') msg.content_type = message.get('amqp10').get('content_type') msg.content_encoding = message.get('amqp10').get('content_encoding') msg.expiry_time = message.get('amqp10').get('expiry_time') msg.creation_time = message.get('amqp10').get('creation_time'), msg.group_id = message.get('amqp10').get('group_id') msg.group_sequence = message.get('amqp10').get('group_sequence') msg.reply_to_group_id = message.get('amqp10').get('reply_to_group_id') msg.format = message.get('amqp10').get('format') return msg
def test_08a_test_strip_message_annotations_both_custom(self): addr = self.router.addresses[2] + "/strip_message_annotations_both/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} # Only annotations with prefix "x-opt-qd." will be stripped ingress_message_annotations = {'stay': 'humble', 'x-opt-qd': 'work'} ingress_message.annotations = ingress_message_annotations #Put and send the message M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) self.assertEqual(egress_message.annotations, ingress_message_annotations) M1.stop() M2.stop()
def test_simple_pre_settled(self): addr = self.routers[0].addresses[4]+"/test/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop()
def test_03_propagated_disposition(self): addr = "amqp:/unsettled/2" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("unsettled/2", 0, 1) tm = Message() rm = Message() tm.address = addr tm.body = {'number': 0} ## ## Test ACCEPT ## tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(0, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.accept(rx_tracker) M2.settle(rx_tracker) M2.flush() M1.flush() self.assertEqual(ACCEPTED, M1.status(tx_tracker)) ## ## Test REJECT ## tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(0, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.reject(rx_tracker) M2.settle(rx_tracker) M2.flush() M1.flush() self.assertEqual(REJECTED, M1.status(tx_tracker)) M1.stop() M2.stop()
def test_08a_test_strip_message_annotations_out_timeout(self): addr = self.router.addresses[3]+"/strip_message_annotations_out_timeout/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.timeout = 0.5 M2.subscribe(addr) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} ingress_message_annotations = {'x-opt-qd.ingress': '0/QDR', 'x-opt-qd.trace': ['0/QDR']} ingress_message.annotations = ingress_message_annotations #Put and send the message M1.put(ingress_message) M1.send() timed_out = False try: # Receive the message, this should timeout because the router thinks that this message has looped. M2.recv(1) except Timeout: timed_out = True self.assertTrue(timed_out) M1.stop() M2.stop()
def test_08a_test_strip_message_annotations_both_custom(self): addr = self.router.addresses[2]+"/strip_message_annotations_both/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} # Only annotations with prefix "x-opt-qd." will be stripped ingress_message_annotations = {'stay': 'humble', 'x-opt-qd': 'work'} ingress_message.annotations = ingress_message_annotations #Put and send the message M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) self.assertEqual(egress_message.annotations, ingress_message_annotations) M1.stop() M2.stop()
def test_13_to_override(self): addr = self.address+"/toov/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr ## ## Pre-existing TO ## tm.annotations = {'x-opt-qd.to': 'toov/1'} for i in range(10): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(10): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) ma = rm.annotations self.assertEqual(ma.__class__, dict) self.assertEqual(ma['x-opt-qd.to'], 'toov/1') M1.stop() M2.stop()
def test_02b_disp_to_closed_connection(self): addr = self.address+"/pre_settled/2" M1 = self.messenger() M2 = self.messenger() M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(2): tm.body = {'number': i} M1.put(tm) M1.send(0) M1.stop() for i in range(2): M2.recv(1) trk = M2.get(rm) M2.accept(trk) M2.settle(trk) self.assertEqual(i, rm.body['number']) M2.stop()
def test_16_delivery_annotations(self): addr = "amqp:/delivery_annotations.1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() self.routers[0].wait_address("delivery_annotations.1", 0, 1) tm.annotations = {'a1': 'a1', 'b1': 'b2'} tm.address = addr tm.instructions = {'work': 'hard', 'stay': 'humble'} tm.body = {'number': 38} M1.put(tm) M1.send() M2.recv(1) M2.get(rm) self.assertEqual(38, rm.body['number']) M1.stop() M2.stop()
def on_sendable(self, event): if self.num_sent < 1: msg = Message(id=1, body='Hello World') # this is a unavailable address msg.address = "SomeUnavailableAddress" event.sender.send(msg) self.num_sent += 1
def on_sendable(self, event): print(15) body = {"attributeNames": ['name', 'role', 'name']} properties = { "operation": 'QUERY', 'type': 'org.amqp.management', 'name': "self", 'entityType': 'org.apache.qpid.dispatch.listener' } address = '/$management' # reply_to = "receiver.remote.attach.source.address" # reply_to = "myManagement" reply_to = "/" print('reply_to ', reply_to) while event.sender.credit and self.sent < self.total: msg = Message(id=(self.sent + 1)) msg.body = body msg.properties = properties msg.address = address msg.reply_to = reply_to event.sender.send(msg) self.sent += 1 # event.sender.detach() event.sender.close() print('sent')
def test_08a_test_strip_message_annotations_out(self): addr = self.router.addresses[3]+"/strip_message_annotations_out/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} #Put and send the message M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) self.assertEqual(egress_message.annotations, None) M1.stop() M2.stop()
def test_09d_management_not_implemented(self): addr = "amqp:/$management" M = self.messenger() M.start() M.route("amqp:/*", self.address + "/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() ## ## Request with an invalid operation ## request.address = addr request.reply_to = reply request.properties = { u'type': u'org.amqp.management', u'name': u'self', u'operation': u'NOT-IMPL' } M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 501) M.stop()
def test_16_delivery_annotations(self): addr = "amqp:/delivery_annotations.1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() self.routers[0].wait_address("delivery_annotations.1", 0, 1) tm.annotations = {'a1': 'a1', 'b1': 'b2'} tm.address = addr tm.instructions = {'work': 'hard', 'stay': 'humble'} tm.body = {'number': 38} M1.put(tm) M1.send() M2.recv(1) M2.get(rm) self.assertEqual(38, rm.body['number']) M1.stop() M2.stop()
def test_09c_management_get_operations(self): addr = "amqp:/_local/$management" M = self.messenger() M.start() M.route("amqp:/*", self.address+"/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() ## ## Unrestricted request ## request.address = addr request.reply_to = reply request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'GET-OPERATIONS'} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 200) self.assertEqual(response.body.__class__, dict) self.assertTrue('org.apache.qpid.dispatch.router' in response.body.keys()) self.assertTrue(len(response.body.keys()) > 2) self.assertTrue(response.body['org.apache.qpid.dispatch.router'].__class__, list) M.stop()
def test_01_pre_settled(self): addr = self.address + "/pre_settled/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop()
def test_08a_test_strip_message_annotations_out(self): addr = self.router.addresses[3] + "/strip_message_annotations_out/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} #Put and send the message M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) self.assertEqual(egress_message.annotations, None) M1.stop() M2.stop()
def test_03_propagated_disposition(self): addr = "amqp:/unsettled/2" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("unsettled/2", 0, 1) tm = Message() rm = Message() tm.address = addr tm.body = {'number': 0} ## ## Test ACCEPT ## tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(0, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.accept(rx_tracker) M2.settle(rx_tracker) M2.flush() M1.flush() self.assertEqual(ACCEPTED, M1.status(tx_tracker)) ## ## Test REJECT ## tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(0, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.reject(rx_tracker) M2.settle(rx_tracker) M2.flush() M1.flush() self.assertEqual(REJECTED, M1.status(tx_tracker)) M1.stop() M2.stop()
def test_02c_sender_settles_first(self): addr = self.address + "/settled/senderfirst/1" M1 = self.messenger() M2 = self.messenger() M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr tm.body = {'number': 0} ttrk = M1.put(tm) M1.send(0) M1.settle(ttrk) M1.flush() M2.flush() M2.recv(1) rtrk = M2.get(rm) M2.accept(rtrk) M2.settle(rtrk) self.assertEqual(0, rm.body['number']) M1.flush() M2.flush() M1.stop() M2.stop()
def test_13_to_override(self): addr = self.address + "/toov/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr ## ## Pre-existing TO ## tm.annotations = {'x-opt-qd.to': 'toov/1'} for i in range(10): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(10): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) ma = rm.annotations self.assertEqual(ma.__class__, dict) self.assertEqual(ma['x-opt-qd.to'], 'toov/1') M1.stop() M2.stop()
def test_02b_disp_to_closed_connection(self): addr = self.address + "/pre_settled/2" M1 = self.messenger() M2 = self.messenger() M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(2): tm.body = {'number': i} M1.put(tm) M1.send(0) M1.stop() for i in range(2): M2.recv(1) trk = M2.get(rm) M2.accept(trk) M2.settle(trk) self.assertEqual(i, rm.body['number']) M2.stop()
def test_01_pre_settled(self): addr = "amqp:/pre_settled.1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M2.subscribe(addr) tm = Message() rm = Message() self.routers[0].wait_address("pre_settled.1", 0, 1) tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop()
def test_01_pre_settled(self): addr = "amqp:/pre_settled.1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M2.subscribe(addr) tm = Message() rm = Message() self.routers[0].wait_address("pre_settled.1", 0, 1) tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop()
def test_09d_management_not_implemented(self): addr = "amqp:/$management" M = self.messenger() M.start() M.route("amqp:/*", self.address+"/$1") sub = M.subscribe("amqp:/#") reply = sub.address request = Message() response = Message() ## ## Request with an invalid operation ## request.address = addr request.reply_to = reply request.properties = {u'type':u'org.amqp.management', u'name':u'self', u'operation':u'NOT-IMPL'} M.put(request) M.send() M.recv() M.get(response) self.assertEqual(response.properties['statusCode'], 501) M.stop()
def test_simple_pre_settled(self): if not is_ipv6_enabled(): return self.skipTest("Skipping test..IPV6 not enabled") addr = self.routers[0].addresses[4] + "/test/1" M1 = self.messenger() M2 = self.messenger() M1.start() M2.start() M2.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop()
def test_91_anonymous_sender(self): """ Verify that senders over anonymous links do not block waiting for consumers. """ # no receiver - should not block, return RELEASED msg = Message(body="test_100_anonymous_sender") msg.address = "multicast/test_100_anonymous_sender" tx = AsyncTestSender(address=self.INT_B.listener, count=5, target=None, message=msg, container_id="test_100_anonymous_sender") tx.wait() self.assertEqual(5, tx.released) # now add a receiver: rx = AsyncTestReceiver(address=self.INT_A.listener, source=msg.address) self.INT_B.wait_address(msg.address) tx = AsyncTestSender(address=self.INT_B.listener, count=5, target=None, message=msg, container_id="test_100_anonymous_sender") tx.wait() self.assertEqual(5, tx.accepted) rx.stop()
def test_02a_multicast_unsettled(self): addr = "amqp:/multicast.2" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M3.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M4.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M3.incoming_window = 5 M4.incoming_window = 5 M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("multicast.2", 1, 1) tm = Message() rm = Message() tm.address = addr for i in range(2): tm.body = {'number': i} M1.put(tm) M1.send(0) for i in range(2): M2.recv(1) trk = M2.get(rm) M2.accept(trk) M2.settle(trk) self.assertEqual(i, rm.body['number']) M3.recv(1) trk = M3.get(rm) M3.accept(trk) M3.settle(trk) self.assertEqual(i, rm.body['number']) M4.recv(1) trk = M4.get(rm) M4.accept(trk) M4.settle(trk) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop() M3.stop() M4.stop()
def test_02a_multicast_unsettled(self): addr = "amqp:/multicast.2" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M3.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M4.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M3.incoming_window = 5 M4.incoming_window = 5 M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("multicast.2", 1, 1) tm = Message() rm = Message() tm.address = addr for i in range(2): tm.body = {'number': i} M1.put(tm) M1.send(0) for i in range(2): M2.recv(1) trk = M2.get(rm) M2.accept(trk) M2.settle(trk) self.assertEqual(i, rm.body['number']) M3.recv(1) trk = M3.get(rm) M3.accept(trk) M3.settle(trk) self.assertEqual(i, rm.body['number']) M4.recv(1) trk = M4.get(rm) M4.accept(trk) M4.settle(trk) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop() M3.stop() M4.stop()
def test_00_discard(self): addr = self.routers[0].addresses[0]+"/discard/1" M1 = self.messenger() tm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send()
def test_10_semantics_multicast(self): addr = "amqp:/multicast.1" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M3.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M4.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("multicast.1", 1, 1) tm = Message() rm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): try: M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) except: print "M2 at", i try: M3.recv(1) M3.get(rm) self.assertEqual(i, rm.body['number']) except: print "M3 at", i try: M4.recv(1) M4.get(rm) self.assertEqual(i, rm.body['number']) except: print "M4 at", i M1.stop() M2.stop() M3.stop() M4.stop()
def test_10_semantics_multicast(self): addr = "amqp:/multicast.1" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M3.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M4.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("multicast.1", 1, 1) tm = Message() rm = Message() tm.address = addr for i in range(100): tm.body = {'number': i} M1.put(tm) M1.send() for i in range(100): try: M2.recv(1) M2.get(rm) self.assertEqual(i, rm.body['number']) except: print "M2 at", i try: M3.recv(1) M3.get(rm) self.assertEqual(i, rm.body['number']) except: print "M3 at", i try: M4.recv(1) M4.get(rm) self.assertEqual(i, rm.body['number']) except: print "M4 at", i M1.stop() M2.stop() M3.stop() M4.stop()
def test_02a_multicast_unsettled(self): addr = self.address+"/multicast.unsettled.1" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.outgoing_window = 5 M2.incoming_window = 5 M3.incoming_window = 5 M4.incoming_window = 5 M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(2): tm.body = {'number': i} M1.put(tm) M1.send(0) for i in range(2): M2.recv(1) trk = M2.get(rm) M2.accept(trk) M2.settle(trk) self.assertEqual(i, rm.body['number']) M3.recv(1) trk = M3.get(rm) M3.accept(trk) M3.settle(trk) self.assertEqual(i, rm.body['number']) M4.recv(1) trk = M4.get(rm) M4.accept(trk) M4.settle(trk) self.assertEqual(i, rm.body['number']) M1.stop() M2.stop() M3.stop() M4.stop()
def send(self, response, reply_to): sender = self.relay if not sender: sender = self.senders.get(reply_to) if not sender: sender = self.container.create_sender(self.conn, reply_to) self.senders[reply_to] = sender msg = Message(body=response) if self.relay: msg.address = reply_to sender.send_msg(msg)
def test_05_three_ack(self): addr = "amqp:/three_ack/1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("three_ack/1", 0, 1) tm = Message() rm = Message() tm.address = addr tm.body = {'number': 200} tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(200, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.accept(rx_tracker) M2.flush() M1.flush() self.assertEqual(ACCEPTED, M1.status(tx_tracker)) M1.settle(tx_tracker) M1.flush() M2.flush() ## ## We need a way to verify on M2 (receiver) that the tracker has been ## settled on the M1 (sender). [ See PROTON-395 ] ## M2.settle(rx_tracker) M2.flush() M1.flush() M1.stop() M2.stop()
def test_05_three_ack(self): addr = "amqp:/three_ack/1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.outgoing_window = 5 M2.incoming_window = 5 M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("three_ack/1", 0, 1) tm = Message() rm = Message() tm.address = addr tm.body = {'number': 200} tx_tracker = M1.put(tm) M1.send(0) M2.recv(1) rx_tracker = M2.get(rm) self.assertEqual(200, rm.body['number']) self.assertEqual(PENDING, M1.status(tx_tracker)) M2.accept(rx_tracker) M2.flush() M1.flush() self.assertEqual(ACCEPTED, M1.status(tx_tracker)) M1.settle(tx_tracker) M1.flush() M2.flush() ## ## We need a way to verify on M2 (receiver) that the tracker has been ## settled on the M1 (sender). [ See PROTON-395 ] ## M2.settle(rx_tracker) M2.flush() M1.flush() M1.stop() M2.stop()
def test_04_unavailable_anonymous_link_attach(self): """ Attempt to attach an anonymous link and send a message to an unavailable address. Expect to allow the link, but REJECT the message """ message = Message(body="REJECTED!!!") message.address = "another/unavailable/address" ats = AsyncTestSender(self.server_address(self.RouterA), target=None, message=message) ats.wait() self.assertEqual(0, ats.accepted) self.assertEqual(1, ats.rejected)
def test_11_semantics_closest(self): addr = self.address+"/closest.1" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M3.subscribe(addr) M4.subscribe(addr) tm = Message() rm = Message() tm.address = addr for i in range(30): tm.body = {'number': i} M1.put(tm) M1.send() i = 0 rx_set = [] for i in range(10): M2.recv(1) M2.get(rm) rx_set.append(rm.body['number']) M3.recv(1) M3.get(rm) rx_set.append(rm.body['number']) M4.recv(1) M4.get(rm) rx_set.append(rm.body['number']) self.assertEqual(30, len(rx_set)) rx_set.sort() for i in range(30): self.assertEqual(i, rx_set[i]) M1.stop() M2.stop() M3.stop() M4.stop()
def _send_request(self): """Send a message containing the RPC method call """ msg = Message() msg.subject = "An RPC call!" msg.address = self._to msg.reply_to = self._reply_to msg.body = self._method msg.correlation_id = 5 # whatever... print("sending RPC call request: %s" % str(self._method)) # @todo send timeout self._sender.send(msg, self, None, time.time() + # 10) self._sender.send(msg, self)
def test_11b_semantics_closest_is_remote(self): addr = "amqp:/closest.2" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M3.route("amqp:/*", self.routers[0].addresses[0]+"/$1") M4.route("amqp:/*", self.routers[1].addresses[0]+"/$1") M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("closest.2", 0, 1) tm = Message() rm = Message() tm.address = addr for i in range(30): tm.body = {'number': i} M1.put(tm) M1.send() i = 0 rx_set = [] for i in range(15): M2.recv(1) M2.get(rm) rx_set.append(rm.body['number']) M4.recv(1) M4.get(rm) rx_set.append(rm.body['number']) self.assertEqual(30, len(rx_set)) rx_set.sort() for i in range(30): self.assertEqual(i, rx_set[i]) M1.stop() M2.stop() M3.stop() M4.stop()
def test_11b_semantics_closest_is_remote(self): addr = "amqp:/closest.2" M1 = self.messenger() M2 = self.messenger() M3 = self.messenger() M4 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M3.route("amqp:/*", self.routers[0].addresses[0] + "/$1") M4.route("amqp:/*", self.routers[1].addresses[0] + "/$1") M1.start() M2.start() M3.start() M4.start() M2.subscribe(addr) M4.subscribe(addr) self.routers[0].wait_address("closest.2", 0, 1) tm = Message() rm = Message() tm.address = addr for i in range(30): tm.body = {'number': i} M1.put(tm) M1.send() i = 0 rx_set = [] for i in range(15): M2.recv(1) M2.get(rm) rx_set.append(rm.body['number']) M4.recv(1) M4.get(rm) rx_set.append(rm.body['number']) self.assertEqual(30, len(rx_set)) rx_set.sort() for i in range(30): self.assertEqual(i, rx_set[i]) M1.stop() M2.stop() M3.stop() M4.stop()
def test_05_unavailable_anonymous_link_send(self): """ Attach an anonymous link and send to a configured address (no subscribers). Expect to allow the link, but RELEASE the message """ message = Message(body="Release me, let me go...") message.address = "closest/foo" ats = AsyncTestSender(self.server_address(self.RouterA), target=None, message=message) ats.wait() self.assertEqual(0, ats.accepted) self.assertEqual(1, ats.released) self.assertEqual(0, ats.rejected)
def test_08a_test_strip_message_annotations_both_add_ingress_trace(self): addr = "amqp:/strip_message_annotations_both_add_ingress_trace/1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[2] + "/$1") M2.route("amqp:/*", self.routers[1].addresses[2] + "/$1") M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address( "strip_message_annotations_both_add_ingress_trace/1", 0, 1) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} ## # Pre-existing ingress and trace. Intentionally populate the trace with the 0/QDR.A which is the trace # of the first router. If the inbound annotations were not stripped, the router would drop this message # since it would consider this message as being looped. # ingress_message_annotations = { 'work': 'hard', 'x-opt-qd': 'humble', 'x-opt-qd.ingress': 'ingress-router', 'x-opt-qd.trace': ['0/QDR.A'] } ingress_message.annotations = ingress_message_annotations #Put and send the message M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) # Router specific annotations (annotations with prefix "x-opt-qd.") will be stripped. User defined annotations will not be stripped. self.assertEqual(egress_message.annotations, { 'work': 'hard', 'x-opt-qd': 'humble' }) M1.stop() M2.stop()
def run(self): while (True): if self.mng.incoming < 1: self.mng.recv(1) if self.mng.incoming > 0: request = Message() self.mng.get(request) if request.reply_to: response = Message() response.address = request.reply_to response.correlation_id = request.correlation_id response.properties = {} response.properties['result'], response.body = self.process(request.properties, request.body) self.mng.put(response) self.mng.send()
def test_08a_test_strip_message_annotations_no_add_trace(self): addr = "amqp:/strip_message_annotations_no_add_trace/1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[1]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[1]+"/$1") M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("strip_message_annotations_no_add_trace/1", 0, 1) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} ## ## Pre-existing ingress and trace ## #ingress_message_annotations = {'x-opt-qd.ingress': 'ingress-router', 'x-opt-qd.trace': ['0/QDR.1']} ingress_message_annotations = {'x-opt-qd.trace': ['0/QDR.1']} ingress_message.annotations = ingress_message_annotations ingress_message.annotations = ingress_message_annotations M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) #Make sure 'Hello World!' is in the message body dict self.assertEqual('Hello World!', egress_message.body['message']) egress_message_annotations = egress_message.annotations self.assertEqual(egress_message_annotations.__class__, dict) self.assertEqual(egress_message_annotations['x-opt-qd.ingress'], '0/QDR.A') self.assertEqual(egress_message_annotations['x-opt-qd.trace'], ['0/QDR.1', '0/QDR.A', '0/QDR.B']) M1.stop() M2.stop()
def test_04_unsettled_undeliverable(self): addr = self.routers[0].addresses[0]+"/unsettled_undeliverable/1" M1 = self.messenger() M1.outgoing_window = 5 M1.start() tm = Message() tm.address = addr tm.body = {'number': 200} tx_tracker = M1.put(tm) M1.send(0) M1.flush() self.assertEqual(MODIFIED, M1.status(tx_tracker)) M1.stop()
def notest_08a_test_strip_message_annotations_no_custom_not_implemented(self): addr = "amqp:/message_annotations_strip_no_custom/1" M1 = self.messenger() M2 = self.messenger() M1.route("amqp:/*", self.routers[0].addresses[1]+"/$1") M2.route("amqp:/*", self.routers[1].addresses[1]+"/$1") M1.start() M2.start() M2.subscribe(addr) self.routers[0].wait_address("message_annotations_strip_no_custom/1", 0, 1) ingress_message = Message() ingress_message.address = addr ingress_message.body = {'message': 'Hello World!'} ingress_message_annotations = {} ingress_message_annotations['custom-annotation'] = '1/Custom_Annotation' ingress_message.annotations = ingress_message_annotations M1.put(ingress_message) M1.send() # Receive the message M2.recv(1) egress_message = Message() M2.get(egress_message) #Make sure 'Hello World!' is in the message body dict self.assertEqual('Hello World!', egress_message.body['message']) egress_message_annotations = egress_message.annotations self.assertEqual(egress_message_annotations.__class__, dict) self.assertEqual(egress_message_annotations['custom-annotation'], '1/Custom_Annotation') self.assertEqual(egress_message_annotations['x-opt-qd.ingress'], '0/QDR.A') self.assertEqual(egress_message_annotations['x-opt-qd.trace'], ['0/QDR.A', '0/QDR.B']) M1.stop() M2.stop()