Add unit & func tests for RPC service-reroute
[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_add_omsAttributes_roadma_roadmc(self):
762         # Config ROADMA-ROADMC oms-attributes
763         data = {"span": {
764             "auto-spanloss": "true",
765             "spanloss-base": 11.4,
766             "spanloss-current": 12,
767             "engineered-spanloss": 12.2,
768             "link-concatenation": [{
769                 "SRLG-Id": 0,
770                 "fiber-type": "smf",
771                 "SRLG-length": 100000,
772                 "pmd": 0.5}]}}
773         response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
774         self.assertEqual(response.status_code, requests.codes.created)
775
776     def test_11_add_omsAttributes_roadmc_roadma(self):
777         # Config ROADMC-ROADMA oms-attributes
778         data = {"span": {
779             "auto-spanloss": "true",
780             "spanloss-base": 11.4,
781             "spanloss-current": 12,
782             "engineered-spanloss": 12.2,
783             "link-concatenation": [{
784                 "SRLG-Id": 0,
785                 "fiber-type": "smf",
786                 "SRLG-length": 100000,
787                 "pmd": 0.5}]}}
788         response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
789         self.assertEqual(response.status_code, requests.codes.created)
790
791     # test service-create for Eth service from xpdr to xpdr with service-resiliency
792     def test_12_create_eth_service1_with_service_resiliency_restorable(self):
793         self.cr_serv_input_data["service-name"] = "service1"
794         response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
795                                                            self.cr_serv_input_data)
796         self.assertEqual(response['status_code'], requests.codes.ok)
797         self.assertIn('PCE calculation in progress',
798                       response['output']['configuration-response-common']['response-message'])
799         time.sleep(self.WAITING)
800
801     def test_13_get_eth_service1(self):
802         response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
803         self.assertEqual(response['status_code'], requests.codes.ok)
804         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
805         self.assertEqual(response['services'][0]['service-name'], 'service1')
806         self.assertEqual(response['services'][0]['connection-type'], 'service')
807         self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
808         self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
809                          'org-openroadm-common-service-types:restorable')
810         time.sleep(1)
811
812     # Degrade ROADM-A1-ROADM-C1 link
813     def test_14_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
814         url = "{}/operations/pm-handling:pm-interact"
815         body = {
816             "input": {
817                 "rpc-action": "set",
818                 "pm-to-be-set-or-created": {
819                     "current-pm-entry": [
820                         {
821                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
822                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
823                             "pm-resource-type": "interface",
824                             "pm-resource-type-extension": "",
825                             "current-pm": [
826                                 {
827                                     "type": "opticalPowerInput",
828                                     "extension": "",
829                                     "location": "nearEnd",
830                                     "direction": "rx",
831                                     "measurement": [
832                                         {
833                                             "granularity": "15min",
834                                             "pmParameterValue": -30,
835                                             "pmParameterUnit": "dBm",
836                                             "validity": "complete"
837                                         },
838                                         {
839                                             "granularity": "24Hour",
840                                             "pmParameterValue": -21.3,
841                                             "pmParameterUnit": "dBm",
842                                             "validity": "complete"
843                                         }
844                                     ]
845                                 }
846                             ]
847                         }
848                     ]
849                 }
850             }
851         }
852         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
853                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
854                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
855                                     timeout=test_utils.REQUEST_TIMEOUT)
856         self.assertEqual(response.status_code, requests.codes.ok)
857         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully set !")
858         time.sleep(2)
859
860     def test_15_get_eth_service1(self):
861         response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
862         self.assertEqual(response['status_code'], requests.codes.ok)
863         self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
864         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
865         self.assertEqual(response['services'][0]['service-name'], 'service1')
866         self.assertEqual(response['services'][0]['connection-type'], 'service')
867         self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
868         self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
869                          'org-openroadm-common-service-types:restorable')
870         time.sleep(1)
871
872     def test_16_service_reroute_service1(self):
873         response = test_utils.transportpce_api_rpc_request(
874             'org-openroadm-service', 'service-reroute',
875             {
876                 "sdnc-request-header": {
877                     "request-id": "request-1",
878                     "rpc-action": "service-reroute",
879                     "request-system-id": "appname"
880                 },
881                 "service-name": "service1",
882                 "service-resiliency": {
883                     "resiliency": "org-openroadm-common-service-types:restorable"
884                 }
885             })
886         self.assertEqual(response['status_code'], requests.codes.ok)
887         self.assertIn('500', response['output']['configuration-response-common']['response-code'])
888         self.assertIn('No path available by PCE',
889                       response['output']['configuration-response-common']['response-message'])
890         time.sleep(2)
891
892     # Restore ROADM-A1-ROADM-C1 link
893     def test_17_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
894         url = "{}/operations/pm-handling:pm-interact"
895         body = {
896             "input": {
897                 "rpc-action": "clear",
898                 "pm-to-get-clear-or-delete": {
899                     "current-pm-entry": [
900                         {
901                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
902                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
903                             "pm-resource-type": "interface",
904                             "pm-resource-type-extension": "",
905                             "current-pm": [
906                                 {
907                                     "type": "opticalPowerInput",
908                                     "extension": "",
909                                     "location": "nearEnd",
910                                     "direction": "rx"
911                                 }
912                             ]
913                         }
914                     ]
915                 }
916             }
917         }
918         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
919                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
920                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
921                                     timeout=test_utils.REQUEST_TIMEOUT)
922         self.assertEqual(response.status_code, requests.codes.ok)
923         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
924         time.sleep(2)
925
926     def test_18_get_eth_service1(self):
927         self.test_13_get_eth_service1()
928
929     def test_19_connect_xprda2_3_N1_to_roadma_PP2(self):
930         response = test_utils.transportpce_api_rpc_request(
931             'transportpce-networkutils', 'init-xpdr-rdm-links',
932             {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
933                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
934         self.assertEqual(response['status_code'], requests.codes.ok)
935         self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
936         time.sleep(2)
937
938     def test_20_connect_roadma_PP2_to_xpdra2_3_N1(self):
939         response = test_utils.transportpce_api_rpc_request(
940             'transportpce-networkutils', 'init-rdm-xpdr-links',
941             {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
942                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
943         self.assertEqual(response['status_code'], requests.codes.ok)
944         self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
945         time.sleep(2)
946
947     def test_21_connect_xprdc2_3_N1_to_roadmc_PP2(self):
948         response = test_utils.transportpce_api_rpc_request(
949             'transportpce-networkutils', 'init-xpdr-rdm-links',
950             {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
951                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
952         self.assertEqual(response['status_code'], requests.codes.ok)
953         self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
954         time.sleep(2)
955
956     def test_22_connect_roadmc_PP2_to_xpdrc2_3_N1(self):
957         response = test_utils.transportpce_api_rpc_request(
958             'transportpce-networkutils', 'init-rdm-xpdr-links',
959             {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
960                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
961         self.assertEqual(response['status_code'], requests.codes.ok)
962         self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
963         time.sleep(2)
964
965     def test_23_add_omsAttributes_roadma_roadmb(self):
966         # Config ROADMA-ROADMB oms-attributes
967         data = {"span": {
968             "auto-spanloss": "true",
969             "spanloss-base": 11.4,
970             "spanloss-current": 12,
971             "engineered-spanloss": 12.2,
972             "link-concatenation": [{
973                 "SRLG-Id": 0,
974                 "fiber-type": "smf",
975                 "SRLG-length": 100000,
976                 "pmd": 0.5}]}}
977         response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
978         self.assertEqual(response.status_code, requests.codes.created)
979
980     def test_24_add_omsAttributes_roadmb_roadma(self):
981         # Config ROADMB-ROADMA oms-attributes
982         data = {"span": {
983             "auto-spanloss": "true",
984             "spanloss-base": 11.4,
985             "spanloss-current": 12,
986             "engineered-spanloss": 12.2,
987             "link-concatenation": [{
988                 "SRLG-Id": 0,
989                 "fiber-type": "smf",
990                 "SRLG-length": 100000,
991                 "pmd": 0.5}]}}
992         response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
993         self.assertEqual(response.status_code, requests.codes.created)
994
995     def test_25_add_omsAttributes_roadmb_roadmc(self):
996         # Config ROADMB-ROADMC oms-attributes
997         data = {"span": {
998             "auto-spanloss": "true",
999             "spanloss-base": 11.4,
1000             "spanloss-current": 12,
1001             "engineered-spanloss": 12.2,
1002             "link-concatenation": [{
1003                 "SRLG-Id": 0,
1004                 "fiber-type": "smf",
1005                 "SRLG-length": 100000,
1006                 "pmd": 0.5}]}}
1007         response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
1008         self.assertEqual(response.status_code, requests.codes.created)
1009
1010     def test_26_add_omsAttributes_roadmc_roadmb(self):
1011         # Config ROADMC-ROADMB oms-attributes
1012         data = {"span": {
1013             "auto-spanloss": "true",
1014             "spanloss-base": 11.4,
1015             "spanloss-current": 12,
1016             "engineered-spanloss": 12.2,
1017             "link-concatenation": [{
1018                 "SRLG-Id": 0,
1019                 "fiber-type": "smf",
1020                 "SRLG-length": 100000,
1021                 "pmd": 0.5}]}}
1022         response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
1023         self.assertEqual(response.status_code, requests.codes.created)
1024
1025     def test_27_create_OTS_ROADMA_DEG1(self):
1026         response = test_utils.transportpce_api_rpc_request(
1027             'transportpce-device-renderer', 'create-ots-oms',
1028             {
1029                 'node-id': 'ROADM-A1',
1030                 'logical-connection-point': 'DEG1-TTP-TXRX'
1031             })
1032         self.assertEqual(response['status_code'], requests.codes.ok)
1033         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
1034                       response["output"]["result"])
1035
1036     def test_28_create_OTS_ROADMC_DEG2(self):
1037         response = test_utils.transportpce_api_rpc_request(
1038             'transportpce-device-renderer', 'create-ots-oms',
1039             {
1040                 'node-id': 'ROADM-C1',
1041                 'logical-connection-point': 'DEG2-TTP-TXRX'
1042             })
1043         self.assertEqual(response['status_code'], requests.codes.ok)
1044         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
1045                       response["output"]["result"])
1046
1047     def test_29_create_OTS_ROADMB_DEG1(self):
1048         response = test_utils.transportpce_api_rpc_request(
1049             'transportpce-device-renderer', 'create-ots-oms',
1050             {
1051                 'node-id': 'ROADM-B1',
1052                 'logical-connection-point': 'DEG1-TTP-TXRX'
1053             })
1054         self.assertEqual(response['status_code'], requests.codes.ok)
1055         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
1056                       response["output"]["result"])
1057
1058     def test_30_create_OTS_ROADMB_DEG2(self):
1059         response = test_utils.transportpce_api_rpc_request(
1060             'transportpce-device-renderer', 'create-ots-oms',
1061             {
1062                 'node-id': 'ROADM-B1',
1063                 'logical-connection-point': 'DEG2-TTP-TXRX'
1064             })
1065         self.assertEqual(response['status_code'], requests.codes.ok)
1066         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
1067                       response["output"]["result"])
1068
1069     def test_31_calculate_span_loss_base_all(self):
1070         response = test_utils.transportpce_api_rpc_request(
1071             'transportpce-olm', 'calculate-spanloss-base',
1072             {
1073                 'src-type': 'all'
1074             })
1075         self.assertEqual(response['status_code'], requests.codes.ok)
1076         self.assertIn('Success', response["output"]["result"])
1077         self.assertIn({
1078             "spanloss": "25.7",
1079             "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
1080         }, response["output"]["spans"])
1081         self.assertIn({
1082             "spanloss": "17.6",
1083             "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
1084         }, response["output"]["spans"])
1085         self.assertIn({
1086             "spanloss": "23.6",
1087             "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
1088         }, response["output"]["spans"])
1089         self.assertIn({
1090             "spanloss": "23.6",
1091             "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
1092         }, response["output"]["spans"])
1093         self.assertIn({
1094             "spanloss": "25.7",
1095             "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
1096         }, response["output"]["spans"])
1097         self.assertIn({
1098             "spanloss": "17.6",
1099             "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
1100         }, response["output"]["spans"])
1101         time.sleep(1)
1102
1103     def test_32_get_service_path_service_1(self):
1104         response = test_utils.get_serv_path_list_attr("service-paths", "service1")
1105         self.assertEqual(response['status_code'], requests.codes.ok)
1106         self.assertCountEqual(self.service_path_service_1_AtoZ,
1107                               response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1108
1109     # test service-create for Eth service from xpdr to xpdr without service-resiliency
1110     def test_33_create_eth_service2_without_service_resiliency(self):
1111         self.cr_serv_input_data["service-name"] = "service2"
1112         del self.cr_serv_input_data["service-resiliency"]
1113         response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
1114                                                            self.cr_serv_input_data)
1115         self.assertEqual(response['status_code'], requests.codes.ok)
1116         self.assertIn('PCE calculation in progress',
1117                       response['output']['configuration-response-common']['response-message'])
1118         time.sleep(self.WAITING)
1119
1120     def test_34_get_eth_service2(self):
1121         response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
1122         self.assertEqual(response['status_code'], requests.codes.ok)
1123         self.assertEqual(response['services'][0]['operational-state'], 'inService')
1124         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
1125         self.assertEqual(response['services'][0]['service-name'], 'service2')
1126         self.assertEqual(response['services'][0]['connection-type'], 'service')
1127         self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
1128         self.assertNotIn('service-resiliency', response['services'][0])
1129         time.sleep(1)
1130
1131     def test_35_get_service_path_service_2(self):
1132         response = test_utils.get_serv_path_list_attr("service-paths", "service2")
1133         self.assertEqual(response['status_code'], requests.codes.ok)
1134         self.assertCountEqual(
1135             self.service_path_service_2_AtoZ,
1136             response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1137
1138     # Degrade ROADM-A1-ROADM-C1 link
1139     def test_36_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
1140         url = "{}/operations/pm-handling:pm-interact"
1141         body = {
1142             "input": {
1143                 "rpc-action": "set",
1144                 "pm-to-be-set-or-created": {
1145                     "current-pm-entry": [
1146                         {
1147                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
1148                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
1149                             "pm-resource-type": "interface",
1150                             "pm-resource-type-extension": "",
1151                             "current-pm": [
1152                                 {
1153                                     "type": "opticalPowerInput",
1154                                     "extension": "",
1155                                     "location": "nearEnd",
1156                                     "direction": "rx",
1157                                     "measurement": [
1158                                         {
1159                                             "granularity": "15min",
1160                                             "pmParameterValue": -30,
1161                                             "pmParameterUnit": "dBm",
1162                                             "validity": "complete"
1163                                         },
1164                                         {
1165                                             "granularity": "24Hour",
1166                                             "pmParameterValue": -21.3,
1167                                             "pmParameterUnit": "dBm",
1168                                             "validity": "complete"
1169                                         }
1170                                     ]
1171                                 }
1172                             ]
1173                         }
1174                     ]
1175                 }
1176             }
1177         }
1178         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
1179                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
1180                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
1181                                     timeout=test_utils.REQUEST_TIMEOUT)
1182         self.assertEqual(response.status_code, requests.codes.ok)
1183         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully set !")
1184         time.sleep(self.WAITING * 2)
1185
1186     def test_37_get_eth_service1(self):
1187         self.test_13_get_eth_service1()
1188
1189     def test_38_get_service_path_service_1(self):
1190         response = test_utils.get_serv_path_list_attr("service-paths", "service1")
1191         self.assertEqual(response['status_code'], requests.codes.ok)
1192         self.assertCountEqual(
1193             self.service_path_service_1_rerouted_AtoZ,
1194             response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1195
1196     def test_39_get_eth_service2(self):
1197         response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
1198         self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
1199         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
1200         self.assertEqual(response['services'][0]['service-name'], 'service2')
1201         self.assertEqual(response['services'][0]['connection-type'], 'service')
1202         self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
1203         self.assertNotIn('service-resiliency', response['services'])
1204         time.sleep(1)
1205
1206     def test_40_get_service_path_service_2(self):
1207         response = test_utils.get_serv_path_list_attr("service-paths", "service2")
1208         self.assertEqual(response['status_code'], requests.codes.ok)
1209         index = self.service_path_service_2_AtoZ.index(
1210             {
1211                 'id': '10',
1212                 'resource': {
1213                     'state': 'inService',
1214                     'tp-id': 'DEG2-TTP-TXRX',
1215                     'tp-node-id': 'ROADM-A1-DEG2'
1216                 }
1217             }
1218         )
1219         service_path_expected = self.service_path_service_2_AtoZ[:index] + [{
1220             'id': '10',
1221             'resource': {
1222                 'state': 'outOfService',
1223                 'tp-id': 'DEG2-TTP-TXRX',
1224                 'tp-node-id': 'ROADM-A1-DEG2'
1225             }
1226         }] + self.service_path_service_2_AtoZ[index + 1:]
1227         self.assertCountEqual(service_path_expected,
1228                               response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1229
1230     # Restore ROADM-A1-ROADM-C1 link
1231     def test_41_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
1232         url = "{}/operations/pm-handling:pm-interact"
1233         body = {
1234             "input": {
1235                 "rpc-action": "clear",
1236                 "pm-to-get-clear-or-delete": {
1237                     "current-pm-entry": [
1238                         {
1239                             "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
1240                                                     ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
1241                             "pm-resource-type": "interface",
1242                             "pm-resource-type-extension": "",
1243                             "current-pm": [
1244                                 {
1245                                     "type": "opticalPowerInput",
1246                                     "extension": "",
1247                                     "location": "nearEnd",
1248                                     "direction": "rx"
1249                                 }
1250                             ]
1251                         }
1252                     ]
1253                 }
1254             }
1255         }
1256         response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
1257                                     data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
1258                                     auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
1259                                     timeout=test_utils.REQUEST_TIMEOUT)
1260         self.assertEqual(response.status_code, requests.codes.ok)
1261         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
1262         time.sleep(2)
1263
1264     def test_42_get_eth_service1(self):
1265         self.test_13_get_eth_service1()
1266
1267     def test_43_get_service_path_service_1(self):
1268         self.test_38_get_service_path_service_1()
1269
1270     def test_44_get_eth_service2(self):
1271         self.test_34_get_eth_service2()
1272
1273     def test_45_get_service_path_service_2(self):
1274         self.test_35_get_service_path_service_2()
1275
1276     def test_46_delete_eth_service2(self):
1277         self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
1278         response = test_utils.transportpce_api_rpc_request(
1279             'org-openroadm-service', 'service-delete',
1280             self.del_serv_input_data)
1281         self.assertEqual(response['status_code'], requests.codes.ok)
1282         self.assertIn('Renderer service delete in progress',
1283                       response['output']['configuration-response-common']['response-message'])
1284         time.sleep(self.WAITING)
1285
1286     def test_47_delete_eth_service1(self):
1287         self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
1288         response = test_utils.transportpce_api_rpc_request(
1289             'org-openroadm-service', 'service-delete',
1290             self.del_serv_input_data)
1291         self.assertEqual(response['status_code'], requests.codes.ok)
1292         self.assertIn('Renderer service delete in progress',
1293                       response['output']['configuration-response-common']['response-message'])
1294         time.sleep(self.WAITING)
1295
1296     def test_48_disconnect_xponders_from_roadm(self):
1297         response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
1298         self.assertEqual(response['status_code'], requests.codes.ok)
1299         links = response['network'][0]['ietf-network-topology:link']
1300         for link in links:
1301             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
1302                 response = test_utils.del_ietf_network_link_request(
1303                     'openroadm-topology', link['link-id'], 'config')
1304                 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1305
1306     def test_49_disconnect_xpdra2(self):
1307         response = test_utils.unmount_device("XPDR-A2")
1308         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1309
1310     def test_50_disconnect_xpdrc2(self):
1311         response = test_utils.unmount_device("XPDR-C2")
1312         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1313
1314     def test_51_disconnect_roadmA(self):
1315         response = test_utils.unmount_device("ROADM-A1")
1316         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1317
1318     def test_52_disconnect_roadmB(self):
1319         response = test_utils.unmount_device("ROADM-B1")
1320         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1321
1322     def test_53_disconnect_roadmC(self):
1323         response = test_utils.unmount_device("ROADM-C1")
1324         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1325
1326
1327 if __name__ == "__main__":
1328     unittest.main(verbosity=2)