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-network-topology: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.assertEqual(nodeType, 'XPONDER')
147 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
150 for j in range(0, nbTps):
151 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-network-topology:tp-type']
152 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
153 if (tpType == 'XPONDER-CLIENT'):
155 elif (tpType == 'XPONDER-NETWORK'):
157 self.assertTrue(client == 4)
158 self.assertTrue(network == 1)
159 listNode.remove(nodeId)
160 if(nodeId == 'SPDR-SA1-XPDR2'):
161 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
162 res['network'][0]['node'][i]['supporting-node'])
163 self.assertEqual(nodeType, 'XPONDER')
164 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
167 for j in range(0, nbTps):
168 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-network-topology:tp-type']
169 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
170 if (tpType == 'XPONDER-CLIENT'):
172 elif (tpType == 'XPONDER-NETWORK'):
174 self.assertTrue(client == 4)
175 self.assertTrue(network == 4)
176 listNode.remove(nodeId)
178 self.assertFalse(True)
179 self.assertEqual(len(listNode), 0)
181 def test_06_getLinks_OtnTopology(self):
182 url = ("{}/config/ietf-network:networks/network/otn-topology"
183 .format(self.restconf_baseurl))
184 headers = {'content-type': 'application/json'}
185 response = requests.request(
186 "GET", url, headers=headers, auth=('admin', 'admin'))
187 self.assertEqual(response.status_code, requests.codes.ok)
188 res = response.json()
189 self.assertNotIn('ietf-network-topology:link', res['network'][0])
191 def test_07_getNodes_OtnTopology(self):
192 url = ("{}/config/ietf-network:networks/network/otn-topology"
193 .format(self.restconf_baseurl))
194 headers = {'content-type': 'application/json'}
195 response = requests.request(
196 "GET", url, headers=headers, auth=('admin', 'admin'))
197 res = response.json()
198 self.assertEqual(response.status_code, requests.codes.ok)
199 nbNode = len(res['network'][0]['node'])
200 self.assertEqual(nbNode, 2)
201 listNode = ['SPDR-SA1-XPDR1', 'SPDR-SA1-XPDR2']
202 for i in range(0, nbNode):
203 nodeId = res['network'][0]['node'][i]['node-id']
204 if(nodeId == 'SPDR-SA1-XPDR1'):
205 nodeType = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:node-type']
206 self.assertEqual(nodeType, 'MUXPDR')
207 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
208 res['network'][0]['node'][i]['supporting-node'])
209 self.assertIn({'network-ref': 'openroadm-topology', 'node-ref': 'SPDR-SA1-XPDR1'},
210 res['network'][0]['node'][i]['supporting-node'])
211 self.assertEqual(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:xpdr-attributes']['xpdr-number'], 1)
212 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
215 for j in range(0, nbTps):
216 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-type']
217 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
218 if (tpType == 'XPONDER-CLIENT'):
220 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-10GE-ODU2e')
221 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU2e')
222 elif (tpType == 'XPONDER-NETWORK'):
224 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-OCH-OTU4-ODU4')
225 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
226 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['network-ref'], 'openroadm-topology')
227 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['node-ref'], 'SPDR-SA1-XPDR1')
228 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['tp-ref'], 'XPDR1-NETWORK1')
229 self.assertTrue(client == 4)
230 self.assertTrue(network == 1)
231 listNode.remove(nodeId)
232 nbNbl = len(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'])
233 self.assertEqual(nbNbl, 4)
234 for k in range(0, nbNbl):
235 nbl = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'][k]
236 if (nbl['nbl-number'] == 1):
237 self.assertEqual(nbl['available-interconnect-bandwidth'], 10)
238 self.assertEqual(nbl['interconnect-bandwidth-unit'], 1000000000)
239 self.assertIn('XPDR1-NETWORK1', nbl['tp-list'])
240 self.assertIn('XPDR1-CLIENT1', nbl['tp-list'])
241 self.assertNotIn('XPDR1-CLIENT2', nbl['tp-list'])
242 elif(nodeId == 'SPDR-SA1-XPDR2'):
243 nodeType = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:node-type']
244 self.assertEqual(nodeType, 'SWITCH')
245 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'SPDR-SA1'},
246 res['network'][0]['node'][i]['supporting-node'])
247 self.assertIn({'network-ref': 'openroadm-topology', 'node-ref': 'SPDR-SA1-XPDR2'},
248 res['network'][0]['node'][i]['supporting-node'])
249 self.assertEqual(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:xpdr-attributes']['xpdr-number'], 2)
250 nbTps = len(res['network'][0]['node'][i]['ietf-network-topology:termination-point'])
253 for j in range(0, nbTps):
254 tpType = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-type']
255 tpId = res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['tp-id']
256 if (tpType == 'XPONDER-CLIENT'):
258 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-100GE-ODU4')
259 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
260 elif (tpType == 'XPONDER-NETWORK'):
262 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:tp-supported-interfaces']['supported-interface-capability'][0]['if-cap-type'], 'org-openroadm-port-types:if-OCH-OTU4-ODU4')
263 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']['rate'], 'org-openroadm-otn-common-types:ODU4')
264 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['network-ref'], 'openroadm-topology')
265 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['node-ref'], 'SPDR-SA1-XPDR2')
266 self.assertEqual(res['network'][0]['node'][i]['ietf-network-topology:termination-point'][j]['supporting-termination-point'][0]['tp-ref'], tpId)
267 self.assertTrue(client == 4)
268 self.assertTrue(network == 4)
269 listNode.remove(nodeId)
270 nbNbl = len(res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'])
271 self.assertEqual(nbNbl, 1)
272 nbl = res['network'][0]['node'][i]['org-openroadm-otn-network-topology:switching-pools']['odu-switching-pools'][0]['non-blocking-list'][0]
273 self.assertIn('XPDR2-NETWORK1', nbl['tp-list'])
274 self.assertIn('XPDR2-CLIENT1', nbl['tp-list'])
275 self.assertIn('XPDR2-NETWORK2', nbl['tp-list'])
276 self.assertIn('XPDR2-CLIENT2', nbl['tp-list'])
277 self.assertIn('XPDR2-NETWORK3', nbl['tp-list'])
278 self.assertIn('XPDR2-CLIENT3', nbl['tp-list'])
279 self.assertIn('XPDR2-NETWORK4', nbl['tp-list'])
280 self.assertIn('XPDR2-CLIENT4', nbl['tp-list'])
282 self.assertFalse(True)
283 self.assertEqual(len(listNode), 0)
285 def test_08_disconnect_SPDR_SA1(self):
286 url = ("{}/config/network-topology:"
287 "network-topology/topology/topology-netconf/node/SPDR-SA1"
288 .format(self.restconf_baseurl))
290 headers = {'content-type': 'application/json'}
291 response = requests.request(
292 "DELETE", url, data=json.dumps(data), headers=headers,
293 auth=('admin', 'admin'))
294 self.assertEqual(response.status_code, requests.codes.ok)
296 def test_09_getClliNetwork(self):
297 url = ("{}/config/ietf-network:networks/network/clli-network"
298 .format(self.restconf_baseurl))
299 headers = {'content-type': 'application/json'}
300 response = requests.request(
301 "GET", url, headers=headers, auth=('admin', 'admin'))
302 self.assertEqual(response.status_code, requests.codes.ok)
303 res = response.json()
304 nbNode = len(res['network'][0]['node'])
305 self.assertEqual(nbNode, 1)
306 self.assertEqual(res['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeSA')
308 def test_10_getOpenRoadmNetwork(self):
309 url = ("{}/config/ietf-network:networks/network/openroadm-network"
310 .format(self.restconf_baseurl))
311 headers = {'content-type': 'application/json'}
312 response = requests.request(
313 "GET", url, headers=headers, auth=('admin', 'admin'))
314 self.assertEqual(response.status_code, requests.codes.ok)
315 res = response.json()
316 self.assertNotIn('node', res['network'][0])
318 def test_11_getNodes_OpenRoadmTopology(self):
319 url = ("{}/config/ietf-network:networks/network/openroadm-topology"
320 .format(self.restconf_baseurl))
321 headers = {'content-type': 'application/json'}
322 response = requests.request(
323 "GET", url, headers=headers, auth=('admin', 'admin'))
324 res = response.json()
325 self.assertNotIn('node', res['network'][0])
327 def test_12_getNodes_OtnTopology(self):
328 url = ("{}/config/ietf-network:networks/network/otn-topology"
329 .format(self.restconf_baseurl))
330 headers = {'content-type': 'application/json'}
331 response = requests.request(
332 "GET", url, headers=headers, auth=('admin', 'admin'))
333 res = response.json()
334 self.assertNotIn('node', res['network'][0])
337 if __name__ == "__main__":
338 unittest.main(verbosity=2)