blob: d1a853147600ba4fdfe1e702c465958642c639c4 [file] [log] [blame]
Gabe Black4c040b72016-11-17 22:35:04 +00001#!/usr/bin/python
2import requests, copy, json, datetime, os
3
4REFLECTOR_ID_FILE="/root/reflector_id"
5INITIATOR_ID_FILE="/root/initiator_id"
6
7##############################################################################################################################################################3
8
9start_reflector_template={u'agent': {u'primary': {u'config': u'primaryConfig',
10 u'id': u'vpma1',
11 u'type': u'inventory'}},
12 u'config': [{u'primaryConfig': {u'ietf-lmap-control:lmap': {u'schedules': {u'schedule': [{u'action': [{u'name': u'TWAMP-REFLECTOR-PM-PROBE0-action',
13 u'option': [{u'id': u'source-ip',
14 u'value': u'10.0.0.0'},
15 {u'id': u'subnet',
16 u'value': u'255.255.255.0'},
17 {u'id': u'gateway',
18 u'value': u'0.0.0.0'},
19 {u'id': u'twamp',
20 u'value': u'{"ietf-twamp:twamp":{"twamp-server":{"server-admin-state":true,"server-tcp-port":"862","dscp":0,"mode":"bits.unauthenticated"}}}'}],
21 u'task': u'twamp-reflector'}],
22 u'name': u'TWAMP-REFLECTOR-PM-PROBE0',
23 u'start': u'immediate'}]}}}}],
24 u'test': {}}
25
26##############################################################################################################################################################3
27
28start_initiator_template=u'{"agent":{"primary":{"type":"inventory","id":"%(initiator_name)s","config":"primaryConfig"}},"test":{"extended-config":{"test":{"nameOnProbe":"twamp-initiator","selected":true,"testType":"twamp","testTypeLabel":"TWAMP Initiator"},"testPoints":[{"ip":"%(initiator_ip)s","model":"vPMA","name":"%(initiator_name)s","port":"80","selected":true,"tag":"Test Point A","type":"inventory","vendor":"viavi","version":"1.0"},{"model":"vPMA","name":"Test Point B","selected":false,"tag":"Test Point B","type":"inventory","vendor":"viavi","version":"1.0"}],"pluginConfig":{"setup":{"version":"2","schedMode":"immediate","periodicDuration":"00:05:00","periodicInterval":"00:15:00","pmInterval":"1","enableRandomStart":"false","randomOffset":"00:10:00","enableRt":"true","rtInterval":"%(interval)s","srcIPAddress":"%(initiator_src_ip)s","srcNetmask":"255.255.255.0","gatewayIPAddress":"192.168.2.1","srcStartingPort":"50000","configToServicesMap":{},"serviceParamToConfigMap":{}},"connections":{"version":"2","connections":[{"version":"2","name":"My Session","enabled":"true","source":null,"destination":{"version":"2","ipv4DestMgmtAddr":"%(reflector_src_ip)s","dstMgmtPort":"862"},"network":null,"numFlows":1,"flows":[{"version":"1","flowName":"Flow 1","flowInUse":"true","flowIpv4DiffServVal":"0","flowPad":"483","flowUdpPort":"50000","flowTxInterval":"10","flowReflWaitTimeout":"2"}]}]}},"testInfo":{"comments":"","name":"Lorna-%(test_name)s"}},"test-list-data":{"customer":{}}},"config":[{"primaryConfig":{"ietf-lmap-control:lmap":{"schedules":{"schedule":[{"name":"Lorna-%(test_name)s","start":"immediate","action":[{"name":"Lorna-%(test_name)s-action","task":"twamp-initiator","option":[{"id":"subnet","value":"255.255.255.0"},{"id":"gateway","value":"0.0.0.0"},{"id":"twamp","value":"{\\"ietf-twamp:twamp\\":{\\"twamp-client\\":{\\"client-admin-state\\":true,\\"mode-preference-chain\\":[{\\"priority\\":1,\\"mode\\":\\"bits.unauthenticated\\"}],\\"twamp-client-ctrl-connection\\":[{\\"ctrl-connection-name\\":\\"My Session\\",\\"client-ip\\":\\"%(initiator_src_ip)s\\",\\"server-ip\\":\\"%(reflector_src_ip)s\\",\\"server-tcp-port\\":862,\\"dscp\\":0,\\"twamp-session-request\\":[{\\"test-session-name\\":\\"Flow 1\\",\\"sender-ip\\":\\"%(initiator_src_ip)s\\",\\"sender-udp-port\\":\\"50000\\",\\"reflector-ip\\":\\"%(reflector_src_ip)s\\",\\"reflector-udp-port\\":\\"50000\\",\\"timeout\\":\\"2\\",\\"padding-length\\":\\"483\\",\\"dscp\\":\\"0\\"}]}],\\"twamp-session-sender\\":{\\"session-sender-admin-state\\":true,\\"twamp-sender-test-session\\":[{\\"test-session-name\\":\\"Flow 1\\",\\"fill-mode\\":\\"fill-mode.zero\\",\\"periodic-interval\\":\\"10\\",\\"periodic-interval-units\\":\\"milliseconds\\"}]}}}}"}],"destination":["Lorna-%(test_name)s-results-periodic-pm","Lorna-%(test_name)s-results-periodic-rt"]}]},{"name":"Lorna-%(test_name)s-results-periodic-pm","start":"Lorna-%(test_name)s-results-periodic-pm-event","action":[{"name":"Lorna-%(test_name)s-results-periodic-pm-action","task":"results","option":[{"id":"result-type","value":"pm"},{"id":"channel","value":"http://%(controller_ip)s:26088/restconf/operations/ietf-lmap-report:report"}]}]},{"name":"Lorna-%(test_name)s-results-periodic-rt","start":"Lorna-%(test_name)s-results-periodic-rt-event","action":[{"name":"Lorna-%(test_name)s-results-periodic-rt-action","task":"results","option":[{"id":"result-type","value":"rt"},{"id":"channel","value":"http://%(controller_ip)s:26088/restconf/operations/ietf-lmap-report:report"}]}]}]},"events":{"event":[{"name":"Lorna-%(test_name)s-results-periodic-pm-event","periodic":{"interval":60}},{"name":"Lorna-%(test_name)s-results-periodic-rt-event","periodic":{"interval":5}}]}}}}]}'
29
30class FusionController:
31 def __init__(self,inventory_ip):
32 self.ip = inventory_ip
33 self.i_url="http://%s:30100"%self.ip # inventory url
34 self.c_url="http://%s:8080"%self.ip # controller url
35 self.h = {"Content-Type":"application/json"}
36 def get_ma(self,ma_ip):
37 inventory = requests.post("%s/vibe/inventory/v2/queryDevices"%self.i_url, headers=self.h).json()
38 return [ma for ma in inventory if ma_ip in ma['connections'][0]['uri']][0]
39
40 def start_reflector(self, reflector_ip, reflector_source_ip):
41 ma = self.get_ma(reflector_ip)
42 data = copy.deepcopy(start_reflector_template)
43 data['agent']['primary']['id']=ma['name']
44 config_options=data['config'][0]['primaryConfig']['ietf-lmap-control:lmap']['schedules']['schedule'][0]['action'][0]['option']
45 config_options[0]['value']=reflector_source_ip
46 r=requests.post("%s/sbi/restconf/data/ietf-lmap-control:lmap"%self.c_url,headers=self.h,data=json.dumps(data))
47 open(REFLECTOR_ID_FILE,"w").write(r.json()["id"])
48
49 def start_initiator(self, initiator_ip, initiator_source_ip, reflector_ip, reflector_source_ip, interval="1"):
50 reflector = self.get_ma(reflector_ip)
51 initiator = self.get_ma(initiator_ip)
52
53 now = datetime.datetime.now()
54 timestamp = '{}-{}-{}-{}:{}'.format(now.year, now.month, now.day, now.hour, now.minute)
55 config_options={"initiator_name":initiator["name"],"initiator_ip":initiator_ip,"initiator_src_ip":initiator_source_ip,
56 "reflector_name":reflector["name"],"reflector_ip":reflector_ip,"reflector_src_ip":reflector_source_ip,
57 "interval":interval,"test_name":timestamp,"controller_ip":self.ip}
58 r=requests.post("%s/sbi/restconf/data/ietf-lmap-control:lmap"%self.c_url,headers=self.h,data=start_initiator_template%config_options)
59 open(INITIATOR_ID_FILE,"w").write(r.json()["id"])
60
61 def stop_test(self, id):
62 print("%s/sbi/restconf/operations/action/lmap?scheduleid=%s"%(self.c_url,id))
63 requests.post("%s/sbi/restconf/operations/action/lmap?scheduleid=%s"%(self.c_url,id),headers=self.h,data=json.dumps({'action':'cancel'}))
64
65
66def start_reflector(options):
67 f = FusionController(options.controller_ip)
68 f.start_reflector(options.reflector_ip,options.reflector_src_ip)
69
70def start_initiator(options):
71 f = FusionController(options.controller_ip)
72 f.start_initiator(options.initiator_ip,options.initiator_src_ip,options.reflector_ip,options.reflector_src_ip,options.results_interval)
73
74def stop_test(options,id_file):
75 if os.path.exists(id_file):
76 f = FusionController(options.controller_ip)
77 f.stop_test(open(id_file).read())
78 os.remove(id_file)
79
80if __name__=="__main__":
81 import argparse
82 parser = argparse.ArgumentParser()
83 parser.add_argument('--controller-ip', help='IP of the Server', default='172.27.0.3')
84 parser.add_argument('--results-interval', help='Results Interval', default='5')
85 parser.add_argument('--reflector-ip', help='IP of the Agent to use as Reflector', default='10.0.6.4')
86 parser.add_argument('--reflector-src-ip', help='Source IP of the reflector', default='10.0.7.3')
87 parser.add_argument('--initiator-ip', help='IP of the Agent to use as initiator', default='10.0.6.5')
88 parser.add_argument('--initiator-src-ip', help='Source IP of the reflector', default='10.0.7.4')
89 parser.add_argument("--start-reflector", help="start reflector", action="store_true")
90 parser.add_argument("--start-initiator", help="start initiator", action="store_true")
91 parser.add_argument("--stop-reflector", help="stop reflector", action="store_true")
92 parser.add_argument("--stop-initiator", help="stop initiator", action="store_true")
93
94 options = parser.parse_args()
95 if options.start_reflector:
96 start_reflector(options)
97 if options.start_initiator:
98 start_initiator(options)
99 if options.stop_reflector:
100 stop_test(options,REFLECTOR_ID_FILE)
101 if options.stop_initiator:
102 stop_test(options,INITIATOR_ID_FILE)
103