3 ##############################################################################
4 # Copyright (c) 2017 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 ##############################################################################
18 from common import test_utils
21 class TransportGNPYtesting(unittest.TestCase):
24 def __init_logfile(cls):
25 GNPY_LOGFILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
26 "..", "..", "transportpce_tests", "gnpy.log")
27 if os.path.isfile(GNPY_LOFGILE):
28 os.remove(GNPY_LOFGILE)
30 topo_cllinet_data = None
31 topo_ordnet_data = None
32 topo_ordtopo_data = None
38 sample_files_parsed = False
39 TOPO_CLLINET_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
40 "..", "..", "sample_configs", "gnpy", "clliNetwork.json")
41 with open(TOPO_CLLINET_FILE, 'r') as topo_cllinet:
42 cls.topo_cllinet_data = topo_cllinet.read()
44 TOPO_ORDNET_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
45 "..", "..", "sample_configs", "gnpy", "openroadmNetwork.json")
46 with open(TOPO_ORDNET_FILE, 'r') as topo_ordnet:
47 cls.topo_ordnet_data = topo_ordnet.read()
49 TOPO_ORDTOPO_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
50 "..", "..", "sample_configs", "gnpy", "openroadmTopology.json")
51 with open(TOPO_ORDTOPO_FILE, 'r') as topo_ordtopo:
52 cls.topo_ordtopo_data = topo_ordtopo.read()
53 sample_files_parsed = True
54 except PermissionError as err:
55 print("Permission Error when trying to read sample files\n", err)
57 except FileNotFoundError as err:
58 print("File Not found Error when trying to read sample files\n", err)
61 print("Unexpected error when trying to read sample files\n", sys.exc_info()[0])
64 if sample_files_parsed:
65 print("sample files content loaded")
67 cls.processes = test_utils.start_tpce()
70 def tearDownClass(cls):
71 for process in cls.processes:
72 test_utils.shutdown_process(process)
73 print("all processes killed")
78 # Mount the different topologies
79 def test_01_connect_clliNetwork(self):
80 response = test_utils.rawput_request(test_utils.URL_CONFIG_CLLI_NET, self.topo_cllinet_data)
81 self.assertEqual(response.status_code, requests.codes.ok)
84 def test_02_connect_openroadmNetwork(self):
85 url = "{}/config/ietf-network:networks/network/openroadm-network"
86 response = test_utils.rawput_request(url, self.topo_ordnet_data)
87 self.assertEqual(response.status_code, requests.codes.ok)
90 def test_03_connect_openroadmTopology(self):
91 response = test_utils.rawput_request(test_utils.URL_CONFIG_ORDM_TOPO, self.topo_ordtopo_data)
92 self.assertEqual(response.status_code, requests.codes.ok)
95 # Path computed by PCE is feasible according to Gnpy
96 def test_04_path_computation_FeasibleWithPCE(self):
97 url = "{}/operations/transportpce-pce:path-computation-request"
100 "service-name": "service-1",
101 "resource-reserve": "true",
102 "pce-metric": "hop-count",
103 "service-handler-header": {
104 "request-id": "request-1"
107 "node-id": "XPONDER-1",
108 "service-rate": "100",
109 "service-format": "Ethernet",
113 "node-id": "XPONDER-5",
114 "service-rate": "100",
115 "service-format": "Ethernet",
120 response = test_utils.post_request(url, data)
121 self.assertEqual(response.status_code, requests.codes.ok)
122 res = response.json()
123 self.assertEqual(res['output']['configuration-response-common'][
124 'response-code'], '200')
125 self.assertEqual(res['output']['configuration-response-common'][
127 'Path is calculated by PCE')
128 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
130 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
131 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
133 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
136 # Path computed by PCE is not feasible by GNPy and GNPy cannot find
137 # another one (low SNR)
138 def test_05_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
139 url = "{}/operations/transportpce-pce:path-computation-request"
142 "service-name": "service-2",
143 "resource-reserve": "true",
144 "pce-metric": "hop-count",
145 "service-handler-header": {
146 "request-id": "request-2"
149 "node-id": "XPONDER-1",
150 "service-rate": "100",
151 "service-format": "Ethernet",
155 "node-id": "XPONDER-5",
156 "service-rate": "100",
157 "service-format": "Ethernet",
160 "hard-constraints": {
166 "node-id": "OpenROADM-2"
172 "node-id": "OpenROADM-3"
178 "node-id": "OpenROADM-4"
186 response = test_utils.post_request(url, data)
187 self.assertEqual(response.status_code, requests.codes.ok)
188 res = response.json()
189 self.assertEqual(res['output']['configuration-response-common'][
190 'response-code'], '500')
191 self.assertEqual(res['output']['configuration-response-common'][
193 'No path available by PCE and GNPy ')
194 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
196 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'],
198 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
200 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'],
204 # #PCE cannot find a path while GNPy finds a feasible one
205 def test_06_path_computation_NotFoundByPCE_FoundByGNPy(self):
206 url = "{}/operations/transportpce-pce:path-computation-request"
209 "service-name": "service-3",
210 "resource-reserve": "true",
211 "pce-metric": "hop-count",
212 "service-handler-header": {
213 "request-id": "request-3"
216 "node-id": "XPONDER-1",
217 "service-rate": "100",
218 "service-format": "Ethernet",
222 "node-id": "XPONDER-4",
223 "service-rate": "100",
224 "service-format": "Ethernet",
227 "hard-constraints": {
233 "node-id": "OpenROADM-2"
239 "node-id": "OpenROADM-3"
247 response = test_utils.post_request(url, data)
248 self.assertEqual(response.status_code, requests.codes.ok)
249 res = response.json()
250 self.assertEqual(res['output']['configuration-response-common'][
251 'response-code'], '200')
252 self.assertEqual(res['output']['configuration-response-common'][
254 'Path is calculated by GNPy')
255 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
257 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
258 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
260 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
263 # Not found path by PCE and GNPy cannot find another one
264 def test_07_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
265 url = "{}/operations/transportpce-pce:path-computation-request"
268 "service-name": "service-4",
269 "resource-reserve": "true",
270 "pce-metric": "hop-count",
271 "service-handler-header": {
272 "request-id": "request-4"
275 "node-id": "XPONDER-1",
276 "service-rate": "100",
277 "service-format": "Ethernet",
281 "node-id": "XPONDER-4",
282 "service-rate": "100",
283 "service-format": "Ethernet",
286 "hard-constraints": {
292 "node-id": "OpenROADM-2"
298 "node-id": "OpenROADM-3"
304 "node-id": "OpenROADM-4"
310 "node-id": "OpenROADM-3"
318 response = test_utils.post_request(url, data)
319 self.assertEqual(response.status_code, requests.codes.ok)
320 res = response.json()
321 self.assertEqual(res['output']['configuration-response-common'][
322 'response-code'], '500')
323 self.assertEqual(res['output']['configuration-response-common'][
325 'No path available by PCE and GNPy ')
328 # Disconnect the different topologies
329 def test_08_disconnect_openroadmTopology(self):
330 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
331 self.assertEqual(response.status_code, requests.codes.ok)
334 def test_09_disconnect_openroadmNetwork(self):
335 url = "{}/config/ietf-network:networks/network/openroadm-network"
336 response = test_utils.delete_request(url)
337 self.assertEqual(response.status_code, requests.codes.ok)
340 def test_10_disconnect_clliNetwork(self):
341 response = test_utils.delete_request(test_utils.URL_CONFIG_CLLI_NET)
342 self.assertEqual(response.status_code, requests.codes.ok)
346 if __name__ == "__main__":
347 # logging.basicConfig(filename='./transportpce_tests/log/response.log',filemode='w',level=logging.DEBUG)
348 unittest.main(verbosity=2)