Merge "Refactor networkmodel OpenRoadmTopology Part 4"
[transportpce.git] / tests / transportpce_tests / hybrid / test03_autonomous_reroute.py
1 #!/usr/bin/env python
2
3 ##############################################################################
4 # Copyright (c) 2022 Orange, Inc. and others.  All rights reserved.
5 #
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
11
12 # pylint: disable=invalid-name
13 # pylint: disable=no-member
14 # pylint: disable=too-many-public-methods
15 # pylint: disable=too-many-lines
16
17 import json
18 import unittest
19 import time
20 import requests
21 # pylint: disable=wrong-import-order
22 import sys
23
24 sys.path.append('transportpce_tests/common/')
25 # pylint: disable=wrong-import-position
26 # pylint: disable=import-error
27 import test_utils  # nopep8
28
29
30 class TransportPCEtesting(unittest.TestCase):
31     processes = None
32     WAITING = 20  # nominal value is 300
33     NODE_VERSION_221 = '2.2.1'
34     NODE_VERSION_71 = '7.1'
35
36     cr_serv_sample_data = {
37         "input": {
38             "sdnc-request-header": {
39                 "request-id": "request-1",
40                 "rpc-action": "service-create",
41                 "request-system-id": "appname"
42             },
43             "service-name": "service1",
44             "common-id": "commonId",
45             "connection-type": "service",
46             "service-resiliency": {
47                 "resiliency": "org-openroadm-common-service-types:restorable"
48             },
49             "service-a-end": {
50                 "service-rate": "400",
51                 "node-id": "XPDR-A2",
52                 "service-format": "Ethernet",
53                 "clli": "NodeA",
54                 "tx-direction": [
55                     {
56                         "index": 0
57                     }
58                 ],
59                 "rx-direction": [
60                     {
61                         "index": 0
62                     }
63                 ],
64                 "optic-type": "gray"
65             },
66             "service-z-end": {
67                 "service-rate": "400",
68                 "node-id": "XPDR-C2",
69                 "service-format": "Ethernet",
70                 "clli": "NodeC",
71                 "tx-direction": [
72                     {
73                         "index": 0
74                     }
75                 ],
76                 "rx-direction": [
77                     {
78                         "index": 0
79                     }
80                 ],
81                 "optic-type": "gray"
82             },
83             "due-date": "2018-06-15T00:00:01Z",
84             "operator-contact": "pw1234"
85         }
86     }
87
88     service_path_service_1_AtoZ = [
89         {
90             "id": "16",
91             "resource": {
92                 "state": "inService",
93                 "tp-id": "SRG1-CP-TXRX",
94                 "tp-node-id": "ROADM-C1-SRG1"
95             }
96         },
97         {
98             "id": "17",
99             "resource": {
100                 "state": "inService",
101                 "node-id": "ROADM-C1-SRG1"
102             }
103         },
104         {
105             "id": "14",
106             "resource": {
107                 "state": "inService",
108                 "tp-id": "DEG1-CTP-TXRX",
109                 "tp-node-id": "ROADM-C1-DEG1"
110             }
111         },
112         {
113             "id": "15",
114             "resource": {
115                 "state": "inService",
116                 "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
117             }
118         },
119         {
120             "id": "18",
121             "resource": {
122                 "state": "inService",
123                 "tp-id": "SRG1-PP1-TXRX",
124                 "tp-node-id": "ROADM-C1-SRG1"
125             }
126         },
127         {
128             "id": "19",
129             "resource": {
130                 "state": "inService",
131                 "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
132             }
133         },
134         {
135             "id": "1",
136             "resource": {
137                 "state": "inService",
138                 "node-id": "XPDR-A2-XPDR1"
139             }
140         },
141         {
142             "id": "2",
143             "resource": {
144                 "state": "inService",
145                 "tp-id": "XPDR1-NETWORK1",
146                 "tp-node-id": "XPDR-A2-XPDR1"
147             }
148         },
149         {
150             "id": "0",
151             "resource": {
152                 "state": "inService",
153                 "tp-id": "XPDR1-CLIENT1",
154                 "tp-node-id": "XPDR-A2-XPDR1"
155             }
156         },
157         {
158             "id": "5",
159             "resource": {
160                 "state": "inService",
161                 "node-id": "ROADM-A1-SRG1"
162             }
163         },
164         {
165             "id": "6",
166             "resource": {
167                 "state": "inService",
168                 "tp-id": "SRG1-CP-TXRX",
169                 "tp-node-id": "ROADM-A1-SRG1"
170             }
171         },
172         {
173             "id": "3",
174             "resource": {
175                 "state": "inService",
176                 "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
177             }
178         },
179         {
180             "id": "4",
181             "resource": {
182                 "state": "inService",
183                 "tp-id": "SRG1-PP1-TXRX",
184                 "tp-node-id": "ROADM-A1-SRG1"
185             }
186         },
187         {
188             "id": "9",
189             "resource": {
190                 "state": "inService",
191                 "node-id": "ROADM-A1-DEG2"
192             }
193         },
194         {
195             "id": "7",
196             "resource": {
197                 "state": "inService",
198                 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
199             }
200         },
201         {
202             "id": "8",
203             "resource": {
204                 "state": "inService",
205                 "tp-id": "DEG2-CTP-TXRX",
206                 "tp-node-id": "ROADM-A1-DEG2"
207             }
208         },
209         {
210             "id": "20",
211             "resource": {
212                 "state": "inService",
213                 "tp-id": "XPDR1-NETWORK1",
214                 "tp-node-id": "XPDR-C2-XPDR1"
215             }
216         },
217         {
218             "id": "12",
219             "resource": {
220                 "state": "inService",
221                 "tp-id": "DEG1-TTP-TXRX",
222                 "tp-node-id": "ROADM-C1-DEG1"
223             }
224         },
225         {
226             "id": "13",
227             "resource": {
228                 "state": "inService",
229                 "node-id": "ROADM-C1-DEG1"
230             }
231         },
232         {
233             "id": "10",
234             "resource": {
235                 "state": "inService",
236                 "tp-id": "DEG2-TTP-TXRX",
237                 "tp-node-id": "ROADM-A1-DEG2"
238             }
239         },
240         {
241             "id": "21",
242             "resource": {
243                 "state": "inService",
244                 "node-id": "XPDR-C2-XPDR1"
245             }
246         },
247         {
248             "id": "11",
249             "resource": {
250                 "state": "inService",
251                 "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
252             }
253         },
254         {
255             "id": "22",
256             "resource": {
257                 "state": "inService",
258                 "tp-id": "XPDR1-CLIENT1",
259                 "tp-node-id": "XPDR-C2-XPDR1"
260             }
261         }
262     ]
263
264     service_path_service_1_rerouted_AtoZ = [
265         {
266             "id": "27",
267             "resource": {
268                 "state": "inService",
269                 "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
270             }
271         },
272         {
273             "id": "28",
274             "resource": {
275                 "state": "inService",
276                 "tp-id": "XPDR1-NETWORK1",
277                 "tp-node-id": "XPDR-C2-XPDR1"
278             }
279         },
280         {
281             "id": "25",
282             "resource": {
283                 "state": "inService",
284                 "node-id": "ROADM-C1-SRG1"
285             }
286         },
287         {
288             "id": "26",
289             "resource": {
290                 "state": "inService",
291                 "tp-id": "SRG1-PP1-TXRX",
292                 "tp-node-id": "ROADM-C1-SRG1"
293             }
294         },
295         {
296             "id": "29",
297             "resource": {
298                 "state": "inService",
299                 "node-id": "XPDR-C2-XPDR1"
300             }
301         },
302         {
303             "id": "30",
304             "resource": {
305                 "state": "inService",
306                 "tp-id": "XPDR1-CLIENT1",
307                 "tp-node-id": "XPDR-C2-XPDR1"
308             }
309         },
310         {
311             "id": "12",
312             "resource": {
313                 "state": "inService",
314                 "tp-id": "DEG1-TTP-TXRX",
315                 "tp-node-id": "ROADM-B1-DEG1"
316             }
317         },
318         {
319             "id": "13",
320             "resource": {
321                 "state": "inService",
322                 "node-id": "ROADM-B1-DEG1"
323             }
324         },
325         {
326             "id": "10",
327             "resource": {
328                 "state": "inService",
329                 "tp-id": "DEG1-TTP-TXRX",
330                 "tp-node-id": "ROADM-A1-DEG1"
331             }
332         },
333         {
334             "id": "11",
335             "resource": {
336                 "state": "inService",
337                 "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
338             }
339         },
340         {
341             "id": "16",
342             "resource": {
343                 "state": "inService",
344                 "tp-id": "DEG2-CTP-TXRX",
345                 "tp-node-id": "ROADM-B1-DEG2"
346             }
347         },
348         {
349             "id": "17",
350             "resource": {
351                 "state": "inService",
352                 "node-id": "ROADM-B1-DEG2"
353             }
354         },
355         {
356             "id": "14",
357             "resource": {
358                 "state": "inService",
359                 "tp-id": "DEG1-CTP-TXRX",
360                 "tp-node-id": "ROADM-B1-DEG1"
361             }
362         },
363         {
364             "id": "15",
365             "resource": {
366                 "state": "inService",
367                 "link-id": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX"
368             }
369         },
370         {
371             "id": "18",
372             "resource": {
373                 "state": "inService",
374                 "tp-id": "DEG2-TTP-TXRX",
375                 "tp-node-id": "ROADM-B1-DEG2"
376             }
377         },
378         {
379             "id": "19",
380             "resource": {
381                 "state": "inService",
382                 "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
383             }
384         },
385         {
386             "id": "1",
387             "resource": {
388                 "state": "inService",
389                 "node-id": "XPDR-A2-XPDR1"
390             }
391         },
392         {
393             "id": "2",
394             "resource": {
395                 "state": "inService",
396                 "tp-id": "XPDR1-NETWORK1",
397                 "tp-node-id": "XPDR-A2-XPDR1"
398             }
399         },
400         {
401             "id": "0",
402             "resource": {
403                 "state": "inService",
404                 "tp-id": "XPDR1-CLIENT1",
405                 "tp-node-id": "XPDR-A2-XPDR1"
406             }
407         },
408         {
409             "id": "5",
410             "resource": {
411                 "state": "inService",
412                 "node-id": "ROADM-A1-SRG1"
413             }
414         },
415         {
416             "id": "6",
417             "resource": {
418                 "state": "inService",
419                 "tp-id": "SRG1-CP-TXRX",
420                 "tp-node-id": "ROADM-A1-SRG1"
421             }
422         },
423         {
424             "id": "3",
425             "resource": {
426                 "state": "inService",
427                 "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
428             }
429         },
430         {
431             "id": "4",
432             "resource": {
433                 "state": "inService",
434                 "tp-id": "SRG1-PP1-TXRX",
435                 "tp-node-id": "ROADM-A1-SRG1"
436             }
437         },
438         {
439             "id": "9",
440             "resource": {
441                 "state": "inService",
442                 "node-id": "ROADM-A1-DEG1"
443             }
444         },
445         {
446             "id": "7",
447             "resource": {
448                 "state": "inService",
449                 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
450             }
451         },
452         {
453             "id": "8",
454             "resource": {
455                 "state": "inService",
456                 "tp-id": "DEG1-CTP-TXRX",
457                 "tp-node-id": "ROADM-A1-DEG1"
458             }
459         },
460         {
461             "id": "20",
462             "resource": {
463                 "state": "inService",
464                 "tp-id": "DEG2-TTP-TXRX",
465                 "tp-node-id": "ROADM-C1-DEG2"
466             }
467         },
468         {
469             "id": "23",
470             "resource": {
471                 "state": "inService",
472                 "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
473             }
474         },
475         {
476             "id": "24",
477             "resource": {
478                 "state": "inService",
479                 "tp-id": "SRG1-CP-TXRX",
480                 "tp-node-id": "ROADM-C1-SRG1"
481             }
482         },
483         {
484             "id": "21",
485             "resource": {
486                 "state": "inService",
487                 "node-id": "ROADM-C1-DEG2"
488             }
489         },
490         {
491             "id": "22",
492             "resource": {
493                 "state": "inService",
494                 "tp-id": "DEG2-CTP-TXRX",
495                 "tp-node-id": "ROADM-C1-DEG2"
496             }
497         }
498     ]
499
500     service_path_service_2_AtoZ = [
501         {
502             "id": "16",
503             "resource": {
504                 "state": "inService",
505                 "tp-id": "SRG1-CP-TXRX",
506                 "tp-node-id": "ROADM-C1-SRG1"
507             }
508         },
509         {
510             "id": "17",
511             "resource": {
512                 "state": "inService",
513                 "node-id": "ROADM-C1-SRG1"
514             }
515         },
516         {
517             "id": "14",
518             "resource": {
519                 "state": "inService",
520                 "tp-id": "DEG1-CTP-TXRX",
521                 "tp-node-id": "ROADM-C1-DEG1"
522             }
523         },
524         {
525             "id": "15",
526             "resource": {
527                 "state": "inService",
528                 "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
529             }
530         },
531         {
532             "id": "18",
533             "resource": {
534                 "state": "inService",
535                 "tp-id": "SRG1-PP2-TXRX",
536                 "tp-node-id": "ROADM-C1-SRG1"
537             }
538         },
539         {
540             "id": "19",
541             "resource": {
542                 "state": "inService",
543                 "link-id": "ROADM-C1-SRG1-SRG1-PP2-TXRXtoXPDR-C2-XPDR3-XPDR3-NETWORK1"
544             }
545         },
546         {
547             "id": "1",
548             "resource": {
549                 "state": "inService",
550                 "node-id": "XPDR-A2-XPDR3"
551             }
552         },
553         {
554             "id": "2",
555             "resource": {
556                 "state": "inService",
557                 "tp-id": "XPDR3-NETWORK1",
558                 "tp-node-id": "XPDR-A2-XPDR3"
559             }
560         },
561         {
562             "id": "0",
563             "resource": {
564                 "state": "inService",
565                 "tp-id": "XPDR3-CLIENT1",
566                 "tp-node-id": "XPDR-A2-XPDR3"
567             }
568         },
569         {
570             "id": "5",
571             "resource": {
572                 "state": "inService",
573                 "node-id": "ROADM-A1-SRG1"
574             }
575         },
576         {
577             "id": "6",
578             "resource": {
579                 "state": "inService",
580                 "tp-id": "SRG1-CP-TXRX",
581                 "tp-node-id": "ROADM-A1-SRG1"
582             }
583         },
584         {
585             "id": "3",
586             "resource": {
587                 "state": "inService",
588                 "link-id": "XPDR-A2-XPDR3-XPDR3-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX"
589             }
590         },
591         {
592             "id": "4",
593             "resource": {
594                 "state": "inService",
595                 "tp-id": "SRG1-PP2-TXRX",
596                 "tp-node-id": "ROADM-A1-SRG1"
597             }
598         },
599         {
600             "id": "9",
601             "resource": {
602                 "state": "inService",
603                 "node-id": "ROADM-A1-DEG2"
604             }
605         },
606         {
607             "id": "7",
608             "resource": {
609                 "state": "inService",
610                 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
611             }
612         },
613         {
614             "id": "8",
615             "resource": {
616                 "state": "inService",
617                 "tp-id": "DEG2-CTP-TXRX",
618                 "tp-node-id": "ROADM-A1-DEG2"
619             }
620         },
621         {
622             "id": "20",
623             "resource": {
624                 "state": "inService",
625                 "tp-id": "XPDR3-NETWORK1",
626                 "tp-node-id": "XPDR-C2-XPDR3"
627             }
628         },
629         {
630             "id": "12",
631             "resource": {
632                 "state": "inService",
633                 "tp-id": "DEG1-TTP-TXRX",
634                 "tp-node-id": "ROADM-C1-DEG1"
635             }
636         },
637         {
638             "id": "13",
639             "resource": {
640                 "state": "inService",
641                 "node-id": "ROADM-C1-DEG1"
642             }
643         },
644         {
645             "id": "10",
646             "resource": {
647                 "state": "inService",
648                 "tp-id": "DEG2-TTP-TXRX",
649                 "tp-node-id": "ROADM-A1-DEG2"
650             }
651         },
652         {
653             "id": "21",
654             "resource": {
655                 "state": "inService",
656                 "node-id": "XPDR-C2-XPDR3"
657             }
658         },
659         {
660             "id": "11",
661             "resource": {
662                 "state": "inService",
663                 "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
664             }
665         },
666         {
667             "id": "22",
668             "resource": {
669                 "state": "inService",
670                 "tp-id": "XPDR3-CLIENT1",
671                 "tp-node-id": "XPDR-C2-XPDR3"
672             }
673         }
674     ]
675
676     @classmethod
677     def setUpClass(cls):
678         cls.processes = test_utils.start_tpce()
679         cls.processes = test_utils.start_sims([('xpdra2', cls.NODE_VERSION_71),
680                                                ('roadma', cls.NODE_VERSION_221),
681                                                ('roadmb', cls.NODE_VERSION_221),
682                                                ('roadmc', cls.NODE_VERSION_221),
683                                                ('xpdrc2', cls.NODE_VERSION_71)])
684
685     @classmethod
686     def tearDownClass(cls):
687         # pylint: disable=not-an-iterable
688         for process in cls.processes:
689             test_utils.shutdown_process(process)
690         print("all processes killed")
691
692     def setUp(self):
693         time.sleep(2)
694
695     def test_01_connect_xpdra2(self):
696         response = test_utils.mount_device("XPDR-A2", ('xpdra2', self.NODE_VERSION_71))
697         self.assertEqual(response.status_code,
698                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
699
700     def test_02_connect_xpdrc2(self):
701         response = test_utils.mount_device("XPDR-C2", ('xpdrc2', self.NODE_VERSION_71))
702         self.assertEqual(response.status_code,
703                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
704
705     def test_03_connect_rdma(self):
706         response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
707         self.assertEqual(response.status_code,
708                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
709
710     def test_04_connect_rdmb(self):
711         response = test_utils.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION_221))
712         self.assertEqual(response.status_code,
713                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
714
715     def test_05_connect_rdmc(self):
716         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
717         self.assertEqual(response.status_code,
718                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
719
720     def test_06_connect_xprda2_1_N1_to_roadma_PP1(self):
721         response = test_utils.connect_xpdr_to_rdm_request("XPDR-A2", "1", "1",
722                                                           "ROADM-A1", "1", "SRG1-PP1-TXRX")
723         self.assertEqual(response.status_code, requests.codes.ok)
724         self.assertIn('Xponder Roadm Link created successfully',
725                       response.json()["output"]["result"])
726         time.sleep(2)
727
728     def test_07_connect_roadma_PP1_to_xpdra2_1_N1(self):
729         response = test_utils.connect_rdm_to_xpdr_request("XPDR-A2", "1", "1",
730                                                           "ROADM-A1", "1", "SRG1-PP1-TXRX")
731         self.assertEqual(response.status_code, requests.codes.ok)
732         self.assertIn('Roadm Xponder links created successfully',
733                       response.json()["output"]["result"])
734         time.sleep(2)
735
736     def test_08_connect_xprdc2_1_N1_to_roadmc_PP1(self):
737         response = test_utils.connect_xpdr_to_rdm_request("XPDR-C2", "1", "1",
738                                                           "ROADM-C1", "1", "SRG1-PP1-TXRX")
739         self.assertEqual(response.status_code, requests.codes.ok)
740         self.assertIn('Xponder Roadm Link created successfully',
741                       response.json()["output"]["result"])
742         time.sleep(2)
743
744     def test_09_connect_roadmc_PP1_to_xpdrc2_1_N1(self):
745         response = test_utils.connect_rdm_to_xpdr_request("XPDR-C2", "1", "1",
746                                                           "ROADM-C1", "1", "SRG1-PP1-TXRX")
747         self.assertEqual(response.status_code, requests.codes.ok)
748         self.assertIn('Roadm Xponder links created successfully',
749                       response.json()["output"]["result"])
750         time.sleep(2)
751
752     def test_10_connect_xprda2_3_N1_to_roadma_PP2(self):
753         response = test_utils.connect_xpdr_to_rdm_request("XPDR-A2", "3", "1",
754                                                           "ROADM-A1", "1", "SRG1-PP2-TXRX")
755         self.assertEqual(response.status_code, requests.codes.ok)
756         self.assertIn('Xponder Roadm Link created successfully',
757                       response.json()["output"]["result"])
758         time.sleep(2)
759
760     def test_11_connect_roadma_PP2_to_xpdra2_3_N1(self):
761         response = test_utils.connect_rdm_to_xpdr_request("XPDR-A2", "3", "1",
762                                                           "ROADM-A1", "1", "SRG1-PP2-TXRX")
763         self.assertEqual(response.status_code, requests.codes.ok)
764         self.assertIn('Roadm Xponder links created successfully',
765                       response.json()["output"]["result"])
766         time.sleep(2)
767
768     def test_12_connect_xprdc2_3_N1_to_roadmc_PP2(self):
769         response = test_utils.connect_xpdr_to_rdm_request("XPDR-C2", "3", "1",
770                                                           "ROADM-C1", "1", "SRG1-PP2-TXRX")
771         self.assertEqual(response.status_code, requests.codes.ok)
772         self.assertIn('Xponder Roadm Link created successfully',
773                       response.json()["output"]["result"])
774         time.sleep(2)
775
776     def test_13_connect_roadmc_PP2_to_xpdrc2_3_N1(self):
777         response = test_utils.connect_rdm_to_xpdr_request("XPDR-C2", "3", "1",
778                                                           "ROADM-C1", "1", "SRG1-PP2-TXRX")
779         self.assertEqual(response.status_code, requests.codes.ok)
780         self.assertIn('Roadm Xponder links created successfully',
781                       response.json()["output"]["result"])
782         time.sleep(2)
783
784     def test_14_add_omsAttributes_roadma_roadmc(self):
785         # Config ROADMA-ROADMC oms-attributes
786         data = {"span": {
787             "auto-spanloss": "true",
788             "spanloss-base": 11.4,
789             "spanloss-current": 12,
790             "engineered-spanloss": 12.2,
791             "link-concatenation": [{
792                 "SRLG-Id": 0,
793                 "fiber-type": "smf",
794                 "SRLG-length": 100000,
795                 "pmd": 0.5}]}}
796         response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
797         self.assertEqual(response.status_code, requests.codes.created)
798
799     def test_15_add_omsAttributes_roadmc_roadma(self):
800         # Config ROADMC-ROADMA oms-attributes
801         data = {"span": {
802             "auto-spanloss": "true",
803             "spanloss-base": 11.4,
804             "spanloss-current": 12,
805             "engineered-spanloss": 12.2,
806             "link-concatenation": [{
807                 "SRLG-Id": 0,
808                 "fiber-type": "smf",
809                 "SRLG-length": 100000,
810                 "pmd": 0.5}]}}
811         response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
812         self.assertEqual(response.status_code, requests.codes.created)
813
814     def test_16_add_omsAttributes_roadma_roadmb(self):
815         # Config ROADMA-ROADMB oms-attributes
816         data = {"span": {
817             "auto-spanloss": "true",
818             "spanloss-base": 11.4,
819             "spanloss-current": 12,
820             "engineered-spanloss": 12.2,
821             "link-concatenation": [{
822                 "SRLG-Id": 0,
823                 "fiber-type": "smf",
824                 "SRLG-length": 100000,
825                 "pmd": 0.5}]}}
826         response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
827         self.assertEqual(response.status_code, requests.codes.created)
828
829     def test_17_add_omsAttributes_roadmb_roadma(self):
830         # Config ROADMB-ROADMA oms-attributes
831         data = {"span": {
832             "auto-spanloss": "true",
833             "spanloss-base": 11.4,
834             "spanloss-current": 12,
835             "engineered-spanloss": 12.2,
836             "link-concatenation": [{
837                 "SRLG-Id": 0,
838                 "fiber-type": "smf",
839                 "SRLG-length": 100000,
840                 "pmd": 0.5}]}}
841         response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
842         self.assertEqual(response.status_code, requests.codes.created)
843
844     def test_18_add_omsAttributes_roadmb_roadmc(self):
845         # Config ROADMB-ROADMC oms-attributes
846         data = {"span": {
847             "auto-spanloss": "true",
848             "spanloss-base": 11.4,
849             "spanloss-current": 12,
850             "engineered-spanloss": 12.2,
851             "link-concatenation": [{
852                 "SRLG-Id": 0,
853                 "fiber-type": "smf",
854                 "SRLG-length": 100000,
855                 "pmd": 0.5}]}}
856         response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
857         self.assertEqual(response.status_code, requests.codes.created)
858
859     def test_19_add_omsAttributes_roadmc_roadmb(self):
860         # Config ROADMC-ROADMB oms-attributes
861         data = {"span": {
862             "auto-spanloss": "true",
863             "spanloss-base": 11.4,
864             "spanloss-current": 12,
865             "engineered-spanloss": 12.2,
866             "link-concatenation": [{
867                 "SRLG-Id": 0,
868                 "fiber-type": "smf",
869                 "SRLG-length": 100000,
870                 "pmd": 0.5}]}}
871         response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
872         self.assertEqual(response.status_code, requests.codes.created)
873
874     def test_20_create_OTS_ROADMA_DEG1(self):
875         response = test_utils.create_ots_oms_request("ROADM-A1", "DEG1-TTP-TXRX")
876         time.sleep(5)
877         self.assertEqual(response.status_code, requests.codes.ok)
878         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
879                       response.json()["output"]["result"])
880
881     def test_21_create_OTS_ROADMC_DEG2(self):
882         response = test_utils.create_ots_oms_request("ROADM-C1", "DEG2-TTP-TXRX")
883         time.sleep(5)
884         self.assertEqual(response.status_code, requests.codes.ok)
885         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
886                       response.json()["output"]["result"])
887
888     def test_22_create_OTS_ROADMB_DEG1(self):
889         response = test_utils.create_ots_oms_request("ROADM-B1", "DEG1-TTP-TXRX")
890         time.sleep(5)
891         self.assertEqual(response.status_code, requests.codes.ok)
892         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
893                       response.json()["output"]["result"])
894
895     def test_23_create_OTS_ROADMB_DEG2(self):
896         response = test_utils.create_ots_oms_request("ROADM-B1", "DEG2-TTP-TXRX")
897         time.sleep(5)
898         self.assertEqual(response.status_code, requests.codes.ok)
899         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
900                       response.json()["output"]["result"])
901
902     def test_24_calculate_span_loss_base_all(self):
903         data = {
904             "input": {
905                 "src-type": "all"
906             }
907         }
908         response = test_utils.post_request("{}/operations/transportpce-olm:calculate-spanloss-base", data)
909         self.assertEqual(response.status_code, requests.codes.ok)
910         res = response.json()
911         self.assertIn('Success',
912                       res["output"]["result"])
913         self.assertIn({
914             "spanloss": "25.7",
915             "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
916         }, res["output"]["spans"])
917         self.assertIn({
918             "spanloss": "23.6",
919             "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
920         }, res["output"]["spans"])
921         self.assertIn({
922             "spanloss": "23.6",
923             "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
924         }, res["output"]["spans"])
925         self.assertIn({
926             "spanloss": "17.6",
927             "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
928         }, res["output"]["spans"])
929         self.assertIn({
930             "spanloss": "25.7",
931             "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
932         }, res["output"]["spans"])
933         self.assertIn({
934             "spanloss": "17.6",
935             "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
936         }, res["output"]["spans"])
937
938     # test service-create for Eth service from xpdr to xpdr with service-resiliency
939     def test_25_create_eth_service1_with_service_resiliency_restorable(self):
940         self.cr_serv_sample_data["input"]["service-name"] = "service1"
941         response = test_utils.service_create_request(self.cr_serv_sample_data)
942         self.assertEqual(response.status_code, requests.codes.ok)
943         self.assertIn('PCE calculation in progress',
944                       response.json()['output']['configuration-response-common']['response-message'])
945         time.sleep(self.WAITING)
946
947     def test_26_get_eth_service1(self):
948         response = test_utils.get_service_list_request("services/service1")
949         self.assertEqual(response.status_code, requests.codes.ok)
950         res = response.json()
951         self.assertEqual(
952             res['services'][0]['operational-state'], 'inService')
953         self.assertEqual(
954             res['services'][0]['administrative-state'], 'inService')
955         self.assertEqual(
956             res['services'][0]['service-name'], 'service1')
957         self.assertEqual(
958             res['services'][0]['connection-type'], 'service')
959         self.assertEqual(
960             res['services'][0]['lifecycle-state'], 'planned')
961         self.assertEqual(
962             res['services'][0]['service-resiliency']['resiliency'], 'org-openroadm-common-service-types:restorable')
963         time.sleep(2)
964
965     def test_27_get_service_path_service_1(self):
966         response = test_utils.get_service_path_list_request("service-paths/service1")
967         self.assertEqual(response.status_code, requests.codes.ok)
968         self.assertCountEqual(self.service_path_service_1_AtoZ,
969                               response.json()['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
970
971     # test service-create for Eth service from xpdr to xpdr without service-resiliency
972     def test_28_create_eth_service2_without_service_resiliency(self):
973         self.cr_serv_sample_data["input"]["service-name"] = "service2"
974         del self.cr_serv_sample_data["input"]["service-resiliency"]
975         response = test_utils.service_create_request(self.cr_serv_sample_data)
976         self.assertEqual(response.status_code, requests.codes.ok)
977         self.assertIn('PCE calculation in progress',
978                       response.json()['output']['configuration-response-common']['response-message'])
979         time.sleep(self.WAITING)
980
981     def test_29_get_eth_service2(self):
982         response = test_utils.get_service_list_request("services/service2")
983         self.assertEqual(response.status_code, requests.codes.ok)
984         res = response.json()
985         self.assertEqual(
986             res['services'][0]['operational-state'], 'inService')
987         self.assertEqual(
988             res['services'][0]['administrative-state'], 'inService')
989         self.assertEqual(
990             res['services'][0]['service-name'], 'service2')
991         self.assertEqual(
992             res['services'][0]['connection-type'], 'service')
993         self.assertEqual(
994             res['services'][0]['lifecycle-state'], 'planned')
995         self.assertNotIn('service-resiliency', res['services'][0])
996         time.sleep(2)
997
998     def test_30_get_service_path_service_2(self):
999         response = test_utils.get_service_path_list_request("service-paths/service2")
1000         self.assertEqual(response.status_code, requests.codes.ok)
1001         self.assertCountEqual(self.service_path_service_2_AtoZ,
1002                               response.json()['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1003
1004     # Degrade ROADM-A1-ROADM-C1 link
1005     def test_31_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
1006         url = "{}/operations/pm-handling:pm-interact"
1007         body = {
1008             "input": {
1009                 "rpc-action": "set",
1010                 "pm-to-be-set-or-created": {
1011                     "current-pm-entry": [
1012                         {
1013                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
1014                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
1015                             "pm-resource-type": "interface",
1016                             "pm-resource-type-extension": "",
1017                             "current-pm": [
1018                                 {
1019                                     "type": "opticalPowerInput",
1020                                     "extension": "",
1021                                     "location": "nearEnd",
1022                                     "direction": "rx",
1023                                     "measurement": [
1024                                         {
1025                                             "granularity": "15min",
1026                                             "pmParameterValue": -30,
1027                                             "pmParameterUnit": "dBm",
1028                                             "validity": "complete"
1029                                         },
1030                                         {
1031                                             "granularity": "24Hour",
1032                                             "pmParameterValue": -21.3,
1033                                             "pmParameterUnit": "dBm",
1034                                             "validity": "complete"
1035                                         }
1036                                     ]
1037                                 }
1038                             ]
1039                         }
1040                     ]
1041                 }
1042             }
1043         }
1044         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
1045                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
1046                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
1047         self.assertEqual(response.status_code, requests.codes.ok)
1048         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully set !")
1049         time.sleep(self.WAITING * 2)
1050
1051     def test_32_get_eth_service1(self):
1052         self.test_26_get_eth_service1()
1053
1054     def test_33_get_service_path_service_1(self):
1055         response = test_utils.get_service_path_list_request("service-paths/service1")
1056         self.assertEqual(response.status_code, requests.codes.ok)
1057         print(response.json())
1058         self.assertCountEqual(self.service_path_service_1_rerouted_AtoZ,
1059                               response.json()['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1060
1061     def test_34_get_eth_service2(self):
1062         response = test_utils.get_service_list_request("services/service2")
1063         self.assertEqual(response.status_code, requests.codes.ok)
1064         res = response.json()
1065         self.assertEqual(
1066             res['services'][0]['operational-state'], 'outOfService')
1067         self.assertEqual(
1068             res['services'][0]['administrative-state'], 'inService')
1069         self.assertEqual(
1070             res['services'][0]['service-name'], 'service2')
1071         self.assertEqual(
1072             res['services'][0]['connection-type'], 'service')
1073         self.assertEqual(
1074             res['services'][0]['lifecycle-state'], 'planned')
1075         self.assertNotIn('service-resiliency', res['services'][0])
1076         time.sleep(2)
1077
1078     def test_35_get_service_path_service_2(self):
1079         response = test_utils.get_service_path_list_request("service-paths/service2")
1080         index = self.service_path_service_2_AtoZ.index(
1081             {
1082                 'id': '10',
1083                 'resource': {
1084                     'state': 'inService',
1085                     'tp-id': 'DEG2-TTP-TXRX',
1086                     'tp-node-id': 'ROADM-A1-DEG2'
1087                 }
1088             }
1089         )
1090         service_path_expected = self.service_path_service_2_AtoZ[:index] + [{
1091             'id': '10',
1092             'resource': {
1093                 'state': 'outOfService',
1094                 'tp-id': 'DEG2-TTP-TXRX',
1095                 'tp-node-id': 'ROADM-A1-DEG2'
1096             }
1097         }] + self.service_path_service_2_AtoZ[index + 1:]
1098         self.assertEqual(response.status_code, requests.codes.ok)
1099         self.assertCountEqual(service_path_expected,
1100                               response.json()['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1101
1102     # Restore ROADM-A1-ROADM-C1 link
1103     def test_36_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
1104         url = "{}/operations/pm-handling:pm-interact"
1105         body = {
1106             "input": {
1107                 "rpc-action": "clear",
1108                 "pm-to-get-clear-or-delete": {
1109                     "current-pm-entry": [
1110                         {
1111                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
1112                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
1113                             "pm-resource-type": "interface",
1114                             "pm-resource-type-extension": "",
1115                             "current-pm": [
1116                                 {
1117                                     "type": "opticalPowerInput",
1118                                     "extension": "",
1119                                     "location": "nearEnd",
1120                                     "direction": "rx"
1121                                 }
1122                             ]
1123                         }
1124                     ]
1125                 }
1126             }
1127         }
1128         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
1129                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
1130                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
1131         self.assertEqual(response.status_code, requests.codes.ok)
1132         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
1133         time.sleep(2)
1134
1135     def test_37_get_eth_service1(self):
1136         self.test_26_get_eth_service1()
1137
1138     def test_38_get_service_path_service_1(self):
1139         self.test_33_get_service_path_service_1()
1140
1141     def test_39_get_eth_service2(self):
1142         self.test_29_get_eth_service2()
1143
1144     def test_40_get_service_path_service_2(self):
1145         self.test_30_get_service_path_service_2()
1146
1147     def test_41_delete_eth_service2(self):
1148         response = test_utils.service_delete_request("service2")
1149         self.assertEqual(response.status_code, requests.codes.ok)
1150         self.assertIn('Renderer service delete in progress',
1151                       response.json()['output']['configuration-response-common']['response-message'])
1152         time.sleep(self.WAITING)
1153
1154     def test_42_delete_eth_service1(self):
1155         response = test_utils.service_delete_request("service1")
1156         self.assertEqual(response.status_code, requests.codes.ok)
1157         self.assertIn('Renderer service delete in progress',
1158                       response.json()['output']['configuration-response-common']['response-message'])
1159         time.sleep(self.WAITING)
1160
1161     def test_43_disconnect_xponders_from_roadm(self):
1162         url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
1163         response = test_utils.get_ordm_topo_request("")
1164         self.assertEqual(response.status_code, requests.codes.ok)
1165         links = response.json()['network'][0]['ietf-network-topology:link']
1166         for link in links:
1167             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
1168                 self.assertEqual(test_utils.delete_request(url + link["link-id"]).status_code, requests.codes.ok)
1169
1170     def test_44_disconnect_xpdra2(self):
1171         response = test_utils.unmount_device("XPDR-A2")
1172         self.assertEqual(response.status_code, requests.codes.ok,
1173                          test_utils.CODE_SHOULD_BE_200)
1174
1175     def test_45_disconnect_xpdrc2(self):
1176         response = test_utils.unmount_device("XPDR-C2")
1177         self.assertEqual(response.status_code, requests.codes.ok,
1178                          test_utils.CODE_SHOULD_BE_200)
1179
1180     def test_46_disconnect_roadmA(self):
1181         response = test_utils.unmount_device("ROADM-A1")
1182         self.assertEqual(response.status_code, requests.codes.ok,
1183                          test_utils.CODE_SHOULD_BE_200)
1184
1185     def test_47_disconnect_roadmB(self):
1186         response = test_utils.unmount_device("ROADM-B1")
1187         self.assertEqual(response.status_code, requests.codes.ok,
1188                          test_utils.CODE_SHOULD_BE_200)
1189
1190     def test_48_disconnect_roadmC(self):
1191         response = test_utils.unmount_device("ROADM-C1")
1192         self.assertEqual(response.status_code, requests.codes.ok,
1193                          test_utils.CODE_SHOULD_BE_200)
1194
1195
1196 if __name__ == "__main__":
1197     unittest.main(verbosity=2)