Migrate PCE functional tests to RFC8040
[transportpce.git] / tests / transportpce_tests / pce / test03_gnpy.py
index 5a72ca754511491e8bdc79a984b6e85d4904a4ad..9b0a3be168f3e79ea48426d88fbe71a44752c06e 100644 (file)
@@ -22,10 +22,30 @@ import requests
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils  # nopep8
+import test_utils_rfc8040  # nopep8
 
 
 class TransportGNPYtesting(unittest.TestCase):
+    path_computation_input_data = {
+        "service-name": "service-1",
+        "resource-reserve": "true",
+        "service-handler-header": {
+            "request-id": "request-1"
+        },
+        "service-a-end": {
+            "service-rate": "100",
+            "clli": "Node1",
+            "service-format": "Ethernet",
+            "node-id": "XPONDER-1"
+        },
+        "service-z-end": {
+            "service-rate": "100",
+            "clli": "Node5",
+            "service-format": "Ethernet",
+            "node-id": "XPONDER-5"
+        },
+        "pce-routing-metric": "hop-count"
+    }
 
     topo_cllinet_data = None
     topo_ordnet_data = None
@@ -73,160 +93,138 @@ class TransportGNPYtesting(unittest.TestCase):
         with open('gnpy.log', 'w', encoding='utf-8') as outfile:
             print('starting GNPy REST server...')
             # pylint: disable=consider-using-with
-            test_utils.process_list.append(subprocess.Popen(
+            test_utils_rfc8040.process_list.append(subprocess.Popen(
                 ['gnpy-rest'], stdout=outfile, stderr=outfile, stdin=None))
-        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils_rfc8040.start_tpce()
 
     @classmethod
     def tearDownClass(cls):
+        # clean datastores
+        test_utils_rfc8040.del_portmapping()
+        test_utils_rfc8040.del_ietf_network('openroadm-topology')
+        test_utils_rfc8040.del_ietf_network('openroadm-network')
+        test_utils_rfc8040.del_ietf_network('clli-network')
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils.shutdown_process(process)
+            test_utils_rfc8040.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(2)
+        time.sleep(1)
 
      # Load port mapping
     def test_00_load_port_mapping(self):
-        response = test_utils.rawpost_request(test_utils.URL_FULL_PORTMAPPING, self.port_mapping_data)
-        self.assertEqual(response.status_code, requests.codes.no_content)
-        time.sleep(2)
+        response = test_utils_rfc8040.post_portmapping(self.port_mapping_data)
+        self.assertIn(response['status_code'], (requests.codes.created, requests.codes.no_content))
+        time.sleep(1)
 
     # Mount the different topologies
     def test_01_connect_clliNetwork(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_CLLI_NET, self.topo_cllinet_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils_rfc8040.put_ietf_network('clli-network', self.topo_cllinet_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     def test_02_connect_openroadmNetwork(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_ORDM_NET, self.topo_ordnet_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils_rfc8040.put_ietf_network('openroadm-network', self.topo_ordnet_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     def test_03_connect_openroadmTopology(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_ORDM_TOPO, self.topo_ordtopo_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils_rfc8040.put_ietf_network('openroadm-topology', self.topo_ordtopo_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path computed by PCE is feasible according to Gnpy
     def test_04_path_computation_FeasibleWithPCE(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-5", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
-            'response-code'], '200')
-        self.assertEqual(res['output']['configuration-response-common'][
-            'response-message'],
-            'Path is calculated by PCE')
+        response = test_utils_rfc8040.transportpce_api_rpc_request('transportpce-pce',
+                                                                   'path-computation-request',
+                                                                   self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common']['response-code'], '200')
+        self.assertEqual(response['output']['configuration-response-common']['response-message'],
+                         'Path is calculated by PCE')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
-        time.sleep(5)
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'], True)
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'], True)
+        time.sleep(2)
 
     # Path computed by PCE is not feasible by GNPy and GNPy cannot find
     # another one (low SNR)
     def test_05_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
-        response = test_utils.path_computation_request("request-2", "service-2",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-5", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-2", "OpenROADM-3", "OpenROADM-4"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-2"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-2"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-2", "OpenROADM-3", "OpenROADM-4"]}}
+        response = test_utils_rfc8040.transportpce_api_rpc_request('transportpce-pce',
+                                                                   'path-computation-request',
+                                                                   self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '500')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'No path available by PCE and GNPy ')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'],
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'],
                          False)
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'],
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'],
                          False)
-        time.sleep(5)
+        time.sleep(2)
 
     # #PCE cannot find a path while GNPy finds a feasible one
     def test_06_path_computation_NotFoundByPCE_FoundByGNPy(self):
-        response = test_utils.path_computation_request("request-3", "service-3",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-4", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-2", "OpenROADM-3"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-3"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-3"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "XPONDER-4"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-2", "OpenROADM-3"]}}
+        response = test_utils_rfc8040.transportpce_api_rpc_request('transportpce-pce',
+                                                                   'path-computation-request',
+                                                                   self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '200')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'Path is calculated by GNPy')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
-        time.sleep(5)
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'], True)
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'], True)
+        time.sleep(2)
 
     # Not found path by PCE and GNPy cannot find another one
     def test_07_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
-        response = test_utils.path_computation_request("request-4", "service-4",
-                                                       {"node-id": "XPONDER-1", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-4", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "Node4"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-3", "OpenROADM-2",
-                                                           "OpenROADM-5"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-4"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-4"
+        self.path_computation_input_data["service-a-end"]["service-rate"] = "400"
+        self.path_computation_input_data["service-z-end"]["service-rate"] = "400"
+        self.path_computation_input_data["service-z-end"]["clli"] = "Node4"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-3", "OpenROADM-2", "OpenROADM-5"]}}
+        response = test_utils_rfc8040.transportpce_api_rpc_request('transportpce-pce',
+                                                                   'path-computation-request',
+                                                                   self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '500')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'No path available by PCE and GNPy ')
-        time.sleep(5)
-
-    # Disconnect the different topologies
-    def test_08_disconnect_openroadmTopology(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    def test_09_disconnect_openroadmNetwork(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_NET)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    def test_10_disconnect_clliNetwork(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_CLLI_NET)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    # Delete portmapping
-    def test_11_delete_port_mapping(self):
-        response = test_utils.delete_request(test_utils.URL_FULL_PORTMAPPING)
-        self.assertEqual(response.status_code, requests.codes.ok)
         time.sleep(2)