8e33de6aac192c59d80178feeefaf31cea286ef2
[transportpce.git] / tests / transportpce_tests / 2.2.1 / test_end2end.py
1 #!/usr/bin/env python
2 ##############################################################################
3 # Copyright (c) 2017 Orange, Inc. and others.  All rights reserved.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11
12 import json
13 import os
14 import psutil
15 import requests
16 import signal
17 import shutil
18 import subprocess
19 import time
20 import unittest
21 import test_utils
22
23
24 class TransportPCEFulltesting(unittest.TestCase):
25
26     processes = None
27     restconf_baseurl = "http://localhost:8181/restconf"
28     WAITING = 20  # nominal value is 300
29
30     @classmethod
31     def setUpClass(cls):
32         cls.processes = test_utils.start_tpce()
33         cls.processes = test_utils.start_sims(['xpdra', 'roadma', 'roadmc', 'xpdrc'])
34
35     @classmethod
36     def tearDownClass(cls):
37         for process in cls.processes:
38             test_utils.shutdown_process(process)
39         print("all processes killed")
40
41     def setUp(self):  # instruction executed before each test method
42         print("execution of {}".format(self.id().split(".")[-1]))
43
44 #  connect netconf devices
45     def test_01_connect_xpdrA(self):
46         url = ("{}/config/network-topology:"
47                "network-topology/topology/topology-netconf/node/XPDR-A1"
48                .format(self.restconf_baseurl))
49         data = {"node": [{
50             "node-id": "XPDR-A1",
51             "netconf-node-topology:username": "admin",
52             "netconf-node-topology:password": "admin",
53             "netconf-node-topology:host": "127.0.0.1",
54             "netconf-node-topology:port": test_utils.sims['xpdra']['port'],
55             "netconf-node-topology:tcp-only": "false",
56             "netconf-node-topology:pass-through": {}}]}
57         headers = {'content-type': 'application/json'}
58         response = requests.request(
59             "PUT", url, data=json.dumps(data), headers=headers,
60             auth=('admin', 'admin'))
61         self.assertEqual(response.status_code, requests.codes.created)
62         time.sleep(20)
63
64     def test_02_connect_xpdrC(self):
65         url = ("{}/config/network-topology:"
66                "network-topology/topology/topology-netconf/node/XPDR-C1"
67                .format(self.restconf_baseurl))
68         data = {"node": [{
69             "node-id": "XPDR-C1",
70             "netconf-node-topology:username": "admin",
71             "netconf-node-topology:password": "admin",
72             "netconf-node-topology:host": "127.0.0.1",
73             "netconf-node-topology:port": test_utils.sims['xpdrc']['port'],
74             "netconf-node-topology:tcp-only": "false",
75             "netconf-node-topology:pass-through": {}}]}
76         headers = {'content-type': 'application/json'}
77         response = requests.request(
78             "PUT", url, data=json.dumps(data), headers=headers,
79             auth=('admin', 'admin'))
80         self.assertEqual(response.status_code, requests.codes.created)
81         time.sleep(20)
82
83     def test_03_connect_rdmA(self):
84         url = ("{}/config/network-topology:"
85                "network-topology/topology/topology-netconf/node/ROADM-A1"
86                .format(self.restconf_baseurl))
87         data = {"node": [{
88             "node-id": "ROADM-A1",
89             "netconf-node-topology:username": "admin",
90             "netconf-node-topology:password": "admin",
91             "netconf-node-topology:host": "127.0.0.1",
92             "netconf-node-topology:port": test_utils.sims['roadma']['port'],
93             "netconf-node-topology:tcp-only": "false",
94             "netconf-node-topology:pass-through": {}}]}
95         headers = {'content-type': 'application/json'}
96         response = requests.request(
97             "PUT", url, data=json.dumps(data), headers=headers,
98             auth=('admin', 'admin'))
99         self.assertEqual(response.status_code, requests.codes.created)
100         time.sleep(20)
101
102     def test_04_connect_rdmC(self):
103         url = ("{}/config/network-topology:"
104                "network-topology/topology/topology-netconf/node/ROADM-C1"
105                .format(self.restconf_baseurl))
106         data = {"node": [{
107             "node-id": "ROADM-C1",
108             "netconf-node-topology:username": "admin",
109             "netconf-node-topology:password": "admin",
110             "netconf-node-topology:host": "127.0.0.1",
111             "netconf-node-topology:port": test_utils.sims['roadmc']['port'],
112             "netconf-node-topology:tcp-only": "false",
113             "netconf-node-topology:pass-through": {}}]}
114         headers = {'content-type': 'application/json'}
115         response = requests.request(
116             "PUT", url, data=json.dumps(data), headers=headers,
117             auth=('admin', 'admin'))
118         self.assertEqual(response.status_code, requests.codes.created)
119         time.sleep(20)
120
121     def test_05_connect_xprdA_N1_to_roadmA_PP1(self):
122         url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links".format(self.restconf_baseurl)
123         data = {
124             "networkutils:input": {
125                 "networkutils:links-input": {
126                     "networkutils:xpdr-node": "XPDR-A1",
127                     "networkutils:xpdr-num": "1",
128                     "networkutils:network-num": "1",
129                     "networkutils:rdm-node": "ROADM-A1",
130                     "networkutils:srg-num": "1",
131                     "networkutils:termination-point-num": "SRG1-PP1-TXRX"
132                 }
133             }
134         }
135         headers = {'content-type': 'application/json'}
136         response = requests.request(
137             "POST", url, data=json.dumps(data),
138             headers=headers, auth=('admin', 'admin'))
139         self.assertEqual(response.status_code, requests.codes.ok)
140         res = response.json()
141         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
142         time.sleep(2)
143
144     def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
145         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
146         data = {
147             "networkutils:input": {
148                 "networkutils:links-input": {
149                     "networkutils:xpdr-node": "XPDR-A1",
150                     "networkutils:xpdr-num": "1",
151                     "networkutils:network-num": "1",
152                     "networkutils:rdm-node": "ROADM-A1",
153                     "networkutils:srg-num": "1",
154                     "networkutils:termination-point-num": "SRG1-PP1-TXRX"
155                 }
156             }
157         }
158         headers = {'content-type': 'application/json'}
159         response = requests.request(
160             "POST", url, data=json.dumps(data),
161             headers=headers, auth=('admin', 'admin'))
162         self.assertEqual(response.status_code, requests.codes.ok)
163         res = response.json()
164         self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
165         time.sleep(2)
166
167     def test_07_connect_xprdC_N1_to_roadmC_PP1(self):
168         url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links".format(self.restconf_baseurl)
169         data = {
170             "networkutils:input": {
171                 "networkutils:links-input": {
172                     "networkutils:xpdr-node": "XPDR-C1",
173                     "networkutils:xpdr-num": "1",
174                     "networkutils:network-num": "1",
175                     "networkutils:rdm-node": "ROADM-C1",
176                     "networkutils:srg-num": "1",
177                     "networkutils:termination-point-num": "SRG1-PP1-TXRX"
178                 }
179             }
180         }
181         headers = {'content-type': 'application/json'}
182         response = requests.request(
183             "POST", url, data=json.dumps(data),
184             headers=headers, auth=('admin', 'admin'))
185         self.assertEqual(response.status_code, requests.codes.ok)
186         res = response.json()
187         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
188         time.sleep(2)
189
190     def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
191         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
192         data = {
193             "networkutils:input": {
194                 "networkutils:links-input": {
195                     "networkutils:xpdr-node": "XPDR-C1",
196                     "networkutils:xpdr-num": "1",
197                     "networkutils:network-num": "1",
198                     "networkutils:rdm-node": "ROADM-C1",
199                     "networkutils:srg-num": "1",
200                     "networkutils:termination-point-num": "SRG1-PP1-TXRX"
201                 }
202             }
203         }
204         headers = {'content-type': 'application/json'}
205         response = requests.request(
206             "POST", url, data=json.dumps(data),
207             headers=headers, auth=('admin', 'admin'))
208         self.assertEqual(response.status_code, requests.codes.ok)
209         res = response.json()
210         self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
211         time.sleep(2)
212
213     def test_09_add_omsAttributes_ROADMA_ROADMC(self):
214         # Config ROADMA-ROADMC oms-attributes
215         url = ("{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:"
216                "link/ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX/org-openroadm-network-topology:"
217                "OMS-attributes/span"
218                .format(self.restconf_baseurl))
219         data = {"span": {
220             "auto-spanloss": "true",
221             "spanloss-base": 11.4,
222             "spanloss-current": 12,
223             "engineered-spanloss": 12.2,
224             "link-concatenation": [{
225                 "SRLG-Id": 0,
226                 "fiber-type": "smf",
227                 "SRLG-length": 100000,
228                 "pmd": 0.5}]}}
229         headers = {'content-type': 'application/json'}
230         response = requests.request(
231             "PUT", url, data=json.dumps(data), headers=headers,
232             auth=('admin', 'admin'))
233         self.assertEqual(response.status_code, requests.codes.created)
234
235     def test_10_add_omsAttributes_ROADMC_ROADMA(self):
236         # Config ROADMC-ROADMA oms-attributes
237         url = ("{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:"
238                "link/ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX/org-openroadm-network-topology:"
239                "OMS-attributes/span"
240                .format(self.restconf_baseurl))
241         data = {"span": {
242             "auto-spanloss": "true",
243             "spanloss-base": 11.4,
244             "spanloss-current": 12,
245             "engineered-spanloss": 12.2,
246             "link-concatenation": [{
247                 "SRLG-Id": 0,
248                 "fiber-type": "smf",
249                 "SRLG-length": 100000,
250                 "pmd": 0.5}]}}
251         headers = {'content-type': 'application/json'}
252         response = requests.request(
253             "PUT", url, data=json.dumps(data), headers=headers,
254             auth=('admin', 'admin'))
255         self.assertEqual(response.status_code, requests.codes.created)
256
257 # test service-create for Eth service from xpdr to xpdr
258     def test_11_create_eth_service1(self):
259         url = ("{}/operations/org-openroadm-service:service-create"
260                .format(self.restconf_baseurl))
261         data = {"input": {
262                 "sdnc-request-header": {
263                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
264                     "rpc-action": "service-create",
265                     "request-system-id": "appname",
266                     "notification-url": "http://localhost:8585/NotificationServer/notify"
267                 },
268                 "service-name": "service1",
269                 "common-id": "ASATT1234567",
270                 "connection-type": "service",
271                 "service-a-end": {
272                     "service-rate": "100",
273                     "node-id": "XPDR-A1",
274                     "service-format": "Ethernet",
275                     "clli": "SNJSCAMCJP8",
276                     "tx-direction": {
277                         "port": {
278                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
279                             "port-type": "router",
280                             "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
281                             "port-rack": "000000.00",
282                             "port-shelf": "00"
283                         },
284                         "lgx": {
285                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
286                             "lgx-port-name": "LGX Back.3",
287                             "lgx-port-rack": "000000.00",
288                             "lgx-port-shelf": "00"
289                         }
290                     },
291                     "rx-direction": {
292                         "port": {
293                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
294                             "port-type": "router",
295                             "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
296                             "port-rack": "000000.00",
297                             "port-shelf": "00"
298                         },
299                         "lgx": {
300                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
301                             "lgx-port-name": "LGX Back.4",
302                             "lgx-port-rack": "000000.00",
303                             "lgx-port-shelf": "00"
304                         }
305                     },
306                     "optic-type": "gray"
307                 },
308                 "service-z-end": {
309                     "service-rate": "100",
310                     "node-id": "XPDR-C1",
311                     "service-format": "Ethernet",
312                     "clli": "SNJSCAMCJT4",
313                     "tx-direction": {
314                         "port": {
315                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
316                             "port-type": "router",
317                             "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
318                             "port-rack": "000000.00",
319                             "port-shelf": "00"
320                         },
321                         "lgx": {
322                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
323                             "lgx-port-name": "LGX Back.29",
324                             "lgx-port-rack": "000000.00",
325                             "lgx-port-shelf": "00"
326                         }
327                     },
328                     "rx-direction": {
329                         "port": {
330                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
331                             "port-type": "router",
332                             "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
333                             "port-rack": "000000.00",
334                             "port-shelf": "00"
335                         },
336                         "lgx": {
337                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
338                             "lgx-port-name": "LGX Back.30",
339                             "lgx-port-rack": "000000.00",
340                             "lgx-port-shelf": "00"
341                         }
342                     },
343                     "optic-type": "gray"
344                 },
345                 "due-date": "2016-11-28T00:00:01Z",
346                 "operator-contact": "pw1234"
347                 }
348                 }
349         headers = {'content-type': 'application/json',
350                    "Accept": "application/json"}
351         response = requests.request(
352             "POST", url, data=json.dumps(data), headers=headers,
353             auth=('admin', 'admin'))
354         self.assertEqual(response.status_code, requests.codes.ok)
355         res = response.json()
356         self.assertIn('PCE calculation in progress',
357                       res['output']['configuration-response-common']['response-message'])
358         time.sleep(self.WAITING)
359
360     def test_12_get_eth_service1(self):
361         url = ("{}/operational/org-openroadm-service:service-list/services/service1"
362                .format(self.restconf_baseurl))
363         headers = {'content-type': 'application/json',
364                    "Accept": "application/json"}
365         response = requests.request(
366             "GET", url, headers=headers, auth=('admin', 'admin'))
367         self.assertEqual(response.status_code, requests.codes.ok)
368         res = response.json()
369         self.assertEqual(
370             res['services'][0]['administrative-state'], 'inService')
371         self.assertEqual(
372             res['services'][0]['service-name'], 'service1')
373         self.assertEqual(
374             res['services'][0]['connection-type'], 'service')
375         self.assertEqual(
376             res['services'][0]['lifecycle-state'], 'planned')
377         time.sleep(2)
378
379     def test_13_check_xc1_ROADMA(self):
380         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
381                "node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
382                "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-1"
383                .format(self.restconf_baseurl))
384         headers = {'content-type': 'application/json'}
385         response = requests.request(
386             "GET", url, headers=headers, auth=('admin', 'admin'))
387         self.assertEqual(response.status_code, requests.codes.ok)
388         res = response.json()
389         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
390         self.assertDictEqual(
391             dict({
392                 'connection-name': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-1',
393                 'opticalControlMode': 'gainLoss',
394                 'target-output-power': -3.0
395             }, **res['roadm-connections'][0]),
396             res['roadm-connections'][0]
397         )
398         self.assertDictEqual(
399             {'src-if': 'SRG1-PP1-TXRX-nmc-1'},
400             res['roadm-connections'][0]['source'])
401         self.assertDictEqual(
402             {'dst-if': 'DEG2-TTP-TXRX-nmc-1'},
403             res['roadm-connections'][0]['destination'])
404         time.sleep(5)
405
406     def test_14_check_xc1_ROADMC(self):
407         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
408                "node/ROADM-C1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
409                "roadm-connections/SRG1-PP1-TXRX-DEG1-TTP-TXRX-1"
410                .format(self.restconf_baseurl))
411         headers = {'content-type': 'application/json'}
412         response = requests.request(
413             "GET", url, headers=headers, auth=('admin', 'admin'))
414         self.assertEqual(response.status_code, requests.codes.ok)
415         res = response.json()
416         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
417         self.assertDictEqual(
418             dict({
419                 'connection-name': 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-1',
420                 'opticalControlMode': 'gainLoss',
421                 'target-output-power': -3.0
422             }, **res['roadm-connections'][0]),
423             res['roadm-connections'][0]
424         )
425         self.assertDictEqual(
426             {'src-if': 'SRG1-PP1-TXRX-nmc-1'},
427             res['roadm-connections'][0]['source'])
428         self.assertDictEqual(
429             {'dst-if': 'DEG1-TTP-TXRX-nmc-1'},
430             res['roadm-connections'][0]['destination'])
431         time.sleep(5)
432
433     def test_15_check_topo_XPDRA(self):
434         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/XPDR-A1-XPDR1"
435                 .format(self.restconf_baseurl))
436         response = requests.request(
437             "GET", url1, auth=('admin', 'admin'))
438         self.assertEqual(response.status_code, requests.codes.ok)
439         res = response.json()
440         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
441         for ele in liste_tp:
442             if ele['tp-id'] == 'XPDR1-NETWORK1':
443                 self.assertEqual({u'frequency': 196.1,
444                                   u'width': 40},
445                                  ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
446             if ele['tp-id'] == 'XPDR1-CLIENT2' or ele['tp-id'] == 'XPDR1-CLIENT1':
447                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
448             if ele['tp-id'] == 'XPDR1-NETWORK2':
449                 self.assertNotIn('org-openroadm-network-topology:xpdr-network-attributes', dict.keys(ele))
450         time.sleep(3)
451
452     def test_16_check_topo_ROADMA_SRG1(self):
453         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-SRG1"
454                 .format(self.restconf_baseurl))
455         response = requests.request(
456             "GET", url1, auth=('admin', 'admin'))
457         self.assertEqual(response.status_code, requests.codes.ok)
458         res = response.json()
459         self.assertNotIn({u'index': 1},
460                          res['node'][0][u'org-openroadm-network-topology:srg-attributes']['available-wavelengths'])
461         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
462         for ele in liste_tp:
463             if ele['tp-id'] == 'SRG1-PP1-TXRX':
464                 self.assertIn({u'index': 1, u'frequency': 196.1,
465                                u'width': 40},
466                               ele['org-openroadm-network-topology:pp-attributes']['used-wavelength'])
467             if ele['tp-id'] == 'SRG1-PP2-TXRX':
468                 self.assertNotIn('used-wavelength', dict.keys(ele))
469         time.sleep(3)
470
471     def test_17_check_topo_ROADMA_DEG1(self):
472         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-DEG2"
473                 .format(self.restconf_baseurl))
474         response = requests.request(
475             "GET", url1, auth=('admin', 'admin'))
476         self.assertEqual(response.status_code, requests.codes.ok)
477         res = response.json()
478         self.assertNotIn({u'index': 1},
479                          res['node'][0][u'org-openroadm-network-topology:degree-attributes']['available-wavelengths'])
480         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
481         for ele in liste_tp:
482             if ele['tp-id'] == 'DEG2-CTP-TXRX':
483                 self.assertIn({u'index': 1, u'frequency': 196.1,
484                                u'width': 40},
485                               ele['org-openroadm-network-topology:ctp-attributes']['used-wavelengths'])
486             if ele['tp-id'] == 'DEG2-TTP-TXRX':
487                 self.assertIn({u'index': 1, u'frequency': 196.1,
488                                u'width': 40},
489                               ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths'])
490         time.sleep(3)
491
492     def test_18_connect_xprdA_N2_to_roadmA_PP2(self):
493         url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links".format(self.restconf_baseurl)
494         data = {
495             "networkutils:input": {
496                 "networkutils:links-input": {
497                     "networkutils:xpdr-node": "XPDR-A1",
498                     "networkutils:xpdr-num": "1",
499                     "networkutils:network-num": "2",
500                     "networkutils:rdm-node": "ROADM-A1",
501                     "networkutils:srg-num": "1",
502                     "networkutils:termination-point-num": "SRG1-PP2-TXRX"
503                 }
504             }
505         }
506         headers = {'content-type': 'application/json'}
507         response = requests.request(
508             "POST", url, data=json.dumps(data),
509             headers=headers, auth=('admin', 'admin'))
510         self.assertEqual(response.status_code, requests.codes.ok)
511         res = response.json()
512         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
513         time.sleep(2)
514
515     def test_19_connect_roadmA_PP2_to_xpdrA_N2(self):
516         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
517         data = {
518             "networkutils:input": {
519                 "networkutils:links-input": {
520                     "networkutils:xpdr-node": "XPDR-A1",
521                     "networkutils:xpdr-num": "1",
522                     "networkutils:network-num": "2",
523                     "networkutils:rdm-node": "ROADM-A1",
524                     "networkutils:srg-num": "1",
525                     "networkutils:termination-point-num": "SRG1-PP2-TXRX"
526                 }
527             }
528         }
529         headers = {'content-type': 'application/json'}
530         response = requests.request(
531             "POST", url, data=json.dumps(data),
532             headers=headers, auth=('admin', 'admin'))
533         self.assertEqual(response.status_code, requests.codes.ok)
534         res = response.json()
535         self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
536         time.sleep(2)
537
538     def test_20_connect_xprdC_N2_to_roadmC_PP2(self):
539         url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links".format(self.restconf_baseurl)
540         data = {
541             "networkutils:input": {
542                 "networkutils:links-input": {
543                     "networkutils:xpdr-node": "XPDR-C1",
544                     "networkutils:xpdr-num": "1",
545                     "networkutils:network-num": "2",
546                     "networkutils:rdm-node": "ROADM-C1",
547                     "networkutils:srg-num": "1",
548                     "networkutils:termination-point-num": "SRG1-PP2-TXRX"
549                 }
550             }
551         }
552         headers = {'content-type': 'application/json'}
553         response = requests.request(
554             "POST", url, data=json.dumps(data),
555             headers=headers, auth=('admin', 'admin'))
556         self.assertEqual(response.status_code, requests.codes.ok)
557         res = response.json()
558         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
559         time.sleep(2)
560
561     def test_21_connect_roadmC_PP2_to_xpdrC_N2(self):
562         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
563         data = {
564             "networkutils:input": {
565                 "networkutils:links-input": {
566                     "networkutils:xpdr-node": "XPDR-C1",
567                     "networkutils:xpdr-num": "1",
568                     "networkutils:network-num": "2",
569                     "networkutils:rdm-node": "ROADM-C1",
570                     "networkutils:srg-num": "1",
571                     "networkutils:termination-point-num": "SRG1-PP2-TXRX"
572                 }
573             }
574         }
575         headers = {'content-type': 'application/json'}
576         response = requests.request(
577             "POST", url, data=json.dumps(data),
578             headers=headers, auth=('admin', 'admin'))
579         self.assertEqual(response.status_code, requests.codes.ok)
580         res = response.json()
581         self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
582         time.sleep(2)
583
584     def test_22_create_eth_service2(self):
585         url = ("{}/operations/org-openroadm-service:service-create"
586                .format(self.restconf_baseurl))
587         data = {"input": {
588                 "sdnc-request-header": {
589                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
590                     "rpc-action": "service-create",
591                     "request-system-id": "appname",
592                     "notification-url": "http://localhost:8585/NotificationServer/notify"
593                 },
594                 "service-name": "service2",
595                 "common-id": "ASATT1234567",
596                 "connection-type": "service",
597                 "service-a-end": {
598                     "service-rate": "100",
599                     "node-id": "XPDR-A1",
600                     "service-format": "Ethernet",
601                     "clli": "SNJSCAMCJP8",
602                     "tx-direction": {
603                         "port": {
604                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
605                             "port-type": "router",
606                             "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
607                             "port-rack": "000000.00",
608                             "port-shelf": "00"
609                         },
610                         "lgx": {
611                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
612                             "lgx-port-name": "LGX Back.3",
613                             "lgx-port-rack": "000000.00",
614                             "lgx-port-shelf": "00"
615                         }
616                     },
617                     "rx-direction": {
618                         "port": {
619                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
620                             "port-type": "router",
621                             "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
622                             "port-rack": "000000.00",
623                             "port-shelf": "00"
624                         },
625                         "lgx": {
626                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
627                             "lgx-port-name": "LGX Back.4",
628                             "lgx-port-rack": "000000.00",
629                             "lgx-port-shelf": "00"
630                         }
631                     },
632                     "optic-type": "gray"
633                 },
634                 "service-z-end": {
635                     "service-rate": "100",
636                     "node-id": "XPDR-C1",
637                     "service-format": "Ethernet",
638                     "clli": "SNJSCAMCJT4",
639                     "tx-direction": {
640                         "port": {
641                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
642                             "port-type": "router",
643                             "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
644                             "port-rack": "000000.00",
645                             "port-shelf": "00"
646                         },
647                         "lgx": {
648                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
649                             "lgx-port-name": "LGX Back.29",
650                             "lgx-port-rack": "000000.00",
651                             "lgx-port-shelf": "00"
652                         }
653                     },
654                     "rx-direction": {
655                         "port": {
656                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
657                             "port-type": "router",
658                             "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
659                             "port-rack": "000000.00",
660                             "port-shelf": "00"
661                         },
662                         "lgx": {
663                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
664                             "lgx-port-name": "LGX Back.30",
665                             "lgx-port-rack": "000000.00",
666                             "lgx-port-shelf": "00"
667                         }
668                     },
669                     "optic-type": "gray"
670                 },
671                 "due-date": "2016-11-28T00:00:01Z",
672                 "operator-contact": "pw1234"
673                 }
674                 }
675         headers = {'content-type': 'application/json',
676                    "Accept": "application/json"}
677         response = requests.request(
678             "POST", url, data=json.dumps(data), headers=headers,
679             auth=('admin', 'admin'))
680         self.assertEqual(response.status_code, requests.codes.ok)
681         res = response.json()
682         self.assertIn('PCE calculation in progress',
683                       res['output']['configuration-response-common']['response-message'])
684         time.sleep(self.WAITING)
685
686     def test_23_get_eth_service2(self):
687         url = ("{}/operational/org-openroadm-service:service-list/services/service2"
688                .format(self.restconf_baseurl))
689         headers = {'content-type': 'application/json',
690                    "Accept": "application/json"}
691         response = requests.request(
692             "GET", url, headers=headers, auth=('admin', 'admin'))
693         self.assertEqual(response.status_code, requests.codes.ok)
694         res = response.json()
695         self.assertEqual(
696             res['services'][0]['administrative-state'],
697             'inService')
698         self.assertEqual(
699             res['services'][0]['service-name'], 'service2')
700         self.assertEqual(
701             res['services'][0]['connection-type'], 'service')
702         self.assertEqual(
703             res['services'][0]['lifecycle-state'], 'planned')
704         time.sleep(1)
705
706     def test_24_check_xc2_ROADMA(self):
707         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
708                "node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
709                "roadm-connections/DEG2-TTP-TXRX-SRG1-PP2-TXRX-2"
710                .format(self.restconf_baseurl))
711         headers = {'content-type': 'application/json'}
712         response = requests.request(
713             "GET", url, headers=headers, auth=('admin', 'admin'))
714         self.assertEqual(response.status_code, requests.codes.ok)
715         res = response.json()
716         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
717         self.assertDictEqual(
718             dict({
719                 'connection-name': 'DEG2-TTP-TXRX-SRG1-PP2-TXRX-2',
720                 'opticalControlMode': 'power'
721             }, **res['roadm-connections'][0]),
722             res['roadm-connections'][0]
723         )
724         self.assertDictEqual(
725             {'src-if': 'DEG2-TTP-TXRX-nmc-2'},
726             res['roadm-connections'][0]['source'])
727         self.assertDictEqual(
728             {'dst-if': 'SRG1-PP2-TXRX-nmc-2'},
729             res['roadm-connections'][0]['destination'])
730
731     def test_25_check_topo_XPDRA(self):
732         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/XPDR-A1-XPDR1"
733                 .format(self.restconf_baseurl))
734         response = requests.request(
735             "GET", url1, auth=('admin', 'admin'))
736         self.assertEqual(response.status_code, requests.codes.ok)
737         res = response.json()
738         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
739         for ele in liste_tp:
740             if ele['tp-id'] == 'XPDR1-NETWORK1':
741                 self.assertEqual({u'frequency': 196.1,
742                                   u'width': 40},
743                                  ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
744             if ele['tp-id'] == 'XPDR1-NETWORK2':
745                 self.assertEqual({u'frequency': 196.05,
746                                   u'width': 40},
747                                  ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
748             if ele['tp-id'] == 'XPDR1-CLIENT1' or ele['tp-id'] == 'XPDR1-CLIENT2':
749                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
750         time.sleep(10)
751
752     def test_26_check_topo_ROADMA_SRG1(self):
753         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-SRG1"
754                 .format(self.restconf_baseurl))
755         response = requests.request(
756             "GET", url1, auth=('admin', 'admin'))
757         self.assertEqual(response.status_code, requests.codes.ok)
758         res = response.json()
759         self.assertNotIn({u'index': 1}, res['node'][0]
760                          [u'org-openroadm-network-topology:srg-attributes']['available-wavelengths'])
761         self.assertNotIn({u'index': 2}, res['node'][0]
762                          [u'org-openroadm-network-topology:srg-attributes']['available-wavelengths'])
763         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
764         for ele in liste_tp:
765             if ele['tp-id'] == 'SRG1-PP1-TXRX':
766                 self.assertIn({u'index': 1, u'frequency': 196.1,
767                                u'width': 40},
768                               ele['org-openroadm-network-topology:pp-attributes']['used-wavelength'])
769                 self.assertNotIn({u'index': 2, u'frequency': 196.05,
770                                   u'width': 40},
771                                  ele['org-openroadm-network-topology:pp-attributes']['used-wavelength'])
772             if ele['tp-id'] == 'SRG1-PP2-TXRX':
773                 self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40},
774                               ele['org-openroadm-network-topology:pp-attributes']['used-wavelength'])
775                 self.assertNotIn({u'index': 1, u'frequency': 196.1,
776                                   u'width': 40},
777                                  ele['org-openroadm-network-topology:pp-attributes']['used-wavelength'])
778             if ele['tp-id'] == 'SRG1-PP3-TXRX':
779                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
780         time.sleep(10)
781
782     def test_27_check_topo_ROADMA_DEG2(self):
783         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-DEG2"
784                 .format(self.restconf_baseurl))
785         response = requests.request(
786             "GET", url1, auth=('admin', 'admin'))
787         self.assertEqual(response.status_code, requests.codes.ok)
788         res = response.json()
789         self.assertNotIn({u'index': 1}, res['node'][0]
790                          [u'org-openroadm-network-topology:degree-attributes']['available-wavelengths'])
791         self.assertNotIn({u'index': 2}, res['node'][0]
792                          [u'org-openroadm-network-topology:degree-attributes']['available-wavelengths'])
793         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
794         for ele in liste_tp:
795             if ele['tp-id'] == 'DEG2-CTP-TXRX':
796                 self.assertIn({u'index': 1, u'frequency': 196.1,
797                                u'width': 40},
798                               ele['org-openroadm-network-topology:ctp-attributes']['used-wavelengths'])
799                 self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40},
800                               ele['org-openroadm-network-topology:ctp-attributes']['used-wavelengths'])
801             if ele['tp-id'] == 'DEG2-TTP-TXRX':
802                 self.assertIn({u'index': 1, u'frequency': 196.1,
803                                u'width': 40},
804                               ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths'])
805                 self.assertIn({u'index': 2, u'frequency': 196.05, u'width': 40},
806                               ele['org-openroadm-network-topology:tx-ttp-attributes']['used-wavelengths'])
807         time.sleep(10)
808
809 #     creation service test on a non-available resource
810     def test_28_create_eth_service3(self):
811         url = ("{}/operations/org-openroadm-service:service-create"
812                .format(self.restconf_baseurl))
813         data = {"input": {
814                 "sdnc-request-header": {
815                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
816                     "rpc-action": "service-create",
817                     "request-system-id": "appname",
818                     "notification-url": "http://localhost:8585/NotificationServer/notify"
819                 },
820                 "service-name": "service3",
821                 "common-id": "ASATT1234567",
822                 "connection-type": "service",
823                 "service-a-end": {
824                     "service-rate": "100",
825                     "node-id": "XPDR-A1",
826                     "service-format": "Ethernet",
827                     "clli": "SNJSCAMCJP8",
828                     "tx-direction": {
829                         "port": {
830                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
831                             "port-type": "router",
832                             "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
833                             "port-rack": "000000.00",
834                             "port-shelf": "00"
835                         },
836                         "lgx": {
837                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
838                             "lgx-port-name": "LGX Back.3",
839                             "lgx-port-rack": "000000.00",
840                             "lgx-port-shelf": "00"
841                         }
842                     },
843                     "rx-direction": {
844                         "port": {
845                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
846                             "port-type": "router",
847                             "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
848                             "port-rack": "000000.00",
849                             "port-shelf": "00"
850                         },
851                         "lgx": {
852                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
853                             "lgx-port-name": "LGX Back.4",
854                             "lgx-port-rack": "000000.00",
855                             "lgx-port-shelf": "00"
856                         }
857                     },
858                     "optic-type": "gray"
859                 },
860                 "service-z-end": {
861                     "service-rate": "100",
862                     "node-id": "XPDR-C1",
863                     "service-format": "Ethernet",
864                     "clli": "SNJSCAMCJT4",
865                     "tx-direction": {
866                         "port": {
867                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
868                             "port-type": "router",
869                             "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
870                             "port-rack": "000000.00",
871                             "port-shelf": "00"
872                         },
873                         "lgx": {
874                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
875                             "lgx-port-name": "LGX Back.29",
876                             "lgx-port-rack": "000000.00",
877                             "lgx-port-shelf": "00"
878                         }
879                     },
880                     "rx-direction": {
881                         "port": {
882                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
883                             "port-type": "router",
884                             "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
885                             "port-rack": "000000.00",
886                             "port-shelf": "00"
887                         },
888                         "lgx": {
889                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
890                             "lgx-port-name": "LGX Back.30",
891                             "lgx-port-rack": "000000.00",
892                             "lgx-port-shelf": "00"
893                         }
894                     },
895                     "optic-type": "gray"
896                 },
897                 "due-date": "2016-11-28T00:00:01Z",
898                 "operator-contact": "pw1234"
899                 }
900                 }
901         headers = {'content-type': 'application/json',
902                    "Accept": "application/json"}
903         response = requests.request(
904             "POST", url, data=json.dumps(data), headers=headers,
905             auth=('admin', 'admin'))
906         self.assertEqual(response.status_code, requests.codes.ok)
907         res = response.json()
908         self.assertIn('PCE calculation in progress',
909                       res['output']['configuration-response-common']['response-message'])
910         self.assertIn('200', res['output']['configuration-response-common']['response-code'])
911         time.sleep(self.WAITING)
912
913 # add a test that check the openroadm-service-list still only contains 2 elements
914     def test_29_delete_eth_service3(self):
915         url = ("{}/operations/org-openroadm-service:service-delete"
916                .format(self.restconf_baseurl))
917         data = {"input": {
918                 "sdnc-request-header": {
919                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
920                     "rpc-action": "service-delete",
921                     "request-system-id": "appname",
922                     "notification-url": "http://localhost:8585/NotificationServer/notify"
923                 },
924                 "service-delete-req-info": {
925                     "service-name": "service3",
926                     "tail-retention": "no"
927                 }
928                 }
929                 }
930         headers = {'content-type': 'application/json'}
931         response = requests.request(
932             "POST", url, data=json.dumps(data), headers=headers,
933             auth=('admin', 'admin'))
934         self.assertEqual(response.status_code, requests.codes.ok)
935         res = response.json()
936         self.assertIn('Service \'service3\' does not exist in datastore',
937                       res['output']['configuration-response-common']['response-message'])
938         self.assertIn('500', res['output']['configuration-response-common']['response-code'])
939         time.sleep(20)
940
941     def test_30_delete_eth_service1(self):
942         url = ("{}/operations/org-openroadm-service:service-delete"
943                .format(self.restconf_baseurl))
944         data = {"input": {
945                 "sdnc-request-header": {
946                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
947                     "rpc-action": "service-delete",
948                     "request-system-id": "appname",
949                     "notification-url": "http://localhost:8585/NotificationServer/notify"
950                 },
951                 "service-delete-req-info": {
952                     "service-name": "service1",
953                     "tail-retention": "no"
954                 }
955                 }
956                 }
957         headers = {'content-type': 'application/json'}
958         response = requests.request(
959             "POST", url, data=json.dumps(data), headers=headers,
960             auth=('admin', 'admin'))
961         self.assertEqual(response.status_code, requests.codes.ok)
962         res = response.json()
963         self.assertIn('Renderer service delete in progress',
964                       res['output']['configuration-response-common']['response-message'])
965         time.sleep(20)
966
967     def test_31_delete_eth_service2(self):
968         url = ("{}/operations/org-openroadm-service:service-delete"
969                .format(self.restconf_baseurl))
970         data = {"input": {
971                 "sdnc-request-header": {
972                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
973                     "rpc-action": "service-delete",
974                     "request-system-id": "appname",
975                     "notification-url": "http://localhost:8585/NotificationServer/notify"
976                 },
977                 "service-delete-req-info": {
978                     "service-name": "service2",
979                     "tail-retention": "no"
980                 }
981                 }
982                 }
983         headers = {'content-type': 'application/json'}
984         response = requests.request(
985             "POST", url, data=json.dumps(data), headers=headers,
986             auth=('admin', 'admin'))
987         self.assertEqual(response.status_code, requests.codes.ok)
988         res = response.json()
989         self.assertIn('Renderer service delete in progress',
990                       res['output']['configuration-response-common']['response-message'])
991         time.sleep(20)
992
993     def test_32_check_no_xc_ROADMA(self):
994         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
995                "node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
996                .format(self.restconf_baseurl))
997         response = requests.request(
998             "GET", url, auth=('admin', 'admin'))
999         res = response.json()
1000         self.assertEqual(response.status_code, requests.codes.ok)
1001         self.assertNotIn('roadm-connections', dict.keys(res['org-openroadm-device']))
1002         time.sleep(2)
1003
1004     def test_33_check_topo_XPDRA(self):
1005         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/XPDR-A1-XPDR1"
1006                 .format(self.restconf_baseurl))
1007         response = requests.request(
1008             "GET", url1, auth=('admin', 'admin'))
1009         self.assertEqual(response.status_code, requests.codes.ok)
1010         res = response.json()
1011         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
1012         for ele in liste_tp:
1013             if ele[u'org-openroadm-common-network:tp-type'] == 'XPONDER-CLIENT':
1014                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
1015             elif (ele[u'org-openroadm-common-network:tp-type'] == 'XPONDER-NETWORK'):
1016                 self.assertIn(u'tail-equipment-id',
1017                               dict.keys(ele[u'org-openroadm-network-topology:xpdr-network-attributes']))
1018                 self.assertNotIn('wavelength', dict.keys(
1019                     ele[u'org-openroadm-network-topology:xpdr-network-attributes']))
1020         time.sleep(10)
1021
1022     def test_34_check_topo_ROADMA_SRG1(self):
1023         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-SRG1"
1024                 .format(self.restconf_baseurl))
1025         response = requests.request(
1026             "GET", url1, auth=('admin', 'admin'))
1027         self.assertEqual(response.status_code, requests.codes.ok)
1028         res = response.json()
1029         self.assertIn({u'index': 1}, res['node'][0]
1030                       [u'org-openroadm-network-topology:srg-attributes']['available-wavelengths'])
1031         self.assertIn({u'index': 2}, res['node'][0]
1032                       [u'org-openroadm-network-topology:srg-attributes']['available-wavelengths'])
1033         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
1034         for ele in liste_tp:
1035             if ele['tp-id'] == 'SRG1-PP1-TXRX' or ele['tp-id'] == 'SRG1-PP1-TXRX':
1036                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
1037             else:
1038                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
1039         time.sleep(10)
1040
1041     def test_35_check_topo_ROADMA_DEG2(self):
1042         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADM-A1-DEG2"
1043                 .format(self.restconf_baseurl))
1044         response = requests.request(
1045             "GET", url1, auth=('admin', 'admin'))
1046         self.assertEqual(response.status_code, requests.codes.ok)
1047         res = response.json()
1048         self.assertIn({u'index': 1}, res['node'][0]
1049                       [u'org-openroadm-network-topology:degree-attributes']['available-wavelengths'])
1050         self.assertIn({u'index': 2}, res['node'][0]
1051                       [u'org-openroadm-network-topology:degree-attributes']['available-wavelengths'])
1052         liste_tp = res['node'][0]['ietf-network-topology:termination-point']
1053         for ele in liste_tp:
1054             if ele['tp-id'] == 'DEG2-CTP-TXRX':
1055                 self.assertNotIn('org-openroadm-network-topology:ctp-attributes', dict.keys(ele))
1056             if ele['tp-id'] == 'DEG2-TTP-TXRX':
1057                 self.assertNotIn('org-openroadm-network-topology:tx-ttp-attributes', dict.keys(ele))
1058         time.sleep(10)
1059
1060 # test service-create for Optical Channel (OC) service from srg-pp to srg-pp
1061     def test_36_create_oc_service1(self):
1062         url = ("{}/operations/org-openroadm-service:service-create"
1063                .format(self.restconf_baseurl))
1064         data = {"input": {
1065                 "sdnc-request-header": {
1066                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
1067                     "rpc-action": "service-create",
1068                     "request-system-id": "appname",
1069                     "notification-url": "http://localhost:8585/NotificationServer/notify"
1070                 },
1071                 "service-name": "service1",
1072                 "common-id": "ASATT1234567",
1073                 "connection-type": "roadm-line",
1074                 "service-a-end": {
1075                     "service-rate": "100",
1076                     "node-id": "ROADM-A1",
1077                     "service-format": "OC",
1078                     "clli": "SNJSCAMCJP8",
1079                     "tx-direction": {
1080                         "port": {
1081                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
1082                             "port-type": "router",
1083                             "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
1084                             "port-rack": "000000.00",
1085                             "port-shelf": "00"
1086                         },
1087                         "lgx": {
1088                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
1089                             "lgx-port-name": "LGX Back.3",
1090                             "lgx-port-rack": "000000.00",
1091                             "lgx-port-shelf": "00"
1092                         }
1093                     },
1094                     "rx-direction": {
1095                         "port": {
1096                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
1097                             "port-type": "router",
1098                             "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
1099                             "port-rack": "000000.00",
1100                             "port-shelf": "00"
1101                         },
1102                         "lgx": {
1103                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
1104                             "lgx-port-name": "LGX Back.4",
1105                             "lgx-port-rack": "000000.00",
1106                             "lgx-port-shelf": "00"
1107                         }
1108                     },
1109                     "optic-type": "gray"
1110                 },
1111                 "service-z-end": {
1112                     "service-rate": "100",
1113                     "node-id": "ROADM-C1",
1114                     "service-format": "OC",
1115                     "clli": "SNJSCAMCJT4",
1116                     "tx-direction": {
1117                         "port": {
1118                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
1119                             "port-type": "router",
1120                             "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
1121                             "port-rack": "000000.00",
1122                             "port-shelf": "00"
1123                         },
1124                         "lgx": {
1125                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
1126                             "lgx-port-name": "LGX Back.29",
1127                             "lgx-port-rack": "000000.00",
1128                             "lgx-port-shelf": "00"
1129                         }
1130                     },
1131                     "rx-direction": {
1132                         "port": {
1133                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
1134                             "port-type": "router",
1135                             "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
1136                             "port-rack": "000000.00",
1137                             "port-shelf": "00"
1138                         },
1139                         "lgx": {
1140                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
1141                             "lgx-port-name": "LGX Back.30",
1142                             "lgx-port-rack": "000000.00",
1143                             "lgx-port-shelf": "00"
1144                         }
1145                     },
1146                     "optic-type": "gray"
1147                 },
1148                 "due-date": "2016-11-28T00:00:01Z",
1149                 "operator-contact": "pw1234"
1150                 }
1151                 }
1152         headers = {'content-type': 'application/json',
1153                    "Accept": "application/json"}
1154         response = requests.request(
1155             "POST", url, data=json.dumps(data), headers=headers,
1156             auth=('admin', 'admin'))
1157         self.assertEqual(response.status_code, requests.codes.ok)
1158         res = response.json()
1159         self.assertIn('PCE calculation in progress',
1160                       res['output']['configuration-response-common']['response-message'])
1161         time.sleep(self.WAITING)
1162
1163     def test_37_get_oc_service1(self):
1164         url = ("{}/operational/org-openroadm-service:service-list/services/service1"
1165                .format(self.restconf_baseurl))
1166         headers = {'content-type': 'application/json',
1167                    "Accept": "application/json"}
1168         response = requests.request(
1169             "GET", url, headers=headers, auth=('admin', 'admin'))
1170         self.assertEqual(response.status_code, requests.codes.ok)
1171         res = response.json()
1172         self.assertEqual(
1173             res['services'][0]['administrative-state'],
1174             'inService')
1175         self.assertEqual(
1176             res['services'][0]['service-name'], 'service1')
1177         self.assertEqual(
1178             res['services'][0]['connection-type'], 'roadm-line')
1179         self.assertEqual(
1180             res['services'][0]['lifecycle-state'], 'planned')
1181         time.sleep(1)
1182
1183     def test_38_check_xc1_ROADMA(self):
1184         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
1185                "node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
1186                "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-1"
1187                .format(self.restconf_baseurl))
1188         headers = {'content-type': 'application/json'}
1189         response = requests.request(
1190             "GET", url, headers=headers, auth=('admin', 'admin'))
1191         self.assertEqual(response.status_code, requests.codes.ok)
1192         res = response.json()
1193         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
1194         self.assertDictEqual(
1195             dict({
1196                 'connection-name': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-1',
1197                 'opticalControlMode': 'gainLoss',
1198                 'target-output-power': -3.0
1199             }, **res['roadm-connections'][0]),
1200             res['roadm-connections'][0]
1201         )
1202         self.assertDictEqual(
1203             {'src-if': 'SRG1-PP1-TXRX-nmc-1'},
1204             res['roadm-connections'][0]['source'])
1205         self.assertDictEqual(
1206             {'dst-if': 'DEG2-TTP-TXRX-nmc-1'},
1207             res['roadm-connections'][0]['destination'])
1208         time.sleep(7)
1209
1210     def test_39_check_xc1_ROADMC(self):
1211         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
1212                "node/ROADM-C1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
1213                "roadm-connections/SRG1-PP1-TXRX-DEG1-TTP-TXRX-1"
1214                .format(self.restconf_baseurl))
1215         headers = {'content-type': 'application/json'}
1216         response = requests.request(
1217             "GET", url, headers=headers, auth=('admin', 'admin'))
1218         self.assertEqual(response.status_code, requests.codes.ok)
1219         res = response.json()
1220         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
1221         self.assertDictEqual(
1222             dict({
1223                 'connection-name': 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-1',
1224                 'opticalControlMode': 'gainLoss',
1225                 'target-output-power': -3.0
1226             }, **res['roadm-connections'][0]),
1227             res['roadm-connections'][0]
1228         )
1229         self.assertDictEqual(
1230             {'src-if': 'SRG1-PP1-TXRX-nmc-1'},
1231             res['roadm-connections'][0]['source'])
1232         self.assertDictEqual(
1233             {'dst-if': 'DEG1-TTP-TXRX-nmc-1'},
1234             res['roadm-connections'][0]['destination'])
1235         time.sleep(7)
1236
1237     def test_40_create_oc_service2(self):
1238         url = ("{}/operations/org-openroadm-service:service-create"
1239                .format(self.restconf_baseurl))
1240         data = {"input": {
1241                 "sdnc-request-header": {
1242                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
1243                     "rpc-action": "service-create",
1244                     "request-system-id": "appname",
1245                     "notification-url": "http://localhost:8585/NotificationServer/notify"
1246                 },
1247                 "service-name": "service2",
1248                 "common-id": "ASATT1234567",
1249                 "connection-type": "roadm-line",
1250                 "service-a-end": {
1251                     "service-rate": "100",
1252                     "node-id": "ROADM-A1",
1253                     "service-format": "OC",
1254                     "clli": "SNJSCAMCJP8",
1255                     "tx-direction": {
1256                         "port": {
1257                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
1258                             "port-type": "router",
1259                             "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
1260                             "port-rack": "000000.00",
1261                             "port-shelf": "00"
1262                         },
1263                         "lgx": {
1264                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
1265                             "lgx-port-name": "LGX Back.3",
1266                             "lgx-port-rack": "000000.00",
1267                             "lgx-port-shelf": "00"
1268                         }
1269                     },
1270                     "rx-direction": {
1271                         "port": {
1272                             "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
1273                             "port-type": "router",
1274                             "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
1275                             "port-rack": "000000.00",
1276                             "port-shelf": "00"
1277                         },
1278                         "lgx": {
1279                             "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
1280                             "lgx-port-name": "LGX Back.4",
1281                             "lgx-port-rack": "000000.00",
1282                             "lgx-port-shelf": "00"
1283                         }
1284                     },
1285                     "optic-type": "gray"
1286                 },
1287                 "service-z-end": {
1288                     "service-rate": "100",
1289                     "node-id": "ROADM-C1",
1290                     "service-format": "OC",
1291                     "clli": "SNJSCAMCJT4",
1292                     "tx-direction": {
1293                         "port": {
1294                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
1295                             "port-type": "router",
1296                             "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
1297                             "port-rack": "000000.00",
1298                             "port-shelf": "00"
1299                         },
1300                         "lgx": {
1301                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
1302                             "lgx-port-name": "LGX Back.29",
1303                             "lgx-port-rack": "000000.00",
1304                             "lgx-port-shelf": "00"
1305                         }
1306                     },
1307                     "rx-direction": {
1308                         "port": {
1309                             "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
1310                             "port-type": "router",
1311                             "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
1312                             "port-rack": "000000.00",
1313                             "port-shelf": "00"
1314                         },
1315                         "lgx": {
1316                             "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
1317                             "lgx-port-name": "LGX Back.30",
1318                             "lgx-port-rack": "000000.00",
1319                             "lgx-port-shelf": "00"
1320                         }
1321                     },
1322                     "optic-type": "gray"
1323                 },
1324                 "due-date": "2016-11-28T00:00:01Z",
1325                 "operator-contact": "pw1234"
1326                 }
1327                 }
1328         headers = {'content-type': 'application/json',
1329                    "Accept": "application/json"}
1330         response = requests.request(
1331             "POST", url, data=json.dumps(data), headers=headers,
1332             auth=('admin', 'admin'))
1333         self.assertEqual(response.status_code, requests.codes.ok)
1334         res = response.json()
1335         self.assertIn('PCE calculation in progress',
1336                       res['output']['configuration-response-common']['response-message'])
1337         time.sleep(self.WAITING)
1338
1339     def test_41_get_oc_service2(self):
1340         url = ("{}/operational/org-openroadm-service:service-list/services/service2"
1341                .format(self.restconf_baseurl))
1342         headers = {'content-type': 'application/json',
1343                    "Accept": "application/json"}
1344         response = requests.request(
1345             "GET", url, headers=headers, auth=('admin', 'admin'))
1346         self.assertEqual(response.status_code, requests.codes.ok)
1347         res = response.json()
1348         self.assertEqual(
1349             res['services'][0]['administrative-state'],
1350             'inService')
1351         self.assertEqual(
1352             res['services'][0]['service-name'], 'service2')
1353         self.assertEqual(
1354             res['services'][0]['connection-type'], 'roadm-line')
1355         self.assertEqual(
1356             res['services'][0]['lifecycle-state'], 'planned')
1357         time.sleep(2)
1358
1359     def test_42_check_xc2_ROADMA(self):
1360         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
1361                "node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
1362                "roadm-connections/SRG1-PP2-TXRX-DEG2-TTP-TXRX-2"
1363                .format(self.restconf_baseurl))
1364         headers = {'content-type': 'application/json'}
1365         response = requests.request(
1366             "GET", url, headers=headers, auth=('admin', 'admin'))
1367         self.assertEqual(response.status_code, requests.codes.ok)
1368         res = response.json()
1369         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
1370         self.assertDictEqual(
1371             dict({
1372                 'connection-name': 'SRG1-PP2-TXRX-DEG2-TTP-TXRX-2',
1373                 'opticalControlMode': 'gainLoss',
1374                 'target-output-power': -3.0
1375             }, **res['roadm-connections'][0]),
1376             res['roadm-connections'][0]
1377         )
1378         self.assertDictEqual(
1379             {'src-if': 'SRG1-PP2-TXRX-nmc-2'},
1380             res['roadm-connections'][0]['source'])
1381         self.assertDictEqual(
1382             {'dst-if': 'DEG2-TTP-TXRX-nmc-2'},
1383             res['roadm-connections'][0]['destination'])
1384         time.sleep(2)
1385
1386     def test_43_check_topo_ROADMA(self):
1387         self.test_26_check_topo_ROADMA_SRG1()
1388         self.test_27_check_topo_ROADMA_DEG2()
1389         time.sleep(3)
1390
1391     def test_44_delete_oc_service1(self):
1392         url = ("{}/operations/org-openroadm-service:service-delete"
1393                .format(self.restconf_baseurl))
1394         data = {"input": {
1395                 "sdnc-request-header": {
1396                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
1397                     "rpc-action": "service-delete",
1398                     "request-system-id": "appname",
1399                     "notification-url": "http://localhost:8585/NotificationServer/notify"
1400                 },
1401                 "service-delete-req-info": {
1402                     "service-name": "service1",
1403                     "tail-retention": "no"
1404                 }
1405                 }
1406                 }
1407         headers = {'content-type': 'application/json'}
1408         response = requests.request(
1409             "POST", url, data=json.dumps(data), headers=headers,
1410             auth=('admin', 'admin'))
1411         self.assertEqual(response.status_code, requests.codes.ok)
1412         res = response.json()
1413         self.assertIn('Renderer service delete in progress',
1414                       res['output']['configuration-response-common']['response-message'])
1415         time.sleep(20)
1416
1417     def test_45_delete_oc_service2(self):
1418         url = ("{}/operations/org-openroadm-service:service-delete"
1419                .format(self.restconf_baseurl))
1420         data = {"input": {
1421                 "sdnc-request-header": {
1422                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
1423                     "rpc-action": "service-delete",
1424                     "request-system-id": "appname",
1425                     "notification-url": "http://localhost:8585/NotificationServer/notify"
1426                 },
1427                 "service-delete-req-info": {
1428                     "service-name": "service2",
1429                     "tail-retention": "no"
1430                 }
1431                 }
1432                 }
1433         headers = {'content-type': 'application/json'}
1434         response = requests.request(
1435             "POST", url, data=json.dumps(data), headers=headers,
1436             auth=('admin', 'admin'))
1437         self.assertEqual(response.status_code, requests.codes.ok)
1438         res = response.json()
1439         self.assertIn('Renderer service delete in progress',
1440                       res['output']['configuration-response-common']['response-message'])
1441         time.sleep(20)
1442
1443     def test_46_get_no_oc_services(self):
1444         print("start test")
1445         url = ("{}/operational/org-openroadm-service:service-list"
1446                .format(self.restconf_baseurl))
1447         headers = {'content-type': 'application/json',
1448                    "Accept": "application/json"}
1449         response = requests.request(
1450             "GET", url, headers=headers, auth=('admin', 'admin'))
1451         self.assertEqual(response.status_code, requests.codes.not_found)
1452         res = response.json()
1453         self.assertIn(
1454             {"error-type": "application", "error-tag": "data-missing",
1455              "error-message": "Request could not be completed because the relevant data model content does not exist"},
1456             res['errors']['error'])
1457         time.sleep(1)
1458
1459     def test_47_get_no_xc_ROADMA(self):
1460         url = ("{}/config/network-topology:network-topology/topology/topology-netconf"
1461                "/node/ROADM-A1/yang-ext:mount/org-openroadm-device:org-openroadm-device/"
1462                .format(self.restconf_baseurl))
1463         headers = {'content-type': 'application/json',
1464                    "Accept": "application/json"}
1465         response = requests.request(
1466             "GET", url, headers=headers, auth=('admin', 'admin'))
1467         self.assertEqual(response.status_code, requests.codes.ok)
1468         res = response.json()
1469         self.assertNotIn(['roadm-connections'][0], res['org-openroadm-device'])
1470         time.sleep(1)
1471
1472     def test_48_check_topo_ROADMA(self):
1473         self.test_34_check_topo_ROADMA_SRG1()
1474         self.test_35_check_topo_ROADMA_DEG2()
1475
1476     def test_49_loop_create_eth_service(self):
1477         for i in range(1, 6):
1478             print("trial number {}".format(i))
1479             print("eth service creation")
1480             self.test_11_create_eth_service1()
1481             print("check xc in ROADM-A1")
1482             self.test_13_check_xc1_ROADMA()
1483             print("check xc in ROADM-C1")
1484             self.test_14_check_xc1_ROADMC()
1485             print("eth service deletion\n")
1486             self.test_30_delete_eth_service1()
1487
1488     def test_50_loop_create_oc_service(self):
1489         url = ("{}/operational/org-openroadm-service:service-list/services/service1"
1490                .format(self.restconf_baseurl))
1491         response = requests.request("GET", url, auth=('admin', 'admin'))
1492         if response.status_code != 404:
1493             url = ("{}/operations/org-openroadm-service:service-delete"
1494                    .format(self.restconf_baseurl))
1495             data = {"input": {
1496                 "sdnc-request-header": {
1497                     "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
1498                     "rpc-action": "service-delete",
1499                     "request-system-id": "appname",
1500                     "notification-url": "http://localhost:8585/NotificationServer/notify"
1501                 },
1502                 "service-delete-req-info": {
1503                     "service-name": "service1",
1504                     "tail-retention": "no"
1505                 }
1506             }
1507             }
1508             headers = {'content-type': 'application/json'}
1509             requests.request("POST", url, data=json.dumps(data), headers=headers, auth=('admin', 'admin'))
1510             time.sleep(5)
1511
1512         for i in range(1, 6):
1513             print("trial number {}".format(i))
1514             print("oc service creation")
1515             self.test_36_create_oc_service1()
1516             print("check xc in ROADM-A1")
1517             self.test_38_check_xc1_ROADMA()
1518             print("check xc in ROADM-C1")
1519             self.test_39_check_xc1_ROADMC()
1520             print("oc service deletion\n")
1521             self.test_44_delete_oc_service1()
1522
1523     def test_51_disconnect_XPDRA(self):
1524         url = ("{}/config/network-topology:"
1525                "network-topology/topology/topology-netconf/node/XPDR-A1"
1526                .format(self.restconf_baseurl))
1527         headers = {'content-type': 'application/json'}
1528         response = requests.request(
1529             "DELETE", url, headers=headers,
1530             auth=('admin', 'admin'))
1531         self.assertEqual(response.status_code, requests.codes.ok)
1532         time.sleep(10)
1533
1534     def test_52_disconnect_XPDRC(self):
1535         url = ("{}/config/network-topology:"
1536                "network-topology/topology/topology-netconf/node/XPDR-C1"
1537                .format(self.restconf_baseurl))
1538         headers = {'content-type': 'application/json'}
1539         response = requests.request(
1540             "DELETE", url, headers=headers,
1541             auth=('admin', 'admin'))
1542         self.assertEqual(response.status_code, requests.codes.ok)
1543         time.sleep(10)
1544
1545     def test_53_disconnect_ROADMA(self):
1546         url = ("{}/config/network-topology:"
1547                "network-topology/topology/topology-netconf/node/ROADM-A1"
1548                .format(self.restconf_baseurl))
1549         headers = {'content-type': 'application/json'}
1550         response = requests.request(
1551             "DELETE", url, headers=headers,
1552             auth=('admin', 'admin'))
1553         self.assertEqual(response.status_code, requests.codes.ok)
1554         time.sleep(10)
1555
1556     def test_54_disconnect_ROADMC(self):
1557         url = ("{}/config/network-topology:"
1558                "network-topology/topology/topology-netconf/node/ROADM-C1"
1559                .format(self.restconf_baseurl))
1560         headers = {'content-type': 'application/json'}
1561         response = requests.request(
1562             "DELETE", url, headers=headers,
1563             auth=('admin', 'admin'))
1564         self.assertEqual(response.status_code, requests.codes.ok)
1565         time.sleep(10)
1566
1567
1568 if __name__ == "__main__":
1569     unittest.main(verbosity=2)