2 ##############################################################################
3 # Copyright (c) 2017 Orange, Inc. and others. All rights reserved.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
11 # pylint: disable=no-member
12 # pylint: disable=too-many-public-methods
19 from common import test_utils
22 class TransportPCEtesting(unittest.TestCase):
24 simple_topo_bi_dir_data = None
25 simple_topo_uni_dir_data = None
26 complex_topo_uni_dir_data = None
27 port_mapping_data = None
32 # pylint: disable=bare-except
34 sample_files_parsed = False
35 TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
36 "..", "..", "sample_configs", "honeynode-topo.xml")
37 with open(TOPO_BI_DIR_FILE, 'r') as topo_bi_dir:
38 cls.simple_topo_bi_dir_data = topo_bi_dir.read()
40 TOPO_UNI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
41 "..", "..", "sample_configs", "NW-simple-topology.xml")
43 with open(TOPO_UNI_DIR_FILE, 'r') as topo_uni_dir:
44 cls.simple_topo_uni_dir_data = topo_uni_dir.read()
46 TOPO_UNI_DIR_COMPLEX_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
47 "..", "..", "sample_configs", "NW-for-test-5-4.xml")
48 with open(TOPO_UNI_DIR_COMPLEX_FILE, 'r') as topo_uni_dir_complex:
49 cls.complex_topo_uni_dir_data = topo_uni_dir_complex.read()
50 PORT_MAPPING_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
51 "..", "..", "sample_configs", "pce_portmapping_121.json")
52 with open(PORT_MAPPING_FILE, 'r') as port_mapping:
53 cls.port_mapping_data = port_mapping.read()
54 sample_files_parsed = True
55 except PermissionError as err:
56 print("Permission Error when trying to read sample files\n", err)
58 except FileNotFoundError as err:
59 print("File Not found Error when trying to read sample files\n", err)
62 print("Unexpected error when trying to read sample files\n", sys.exc_info()[0])
65 if sample_files_parsed:
66 print("sample files content loaded")
68 cls.processes = test_utils.start_tpce()
71 def tearDownClass(cls):
72 # pylint: disable=not-an-iterable
73 for process in cls.processes:
74 test_utils.shutdown_process(process)
75 print("all processes killed")
77 def setUp(self): # instruction executed before each test method
81 def test_00_load_port_mapping(self):
82 response = test_utils.rawpost_request(test_utils.URL_FULL_PORTMAPPING, self.port_mapping_data)
83 self.assertEqual(response.status_code, requests.codes.no_content)
86 # Load simple bidirectional topology
87 def test_01_load_simple_topology_bi(self):
88 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_bi_dir_data)
89 self.assertEqual(response.status_code, requests.codes.ok)
93 def test_02_get_nodeId(self):
94 response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
95 self.assertEqual(response.status_code, requests.codes.ok)
98 res['node'][0]['node-id'], 'ROADMA01-SRG1')
101 # Get existing linkId
102 def test_03_get_linkId(self):
103 response = test_utils.get_ordm_topo_request("link/XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX")
104 self.assertEqual(response.status_code, requests.codes.ok)
105 res = response.json()
107 res['ietf-network-topology:link'][0]['link-id'],
108 'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX')
111 # Path Computation success
112 def test_04_path_computation_xpdr_bi(self):
113 response = test_utils.path_computation_request("request-1", "service-1",
114 {"node-id": "XPDRA01", "service-rate": "100",
115 "service-format": "Ethernet", "clli": "nodeA"},
116 {"node-id": "XPDRC01", "service-rate": "100",
117 "service-format": "Ethernet", "clli": "nodeC"})
118 self.assertEqual(response.status_code, requests.codes.ok)
119 res = response.json()
120 self.assertIn('Path is calculated',
121 res['output']['configuration-response-common']['response-message'])
124 # Path Computation success
125 def test_05_path_computation_rdm_bi(self):
126 response = test_utils.path_computation_request("request-1", "service-1",
127 {"node-id": "ROADMA01", "service-rate": "100",
128 "service-format": "Ethernet", "clli": "NodeA"},
129 {"node-id": "ROADMC01", "service-rate": "100",
130 "service-format": "Ethernet", "clli": "NodeC"})
131 self.assertEqual(response.status_code, requests.codes.ok)
132 res = response.json()
133 self.assertIn('Path is calculated',
134 res['output']['configuration-response-common']['response-message'])
138 def test_06_delete_simple_topology_bi(self):
139 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
140 self.assertEqual(response.status_code, requests.codes.ok)
143 # Test deleted topology
144 def test_07_test_topology_simple_bi_deleted(self):
145 response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
146 self.assertEqual(response.status_code, requests.codes.conflict)
149 # Load simple bidirectional topology
150 def test_08_load_simple_topology_uni(self):
151 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_uni_dir_data)
152 self.assertEqual(response.status_code, 201)
155 # Get existing nodeId
156 def test_09_get_nodeId(self):
157 response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
158 self.assertEqual(response.status_code, requests.codes.ok)
159 res = response.json()
161 res['node'][0]['node-id'],
165 # Get existing linkId
166 def test_10_get_linkId(self):
167 response = test_utils.get_ordm_topo_request("link/XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX")
168 self.assertEqual(response.status_code, requests.codes.ok)
169 res = response.json()
171 res['ietf-network-topology:link'][0]['link-id'],
172 'XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX')
175 # Path Computation success
176 def test_11_path_computation_xpdr_uni(self):
177 response = test_utils.path_computation_request("request-1", "service-1",
178 {"node-id": "XPONDER-1-2", "service-rate": "100",
179 "service-format": "Ethernet", "clli": "ORANGE1"},
180 {"node-id": "XPONDER-3-2", "service-rate": "100",
181 "service-format": "Ethernet", "clli": "ORANGE3"})
182 self.assertEqual(response.status_code, requests.codes.ok)
183 res = response.json()
184 self.assertIn('Path is calculated',
185 res['output']['configuration-response-common']['response-message'])
188 # Path Computation success
189 def test_12_path_computation_rdm_uni(self):
190 response = test_utils.path_computation_request("request1", "service1",
191 {"service-rate": "100", "service-format": "Ethernet",
192 "clli": "cll21", "node-id": "OpenROADM-2-1"},
193 {"service-rate": "100", "service-format": "Ethernet",
194 "clli": "ncli22", "node-id": "OpenROADM-2-2"})
195 self.assertEqual(response.status_code, requests.codes.ok)
196 res = response.json()
197 self.assertIn('Path is calculated',
198 res['output']['configuration-response-common']['response-message'])
200 atozList = len(res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'])
201 ztoaList = len(res['output']['response-parameters']['path-description']['zToA-direction']['zToA'])
202 self.assertEqual(atozList, 15)
203 self.assertEqual(ztoaList, 15)
204 for i in range(0, 15):
205 atoz = res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
206 ztoa = res['output']['response-parameters']['path-description']['zToA-direction']['zToA'][i]
207 if atoz['id'] == '14':
208 self.assertEqual(atoz['resource']['tp-id'], 'SRG1-PP1-TX')
209 if ztoa['id'] == '0':
210 self.assertEqual(ztoa['resource']['tp-id'], 'SRG1-PP1-RX')
214 def test_13_delete_simple_topology(self):
215 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
216 self.assertEqual(response.status_code, requests.codes.ok)
219 # Test deleted topology
220 def test_14_test_topology_simple_deleted(self):
221 response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
222 self.assertEqual(response.status_code, requests.codes.conflict)
225 # Load complex topology
226 def test_15_load_complex_topology(self):
227 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.complex_topo_uni_dir_data)
228 self.assertEqual(response.status_code, 201)
231 # Get existing nodeId
232 def test_16_get_nodeId(self):
233 response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
234 self.assertEqual(response.status_code, requests.codes.ok)
235 res = response.json()
237 res['node'][0]['node-id'],
241 # Test failed path computation
242 def test_17_fail_path_computation(self):
243 response = test_utils.post_request(test_utils.URL_PATH_COMPUTATION_REQUEST,
244 {"input": {"service-handler-header": {"request-id": "request-1"}}})
245 self.assertEqual(response.status_code, requests.codes.ok)
246 res = response.json()
247 self.assertIn('Service Name is not set',
248 res['output']['configuration-response-common']['response-message'])
251 # Test1 success path computation
252 def test_18_success1_path_computation(self):
253 response = test_utils.path_computation_request("request1", "service1",
254 {"service-format": "Ethernet", "service-rate": "100",
255 "clli": "ORANGE2", "node-id": "XPONDER-2-2",
256 "tx-direction": {"port": {
257 "port-device-name": "Some port-device-name",
258 "port-type": "Some port-type",
259 "port-name": "Some port-name",
260 "port-rack": "Some port-rack",
261 "port-shelf": "Some port-shelf",
262 "port-slot": "Some port-slot",
263 "port-sub-slot": "Some port-sub-slot"
265 "rx-direction": {"port": {
266 "port-device-name": "Some port-device-name",
267 "port-type": "Some port-type",
268 "port-name": "Some port-name",
269 "port-rack": "Some port-rack",
270 "port-shelf": "Some port-shelf",
271 "port-slot": "Some port-slot",
272 "port-sub-slot": "Some port-sub-slot"
274 {"service-format": "Ethernet", "service-rate": "100",
275 "clli": "ORANGE1", "node-id": "XPONDER-1-2",
276 "tx-direction": {"port": {
277 "port-device-name": "Some port-device-name",
278 "port-type": "Some port-type",
279 "port-name": "Some port-name",
280 "port-rack": "Some port-rack",
281 "port-shelf": "Some port-shelf",
282 "port-slot": "Some port-slot",
283 "port-sub-slot": "Some port-sub-slot"
285 "rx-direction": {"port": {
286 "port-device-name": "Some port-device-name",
287 "port-type": "Some port-type",
288 "port-name": "Some port-name",
289 "port-rack": "Some port-rack",
290 "port-shelf": "Some port-shelf",
291 "port-slot": "Some port-slot",
292 "port-sub-slot": "Some port-sub-slot"
294 {"customer-code": ["Some customer-code"],
295 "co-routing": {"existing-service": ["Some existing-service"]}
297 {"customer-code": ["Some customer-code"],
298 "co-routing": {"existing-service": ["Some existing-service"]}
300 "hop-count", {"locally-protected-links": "true"})
301 self.assertEqual(response.status_code, requests.codes.ok)
302 res = response.json()
303 self.assertIn('Path is calculated',
304 res['output']['configuration-response-common']['response-message'])
307 # Test2 success path computation with path description
308 def test_19_success2_path_computation(self):
309 response = test_utils.path_computation_request("request 1", "service 1",
310 {"service-rate": "100", "service-format": "Ethernet",
311 "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
312 {"service-rate": "100", "service-format": "Ethernet",
313 "node-id": "XPONDER-3-2", "clli": "ORANGE3"})
314 self.assertEqual(response.status_code, requests.codes.ok)
315 res = response.json()
316 self.assertIn('Path is calculated',
317 res['output']['configuration-response-common']['response-message'])
318 self.assertEqual(5, res['output']['response-parameters']['path-description']
319 ['aToZ-direction']['aToZ-wavelength-number'])
320 self.assertEqual(5, res['output']['response-parameters']['path-description']
321 ['zToA-direction']['zToA-wavelength-number'])
324 # Test3 success path computation with hard-constraints exclude
325 def test_20_success3_path_computation(self):
326 response = test_utils.path_computation_request("request 1", "service 1",
327 {"service-rate": "100", "service-format": "Ethernet",
328 "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
329 {"service-rate": "100", "service-format": "Ethernet",
330 "node-id": "XPONDER-3-2", "clli": "ORANGE3"},
331 {"exclude_": {"node-id": ["OpenROADM-2-1", "OpenROADM-2-2"]}})
332 self.assertEqual(response.status_code, requests.codes.ok)
333 res = response.json()
334 self.assertIn('Path is calculated',
335 res['output']['configuration-response-common']['response-message'])
336 self.assertEqual(9, res['output']['response-parameters']['path-description']
337 ['aToZ-direction']['aToZ-wavelength-number'])
338 self.assertEqual(9, res['output']['response-parameters']['path-description']
339 ['zToA-direction']['zToA-wavelength-number'])
342 # Path computation before deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
343 def test_21_path_computation_before_oms_attribute_deletion(self):
344 response = test_utils.path_computation_request("request 1", "service 1",
345 {"service-rate": "100", "service-format": "Ethernet",
346 "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
347 {"service-rate": "100", "service-format": "Ethernet",
348 "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
349 self.assertEqual(response.status_code, requests.codes.ok)
350 res = response.json()
351 self.assertIn('Path is calculated',
352 res['output']['configuration-response-common']['response-message'])
353 nbElmPath = len(res['output']['response-parameters']['path-description']
354 ['aToZ-direction']['aToZ'])
355 self.assertEqual(31, nbElmPath)
356 link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2", "state":"inService"}
358 for i in range(0, nbElmPath):
359 resource_i = (res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
361 if resource_i == link:
363 self.assertEqual(find, True)
366 # Delete oms-attribute in the link :openroadm1-3 to openroadm1-2
367 def test_22_delete_oms_attribute_in_openroadm13toopenroadm12_link(self):
368 response = test_utils.del_oms_attr_request("OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2")
369 self.assertEqual(response.status_code, requests.codes.ok)
372 # Path computation after deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
373 def test_23_path_computation_after_oms_attribute_deletion(self):
374 response = test_utils.path_computation_request("request 1", "service 1",
375 {"service-rate": "100", "service-format": "Ethernet",
376 "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
377 {"service-rate": "100", "service-format": "Ethernet",
378 "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
379 self.assertEqual(response.status_code, requests.codes.ok)
380 res = response.json()
381 self.assertIn('Path is calculated',
382 res['output']['configuration-response-common']['response-message'])
383 nbElmPath = len(res['output']['response-parameters']['path-description']
384 ['aToZ-direction']['aToZ'])
385 self.assertEqual(47, nbElmPath)
386 link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2", "state":"inService"}
388 for i in range(0, nbElmPath):
389 resource_i = (res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
391 if resource_i == link:
393 self.assertNotEqual(find, True)
396 # Delete complex topology
397 def test_24_delete_complex_topology(self):
398 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
399 self.assertEqual(response.status_code, requests.codes.ok)
402 # Test deleted complex topology
403 def test_25_test_topology_complex_deleted(self):
404 response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
405 self.assertEqual(response.status_code, requests.codes.conflict)
409 def test_26_delete_port_mapping(self):
410 response = test_utils.delete_request(test_utils.URL_FULL_PORTMAPPING)
411 self.assertEqual(response.status_code, requests.codes.ok)
415 if __name__ == "__main__":
416 unittest.main(verbosity=2)