3 ##############################################################################
4 # Copyright (c) 2022 Orange, Inc. and others. All rights reserved.
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 ##############################################################################
12 # pylint: disable=invalid-name
13 # pylint: disable=no-member
14 # pylint: disable=too-many-public-methods
15 # pylint: disable=too-many-lines
21 # pylint: disable=wrong-import-order
24 sys.path.append('transportpce_tests/common/')
25 # pylint: disable=wrong-import-position
26 # pylint: disable=import-error
27 import test_utils # nopep8
30 class TransportPCEtesting(unittest.TestCase):
32 WAITING = 20 # nominal value is 300
33 NODE_VERSION_221 = '2.2.1'
34 NODE_VERSION_71 = '7.1'
36 cr_serv_input_data = {
37 "sdnc-request-header": {
38 "request-id": "request-1",
39 "rpc-action": "service-create",
40 "request-system-id": "appname"
42 "service-name": "service1",
43 "common-id": "commonId",
44 "connection-type": "service",
45 "service-resiliency": {
46 "resiliency": "org-openroadm-common-service-types:restorable"
49 "service-rate": "400",
51 "service-format": "Ethernet",
66 "service-rate": "400",
68 "service-format": "Ethernet",
82 "due-date": "2018-06-15T00:00:01Z",
83 "operator-contact": "pw1234"
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"}
97 service_path_service_1_AtoZ = [
101 "state": "inService",
102 "tp-id": "SRG1-CP-TXRX",
103 "tp-node-id": "ROADM-C1-SRG1"
109 "state": "inService",
110 "node-id": "ROADM-C1-SRG1"
116 "state": "inService",
117 "tp-id": "DEG1-CTP-TXRX",
118 "tp-node-id": "ROADM-C1-DEG1"
124 "state": "inService",
125 "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
131 "state": "inService",
132 "tp-id": "SRG1-PP1-TXRX",
133 "tp-node-id": "ROADM-C1-SRG1"
139 "state": "inService",
140 "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
146 "state": "inService",
147 "node-id": "XPDR-A2-XPDR1"
153 "state": "inService",
154 "tp-id": "XPDR1-NETWORK1",
155 "tp-node-id": "XPDR-A2-XPDR1"
161 "state": "inService",
162 "tp-id": "XPDR1-CLIENT1",
163 "tp-node-id": "XPDR-A2-XPDR1"
169 "state": "inService",
170 "node-id": "ROADM-A1-SRG1"
176 "state": "inService",
177 "tp-id": "SRG1-CP-TXRX",
178 "tp-node-id": "ROADM-A1-SRG1"
184 "state": "inService",
185 "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
191 "state": "inService",
192 "tp-id": "SRG1-PP1-TXRX",
193 "tp-node-id": "ROADM-A1-SRG1"
199 "state": "inService",
200 "node-id": "ROADM-A1-DEG2"
206 "state": "inService",
207 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
213 "state": "inService",
214 "tp-id": "DEG2-CTP-TXRX",
215 "tp-node-id": "ROADM-A1-DEG2"
221 "state": "inService",
222 "tp-id": "XPDR1-NETWORK1",
223 "tp-node-id": "XPDR-C2-XPDR1"
229 "state": "inService",
230 "tp-id": "DEG1-TTP-TXRX",
231 "tp-node-id": "ROADM-C1-DEG1"
237 "state": "inService",
238 "node-id": "ROADM-C1-DEG1"
244 "state": "inService",
245 "tp-id": "DEG2-TTP-TXRX",
246 "tp-node-id": "ROADM-A1-DEG2"
252 "state": "inService",
253 "node-id": "XPDR-C2-XPDR1"
259 "state": "inService",
260 "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
266 "state": "inService",
267 "tp-id": "XPDR1-CLIENT1",
268 "tp-node-id": "XPDR-C2-XPDR1"
273 service_path_service_1_rerouted_AtoZ = [
277 "state": "inService",
278 "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
284 "state": "inService",
285 "tp-id": "XPDR1-NETWORK1",
286 "tp-node-id": "XPDR-C2-XPDR1"
292 "state": "inService",
293 "node-id": "ROADM-C1-SRG1"
299 "state": "inService",
300 "tp-id": "SRG1-PP1-TXRX",
301 "tp-node-id": "ROADM-C1-SRG1"
307 "state": "inService",
308 "node-id": "XPDR-C2-XPDR1"
314 "state": "inService",
315 "tp-id": "XPDR1-CLIENT1",
316 "tp-node-id": "XPDR-C2-XPDR1"
322 "state": "inService",
323 "tp-id": "DEG1-TTP-TXRX",
324 "tp-node-id": "ROADM-B1-DEG1"
330 "state": "inService",
331 "node-id": "ROADM-B1-DEG1"
337 "state": "inService",
338 "tp-id": "DEG1-TTP-TXRX",
339 "tp-node-id": "ROADM-A1-DEG1"
345 "state": "inService",
346 "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
352 "state": "inService",
353 "tp-id": "DEG2-CTP-TXRX",
354 "tp-node-id": "ROADM-B1-DEG2"
360 "state": "inService",
361 "node-id": "ROADM-B1-DEG2"
367 "state": "inService",
368 "tp-id": "DEG1-CTP-TXRX",
369 "tp-node-id": "ROADM-B1-DEG1"
375 "state": "inService",
376 "link-id": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX"
382 "state": "inService",
383 "tp-id": "DEG2-TTP-TXRX",
384 "tp-node-id": "ROADM-B1-DEG2"
390 "state": "inService",
391 "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
397 "state": "inService",
398 "node-id": "XPDR-A2-XPDR1"
404 "state": "inService",
405 "tp-id": "XPDR1-NETWORK1",
406 "tp-node-id": "XPDR-A2-XPDR1"
412 "state": "inService",
413 "tp-id": "XPDR1-CLIENT1",
414 "tp-node-id": "XPDR-A2-XPDR1"
420 "state": "inService",
421 "node-id": "ROADM-A1-SRG1"
427 "state": "inService",
428 "tp-id": "SRG1-CP-TXRX",
429 "tp-node-id": "ROADM-A1-SRG1"
435 "state": "inService",
436 "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
442 "state": "inService",
443 "tp-id": "SRG1-PP1-TXRX",
444 "tp-node-id": "ROADM-A1-SRG1"
450 "state": "inService",
451 "node-id": "ROADM-A1-DEG1"
457 "state": "inService",
458 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
464 "state": "inService",
465 "tp-id": "DEG1-CTP-TXRX",
466 "tp-node-id": "ROADM-A1-DEG1"
472 "state": "inService",
473 "tp-id": "DEG2-TTP-TXRX",
474 "tp-node-id": "ROADM-C1-DEG2"
480 "state": "inService",
481 "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
487 "state": "inService",
488 "tp-id": "SRG1-CP-TXRX",
489 "tp-node-id": "ROADM-C1-SRG1"
495 "state": "inService",
496 "node-id": "ROADM-C1-DEG2"
502 "state": "inService",
503 "tp-id": "DEG2-CTP-TXRX",
504 "tp-node-id": "ROADM-C1-DEG2"
509 service_path_service_2_AtoZ = [
513 "state": "inService",
514 "tp-id": "SRG1-CP-TXRX",
515 "tp-node-id": "ROADM-C1-SRG1"
521 "state": "inService",
522 "node-id": "ROADM-C1-SRG1"
528 "state": "inService",
529 "tp-id": "DEG1-CTP-TXRX",
530 "tp-node-id": "ROADM-C1-DEG1"
536 "state": "inService",
537 "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
543 "state": "inService",
544 "tp-id": "SRG1-PP2-TXRX",
545 "tp-node-id": "ROADM-C1-SRG1"
551 "state": "inService",
552 "link-id": "ROADM-C1-SRG1-SRG1-PP2-TXRXtoXPDR-C2-XPDR3-XPDR3-NETWORK1"
558 "state": "inService",
559 "node-id": "XPDR-A2-XPDR3"
565 "state": "inService",
566 "tp-id": "XPDR3-NETWORK1",
567 "tp-node-id": "XPDR-A2-XPDR3"
573 "state": "inService",
574 "tp-id": "XPDR3-CLIENT1",
575 "tp-node-id": "XPDR-A2-XPDR3"
581 "state": "inService",
582 "node-id": "ROADM-A1-SRG1"
588 "state": "inService",
589 "tp-id": "SRG1-CP-TXRX",
590 "tp-node-id": "ROADM-A1-SRG1"
596 "state": "inService",
597 "link-id": "XPDR-A2-XPDR3-XPDR3-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX"
603 "state": "inService",
604 "tp-id": "SRG1-PP2-TXRX",
605 "tp-node-id": "ROADM-A1-SRG1"
611 "state": "inService",
612 "node-id": "ROADM-A1-DEG2"
618 "state": "inService",
619 "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
625 "state": "inService",
626 "tp-id": "DEG2-CTP-TXRX",
627 "tp-node-id": "ROADM-A1-DEG2"
633 "state": "inService",
634 "tp-id": "XPDR3-NETWORK1",
635 "tp-node-id": "XPDR-C2-XPDR3"
641 "state": "inService",
642 "tp-id": "DEG1-TTP-TXRX",
643 "tp-node-id": "ROADM-C1-DEG1"
649 "state": "inService",
650 "node-id": "ROADM-C1-DEG1"
656 "state": "inService",
657 "tp-id": "DEG2-TTP-TXRX",
658 "tp-node-id": "ROADM-A1-DEG2"
664 "state": "inService",
665 "node-id": "XPDR-C2-XPDR3"
671 "state": "inService",
672 "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
678 "state": "inService",
679 "tp-id": "XPDR3-CLIENT1",
680 "tp-node-id": "XPDR-C2-XPDR3"
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)])
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")
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)
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)
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)
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)
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)
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"])
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"])
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"])
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"])
761 def test_10_add_omsAttributes_roadma_roadmc(self):
762 # Config ROADMA-ROADMC oms-attributes
764 "auto-spanloss": "true",
765 "spanloss-base": 11.4,
766 "spanloss-current": 12,
767 "engineered-spanloss": 12.2,
768 "link-concatenation": [{
771 "SRLG-length": 100000,
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)
776 def test_11_add_omsAttributes_roadmc_roadma(self):
777 # Config ROADMC-ROADMA oms-attributes
779 "auto-spanloss": "true",
780 "spanloss-base": 11.4,
781 "spanloss-current": 12,
782 "engineered-spanloss": 12.2,
783 "link-concatenation": [{
786 "SRLG-length": 100000,
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)
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)
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')
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"
818 "pm-to-be-set-or-created": {
819 "current-pm-entry": [
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": "",
827 "type": "opticalPowerInput",
829 "location": "nearEnd",
833 "granularity": "15min",
834 "pmParameterValue": -30,
835 "pmParameterUnit": "dBm",
836 "validity": "complete"
839 "granularity": "24Hour",
840 "pmParameterValue": -21.3,
841 "pmParameterUnit": "dBm",
842 "validity": "complete"
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 !")
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')
872 def test_16_service_reroute_service1(self):
873 response = test_utils.transportpce_api_rpc_request(
874 'org-openroadm-service', 'service-reroute',
876 "sdnc-request-header": {
877 "request-id": "request-1",
878 "rpc-action": "service-reroute",
879 "request-system-id": "appname"
881 "service-name": "service1",
882 "service-resiliency": {
883 "resiliency": "org-openroadm-common-service-types:restorable"
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'])
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"
897 "rpc-action": "clear",
898 "pm-to-get-clear-or-delete": {
899 "current-pm-entry": [
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": "",
907 "type": "opticalPowerInput",
909 "location": "nearEnd",
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 !")
926 def test_18_get_eth_service1(self):
927 self.test_13_get_eth_service1()
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"])
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"])
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"])
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"])
965 def test_23_add_omsAttributes_roadma_roadmb(self):
966 # Config ROADMA-ROADMB oms-attributes
968 "auto-spanloss": "true",
969 "spanloss-base": 11.4,
970 "spanloss-current": 12,
971 "engineered-spanloss": 12.2,
972 "link-concatenation": [{
975 "SRLG-length": 100000,
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)
980 def test_24_add_omsAttributes_roadmb_roadma(self):
981 # Config ROADMB-ROADMA oms-attributes
983 "auto-spanloss": "true",
984 "spanloss-base": 11.4,
985 "spanloss-current": 12,
986 "engineered-spanloss": 12.2,
987 "link-concatenation": [{
990 "SRLG-length": 100000,
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)
995 def test_25_add_omsAttributes_roadmb_roadmc(self):
996 # Config ROADMB-ROADMC oms-attributes
998 "auto-spanloss": "true",
999 "spanloss-base": 11.4,
1000 "spanloss-current": 12,
1001 "engineered-spanloss": 12.2,
1002 "link-concatenation": [{
1004 "fiber-type": "smf",
1005 "SRLG-length": 100000,
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)
1010 def test_26_add_omsAttributes_roadmc_roadmb(self):
1011 # Config ROADMC-ROADMB oms-attributes
1013 "auto-spanloss": "true",
1014 "spanloss-base": 11.4,
1015 "spanloss-current": 12,
1016 "engineered-spanloss": 12.2,
1017 "link-concatenation": [{
1019 "fiber-type": "smf",
1020 "SRLG-length": 100000,
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)
1025 def test_27_create_OTS_ROADMA_DEG1(self):
1026 response = test_utils.transportpce_api_rpc_request(
1027 'transportpce-device-renderer', 'create-ots-oms',
1029 'node-id': 'ROADM-A1',
1030 'logical-connection-point': 'DEG1-TTP-TXRX'
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"])
1036 def test_28_create_OTS_ROADMC_DEG2(self):
1037 response = test_utils.transportpce_api_rpc_request(
1038 'transportpce-device-renderer', 'create-ots-oms',
1040 'node-id': 'ROADM-C1',
1041 'logical-connection-point': 'DEG2-TTP-TXRX'
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"])
1047 def test_29_create_OTS_ROADMB_DEG1(self):
1048 response = test_utils.transportpce_api_rpc_request(
1049 'transportpce-device-renderer', 'create-ots-oms',
1051 'node-id': 'ROADM-B1',
1052 'logical-connection-point': 'DEG1-TTP-TXRX'
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"])
1058 def test_30_create_OTS_ROADMB_DEG2(self):
1059 response = test_utils.transportpce_api_rpc_request(
1060 'transportpce-device-renderer', 'create-ots-oms',
1062 'node-id': 'ROADM-B1',
1063 'logical-connection-point': 'DEG2-TTP-TXRX'
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"])
1069 def test_31_calculate_span_loss_base_all(self):
1070 response = test_utils.transportpce_api_rpc_request(
1071 'transportpce-olm', 'calculate-spanloss-base',
1075 self.assertEqual(response['status_code'], requests.codes.ok)
1076 self.assertIn('Success', response["output"]["result"])
1079 "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
1080 }, response["output"]["spans"])
1083 "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
1084 }, response["output"]["spans"])
1087 "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
1088 }, response["output"]["spans"])
1091 "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
1092 }, response["output"]["spans"])
1095 "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
1096 }, response["output"]["spans"])
1099 "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
1100 }, response["output"]["spans"])
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'])
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)
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])
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'])
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"
1143 "rpc-action": "set",
1144 "pm-to-be-set-or-created": {
1145 "current-pm-entry": [
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": "",
1153 "type": "opticalPowerInput",
1155 "location": "nearEnd",
1159 "granularity": "15min",
1160 "pmParameterValue": -30,
1161 "pmParameterUnit": "dBm",
1162 "validity": "complete"
1165 "granularity": "24Hour",
1166 "pmParameterValue": -21.3,
1167 "pmParameterUnit": "dBm",
1168 "validity": "complete"
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)
1186 def test_37_get_eth_service1(self):
1187 self.test_13_get_eth_service1()
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'])
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'])
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 index1 = self.service_path_service_2_AtoZ.index(
1213 'state': 'inService',
1214 'tp-id': 'DEG2-TTP-TXRX',
1215 'tp-node-id': 'ROADM-A1-DEG2'
1219 index2 = self.service_path_service_2_AtoZ.index(
1223 'state': 'inService',
1224 'link-id': 'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX'
1228 service_path_expected = self.service_path_service_2_AtoZ[:index1] + [{
1231 'state': 'outOfService',
1232 'tp-id': 'DEG2-TTP-TXRX',
1233 'tp-node-id': 'ROADM-A1-DEG2'
1235 }] + self.service_path_service_2_AtoZ[index1 + 1:index2] + [{
1238 'state': 'outOfService',
1239 'link-id': 'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX'
1241 }] + self.service_path_service_2_AtoZ[index2 + 1:]
1242 self.assertCountEqual(service_path_expected,
1243 response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
1245 # Restore ROADM-A1-ROADM-C1 link
1246 def test_41_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
1247 url = "{}/operations/pm-handling:pm-interact"
1250 "rpc-action": "clear",
1251 "pm-to-get-clear-or-delete": {
1252 "current-pm-entry": [
1254 "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
1255 ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
1256 "pm-resource-type": "interface",
1257 "pm-resource-type-extension": "",
1260 "type": "opticalPowerInput",
1262 "location": "nearEnd",
1271 response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
1272 data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
1273 auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
1274 timeout=test_utils.REQUEST_TIMEOUT)
1275 self.assertEqual(response.status_code, requests.codes.ok)
1276 self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
1279 def test_42_get_eth_service1(self):
1280 self.test_13_get_eth_service1()
1282 def test_43_get_service_path_service_1(self):
1283 self.test_38_get_service_path_service_1()
1285 def test_44_get_eth_service2(self):
1286 self.test_34_get_eth_service2()
1288 def test_45_get_service_path_service_2(self):
1289 self.test_35_get_service_path_service_2()
1291 def test_46_delete_eth_service2(self):
1292 self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
1293 response = test_utils.transportpce_api_rpc_request(
1294 'org-openroadm-service', 'service-delete',
1295 self.del_serv_input_data)
1296 self.assertEqual(response['status_code'], requests.codes.ok)
1297 self.assertIn('Renderer service delete in progress',
1298 response['output']['configuration-response-common']['response-message'])
1299 time.sleep(self.WAITING)
1301 def test_47_delete_eth_service1(self):
1302 self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
1303 response = test_utils.transportpce_api_rpc_request(
1304 'org-openroadm-service', 'service-delete',
1305 self.del_serv_input_data)
1306 self.assertEqual(response['status_code'], requests.codes.ok)
1307 self.assertIn('Renderer service delete in progress',
1308 response['output']['configuration-response-common']['response-message'])
1309 time.sleep(self.WAITING)
1311 def test_48_disconnect_xponders_from_roadm(self):
1312 response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
1313 self.assertEqual(response['status_code'], requests.codes.ok)
1314 links = response['network'][0]['ietf-network-topology:link']
1316 if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
1317 response = test_utils.del_ietf_network_link_request(
1318 'openroadm-topology', link['link-id'], 'config')
1319 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1321 def test_49_disconnect_xpdra2(self):
1322 response = test_utils.unmount_device("XPDR-A2")
1323 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1325 def test_50_disconnect_xpdrc2(self):
1326 response = test_utils.unmount_device("XPDR-C2")
1327 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1329 def test_51_disconnect_roadmA(self):
1330 response = test_utils.unmount_device("ROADM-A1")
1331 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1333 def test_52_disconnect_roadmB(self):
1334 response = test_utils.unmount_device("ROADM-B1")
1335 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1337 def test_53_disconnect_roadmC(self):
1338 response = test_utils.unmount_device("ROADM-C1")
1339 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
1342 if __name__ == "__main__":
1343 unittest.main(verbosity=2)