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 ##############################################################################
17 from common import test_utils
20 class TransportGNPYtesting(unittest.TestCase):
23 def __init_logfile(cls):
24 if os.path.isfile("./transportpce_tests/gnpy.log"):
25 os.remove("transportpce_tests/gnpy.log")
31 cls.processes = test_utils.start_tpce()
34 def tearDownClass(cls):
35 for process in cls.processes:
36 test_utils.shutdown_process(process)
37 print("all processes killed")
42 # Mount the different topologies
43 def test_01_connect_clliNetwork(self):
44 url = "{}/config/ietf-network:networks/network/clli-network"
45 topo_cllinet_file = "sample_configs/gnpy/clliNetwork.json"
46 if os.path.isfile(topo_cllinet_file):
47 with open(topo_cllinet_file, 'r') as clli_net:
48 data = clli_net.read()
49 #TODO : review this os specific path and treat error with an else-statement
50 response = test_utils.rawput_request(url, data)
51 self.assertEqual(response.status_code, requests.codes.ok)
54 def test_02_connect_openroadmNetwork(self):
55 url = "{}/config/ietf-network:networks/network/openroadm-network"
56 topo_ordnet_file = "sample_configs/gnpy/openroadmNetwork.json"
57 if os.path.isfile(topo_ordnet_file):
58 with open(topo_ordnet_file, 'r') as ord_net:
60 response = test_utils.rawput_request(url, data)
61 self.assertEqual(response.status_code, requests.codes.ok)
64 def test_03_connect_openroadmTopology(self):
65 url = "{}/config/ietf-network:networks/network/openroadm-topology"
66 topo_ordtopo_file = "sample_configs/gnpy/openroadmTopology.json"
67 if os.path.isfile(topo_ordtopo_file):
68 with open(topo_ordtopo_file, 'r') as ord_topo:
69 data = ord_topo.read()
70 response = test_utils.rawput_request(url, data)
71 self.assertEqual(response.status_code, requests.codes.ok)
74 # Path computed by PCE is feasible according to Gnpy
75 def test_04_path_computation_FeasibleWithPCE(self):
76 url = "{}/operations/transportpce-pce:path-computation-request"
79 "service-name": "service-1",
80 "resource-reserve": "true",
81 "pce-metric": "hop-count",
82 "service-handler-header": {
83 "request-id": "request-1"
86 "node-id": "XPONDER-1",
87 "service-rate": "100",
88 "service-format": "Ethernet",
92 "node-id": "XPONDER-5",
93 "service-rate": "100",
94 "service-format": "Ethernet",
99 response = test_utils.post_request(url, data)
100 self.assertEqual(response.status_code, requests.codes.ok)
101 res = response.json()
102 self.assertEqual(res['output']['configuration-response-common'][
103 'response-code'], '200')
104 self.assertEqual(res['output']['configuration-response-common'][
106 'Path is calculated by PCE')
107 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
109 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
110 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
112 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
115 # Path computed by PCE is not feasible by GNPy and GNPy cannot find
116 # another one (low SNR)
117 def test_05_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
118 url = "{}/operations/transportpce-pce:path-computation-request"
121 "service-name": "service-2",
122 "resource-reserve": "true",
123 "pce-metric": "hop-count",
124 "service-handler-header": {
125 "request-id": "request-2"
128 "node-id": "XPONDER-1",
129 "service-rate": "100",
130 "service-format": "Ethernet",
134 "node-id": "XPONDER-5",
135 "service-rate": "100",
136 "service-format": "Ethernet",
139 "hard-constraints": {
145 "node-id": "OpenROADM-2"
151 "node-id": "OpenROADM-3"
157 "node-id": "OpenROADM-4"
165 response = test_utils.post_request(url, data)
166 self.assertEqual(response.status_code, requests.codes.ok)
167 res = response.json()
168 self.assertEqual(res['output']['configuration-response-common'][
169 'response-code'], '500')
170 self.assertEqual(res['output']['configuration-response-common'][
172 'No path available by PCE and GNPy ')
173 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
175 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'],
177 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
179 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'],
183 # #PCE cannot find a path while GNPy finds a feasible one
184 def test_06_path_computation_NotFoundByPCE_FoundByGNPy(self):
185 url = "{}/operations/transportpce-pce:path-computation-request"
188 "service-name": "service-3",
189 "resource-reserve": "true",
190 "pce-metric": "hop-count",
191 "service-handler-header": {
192 "request-id": "request-3"
195 "node-id": "XPONDER-1",
196 "service-rate": "100",
197 "service-format": "Ethernet",
201 "node-id": "XPONDER-4",
202 "service-rate": "100",
203 "service-format": "Ethernet",
206 "hard-constraints": {
212 "node-id": "OpenROADM-2"
218 "node-id": "OpenROADM-3"
226 response = test_utils.post_request(url, data)
227 self.assertEqual(response.status_code, requests.codes.ok)
228 res = response.json()
229 self.assertEqual(res['output']['configuration-response-common'][
230 'response-code'], '200')
231 self.assertEqual(res['output']['configuration-response-common'][
233 'Path is calculated by GNPy')
234 self.assertEqual(res['output']['gnpy-response'][0]['path-dir'],
236 self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
237 self.assertEqual(res['output']['gnpy-response'][1]['path-dir'],
239 self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
242 # Not found path by PCE and GNPy cannot find another one
243 def test_07_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
244 url = "{}/operations/transportpce-pce:path-computation-request"
247 "service-name": "service-4",
248 "resource-reserve": "true",
249 "pce-metric": "hop-count",
250 "service-handler-header": {
251 "request-id": "request-4"
254 "node-id": "XPONDER-1",
255 "service-rate": "100",
256 "service-format": "Ethernet",
260 "node-id": "XPONDER-4",
261 "service-rate": "100",
262 "service-format": "Ethernet",
265 "hard-constraints": {
271 "node-id": "OpenROADM-2"
277 "node-id": "OpenROADM-3"
283 "node-id": "OpenROADM-4"
289 "node-id": "OpenROADM-3"
297 response = test_utils.post_request(url, data)
298 self.assertEqual(response.status_code, requests.codes.ok)
299 res = response.json()
300 self.assertEqual(res['output']['configuration-response-common'][
301 'response-code'], '500')
302 self.assertEqual(res['output']['configuration-response-common'][
304 'No path available by PCE and GNPy ')
307 # Disconnect the different topologies
308 def test_08_disconnect_openroadmTopology(self):
309 url = "{}/config/ietf-network:networks/network/openroadm-topology"
310 response = test_utils.delete_request(url)
311 self.assertEqual(response.status_code, requests.codes.ok)
314 def test_09_disconnect_openroadmNetwork(self):
315 url = "{}/config/ietf-network:networks/network/openroadm-network"
316 response = test_utils.delete_request(url)
317 self.assertEqual(response.status_code, requests.codes.ok)
320 def test_10_disconnect_clliNetwork(self):
321 url = "{}/config/ietf-network:networks/network/clli-network"
322 response = test_utils.delete_request(url)
323 self.assertEqual(response.status_code, requests.codes.ok)
327 if __name__ == "__main__":
328 # logging.basicConfig(filename='./transportpce_tests/log/response.log',filemode='w',level=logging.DEBUG)
329 unittest.main(verbosity=2)