3 ##############################################################################
4 # Copyright (c) 2019 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 ##############################################################################
25 class TransportPCEtesting(unittest.TestCase):
27 honeynode_process1 = None
29 restconf_baseurl = "http://localhost:8181/restconf"
33 print("starting honeynode1...")
34 cls.honeynode_process1 = test_utils.start_spdra_honeynode()
37 print("starting opendaylight...")
38 cls.odl_process = test_utils.start_tpce()
40 print("opendaylight started")
43 def tearDownClass(cls):
44 for child in psutil.Process(cls.odl_process.pid).children():
45 child.send_signal(signal.SIGINT)
47 cls.odl_process.send_signal(signal.SIGINT)
48 cls.odl_process.wait()
49 for child in psutil.Process(cls.honeynode_process1.pid).children():
50 child.send_signal(signal.SIGINT)
52 cls.honeynode_process1.send_signal(signal.SIGINT)
53 cls.honeynode_process1.wait()
58 def test_01_connect_SPDR_SA1(self):
59 url = ("{}/config/network-topology:"
60 "network-topology/topology/topology-netconf/node/SPDR-SA1"
61 .format(self.restconf_baseurl))
63 "node-id": "SPDR-SA1",
64 "netconf-node-topology:username": "admin",
65 "netconf-node-topology:password": "admin",
66 "netconf-node-topology:host": "127.0.0.1",
67 "netconf-node-topology:port": "17845",
68 "netconf-node-topology:tcp-only": "false",
69 "netconf-node-topology:pass-through": {}}]}
70 headers = {'content-type': 'application/json'}
71 response = requests.request(
72 "PUT", url, data=json.dumps(data), headers=headers,
73 auth=('admin', 'admin'))
74 self.assertEqual(response.status_code, requests.codes.created)
76 url = ("{}/operational/network-topology:"
77 "network-topology/topology/topology-netconf/node/SPDR-SA1"
78 .format(self.restconf_baseurl))
79 response = requests.request(
80 "GET", url, headers=headers, auth=('admin', 'admin'))
81 self.assertEqual(response.status_code, requests.codes.ok)
84 res['node'][0]['netconf-node-topology:connection-status'],
87 def test_02_getClliNetwork(self):
88 url = ("{}/config/ietf-network:networks/network/clli-network"
89 .format(self.restconf_baseurl))
90 headers = {'content-type': 'application/json'}
91 response = requests.request(
92 "GET", url, headers=headers, auth=('admin', 'admin'))
93 self.assertEqual(response.status_code, requests.codes.ok)
96 self.assertEqual(res['network'][0]['node'][0]['node-id'], 'NodeSA')
97 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeSA')
99 def test_03_getOpenRoadmNetwork(self):
100 url = ("{}/config/ietf-network:networks/network/openroadm-network"
101 .format(self.restconf_baseurl))
102 headers = {'content-type': 'application/json'}
103 response = requests.request(
104 "GET", url, headers=headers, auth=('admin', 'admin'))
105 self.assertEqual(response.status_code, requests.codes.ok)
106 res = response.json()
107 self.assertEqual(res['network'][0]['node'][0]['node-id'], 'SPDR-SA1')
108 self.assertEqual(res['network'][0]['node'][0]['supporting-node'][0]['network-ref'], 'clli-network')
109 self.assertEqual(res['network'][0]['node'][0]['supporting-node'][0]['node-ref'], 'NodeSA')
110 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-common-network:node-type'], 'XPONDER')
111 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-network:model'], 'universal-switchponder')
112 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-network:vendor'], 'vendorA')
113 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-network:ip'], '1.2.3.4')
115 def test_04_getLinks_OpenroadmTopology(self):
116 url = ("{}/config/ietf-network:networks/network/openroadm-topology"
117 .format(self.restconf_baseurl))
118 headers = {'content-type': 'application/json'}
119 response = requests.request(
120 "GET", url, headers=headers, auth=('admin', 'admin'))
121 self.assertEqual(response.status_code, requests.codes.ok)
122 res = response.json()
123 # Tests related to links
124 self.assertNotIn('ietf-network-topology:link', res['network'][0])
126 def test_05_getNodes_OpenRoadmTopology(self):
127 url = ("{}/config/ietf-network:networks/network/openroadm-topology"
128 .format(self.restconf_baseurl))
129 headers = {'content-type': 'application/json'}
130 response = requests.request(
131 "GET", url, headers=headers, auth=('admin', 'admin'))
132 res = response.json()
133 # Tests related to nodes
134 self.assertEqual(response.status_code, requests.codes.ok)
135 self.assertIn('node', res['network'][0])
136 if ('node' in res['network'][0]):
137 nbNode = len(res['network'][0]['node'])
138 self.assertEqual(nbNode, 2)
139 listNode = ['SPDR-SA1-XPDR1', 'SPDR-SA1-XPDR2']
140 for i in range(0, nbNode):
141 nodeType = res['network'][0]['node'][i]['org-openroadm-common-network:node-type']
142 nodeId = res['network'][0]['node'][i]['node-id']
143 if (nodeId == 'SPDR-SA1-XPDR1'):
144 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
145 res['network'][0]['node'][i]['supporting-node'])
146 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeSA'},
147 res['network'][0]['node'][i]['supporting-node'])
148 self.assertEqual(nodeType, 'XPONDER')
149 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
152 for j in range(0, nbTps):
153 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-common-network:tp-type']
154 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
155 if (tpType == 'XPONDER-CLIENT'):
157 elif (tpType == 'XPONDER-NETWORK'):
159 self.assertTrue(client == 0)
160 self.assertTrue(network == 1)
161 listNode.remove(nodeId)
162 elif (nodeId == 'SPDR-SA1-XPDR2'):
163 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
164 res['network'][0]['node'][i]['supporting-node'])
165 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeSA'},
166 res['network'][0]['node'][i]['supporting-node'])
167 self.assertEqual(nodeType, 'XPONDER')
168 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
171 for j in range(0, nbTps):
172 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-common-network:tp-type']
173 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
174 if (tpType == 'XPONDER-CLIENT'):
176 elif (tpType == 'XPONDER-NETWORK'):
178 self.assertTrue(client == 0)
179 self.assertTrue(network == 4)
180 listNode.remove(nodeId)
182 self.assertFalse(True)
183 self.assertEqual(len(listNode), 0)
185 def test_06_getLinks_OtnTopology(self):
186 url = ("{}/config/ietf-network:networks/network/otn-topology"
187 .format(self.restconf_baseurl))
188 headers = {'content-type': 'application/json'}
189 response = requests.request(
190 "GET", url, headers=headers, auth=('admin', 'admin'))
191 self.assertEqual(response.status_code, requests.codes.ok)
192 res = response.json()
193 self.assertNotIn('ietf-network-topology:link', res['network'][0])
195 def test_07_getNodes_OtnTopology(self):
196 url = ("{}/config/ietf-network:networks/network/otn-topology"
197 .format(self.restconf_baseurl))
198 headers = {'content-type': 'application/json'}
199 response = requests.request(
200 "GET", url, headers=headers, auth=('admin', 'admin'))
201 res = response.json()
202 self.assertEqual(response.status_code, requests.codes.ok)
203 nbNode = len(res['network'][0]['node'])
204 self.assertEqual(nbNode, 2)
205 listNode = ['SPDR-SA1-XPDR1', 'SPDR-SA1-XPDR2']
206 for i in range(0, nbNode):
207 nodeId = res['network'][0]['node'][i]['node-id']
208 if(nodeId == 'SPDR-SA1-XPDR1'):
209 nodeType = res['network'][0]['node'][i]['org-openroadm-common-network:node-type']
210 self.assertEqual(nodeType, 'MUXPDR')
211 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
212 res['network'][0]['node'][i]['supporting-node'])
213 self.assertIn({'network-ref': 'openroadm-topology', 'node-ref': 'SPDR-SA1-XPDR1'},
214 res['network'][0]['node'][i]['supporting-node'])
215 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeSA'},
216 res['network'][0]['node'][i]['supporting-node'])
217 self.assertEqual(res['network'][0]['node'][i]
218 ['org-openroadm-otn-network-topology:xpdr-attributes']['xpdr-number'], 1)
219 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
222 for j in range(0, nbTps):
223 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-common-network:tp-type']
224 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
225 if (tpType == 'XPONDER-CLIENT'):
227 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']
228 ['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-10GE-ODU2e')
229 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]
230 ['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU2e')
231 elif (tpType == 'XPONDER-NETWORK'):
233 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']
234 ['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-OCH-OTU4-ODU4')
235 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]
236 ['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
237 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
238 [j]['supporting-termination-point'][0]['network-ref'], 'openroadm-topology')
239 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
240 [j]['supporting-termination-point'][0]['node-ref'], 'SPDR-SA1-XPDR1')
241 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
242 [j]['supporting-termination-point'][0]['tp-ref'], 'XPDR1-NETWORK1')
243 self.assertTrue(client == 4)
244 self.assertTrue(network == 1)
245 listNode.remove(nodeId)
246 nbNbl = len(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']
247 ['odu-switching-pools'][0]['non-blocking-list'])
248 self.assertEqual(nbNbl, 4)
249 for k in range(0, nbNbl):
250 nbl = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'][k]
251 if (nbl['nbl-number'] == 1):
252 self.assertEqual(nbl['available-interconnect-bandwidth'], 10)
253 self.assertEqual(nbl['interconnect-bandwidth-unit'], 1000000000)
254 self.assertIn('XPDR1-NETWORK1', nbl['tp-list'])
255 self.assertIn('XPDR1-CLIENT1', nbl['tp-list'])
256 self.assertNotIn('XPDR1-CLIENT2', nbl['tp-list'])
257 elif(nodeId == 'SPDR-SA1-XPDR2'):
258 nodeType = res['network'][0]['node'][i]['org-openroadm-common-network:node-type']
259 self.assertEqual(nodeType, 'SWITCH')
260 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
261 res['network'][0]['node'][i]['supporting-node'])
262 self.assertIn({'network-ref': 'openroadm-topology', 'node-ref': 'SPDR-SA1-XPDR2'},
263 res['network'][0]['node'][i]['supporting-node'])
264 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeSA'},
265 res['network'][0]['node'][i]['supporting-node'])
266 self.assertEqual(res['network'][0]['node'][i]
267 ['org-openroadm-otn-network-topology:xpdr-attributes']['xpdr-number'], 2)
268 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
271 for j in range(0, nbTps):
272 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-common-network:tp-type']
273 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
274 if (tpType == 'XPONDER-CLIENT'):
276 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']
277 ['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-100GE-ODU4')
278 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]
279 ['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
280 elif (tpType == 'XPONDER-NETWORK'):
282 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']
283 ['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-OCH-OTU4-ODU4')
284 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]
285 ['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
286 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
287 [j]['supporting-termination-point'][0]['network-ref'], 'openroadm-topology')
288 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
289 [j]['supporting-termination-point'][0]['node-ref'], 'SPDR-SA1-XPDR2')
290 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point']
291 [j]['supporting-termination-point'][0]['tp-ref'], tpId)
292 self.assertTrue(client == 4)
293 self.assertTrue(network == 4)
294 listNode.remove(nodeId)
295 nbNbl = len(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']
296 ['odu-switching-pools'][0]['non-blocking-list'])
297 self.assertEqual(nbNbl, 1)
298 nbl = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'][0]
299 self.assertIn('XPDR2-NETWORK1', nbl['tp-list'])
300 self.assertIn('XPDR2-CLIENT1', nbl['tp-list'])
301 self.assertIn('XPDR2-NETWORK2', nbl['tp-list'])
302 self.assertIn('XPDR2-CLIENT2', nbl['tp-list'])
303 self.assertIn('XPDR2-NETWORK3', nbl['tp-list'])
304 self.assertIn('XPDR2-CLIENT3', nbl['tp-list'])
305 self.assertIn('XPDR2-NETWORK4', nbl['tp-list'])
306 self.assertIn('XPDR2-CLIENT4', nbl['tp-list'])
308 self.assertFalse(True)
309 self.assertEqual(len(listNode), 0)
311 def test_08_disconnect_SPDR_SA1(self):
312 url = ("{}/config/network-topology:"
313 "network-topology/topology/topology-netconf/node/SPDR-SA1"
314 .format(self.restconf_baseurl))
316 headers = {'content-type': 'application/json'}
317 response = requests.request(
318 "DELETE", url, data=json.dumps(data), headers=headers,
319 auth=('admin', 'admin'))
320 self.assertEqual(response.status_code, requests.codes.ok)
322 def test_09_getClliNetwork(self):
323 url = ("{}/config/ietf-network:networks/network/clli-network"
324 .format(self.restconf_baseurl))
325 headers = {'content-type': 'application/json'}
326 response = requests.request(
327 "GET", url, headers=headers, auth=('admin', 'admin'))
328 self.assertEqual(response.status_code, requests.codes.ok)
329 res = response.json()
330 nbNode = len(res['network'][0]['node'])
331 self.assertEqual(nbNode, 1)
332 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeSA')
334 def test_10_getOpenRoadmNetwork(self):
335 url = ("{}/config/ietf-network:networks/network/openroadm-network"
336 .format(self.restconf_baseurl))
337 headers = {'content-type': 'application/json'}
338 response = requests.request(
339 "GET", url, headers=headers, auth=('admin', 'admin'))
340 self.assertEqual(response.status_code, requests.codes.ok)
341 res = response.json()
342 self.assertNotIn('node', res['network'][0])
344 def test_11_getNodes_OpenRoadmTopology(self):
345 url = ("{}/config/ietf-network:networks/network/openroadm-topology"
346 .format(self.restconf_baseurl))
347 headers = {'content-type': 'application/json'}
348 response = requests.request(
349 "GET", url, headers=headers, auth=('admin', 'admin'))
350 res = response.json()
351 self.assertNotIn('node', res['network'][0])
353 def test_12_getNodes_OtnTopology(self):
354 url = ("{}/config/ietf-network:networks/network/otn-topology"
355 .format(self.restconf_baseurl))
356 headers = {'content-type': 'application/json'}
357 response = requests.request(
358 "GET", url, headers=headers, auth=('admin', 'admin'))
359 res = response.json()
360 self.assertNotIn('node', res['network'][0])
363 if __name__ == "__main__":
364 unittest.main(verbosity=2)