[asterisk-commits] mjordan: testsuite/asterisk/trunk r6398 - in /asterisk/trunk/tests/rest_api/c...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Feb 12 14:50:25 CST 2015
Author: mjordan
Date: Thu Feb 12 14:50:23 2015
New Revision: 6398
URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=6398
Log:
rest_api/channels/redirect: Add tests for /channels/redirect operation
This patch adds the following tests:
- rest_api/channels/redirect/off-nominal: Off-nominal testing of the redirect
operation, verifying that the various off nominal error response codes are
returned as expected
- rest_api/channels/redirect/nominal: Nominal testing of the operation. For
fun, this spawns four Asterisk instances (one call generator, one load
balancer, and two destinations) - and proceeds to load balance 'calls'
between the two destination instances.
Review: https://reviewboard.asterisk.org/r/4352/
ASTERISK-24703
Added:
asterisk/trunk/tests/rest_api/channels/redirect/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test (with props)
asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml (with props)
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf (with props)
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/redirect_off_nominal.py (with props)
asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/test-config.yaml (with props)
asterisk/trunk/tests/rest_api/channels/redirect/tests.yaml (with props)
Modified:
asterisk/trunk/tests/rest_api/channels/tests.yaml
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,8 @@
+[default]
+
+exten => _.,1,NoOp()
+ same => n,Stasis(call_spawner,${EXTEN})
+ same => n,Hangup()
+
+exten => h,1,NoOp()
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,5 @@
+[general]
+enabled=yes
+bindaddr=127.0.0.1
+bindport=8088
+prefix=
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/http.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,40 @@
+[local-transport]
+type=transport
+protocol=udp
+bind=127.0.0.1:5061
+
+[endpoint-template](!)
+type=endpoint
+context=default
+allow=!all,ulaw,g722
+
+[aor-template](!)
+type=aor
+max_contacts=1
+
+[ast2](aor-template)
+contact=sip:ast2 at 127.0.0.1:5062
+
+[ast2](endpoint-template)
+transport=local-transport
+aors=ast2
+from_user=ast1
+context=default
+
+[ast3](aor-template)
+contact=sip:ast3 at 127.0.0.1:5063
+
+[ast3](endpoint-template)
+transport=local-transport
+aors=ast3
+from_user=ast1
+context=default
+
+[ast4](aor-template)
+contact=sip:ast4 at 127.0.0.1:5064
+
+[ast4](endpoint-template)
+transport=local-transport
+aors=ast4
+from_user=ast1
+context=default
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,8 @@
+[default]
+
+exten => _.,1,NoOp()
+ same => n,Stasis(balancer,ast2)
+ same => n,Hangup()
+
+exten => h,1,NoOp()
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,5 @@
+[general]
+enabled=yes
+bindaddr=127.0.0.2
+bindport=8088
+prefix=
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/http.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,40 @@
+[local-transport]
+type=transport
+protocol=udp
+bind=127.0.0.1:5062
+
+[endpoint-template](!)
+type=endpoint
+context=default
+allow=!all,ulaw,g722
+
+[aor-template](!)
+type=aor
+max_contacts=1
+
+[ast1](aor-template)
+contact=sip:ast1 at 127.0.0.1:5061
+
+[ast1](endpoint-template)
+transport=local-transport
+aors=ast1
+from_user=ast2
+context=default
+
+[ast3](aor-template)
+contact=sip:ast3 at 127.0.0.1:5063
+
+[ast3](endpoint-template)
+transport=local-transport
+aors=ast3
+from_user=ast2
+context=default
+
+[ast4](aor-template)
+contact=sip:ast4 at 127.0.0.1:5064
+
+[ast4](endpoint-template)
+transport=local-transport
+aors=ast4
+from_user=ast2
+context=default
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast2/pjsip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,8 @@
+[default]
+
+exten => _.,1,NoOp()
+ same => n,Stasis(balancer,ast3)
+ same => n,Hangup()
+
+exten => h,1,NoOp()
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,5 @@
+[general]
+enabled=yes
+bindaddr=127.0.0.3
+bindport=8088
+prefix=
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/http.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,31 @@
+[local-transport]
+type=transport
+protocol=udp
+bind=127.0.0.1:5063
+
+[endpoint-template](!)
+type=endpoint
+context=default
+allow=!all,ulaw,g722
+
+[aor-template](!)
+type=aor
+max_contacts=1
+
+[ast1](aor-template)
+contact=sip:ast1 at 127.0.0.1:5061
+
+[ast1](endpoint-template)
+transport=local-transport
+aors=ast1
+from_user=ast3
+context=default
+
+[ast2](aor-template)
+contact=sip:ast2 at 127.0.0.1:5062
+
+[ast2](endpoint-template)
+transport=local-transport
+aors=ast2
+from_user=ast3
+context=default
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast3/pjsip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,8 @@
+[default]
+
+exten => _.,1,NoOp()
+ same => n,Stasis(balancer,ast4)
+ same => n,Hangup()
+
+exten => h,1,NoOp()
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,5 @@
+[general]
+enabled=yes
+bindaddr=127.0.0.4
+bindport=8088
+prefix=
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/http.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,31 @@
+[local-transport]
+type=transport
+protocol=udp
+bind=127.0.0.1:5064
+
+[endpoint-template](!)
+type=endpoint
+context=default
+allow=!all,ulaw,g722
+
+[aor-template](!)
+type=aor
+max_contacts=1
+
+[ast1](aor-template)
+contact=sip:ast1 at 127.0.0.1:5061
+
+[ast1](endpoint-template)
+transport=local-transport
+aors=ast1
+from_user=ast4
+context=default
+
+[ast2](aor-template)
+contact=sip:ast2 at 127.0.0.1:5062
+
+[ast2](endpoint-template)
+transport=local-transport
+aors=ast2
+from_user=ast4
+context=default
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/configs/ast4/pjsip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test Thu Feb 12 14:50:23 2015
@@ -1,0 +1,336 @@
+#!/usr/bin/env python
+# vim: sw=3 et:
+"""A test that verifies the redirect operation for the ARI channels resource
+
+Copyright (C) 2015, Digium, Inc.
+Matt Jordan <mjordan at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+
+import sys
+import uuid
+import logging
+
+from twisted.internet import reactor
+
+sys.path.append("lib/python")
+
+from asterisk.test_case import TestCase
+from asterisk.ari import ARI, AriClientFactory
+
+LOGGER = logging.getLogger(__name__)
+
+USERPASS = ('testsuite', 'testsuite')
+
+CHANNEL_COUNT = 10
+
+
+class BaseReceiver(object):
+ """Base class for an ARI protocol receiver"""
+
+ def __init__(self, test_object):
+ """Constructor
+
+ Keyword Arguments:
+ test_object -- our TestCase instance
+ """
+ self.test_object = test_object
+
+ def on_ws_event(self, message):
+ """Handler for WebSocket events
+
+ Keyword Arguments:
+ message -- The WS event payload
+ """
+ msg_type = message.get('type')
+ callback = getattr(self, 'handle_{0}'.format(msg_type.lower()), None)
+ if callback:
+ callback(message)
+
+ def on_ws_open(self, protocol):
+ """Handler for WebSocket Client Protocol opened
+
+ Keyword Arguments:
+ protocol -- The WS Client protocol object
+ """
+ LOGGER.debug("{0}: WebSocket connection made {1}".format(self,
+ protocol))
+ self.test_object.protocol_connected(protocol)
+
+ def on_ws_closed(self, protocol):
+ """Handler for WebSocket Client Protocol closed
+
+ :param protocol The WS Client protocol object
+ """
+ LOGGER.debug("{0}: WebSocket connection closed {1}".format(self,
+ protocol))
+
+
+class CallSpawner(BaseReceiver):
+ """A class that spawns calls and handles forwards
+
+ The call spawner originates channels to another Asterisk instance
+ and - if the channel is forwarded - deals with the Local channel
+ and re-originates to the specified destination.
+ """
+
+ def __init__(self, ast, test_object):
+ """Constructor
+
+ Keyword Arguments:
+ ast -- our call spawning Asterisk instance
+ test_object -- our TestCase object
+ """
+ super(CallSpawner, self).__init__(test_object)
+ self.channels = []
+ self.bridges = []
+ self.redirected_channels = {}
+ self.client = ARI(ast.host, userpass=USERPASS)
+ self.factory = AriClientFactory(receiver=self,
+ host=ast.host,
+ port=8088,
+ apps='call_spawner',
+ userpass=USERPASS)
+ self.factory.connect()
+
+ def spawn_calls(self):
+ """Make me a call!"""
+ for i in xrange(0, CHANNEL_COUNT):
+ LOGGER.debug('Originating channel {0}'.format(i))
+ self.client.post('channels',
+ endpoint='PJSIP/ast2',
+ app='call_spawner')
+
+ def handle_channelleftbridge(self, message):
+ """ChannelLeftBridge handler
+
+ Keyword Arguments:
+ message -- the JSON message
+ """
+ bridge = message['bridge']
+ if not bridge['channels']:
+ self.client.delete('bridges', bridge['id'])
+
+ def handle_stasisend(self, message):
+ """StasisEnd handler
+
+ Keyword Arguments:
+ message -- the JSON message
+ """
+ channel_id = message['channel']['id']
+ self.channels.remove(channel_id)
+
+ def handle_stasisstart(self, message):
+ """StasisStart handler
+
+ Keyword Arguments:
+ message -- the JSON message
+ """
+ channel_id = message['channel']['id']
+ channel_name = message['channel']['name']
+ args = message['args']
+
+ # args will be:
+ # - empty if the channel was spawned and accepted
+ # - ast3 or ast4 if we should redirect the channel there
+ # - redirected if it is a Local channel created due to a call
+ # forward being received
+ if not args:
+ LOGGER.debug('Spawned channel: {0}'.format(channel_name))
+ elif 'ast3' in args or 'ast4' in args:
+ outbound_id = str(uuid.uuid4())
+ self.redirected_channels[outbound_id] = channel_id
+
+ LOGGER.debug('Got redirect to {0}'.format(args))
+ self.client.post('channels',
+ channelId=outbound_id,
+ endpoint='PJSIP/{0}'.format(args[0]),
+ app='call_spawner',
+ appData='redirected')
+ elif 'redirected' in args:
+ bridge_id = str(uuid.uuid4())
+ self.client.post('bridges',
+ bridgeId=bridge_id)
+ self.bridges.append(bridge_id)
+ redirect_id = self.redirected_channels[channel_id]
+
+ LOGGER.debug('Bridging redirect {0} and {1} in {2}'.format(
+ redirect_id, channel_id, bridge_id))
+ self.client.post('channels', channel_id, 'answer')
+ self.client.post('channels', redirect_id, 'answer')
+ self.client.post('bridges', 'addChannel', channel_id)
+ self.client.post('bridges', 'addChannel', redirect_id)
+
+ self.channels.append(channel_id)
+
+ def hangup_channels(self):
+ """Hang up all tracked channels"""
+
+ # We will race between the StasisEnd event being processed
+ # from a BYE from the loaded systems and our attempt to
+ # delete the channel; ignore any HTTP errors
+ self.client.set_allow_errors(True)
+ for channel in self.channels:
+ LOGGER.debug('Hanging up {0}'.format(channel))
+ self.client.delete('channels', channel)
+ self.client.set_allow_errors(False)
+ for bridge in self.bridges:
+ LOGGER.debug('Destroying bridge {0}'.format(bridge))
+ self.client.delete('bridges', bridge)
+
+
+class BalancerReceiver(BaseReceiver):
+ """A class that load balances and handles their destination
+
+ The balancer load balances in a round-robin fashion between
+ destination servers. It maintains a connection to the destination
+ servers as well to detect when all calls are placed.
+ """
+
+ def __init__(self, ast_instances, test_object):
+ """Constructor
+
+ Keyword Arguments:
+ ast_instances -- list of Asterisk instances to balance across
+ test_object -- our TestCase object
+ """
+ super(BalancerReceiver, self).__init__(test_object)
+
+ # The channels in each Asterisk instance
+ self.channels = {'ast3': [], 'ast4': []}
+ # The ARI clients for each Asterisk instance
+ self.client_map = {}
+ # The ARI clients
+ clients = []
+ # Number of channels this has handled
+ self.channels_handled = 0
+
+ for ast_instance in ast_instances:
+ clients.append(ARI(ast_instance.host, userpass=USERPASS))
+ factory = AriClientFactory(receiver=self,
+ host=ast_instance.host,
+ port=8088,
+ apps='balancer',
+ userpass=USERPASS)
+ factory.connect()
+ self.client_map['ast2'] = clients[0]
+ self.client_map['ast3'] = clients[1]
+ self.client_map['ast4'] = clients[2]
+
+ def handle_stasisend(self, message):
+ """StasisEnd handler
+
+ Keyword Arguments:
+ message -- the JSON message
+ """
+ channel_id = message['channel']['id']
+ for c_list in self.channels.itervalues():
+ if channel_id in c_list:
+ c_list.remove(channel_id)
+ if sum(len(c_list) for c_list in self.channels.itervalues()) == 0:
+ LOGGER.info('All channels hung up')
+
+ def handle_stasisstart(self, message):
+ """StasisStart handler
+
+ Keyword Arguments:
+ message -- the JSON message
+ """
+ channel_id = message['channel']['id']
+ instance = message['args'][0]
+ client = self.client_map[instance]
+
+ if instance == 'ast2':
+ self.channels_handled += 1
+ rr_pick = self.channels_handled % 2
+ target_instance = 'ast{0}'.format(rr_pick + 3)
+ LOGGER.debug('Bouncing {0} from {1} to {2}'.format(
+ channel_id, instance, target_instance))
+ client.post('channels', channel_id, 'redirect',
+ endpoint='PJSIP/{0}'.format(target_instance))
+ return
+
+ LOGGER.debug('Answering channel {0} on {1}'.format(
+ channel_id, instance))
+ client.post('channels', channel_id, 'answer')
+ channels = self.channels[instance]
+ channels.append(channel_id)
+
+ if all([len(chan_list) == (CHANNEL_COUNT / 2)
+ for chan_list in self.channels.itervalues()]):
+ self.test_object.set_passed(True)
+
+ LOGGER.info('All channels answered and balanced:')
+ for server, chan_list in self.channels.items():
+ LOGGER.info('Server {0}: {1}'.format(server, chan_list))
+ self.test_object.hangup_all_channels()
+
+ def hangup_channels(self):
+ """Hang up all tracked channels"""
+
+ for server, chan_list in self.channels.items():
+ for chan in chan_list:
+ self.client_map[server].delete('channels', chan)
+
+
+class RedirectTest(TestCase):
+ """A class that manages this test"""
+
+ def __init__(self):
+ """Constructor"""
+ super(RedirectTest, self).__init__()
+ self.create_asterisk(count=4)
+ self.protocols = []
+ self.spawner = None
+ self.balancer = None
+
+ def run(self):
+ """Entry point for the twisted reactor"""
+ super(RedirectTest, self).run()
+
+ # Create the ARI spawner
+ self.spawner = CallSpawner(self.ast[0], self)
+ # Create the ARI balancers
+ self.balancer = BalancerReceiver(self.ast[1:], self)
+
+ def protocol_connected(self, protocol):
+ """Called by the various BaseReceivers on protocol connection
+
+ Keyword Arguments:
+ protocol -- the twisted protocol that connected
+ """
+ self.protocols.append(protocol)
+ if len(self.protocols) == 4:
+ LOGGER.info('Spawning calls!')
+ self.spawner.spawn_calls()
+
+ def hangup_all_channels(self):
+ """Hangs up all channels in both the spawner and the balancer
+ """
+ self.balancer.hangup_channels()
+ self.spawner.hangup_channels()
+ for protocol in self.protocols:
+ protocol.transport.loseConnection()
+ self.stop_reactor()
+
+
+def main():
+ """Main entry point for the test.
+
+ Returns:
+ 0 on test pass
+ 1 on test failure
+ """
+
+ test = RedirectTest()
+ reactor.run()
+
+ if not test.passed:
+ return 1
+
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main() or 0)
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test
------------------------------------------------------------------------------
svn:executable = *
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/run-test
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml Thu Feb 12 14:50:23 2015
@@ -1,0 +1,37 @@
+testinfo:
+ summary: Test redirecting channels using ARI
+ description: |
+ This test covers redirecting channels using ARI. Specifically,
+ it does the following:
+ - The first Asterisk instance (ast1) acts as a call generator
+ using a Stasis application. It spawns calls to the second
+ Asterisk instance (ast2). If a call is forwarded - which is
+ detected by a Local channel entering the destination extension
+ (ast3 or ast4), it creates a new call to that server and
+ bridges it with the Local channel.
+ - The second Asterisk instance (ast2) acts as a load balancer.
+ As calls are received from ast1, it picks a server to forward
+ them to in a round-robin fashion. It then uses the /redirect
+ operation on the channels resource to forward the calls to
+ the specified server.
+ - The third and fourth Asterisk instances (ast3 and ast4)
+ receive the forwarded calls.
+ Two Stasis applications handle the test: a call generator,
+ connected to ast1, and the load balancer, connected to ast2,
+ ast3, and ast4. When the load balancer detects that all calls
+ have been forwarded to ast3 and ast4, it stops the test. A
+ total of 10 calls are processed, with 5 being forwarded to both
+ ast3 and ast4.
+
+properties:
+ minversion: '13.3.0'
+ dependencies:
+ - python : autobahn.websocket
+ - python : requests
+ - python : twisted
+ - asterisk : res_ari_channels
+ - asterisk : res_ari_bridges
+ - asterisk : chan_pjsip
+ - asterisk : app_stasis
+ tags:
+ - ARI
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,9 @@
+[default]
+exten => s,1,NoOp()
+ same => n,Answer()
+ same => n,Stasis(testsuite)
+ same => n,Hangup()
+
+exten => asterisk,1,NoOp()
+ same => n,Answer()
+ same => n,Echo()
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf Thu Feb 12 14:50:23 2015
@@ -1,0 +1,22 @@
+[local-transport]
+type=transport
+protocol=udp
+bind=127.0.0.1
+
+[endpoint-template](!)
+type=endpoint
+context=default
+allow=!all,ulaw,g722
+
+[aor-template](!)
+type=aor
+max_contacts=1
+
+[asterisk-aors](aor-template)
+contact=sip:asterisk at 127.0.0.1:5060
+
+[asterisk](endpoint-template)
+transport=local-transport
+aors=asterisk-aors
+context=default
+from_user=asterisk
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/redirect_off_nominal.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/redirect_off_nominal.py?view=auto&rev=6398
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/redirect_off_nominal.py (added)
+++ asterisk/trunk/tests/rest_api/channels/redirect/off-nominal/redirect_off_nominal.py Thu Feb 12 14:50:23 2015
@@ -1,0 +1,70 @@
+"""
+Copyright (C) 2015, Digium, Inc.
+Matt Jordan <mjordan at digium.com>
+Joshua Colp <jcolp at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+
+import logging
+import requests
+
+LOGGER = logging.getLogger(__name__)
+
+CHANNELS = []
+
+
+def on_stasis_start(ari, event, test_object):
+ """StasisStart event handler
+
+ Keyword Arguments:
+ event -- the ARI event. In this case, StasisStart.
+ test_object -- our one and only test object
[... 161 lines stripped ...]
More information about the asterisk-commits
mailing list