wip
This commit is contained in:
parent
979d79872a
commit
92e55269f4
|
@ -10,6 +10,15 @@
|
||||||
# Licensed under GNU General Public License, Version 2 or at your
|
# Licensed under GNU General Public License, Version 2 or at your
|
||||||
# option, any later version.
|
# option, any later version.
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
./mncc_mt_loadgen.py [<nr-of-calls> [<ramp-time>]]
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RTPSOURCE_CTRL_IP = "127.0.0.1"
|
RTPSOURCE_CTRL_IP = "127.0.0.1"
|
||||||
RTPSOURCE_CTRL_PORT = 11111
|
RTPSOURCE_CTRL_PORT = 11111
|
||||||
|
|
||||||
|
@ -137,7 +146,8 @@ class MTCallRtpsource(pykka.ThreadingActor):
|
||||||
# MSC+MGW informs us of the PLMN side IP/port
|
# MSC+MGW informs us of the PLMN side IP/port
|
||||||
mncc_rtp_ind = message['rtp']
|
mncc_rtp_ind = message['rtp']
|
||||||
# tell external rtpsourc to connect to this address
|
# tell external rtpsourc to connect to this address
|
||||||
r = self.ctrl_act.ask({'type':'rtp_connect', 'cname':self.callref,
|
if True:
|
||||||
|
r = self.ctrl_act.ask({'type':'rtp_connect', 'cname':self.callref,
|
||||||
'remote_host': int2ipstr(mncc_rtp_ind.ip),
|
'remote_host': int2ipstr(mncc_rtp_ind.ip),
|
||||||
'remote_port': mncc_rtp_ind.port,
|
'remote_port': mncc_rtp_ind.port,
|
||||||
'payload_type':3})
|
'payload_type':3})
|
||||||
|
@ -150,10 +160,30 @@ class MTCallRtpsource(pykka.ThreadingActor):
|
||||||
# Call FSM has reached the NULL state again (call terminated)
|
# Call FSM has reached the NULL state again (call terminated)
|
||||||
# on_stop() will clean up the RTP connection at rtpsource
|
# on_stop() will clean up the RTP connection at rtpsource
|
||||||
self.stop()
|
self.stop()
|
||||||
|
elif message['type'] == 'msisdn_called':
|
||||||
|
return self.msisdn_called
|
||||||
|
|
||||||
|
established_calls = []
|
||||||
|
|
||||||
|
def release(nr=None):
|
||||||
|
global established_calls
|
||||||
|
if nr is None:
|
||||||
|
nr = len(established_calls)
|
||||||
|
for i in reversed(range(len(established_calls))):
|
||||||
|
call = established_calls[i]
|
||||||
|
if nr < 1:
|
||||||
|
break
|
||||||
|
try:
|
||||||
|
call.release()
|
||||||
|
nr -= 1
|
||||||
|
except pykka.exceptions.ActorDeadError:
|
||||||
|
pass
|
||||||
|
del established_calls[i]
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
# capture SIGINT (Ctrl+C) and stop all actors
|
# capture SIGINT (Ctrl+C) and stop all actors
|
||||||
def sigint_handler(signum, frame):
|
def sigint_handler(signum, frame):
|
||||||
|
release()
|
||||||
pykka.ActorRegistry.stop_all()
|
pykka.ActorRegistry.stop_all()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
@ -172,24 +202,63 @@ rtpctrl_act = RtpSourceCtrlActor.start(RTPSOURCE_CTRL_IP, RTPSOURCE_CTRL_PORT)
|
||||||
|
|
||||||
# convenience wrapper
|
# convenience wrapper
|
||||||
def mt_call(msisdn_called, msisdn_calling = '123456789', codecs = GSM48.AllCodecs):
|
def mt_call(msisdn_called, msisdn_calling = '123456789', codecs = GSM48.AllCodecs):
|
||||||
|
global established_calls
|
||||||
call_conn = MTCallRtpsource.start(mncc_act, rtpctrl_act, codecs).proxy()
|
call_conn = MTCallRtpsource.start(mncc_act, rtpctrl_act, codecs).proxy()
|
||||||
call_conn.start_call(msisdn_called, msisdn_calling)
|
call_conn.start_call(msisdn_called, msisdn_calling)
|
||||||
|
established_calls.append(call_conn)
|
||||||
|
log.info('established: %d' % len(established_calls))
|
||||||
return call_conn
|
return call_conn
|
||||||
|
|
||||||
|
def sanitize_established_calls():
|
||||||
|
global established_calls
|
||||||
|
dead = []
|
||||||
|
for i in range(len(established_calls)):
|
||||||
|
try:
|
||||||
|
established_calls[i].msisdn_called.get()
|
||||||
|
except pykka.exceptions.ActorDeadError:
|
||||||
|
dead.append(i)
|
||||||
|
|
||||||
|
for i in reversed(dead):
|
||||||
|
del established_calls[i]
|
||||||
|
|
||||||
|
|
||||||
def calls(nr, ramp=1.0):
|
def calls(nr, ramp=1.0):
|
||||||
|
global established_calls
|
||||||
|
sanitize_established_calls()
|
||||||
|
established_msisdns = [int(call.msisdn_called.get()) for call in established_calls]
|
||||||
|
available_msisdns = [msisdn for msisdn in range(90001, 90201) if msisdn not in established_msisdns]
|
||||||
|
log.info('established: %d: %r' % (len(established_msisdns), established_msisdns))
|
||||||
|
log.info('available: %d: %r' % (len(available_msisdns), available_msisdns))
|
||||||
|
if not available_msisdns:
|
||||||
|
log.error('no more MSISDNs available')
|
||||||
|
return
|
||||||
|
|
||||||
for i in range(nr):
|
for i in range(nr):
|
||||||
a = 90001 + i
|
a = str(available_msisdns[i])
|
||||||
a = str(a)
|
|
||||||
print("%d: mt_call(%r)" % (i, a))
|
print("%d: mt_call(%r)" % (i, a))
|
||||||
mt_call(a)
|
mt_call(a)
|
||||||
time.sleep(ramp)
|
time.sleep(ramp)
|
||||||
|
|
||||||
log.info("")
|
|
||||||
log.info("")
|
|
||||||
log.info("Start calls by typing:")
|
if len(sys.argv) > 1:
|
||||||
log.info(" mt_call('90001')")
|
|
||||||
log.info("")
|
nr_of_calls = int(sys.argv[1])
|
||||||
log.info("")
|
ramp_time = 1.0
|
||||||
|
if len(sys.argv) > 2:
|
||||||
|
ramp_time = float(sys.argv[2])
|
||||||
|
|
||||||
|
log.info("Launching %d calls with a ramp time of %.2f" % (nr_of_calls, ramp_time))
|
||||||
|
calls(nr_of_calls, ramp_time)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
log.info("")
|
||||||
|
log.info("")
|
||||||
|
log.info("Start calls by typing:")
|
||||||
|
log.info(" mt_call('90001')")
|
||||||
|
log.info("")
|
||||||
|
log.info("")
|
||||||
|
|
||||||
# start a shell to enable the user to add more calls as needed
|
# start a shell to enable the user to add more calls as needed
|
||||||
vars = globals().copy()
|
vars = globals().copy()
|
||||||
|
|
Loading…
Reference in New Issue