"""
Python invocation of several parallel publish-notifications RPCs.
"""
import Queue
import requests
import string
import threading
def publish_notifications(host, grprefix, duration, rate, nrpairs=1):
"""Invoke publish notification rpcs and verify the response.
:param host: ip address of odl node
:type host: string
:param grprefix: prefix identifier for publisher/listener pair
:type grprefix: string
:param duration: publishing notification duration in seconds
:type duration: int
:param rate: events rate per second
:type rate: int
:param nrpairs: number of publisher/listener pairs, id suffix is counted from it
:type nrpairs: int
"""
def _publ_notifications(rqueue, url, grid, duration, rate):
dtmpl = string.Template('''
$ID
$DURATION
$RATE
''')
data = dtmpl.substitute({'ID': grid, 'DURATION': duration, 'RATE': rate})
try:
resp = requests.post(url=url, headers={'Content-Type': 'application/xml'},
data=data, auth=('admin', 'admin'), timeout=int(duration)+60)
except Exception as exc:
resp = exc
rqueue.put(resp)
resqueue = Queue.Queue()
lthreads = []
url = 'http://{}:8181/restconf/operations/odl-mdsal-lowlevel-control:publish-notifications'.format(host)
for i in range(nrpairs):
t = threading.Thread(target=_publ_notifications,
args=(resqueue, url, '{}{}'.format(grprefix, i+1), duration, rate))
t.daemon = True
t.start()
lthreads.append(t)
for t in lthreads:
t.join()
for i in range(nrpairs):
resp = resqueue.get()
assert resp.status_code == 200