3 # This script sets up the physical network and NEMO Nodes for the NIC BoD flow.
4 # Use nemo-odl.py to set up the predefined NEMO definitions first.
8 from requests.auth import HTTPBasicAuth
13 TRANSACTION_BEGIN="http://%s:8181/restconf/operations/nemo-intent:begin-transaction"
14 TRANSACTION_END="http://%s:8181/restconf/operations/nemo-intent:end-transaction"
15 REGISTER_USER="http://%s:8181/restconf/operations/nemo-intent:register-user"
16 STRUCTURE_UPDATE_USERS="http://%s:8181/restconf/operations/nemo-intent:structure-style-nemo-update"
17 PHYSICAL_NETWORK="http://%s:8181/restconf/config/generic-physical-network:physical-network"
19 def create_physical_network(contHost):
25 "host-id": "22282cca-9a13-4d0c-a67e-a933ebb0b0ae",
26 "node-id": "openflow:2",
27 "host-name": "video-server2",
28 "mac-address": "00:00:00:00:00:04",
29 "port-id": "openflow:2:2",
37 "host-id": "7b796915-adf4-4356-b5ca-de005ac410c1",
38 "node-id": "openflow:1",
39 "host-name": "video-server1",
40 "mac-address": "00:00:00:00:00:01",
41 "port-id": "openflow:1:1",
49 "host-id": "6c787caa-156a-49ed-8546-547bdccf283c",
50 "node-id": "openflow:2",
52 "mac-address": "00:00:00:00:00:03",
53 "port-id": "openflow:2:1",
61 "host-id": "1eaf9a67-a171-42a8-9282-71cf702f61dd",
62 "node-id": "openflow:1",
64 "mac-address": "00:00:00:00:00:02",
65 "port-id": "openflow:1:2",
77 "node-id": "openflow:3",
80 "attribute-name": "location",
82 "string-value": "openflow:3"
86 "node-type": "router",
89 "port-id": "openflow:3:1",
92 "attribute-name": "location",
94 "string-value": "openflow:3:1"
98 "port-type": "internal",
99 "mac-address": "BE:DB:79:24:0A:B1",
103 "port-id": "openflow:3:2",
106 "attribute-name": "location",
108 "string-value": "openflow:3:2"
112 "port-type": "internal",
113 "mac-address": "06:E7:27:6D:C2:A5",
117 "port-id": "openflow:3:3",
120 "attribute-name": "location",
122 "string-value": "openflow:3:3"
126 "port-type": "internal",
127 "mac-address": "9E:00:76:D7:0C:1D",
131 "port-id": "openflow:3:4",
134 "attribute-name": "location",
136 "string-value": "openflow:3:4"
140 "port-type": "external",
141 "mac-address": "00:00:00:00:03:04",
147 "node-id": "openflow:4",
150 "attribute-name": "location",
152 "string-value": "openflow:4"
156 "node-type": "router",
159 "port-id": "openflow:4:2",
162 "attribute-name": "location",
164 "string-value": "openflow:4:2"
168 "port-type": "external",
169 "mac-address": "00:00:00:00:04:02",
173 "port-id": "openflow:4:1",
176 "attribute-name": "location",
178 "string-value": "openflow:4:1"
182 "port-type": "internal",
183 "mac-address": "4E:93:BE:EF:99:35",
189 "node-id": "openflow:1",
192 "attribute-name": "location",
194 "string-value": "openflow:1"
198 "node-type": "switch",
201 "port-id": "openflow:1:1",
204 "attribute-name": "location",
206 "string-value": "openflow:1:1"
210 "port-type": "external",
211 "mac-address": "BA:8C:1F:60:2C:FC",
215 "port-id": "openflow:1:2",
218 "attribute-name": "location",
220 "string-value": "openflow:1:2"
224 "port-type": "external",
225 "mac-address": "82:ED:57:DE:28:F0",
229 "port-id": "openflow:1:3",
232 "attribute-name": "location",
234 "string-value": "openflow:1:3"
238 "port-type": "internal",
239 "mac-address": "62:D3:F1:80:06:F0",
245 "node-id": "openflow:2",
248 "attribute-name": "location",
250 "string-value": "openflow:2"
254 "node-type": "switch",
257 "port-id": "openflow:2:3",
260 "attribute-name": "location",
262 "string-value": "openflow:2:3"
266 "port-type": "internal",
267 "mac-address": "42:33:22:43:EF:02",
271 "port-id": "openflow:2:2",
274 "attribute-name": "location",
276 "string-value": "openflow:2:2"
280 "port-type": "external",
281 "mac-address": "32:7C:45:B9:ED:18",
285 "port-id": "openflow:2:1",
288 "attribute-name": "location",
290 "string-value": "openflow:2:1"
294 "port-type": "external",
295 "mac-address": "D6:86:A8:54:2B:32",
305 "link-id": "openflow:4:1",
308 "src-port-id": "openflow:4:1",
309 "dest-node-id": "openflow:3",
311 "dest-port-id": "openflow:3:3",
313 "src-node-id": "openflow:4"
316 "link-id": "openflow:2:3",
319 "src-port-id": "openflow:2:3",
320 "dest-node-id": "openflow:3",
322 "dest-port-id": "openflow:3:2",
324 "src-node-id": "openflow:2"
327 "link-id": "openflow:3:1",
330 "src-port-id": "openflow:3:1",
331 "dest-node-id": "openflow:1",
333 "dest-port-id": "openflow:1:3",
335 "src-node-id": "openflow:3"
338 "link-id": "openflow:1:3",
341 "src-port-id": "openflow:1:3",
342 "dest-node-id": "openflow:3",
344 "dest-port-id": "openflow:3:1",
346 "src-node-id": "openflow:1"
349 "link-id": "openflow:3:3",
352 "src-port-id": "openflow:3:3",
353 "dest-node-id": "openflow:4",
355 "dest-port-id": "openflow:4:1",
357 "src-node-id": "openflow:3"
360 "link-id": "openflow:3:2",
363 "src-port-id": "openflow:3:2",
364 "dest-node-id": "openflow:2",
366 "dest-port-id": "openflow:2:3",
368 "src-node-id": "openflow:3"
374 put(PHYSICAL_NETWORK % contHost, data)
377 def register_user(contHost):
380 "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",
382 "user-password":"abc",
386 post(REGISTER_USER % contHost, data)
388 def transaction_begin(contHost):
391 "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b"
394 post(TRANSACTION_BEGIN % contHost, data)
396 def transaction_end(contHost):
399 "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b"
402 post(TRANSACTION_END % contHost, data)
404 def add_server1_host(contHost):
407 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
411 "node-name": "server1",
413 "node-id":"7b796915-adf4-4356-b5ca-de005ac410c1"
419 post(STRUCTURE_UPDATE_USERS % contHost, data)
421 def add_server2_host(contHost):
424 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
428 "node-name": "server2",
430 "node-id":"22282cca-9a13-4d0c-a67e-a933ebb0b0ae"
436 post(STRUCTURE_UPDATE_USERS % contHost, data)
438 def add_vm1_host(contHost):
441 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
447 "node-id":"1eaf9a67-a171-42a8-9282-71cf702f61dd"
453 post(STRUCTURE_UPDATE_USERS % contHost, data)
455 def add_vm2_host(contHost):
458 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
464 "node-id":"6c787caa-156a-49ed-8546-547bdccf283c"
470 post(STRUCTURE_UPDATE_USERS % contHost, data)
472 def add_enterpise_node(contHost):
475 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
479 "node-name": "enterprise",
480 "node-type": "ext-group",
483 "property-name": "location",
488 "value": "openflow:4:2"
494 "property-name": "ac-info-network",
505 "property-name": "ac-info-protocol",
516 "property-name": "ip-prefix",
521 "value": "192.168.13.0/24"
527 "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"
533 post(STRUCTURE_UPDATE_USERS % contHost, data)
535 def add_internet_node(contHost):
538 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
542 "node-name": "internet",
543 "node-type": "ext-group",
546 "property-name": "location",
551 "value": "openflow:3:4"
557 "property-name": "ac-info-network",
568 "property-name": "ac-info-protocol",
579 "property-name": "ip-prefix",
584 #wait for external network ip
585 "value": "172.168.1.0/24"
591 "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"
597 post(STRUCTURE_UPDATE_USERS % contHost, data)
599 def add_dmz_node(contHost):
602 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
607 "node-type": "l2-group",
610 "node-id":"7b796915-adf4-4356-b5ca-de005ac410c1",
616 "property-name": "location",
621 "value": "openflow:3"
627 "property-name": "ip-prefix",
632 "value": "192.168.11.0/24"
638 "property-name": "gateway-ip",
643 "value": "192.168.11.1"
649 "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"
655 post(STRUCTURE_UPDATE_USERS % contHost, data)
657 def add_interior_node(contHost):
660 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
664 "node-name": "interior",
665 "node-type": "l2-group",
668 "node-id":"22282cca-9a13-4d0c-a67e-a933ebb0b0ae",
672 "node-id":"1eaf9a67-a171-42a8-9282-71cf702f61dd",
676 "node-id":"6c787caa-156a-49ed-8546-547bdccf283c",
682 "property-name": "location",
687 "value": "openflow:3"
693 "property-name": "ip-prefix",
698 "value": "192.168.12.0/24"
704 "property-name": "gateway-ip",
709 "value": "192.168.12.1"
715 "node-id": "175425f7-c9c9-474a-962c-70cb6c180d4d"
721 post(STRUCTURE_UPDATE_USERS % contHost, data)
723 def add_enterprise_interior_connection(contHost):
726 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
730 "connection-name": "c1",
731 "connection-id": "30da6667-608e-4d2f-bb50-79e5cabcc523",
735 "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"
739 "node-id": "175425f7-c9c9-474a-962c-70cb6c180d4d"
742 "connection-type": "p2p",
745 "property-name": "bandwidth",
761 post(STRUCTURE_UPDATE_USERS % contHost, data)
763 def add_interior_dmz_connection(contHost):
766 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
770 "connection-name": "c2",
771 "connection-id": "b49e3960-c08d-4fff-b9fc-08b65ebcde2c",
775 "node-id": "175425f7-c9c9-474a-962c-70cb6c180d4d"
779 "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"
782 "connection-type": "p2p"
788 post(STRUCTURE_UPDATE_USERS % contHost, data)
790 def add_dmz_internet_connection(contHost):
793 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
797 "connection-name": "c3",
798 "connection-id": "e0d56fee-7235-4748-a2a1-eb5e3733d866",
802 "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"
806 "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"
809 "connection-type": "p2p"
815 post(STRUCTURE_UPDATE_USERS % contHost, data)
817 def update_enterprise_interior_connection(contHost):
820 "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
824 "connection-name": "c1",
825 "connection-id": "30da6667-608e-4d2f-bb50-79e5cabcc523",
829 "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"
833 "node-id": "175425f7-c9c9-474a-962c-70cb6c180d4d"
836 "connection-type": "p2p",
839 "property-name": "bandwidth",
855 post(STRUCTURE_UPDATE_USERS % contHost, data)
858 headers = {'Content-type': 'application/yang.data+json',
859 'Accept': 'application/yang.data+json'}
860 print "POST %s" % url
861 print json.dumps(data, indent=4, sort_keys=True)
862 r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
867 headers = {'Content-type': 'application/yang.data+json',
868 'Accept': 'application/yang.data+json'}
870 print json.dumps(data, indent=4, sort_keys=True)
871 r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
876 headers = {'Content-type': 'application/yang.data+json',
877 'Accept': 'application/yang.data+json'}
878 print "DELETE %s" % url
879 r = requests.delete(url, headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
884 if __name__ == '__main__':
886 parser = argparse.ArgumentParser()
887 parser.add_argument('--controller', default='127.0.0.1', help='controller IP')
888 args=parser.parse_args()
891 create_physical_network(args.controller)
894 register_user(args.controller)
897 transaction_begin(args.controller)
899 # IMPORT Node server1 Type host;
900 add_server1_host(args.controller)
902 # IMPORT Node server2 Type host;
903 add_server2_host(args.controller)
905 # IMPORT Node vm1 Type host;
906 add_vm1_host(args.controller)
908 # IMPORT Node vm2 Type host;
909 add_vm2_host(args.controller)
911 # IMPORT Node enterprise Type ext-group Property location:openflow:4:2, ip-prefix:192.18.13.0/24;
912 add_enterpise_node(args.controller)
914 # CREATE Node interior Type l2-group Contain server1,vm1,vm2;
915 add_interior_node(args.controller)
917 # CREATE Node dmz Type l2-group Contain server2;
918 add_dmz_node(args.controller)
920 # IMPORT Node internet Type ext-group Property location:openflow:3:4, ip-prefix:172.168.1.0/24;
921 add_internet_node(args.controller)
923 transaction_end(args.controller)