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
20 from common import test_utils
23 class TransportPCEtesting(unittest.TestCase):
25 simple_topo_bi_dir_data = None
26 simple_topo_uni_dir_data = None
27 complex_topo_uni_dir_data = None
33 sample_files_parsed = False
34 TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
35 "..", "..", "sample_configs", "honeynode-topo.xml")
36 with open(TOPO_BI_DIR_FILE, 'r') as topo_bi_dir:
37 cls.simple_topo_bi_dir_data = topo_bi_dir.read()
39 TOPO_UNI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
40 "..", "..", "sample_configs", "NW-simple-topology.xml")
42 with open(TOPO_UNI_DIR_FILE, 'r') as topo_uni_dir:
43 cls.simple_topo_uni_dir_data = topo_uni_dir.read()
45 TOPO_UNI_DIR_COMPLEX_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
46 "..", "..", "sample_configs", "NW-for-test-5-4.xml")
47 with open(TOPO_UNI_DIR_COMPLEX_FILE, 'r') as topo_uni_dir_complex:
48 cls.complex_topo_uni_dir_data = topo_uni_dir_complex.read()
49 sample_files_parsed = True
50 except PermissionError as err:
51 print("Permission Error when trying to read sample files\n", err)
53 except FileNotFoundError as err:
54 print("File Not found Error when trying to read sample files\n", err)
57 print("Unexpected error when trying to read sample files\n", sys.exc_info()[0])
60 if sample_files_parsed:
61 print("sample files content loaded")
63 cls.processes = test_utils.start_tpce()
66 def tearDownClass(cls):
67 for process in cls.processes:
68 test_utils.shutdown_process(process)
69 print("all processes killed")
71 def setUp(self): # instruction executed before each test method
74 # Load simple bidirectional topology
75 def test_01_load_simple_topology_bi(self):
76 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_bi_dir_data)
77 self.assertEqual(response.status_code, requests.codes.ok)
81 def test_02_get_nodeId(self):
82 response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
83 self.assertEqual(response.status_code, requests.codes.ok)
86 res['node'][0]['node-id'], 'ROADMA01-SRG1')
90 def test_03_get_linkId(self):
91 response = test_utils.get_ordm_topo_request("link/XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX")
92 self.assertEqual(response.status_code, requests.codes.ok)
95 res['ietf-network-topology:link'][0]['link-id'],
96 'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX')
99 # Path Computation success
100 def test_04_path_computation_xpdr_bi(self):
101 response = test_utils.path_computation_request("request-1", "service-1",
102 {"node-id": "XPDRA01", "service-rate": "100",
103 "service-format": "Ethernet", "clli": "nodeA"},
104 {"node-id": "XPDRC01", "service-rate": "100", "service-format": "Ethernet", "clli": "nodeC"})
105 self.assertEqual(response.status_code, requests.codes.ok)
106 res = response.json()
107 self.assertIn('Path is calculated',
108 res['output']['configuration-response-common']['response-message'])
111 # Path Computation success
112 def test_05_path_computation_rdm_bi(self):
113 response = test_utils.path_computation_request("request-1", "service-1",
114 {"node-id": "ROADMA01", "service-rate": "100",
115 "service-format": "Ethernet", "clli": "NodeA"},
116 {"node-id": "ROADMC01", "service-rate": "100", "service-format": "Ethernet", "clli": "NodeC"})
117 self.assertEqual(response.status_code, requests.codes.ok)
118 res = response.json()
119 self.assertIn('Path is calculated',
120 res['output']['configuration-response-common']['response-message'])
124 def test_06_delete_simple_topology_bi(self):
125 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
126 self.assertEqual(response.status_code, requests.codes.ok)
129 # Test deleted topology
130 def test_07_test_topology_simple_bi_deleted(self):
131 response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
132 self.assertEqual(response.status_code, requests.codes.conflict)
135 # Load simple bidirectional topology
136 def test_08_load_simple_topology_uni(self):
137 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_uni_dir_data)
138 self.assertEqual(response.status_code, 201)
141 # Get existing nodeId
142 def test_09_get_nodeId(self):
143 response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
144 self.assertEqual(response.status_code, requests.codes.ok)
145 res = response.json()
147 res['node'][0]['node-id'],
151 # Get existing linkId
152 def test_10_get_linkId(self):
153 response = test_utils.get_ordm_topo_request("link/XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX")
154 self.assertEqual(response.status_code, requests.codes.ok)
155 res = response.json()
157 res['ietf-network-topology:link'][0]['link-id'],
158 'XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX')
161 # Path Computation success
162 def test_11_path_computation_xpdr_uni(self):
163 response = test_utils.path_computation_request("request-1", "service-1",
164 {"node-id": "XPONDER-1-2", "service-rate": "100",
165 "service-format": "Ethernet", "clli": "ORANGE1"},
166 {"node-id": "XPONDER-3-2", "service-rate": "100", "service-format": "Ethernet", "clli": "ORANGE3"})
167 self.assertEqual(response.status_code, requests.codes.ok)
168 res = response.json()
169 self.assertIn('Path is calculated',
170 res['output']['configuration-response-common']['response-message'])
173 # Path Computation success
174 def test_12_path_computation_rdm_uni(self):
175 response = test_utils.path_computation_request("request1", "service1",
176 {"service-rate": "100", "service-format": "Ethernet",
177 "clli": "cll21", "node-id": "OpenROADM-2-1"},
178 {"service-rate": "100", "service-format": "Ethernet", "clli": "ncli22", "node-id": "OpenROADM-2-2"})
179 self.assertEqual(response.status_code, requests.codes.ok)
180 res = response.json()
181 self.assertIn('Path is calculated',
182 res['output']['configuration-response-common']['response-message'])
184 atozList = len(res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'])
185 ztoaList = len(res['output']['response-parameters']['path-description']['zToA-direction']['zToA'])
186 self.assertEqual(atozList, 15)
187 self.assertEqual(ztoaList, 15)
188 for i in range(0, 15):
189 atoz = res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
190 ztoa = res['output']['response-parameters']['path-description']['zToA-direction']['zToA'][i]
191 if (atoz['id'] == '14'):
192 self.assertEqual(atoz['resource']['tp-id'], 'SRG1-PP1-TX')
193 if (ztoa['id'] == '0'):
194 self.assertEqual(ztoa['resource']['tp-id'], 'SRG1-PP1-RX')
198 def test_13_delete_simple_topology(self):
199 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
200 self.assertEqual(response.status_code, requests.codes.ok)
203 # Test deleted topology
204 def test_14_test_topology_simple_deleted(self):
205 response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
206 self.assertEqual(response.status_code, requests.codes.conflict)
209 # Load complex topology
210 def test_15_load_complex_topology(self):
211 response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.complex_topo_uni_dir_data)
212 self.assertEqual(response.status_code, 201)
215 # Get existing nodeId
216 def test_16_get_nodeId(self):
217 response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
218 self.assertEqual(response.status_code, requests.codes.ok)
219 res = response.json()
221 res['node'][0]['node-id'],
225 # Test failed path computation
226 def test_17_fail_path_computation(self):
227 response = test_utils.post_request(test_utils.URL_PATH_COMPUTATION_REQUEST,
228 {"input": {"service-handler-header": {"request-id": "request-1"}}})
229 self.assertEqual(response.status_code, requests.codes.ok)
230 res = response.json()
231 self.assertIn('Service Name is not set',
232 res['output']['configuration-response-common']['response-message'])
235 # Test1 success path computation
236 def test_18_success1_path_computation(self):
237 response = test_utils.path_computation_request("request1", "service1",
238 {"service-format": "Ethernet", "service-rate": "100", "clli": "ORANGE2", "node-id": "XPONDER-2-2",
239 "tx-direction": {"port": {
240 "port-device-name": "Some port-device-name",
241 "port-type": "Some port-type",
242 "port-name": "Some port-name",
243 "port-rack": "Some port-rack",
244 "port-shelf": "Some port-shelf",
245 "port-slot": "Some port-slot",
246 "port-sub-slot": "Some port-sub-slot"
248 "rx-direction": {"port": {
249 "port-device-name": "Some port-device-name",
250 "port-type": "Some port-type",
251 "port-name": "Some port-name",
252 "port-rack": "Some port-rack",
253 "port-shelf": "Some port-shelf",
254 "port-slot": "Some port-slot",
255 "port-sub-slot": "Some port-sub-slot"
257 {"service-format": "Ethernet", "service-rate": "100", "clli": "ORANGE1", "node-id": "XPONDER-1-2",
258 "tx-direction": {"port": {
259 "port-device-name": "Some port-device-name",
260 "port-type": "Some port-type",
261 "port-name": "Some port-name",
262 "port-rack": "Some port-rack",
263 "port-shelf": "Some port-shelf",
264 "port-slot": "Some port-slot",
265 "port-sub-slot": "Some port-sub-slot"
267 "rx-direction": {"port": {
268 "port-device-name": "Some port-device-name",
269 "port-type": "Some port-type",
270 "port-name": "Some port-name",
271 "port-rack": "Some port-rack",
272 "port-shelf": "Some port-shelf",
273 "port-slot": "Some port-slot",
274 "port-sub-slot": "Some port-sub-slot"
276 {"customer-code": ["Some customer-code"],
277 "co-routing": {"existing-service": ["Some existing-service"]}},
278 {"customer-code": ["Some customer-code"],
279 "co-routing": {"existing-service": ["Some existing-service"]}},
280 "hop-count", {"locally-protected-links": "true"})
281 self.assertEqual(response.status_code, requests.codes.ok)
282 res = response.json()
283 self.assertIn('Path is calculated',
284 res['output']['configuration-response-common']['response-message'])
287 # Test2 success path computation with path description
288 def test_19_success2_path_computation(self):
289 response = test_utils.path_computation_request("request 1", "service 1",
290 {"service-rate": "100", "service-format": "Ethernet",
291 "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
292 {"service-rate": "100", "service-format": "Ethernet", "node-id": "XPONDER-3-2", "clli": "ORANGE3"})
293 self.assertEqual(response.status_code, requests.codes.ok)
294 res = response.json()
295 self.assertIn('Path is calculated',
296 res['output']['configuration-response-common']['response-message'])
297 self.assertEqual(5, res['output']['response-parameters']['path-description']
298 ['aToZ-direction']['aToZ-wavelength-number'])
299 self.assertEqual(5, res['output']['response-parameters']['path-description']
300 ['zToA-direction']['zToA-wavelength-number'])
303 # Test3 success path computation with hard-constraints exclude
304 def test_20_success3_path_computation(self):
305 response = test_utils.path_computation_request("request 1", "service 1",
306 {"service-rate": "100", "service-format": "Ethernet",
307 "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
308 {"service-rate": "100", "service-format": "Ethernet",
309 "node-id": "XPONDER-3-2", "clli": "ORANGE3"},
310 {"exclude_": {"node-id": ["OpenROADM-2-1", "OpenROADM-2-2"]}})
311 self.assertEqual(response.status_code, requests.codes.ok)
312 res = response.json()
313 self.assertIn('Path is calculated',
314 res['output']['configuration-response-common']['response-message'])
315 self.assertEqual(9, res['output']['response-parameters']['path-description']
316 ['aToZ-direction']['aToZ-wavelength-number'])
317 self.assertEqual(9, res['output']['response-parameters']['path-description']
318 ['zToA-direction']['zToA-wavelength-number'])
321 # Path computation before deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
322 def test_21_path_computation_before_oms_attribute_deletion(self):
323 response = test_utils.path_computation_request("request 1", "service 1",
324 {"service-rate": "100", "service-format": "Ethernet",
325 "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
326 {"service-rate": "100", "service-format": "Ethernet", "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
327 self.assertEqual(response.status_code, requests.codes.ok)
328 res = response.json()
329 self.assertIn('Path is calculated',
330 res['output']['configuration-response-common']['response-message'])
331 nbElmPath = len(res['output']['response-parameters']['path-description']
332 ['aToZ-direction']['aToZ'])
333 self.assertEqual(31, nbElmPath)
334 link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2"}
336 for i in range(0, nbElmPath):
337 resource_i = res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]['resource']
338 if(resource_i == link):
340 self.assertEqual(find, True)
343 # Delete oms-attribute in the link :openroadm1-3 to openroadm1-2
344 def test_22_delete_oms_attribute_in_openroadm13toopenroadm12_link(self):
345 response = test_utils.del_oms_attr_request("OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2")
346 self.assertEqual(response.status_code, requests.codes.ok)
349 # Path computation after deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
350 def test_23_path_computation_after_oms_attribute_deletion(self):
351 response = test_utils.path_computation_request("request 1", "service 1",
352 {"service-rate": "100", "service-format": "Ethernet",
353 "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
354 {"service-rate": "100", "service-format": "Ethernet", "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
355 self.assertEqual(response.status_code, requests.codes.ok)
356 res = response.json()
357 self.assertIn('Path is calculated',
358 res['output']['configuration-response-common']['response-message'])
359 nbElmPath = len(res['output']['response-parameters']['path-description']
360 ['aToZ-direction']['aToZ'])
361 self.assertEqual(47, nbElmPath)
362 link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2"}
364 for i in range(0, nbElmPath):
365 resource_i = res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]['resource']
366 if (resource_i == link):
368 self.assertNotEqual(find, True)
371 # Delete complex topology
372 def test_24_delete_complex_topology(self):
373 response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
374 self.assertEqual(response.status_code, requests.codes.ok)
377 # Test deleted complex topology
378 def test_25_test_topology_complex_deleted(self):
379 response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
380 self.assertEqual(response.status_code, requests.codes.conflict)
384 if __name__ == "__main__":
385 unittest.main(verbosity=2)