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