blob: 69859d08b567fa93d23020f1026bfac6b0bee1ce [file] [log] [blame]
ChetanGaonker901727c2016-11-29 14:05:03 -08001#
2# Copyright 2016-present Ciena Corporation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16import unittest
17import os,sys
ChetanGaonker901727c2016-11-29 14:05:03 -080018import keystoneclient.v2_0.client as ksclient
19import keystoneclient.apiclient.exceptions
20import neutronclient.v2_0.client as nclient
21import neutronclient.common.exceptions
22import novaclient.v1_1.client as novaclient
23from multiprocessing import Pool
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080024from neutronclient.v2_0 import client as neutron_client
ChetanGaonker901727c2016-11-29 14:05:03 -080025from nose.tools import assert_equal
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080026from OnosCtrl import OnosCtrl, get_mac
ChetanGaonker901727c2016-11-29 14:05:03 -080027from CordLogger import CordLogger
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080028import time
ChetanGaonker901727c2016-11-29 14:05:03 -080029
30class cordvtn_exchange(CordLogger):
31
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080032 app_cordvtn = 'org.opencord.vtn'
33 test_path = os.path.dirname(os.path.realpath(__file__))
34 cordvtn_dir = os.path.join(test_path, '..', 'setup')
35 cordvtn_conf_file = os.path.join(test_path, '..', '../cordvtn/network_cfg.json')
36 default_config = { 'default-lease-time' : 600, 'max-lease-time' : 7200, }
37 default_options = [ ('subnet-mask', '255.255.255.0'),
38 ('broadcast-address', '192.168.1.255'),
39 ('domain-name-servers', '192.168.1.1'),
40 ('domain-name', '"mydomain.cord-tester"'),
41 ]
42 default_subnet_config = [ ('192.168.1.2',
43'''
44subnet 192.168.1.0 netmask 255.255.255.0 {
45 range 192.168.1.10 192.168.1.100;
46}
47'''), ]
48 config = {}
ChetanGaonker901727c2016-11-29 14:05:03 -080049
50 @classmethod
51 def setUpClass(cls):
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080052 ''' Activate the cordvtn app'''
ChetanGaonker901727c2016-11-29 14:05:03 -080053 time.sleep(3)
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080054 cls.onos_ctrl = OnosCtrl(cls.app_cordvtn)
55 status, _ = cls.onos_ctrl.activate()
56 assert_equal(status, False)
57 time.sleep(3)
58 cls.cordvtn_setup()
ChetanGaonker901727c2016-11-29 14:05:03 -080059
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080060 @classmethod
61 def tearDownClass(cls):
ChetanGaonker901727c2016-11-29 14:05:03 -080062 '''Deactivate the cord vtn app'''
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080063 cls.onos_ctrl.deactivate()
64 cls.cord_vtn_cleanup()
ChetanGaonker901727c2016-11-29 14:05:03 -080065
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080066 @classmethod
67 def cordvtn_setup(cls):
68 pass
69
70 @classmethod
71 def cord_vtn_cleanup(cls):
72 ##reset the ONOS port configuration back to default
73 for config in cls.configs.items():
74 OnosCtrl.delete(config)
75
76 @classmethod
77 def onos_load_config(cls, cordvtn_conf_file):
78 status, code = OnosCtrl.config(cordvtn_conf_file)
ChetanGaonker901727c2016-11-29 14:05:03 -080079 if status is False:
80 log.info('JSON request returned status %d' %code)
81 assert_equal(status, True)
82 time.sleep(3)
83
ChetanGaonkeraaea6b62016-12-16 17:06:39 -080084 @classmethod
85 def get_neutron_credentials():
86 n = {}
87 n['username'] = os.environ['OS_USERNAME']
88 n['password'] = os.environ['OS_PASSWORD']
89 n['auth_url'] = os.environ['OS_AUTH_URL']
90 n['tenant_name'] = os.environ['OS_TENANT_NAME']
91 return n
92
93 @classmethod
94 def create_net_and_subnet():
95 network_name = "Subscriber-1"
96
97 creds = get_neutron_credentials()
98 neutron = client.Client(**creds)
99
100 body_example = {
101 "network":
102 {
103 "name": network_name,
104 "admin_state_up":True
105 }
106 }
107 net = neutron.create_network(body=body_example)
108 net_dict = net['network']
109 network_id = net_dict['id']
110 print "Network %s created" %network_id
111
112 create_subnet = {
113 "subnets": [
114 {
115 "cidr":"10.10.0.0/24",
116 "ip_version":4,
117 "network_id":network_id
118 }
119 ]
120 }
121 subnet = neutron.create_subnet(body = create_subnet)
122 print "Created Subnet %s"%subnet
123
124 @classmethod
125 def create_network(i):
126 neutron_credentials = get_neutron_credentials()
127 neutron = neutron_client.Client(**neutron_credentials)
128 json = {'network': {'name': 'network-' + str(i),
129 'admin_state_up': True}}
130 while True:
131 try:
132 neutron.create_network(body=json)
133 print '\nnetwork-' + str(i) + ' created'
134 break
135 except Exception as e:
136 print e
137 continue
138
ChetanGaonker901727c2016-11-29 14:05:03 -0800139 def create_tenant(tenant_name):
140 new_tenant = keystone.tenants.create(tenant_name=tenant_name,
141 description="CORD Tenant \
142 created",
143 enabled=True)
144 tenant_id = new_tenant.id
145 tenant_status = True
146 user_data = []
147 for j in range(2):
148 j += 1
149 user_name = tenant_name + '-user-' + str(j)
150 user_data.append(create_user(user_name, tenant_id))
151
152 print " Tenant and User Created"
153
154 tenant_data = {'tenant_name': tenant_name,
155 'tenant_id': tenant_id,
156 'status': tenant_status}
157 return tenant_data
158
159 def create_user(user_name, tenant_id):
160 new_user = keystone.users.create(name=user_name,
161 password="ubuntu",
162 tenant_id=tenant_id)
163 print(' - Created User %s' % user_name)
164 keystone.roles.add_user_role(new_user, member_role, tenant_id)
165 if assign_admin:
166 admin_user = keystone.users.find(name='admin')
167 admin_role = keystone.roles.find(name='admin')
168 keystone.roles.add_user_role(admin_user, admin_role, tenant_id)
169 user_data = {'name': new_user.name,
170 'id': new_user.id}
171 return user_data
172
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800173 def create_port( router_id, network_id):
174 credentials = get_credentials()
175 neutron = client.Client(**credentials)
176 router = neutron.show_router(router_id)
177
178 value = {'port':{
179 'admin_state_up':True,
180 'device_id': router_id,
181 'name': 'port1',
182 'network_id':network_id,
183 }}
184 response = neutron.create_port(body=value)
185
186 def create_router(self, name):
187 external_network = None
188 for network in self.neutron.list_networks()["networks"]:
189 if network.get("router:external"):
190 external_network = network
191 break
192
193 if not external_network:
194 raise Exception("Alarm! Can not to find external network")
195
196 gw_info = {
197 "network_id": external_network["id"],
198 "enable_snat": True
199 }
200 router_info = {
201 "router": {
202 "name": name,
203 "external_gateway_info": gw_info,
204 "tenant_id": self.tenant_id
205 }
206 }
207 router = self.neutron.create_router(router_info)['router']
208 return router
209
210 def router_add_gateway( router_name, network_name):
211 pass
212
ChetanGaonker901727c2016-11-29 14:05:03 -0800213 def delete_tenant(tenant_name):
214 tenant = keystone.tenants.find(name=tenant_name)
215 for j in range(2):
216 j += 1
217 user_name = tenant_name + '-user-' + str(j)
218 delete_user(user_name, tenant.id)
219 tenant.delete()
220 print(' - Deleted Tenant %s ' % tenant_name)
221 return True
222
223 def delete_user(user_name, tenant_id):
224 user = keystone.users.find(name=user_name)
225 user.delete()
226
227 print(' - Deleted User %s' % user_name)
228 return True
229
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800230 @classmethod
231 def verify_neutron_crud():
232 x = os.system("neutron_test.sh")
233 return x
ChetanGaonker901727c2016-11-29 14:05:03 -0800234
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800235 def test_cordvtn_app_activation(self):
236 pass
ChetanGaonker901727c2016-11-29 14:05:03 -0800237
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800238 def test_cordvtn_config_on_restart(self):
239 pass
ChetanGaonker901727c2016-11-29 14:05:03 -0800240
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800241 def test_cordvtn_arp_proxy(self):
242 pass
243
244 def test_cordvtn_gateway(self):
245 pass
246
247 def test_cordvtn_openstack_access(self):
248 pass
249
250 def test_cordvtn_xos_access(self):
251 pass
252
253 def test_cordvtn_ssh_access(self):
254 pass
255
256 def test_cordvtn_ovsdbport(self):
257 pass
258
259 def test_cordvtn_local_management_ip(self):
260 pass
261
262 def test_cordvtn_compute_nodes(self):
263 pass
264
265 def test_cordvtn_basic_tenant(self):
266 onos_load_config()
267 status = verify_neutron_crud()
268 if status != 0:
269 print "Issues with Neutron working state"
270 assert_equal(status, True)
271
272 ret1 = create_tenant(netA)
273 if ret1 != 0:
274 print "Creation of Tenant netA Failed"
275
276 ret2 = create_tenant(netB)
277 if ret1 != 0:
278 print "Creation of Tenant netB Failed"
279 assert_equal(ret1, ret2)
ChetanGaonker901727c2016-11-29 14:05:03 -0800280
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800281 def test_cordvtn_for_create_network(self):
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800282 onos_load_config()
283 status = verify_neutron_crud()
284 if status != 0:
285 print "Issues with Neutron working state"
286
287 ret1 = create_tenant(netA)
288 if ret1 != 0:
289 print "Creation of Tenant netA Failed"
290
291 ret2 = create_tenant(netB)
292 if ret2 != 0:
293 print "Creation of Tenant netB Failed"
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800294 network = {'name': self.network_name, 'admin_state_up': True}
295 self.neutron.create_network({'network':network})
296 log.info("Created network:{0}".format(self.network_name))
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800297 assert_equal(ret1, ret2)
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800298
299 def test_cordvtn_to_create_net_work_with_subnet(self):
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800300 onos_load_config()
301 status = verify_neutron_crud()
302 if status != 0:
303 print "Issues with Neutron working state"
304
305 ret1 = create_tenant(netA)
306 if ret1 != 0:
307 print "Creation of Tenant netA Failed"
308
309 ret2 = create_tenant(netB)
310 if ret2 != 0:
311 print "Creation of Tenant netB Failed"
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800312 network_name = self.network_name
313 network = {'name': network_name, 'admin_state_up': True}
314 network_info = self.neutron.create_network({'network':network})
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800315 network_id = network_info['network']['id']
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800316
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800317 log.info("Created network:{0}".format(network_id))
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800318 self.network_ids.append(network_id)
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800319 subnet_count = 1
320 for cidr in self.subnet_cidrs:
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800321 gateway_ip = str(list(cidr)[1])
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800322 subnet = {"network_id": network_id, "ip_version":4,
323 "cidr":str(cidr), "enable_dhcp":True,
324 "host_routes":[{"destination":"0.0.0.0/0", "nexthop":gateway_ip}]
325 }
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800326 subnet = {"name":"subnet-"+str(subnet_count), "network_id": network_id, "ip_version":4, "cidr":str(cidr), "enable_dhcp":True}
327 print subnet
328 self.neutron.create_subnet({'subnet':subnet})
329 log.info("Created subnet:{0}".format(str(cidr)))
330 if not self.number_of_subnet - 1:
331 break
332 self.number_of_subnet -= 1
333 subnet_count += 1
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800334 assert_equal(ret1, ret2)
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800335
336 def test_cordvtn_subnet_limit(self):
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800337 onos_load_config()
338 status = verify_neutron_crud()
339 if status != 0:
340 print "Issues with Neutron working state"
341
342 ret1 = create_tenant(netA)
343 if ret1 != 0:
344 print "Creation of Tenant netA Failed"
345
346 ret2 = create_tenant(netB)
347 if ret2 != 0:
348 print "Creation of Tenant netB Failed"
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800349 network_name = uuid.uuid4().get_hex()
350 network = {'name': network_name, 'admin_state_up': True}
351 network_info = self.neutron.create_network({'network':network})
352 log.info("Created network:{0}".format(network_name))
353 network_id = network_info['network']['id']
354 self.network_ids.append(network_id)
355 subnet_cidrs = ['11.2.2.0/29', '11.2.2.8/29']
356 for cidr in subnet_cidrs:
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800357 subnet = {"network_id": network_id, "ip_version":4, "cidr": cidr}
358 subnet_info = self.neutron.create_subnet({'subnet':subnet})
359 subnet_id = subnet_info['subnet']['id']
360 log.info("Created subnet:{0}".format(cidr))
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800361 while True:
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800362 port = {"network_id": network_id, "admin_state_up": True}
363 port_info = self.neutron.create_port({'port':port})
364 port_id = port_info['port']['id']
365 self.port_ids.append(port_id)
366 log.info("Created Port:{0}".format(port_info['port']['id']))
367 if not self.quota_limit:
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800368 break
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800369 self.quota_limit -= 1
370 assert_equal(ret1, ret2)
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800371
372 def test_cordvtn_floatingip_limit(self):
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800373 onos_load_config()
374 status = verify_neutron_crud()
375 if status != 0:
376 print "Issues with Neutron working state"
ChetanGaonkerd65b7612016-12-07 01:01:20 -0800377
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800378 ret1 = create_tenant(netA)
379 if ret1 != 0:
380 print "Creation of Tenant netA Failed"
381
382 ret2 = create_tenant(netB)
383 if ret2 != 0:
384 print "Creation of Tenant netB Failed"
385 while True:
386 floatingip = {"floating_network_id": self.floating_nw_id}
387 fip_info = self.neutron.create_floatingip({'floatingip':floatingip})
388 fip_id = fip_info['floatingip']['id']
389 log.info("Created Floating IP:{0}".format(fip_id))
390 self.fip_ids.append(fip_id)
391 if not self.quota_limit:
392 break
393 self.quota_limit -= 1
394 assert_equal(ret1, ret2)
395
396 def test_cordvtn_10_neutron_networks(self):
397 onos_load_config()
398 status = verify_neutron_crud()
399 if status != 0:
400 print "Issues with Neutron working state"
401
402 ret1 = create_tenant(netA)
403 if ret1 != 0:
404 print "Creation of Tenant netA Failed"
405
406 ret2 = create_tenant(netB)
407 if ret2 != 0:
408 print "Creation of Tenant netB Failed"
409 pool = Pool(processes=10)
410 ret = os.system("neutron quote-update --network 15")
411 if ret1 != 0:
412 print "Neutron network install failed"
413 for i in range(1, 11):
414 pool.apply_asynch(create_network, (i, ))
415
416 pool.close()
417 pool.join()
418 assert_equal(ret1, ret2)
419
420 def test_cordvtn_100_neutron_networks(self):
421 onos_load_config()
422 status = verify_neutron_crud()
423 if status != 0:
424 print "Issues with Neutron working state"
425
426 ret1 = create_tenant(netA)
427 if ret1 != 0:
428 print "Creation of Tenant netA Failed"
429
430 ret2 = create_tenant(netB)
431 if ret2 != 0:
432 print "Creation of Tenant netB Failed"
433 pool = Pool(processes=10)
434
435 ret = os.system("neutron quote-update --network 105")
436 if ret1 != 0:
437 print "Neutron network install failed"
438 for i in range(1, 101):
439 pool.apply_asynch(create_network, (i, ))
440
441 pool.close()
442 pool.join()
443 assert_equal(ret1, ret2)
444
445 def test_cordvtn_service_dependency_for_two_subnets(self):
446 pass
447
448 def test_cordvtn_service_dependency_for_three_subnets(self):
449 pass
450
451 def test_cordvtn_service_dependency_for_four_subnets(self):
452 pass
453
454 def test_cordvtn_service_dependency_for_five_subnets(self):
455 pass
456
457 def test_cordvtn_for_biderectional_connections(self):
458 pass
459
460 def test_cordvtn_authentication_from_openstack(self):
461 pass
462
463 def test_cordvtn_with_gateway(self):
464 pass
465
466 def test_cordvtn_without_gateway(self):
467 pass
468
469 def test_cordvtn_for_service_instance(self):
470 pass
471
472 def test_cordvtn_for_instance_to_network(self):
473 pass
474
475 def test_cordvtn_for_network_to_instance(self):
476 pass
477
478 def test_cordvtn_for_instance_to_instance(self):
479 pass
480
481 def test_cordvtn_for_network_to_network(self):
482 pass
483
484 def test_cordvtn_without_neutron_ml2_plugin(self):
485 pass
486
487 def test_cordvtn_with_neutron_ml2_plugin(self):
488 pass
489
490 def test_cordvtn_service_network_type_private(self):
491 pass
492
493 def test_cordvtn_service_network_type_management_local(self):
494 pass
495
496 def test_cordvtn_service_network_type_management_host(self):
497 pass
498
499 def test_cordvtn_service_network_type_vsg(self):
500 pass
501
502 def test_cordvtn_service_network_type_access_agent(self):
ChetanGaonker901727c2016-11-29 14:05:03 -0800503 pass
504
505 def test_cordvtn_mgmt_network(self):
506 pass
507
508 def test_cordvtn_data_network(self):
509 pass
510
511 def test_cordvtn_public_network(self):
512 pass
513
514 def test_cordvtn_in_same_network(self):
515 pass
516
517 def test_cordvtn_local_mgmt_network(self):
518 pass
519
520 def test_cordvtn_service_dependency(self):
521 pass
522
523 def test_cordvtn_service_dependency_with_xos(self):
524 pass
525
526 def test_cordvtn_vsg_xos_service_profile(self):
527 pass
528
529 def test_cordvtn_access_agent(self):
530 pass
531
532 def test_cordvtn_network_creation(self):
533 pass
534
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800535 def test_cordvtn_network_deletion(self):
536 pass
537
ChetanGaonker901727c2016-11-29 14:05:03 -0800538 def test_cordvtn_removing_service_network(self):
539 pass
540
541 def test_cordvtn_web_application(self):
542 pass
543
544 def test_cordvtn_service_port(self):
545 pass
ChetanGaonkeraaea6b62016-12-16 17:06:39 -0800546
547 def test_cordvtn_inetgration_bridge(self):
548 pass
549