3 # jose.lausuch@ericsson.com
4 # valentin.boucher@orange.com
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
23 # ############ CREDENTIALS OPENSTACK #############
24 def check_credentials():
26 Check if the OpenStack credentials (openrc) are sourced
28 env_vars = ['OS_AUTH_URL','OS_USERNAME','OS_PASSWORD','OS_TENANT_NAME']
29 return all(map(lambda v: v in os.environ and os.environ[v], env_vars))
32 def get_credentials(service):
33 """Returns a creds dictionary filled with the following keys:
35 * password/api_key (depending on the service)
36 * tenant_name/project_id (depending on the service)
38 :param service: a string indicating the name of the service
39 requesting the credentials.
42 # Unfortunately, each of the OpenStack client will request slightly
43 # different entries in their credentials dict.
44 if service.lower() in ("nova", "cinder"):
49 tenant = "tenant_name"
51 # The most common way to pass these info to the script is to do it through
52 # environment variables.
54 "username": os.environ.get('OS_USERNAME', "admin"),
55 password: os.environ.get("OS_PASSWORD", 'admin'),
56 "auth_url": os.environ.get("OS_AUTH_URL",
57 "http://192.168.20.71:5000/v2.0"),
58 tenant: os.environ.get("OS_TENANT_NAME", "admin"),
64 # ################ NOVA #################
65 def get_instances(nova_client):
67 instances = nova_client.servers.list(search_opts={'all_tenants': 1})
72 def get_instance_status(nova_client, instance):
74 instance = nova_client.servers.get(instance.id)
75 return instance.status
79 def get_instance_by_name(nova_client, instance_name):
81 instance = nova_client.servers.find(name=instance_name)
88 def get_flavor_id(nova_client, flavor_name):
89 flavors = nova_client.flavors.list(detailed=True)
92 if f.name == flavor_name:
98 def get_flavor_id_by_ram_range(nova_client, min_ram, max_ram):
99 flavors = nova_client.flavors.list(detailed=True)
102 if min_ram <= f.ram and f.ram <= max_ram:
108 def delete_instance(nova_client, instance_id):
110 nova_client.servers.force_delete(instance_id)
113 print "Error:", sys.exc_info()[0]
117 def get_floating_ips(nova_client):
119 floating_ips = nova_client.floating_ips.list()
124 def delete_floating_ip(nova_client, floatingip_id):
126 nova_client.floating_ips.delete(floatingip_id)
129 print "Error:", sys.exc_info()[0]
133 # ################ NEUTRON #################
134 def create_neutron_net(neutron_client, name):
135 json_body = {'network': {'name': name,
136 'admin_state_up': True}}
138 network = neutron_client.create_network(body=json_body)
139 network_dict = network['network']
140 return network_dict['id']
142 print "Error:", sys.exc_info()[0]
146 def update_neutron_net(neutron_client, network_id, shared=False):
147 json_body = {'network': {'shared': shared}}
149 neutron_client.update_network(network_id, body=json_body)
152 print "Error:", sys.exc_info()[0]
156 def delete_neutron_net(neutron_client, network_id):
158 neutron_client.delete_network(network_id)
161 print "Error:", sys.exc_info()[0]
165 def create_neutron_subnet(neutron_client, name, cidr, net_id):
166 json_body = {'subnets': [{'name': name, 'cidr': cidr,
167 'ip_version': 4, 'network_id': net_id}]}
169 subnet = neutron_client.create_subnet(body=json_body)
170 return subnet['subnets'][0]['id']
172 print "Error:", sys.exc_info()[0]
176 def delete_neutron_subnet(neutron_client, subnet_id):
178 neutron_client.delete_subnet(subnet_id)
181 print "Error:", sys.exc_info()[0]
185 def create_neutron_router(neutron_client, name):
186 json_body = {'router': {'name': name, 'admin_state_up': True}}
188 router = neutron_client.create_router(json_body)
189 return router['router']['id']
191 print "Error:", sys.exc_info()[0]
195 def delete_neutron_router(neutron_client, router_id):
196 json_body = {'router': {'id': router_id}}
198 neutron_client.delete_router(router=router_id)
201 print "Error:", sys.exc_info()[0]
205 def add_interface_router(neutron_client, router_id, subnet_id):
206 json_body = {"subnet_id": subnet_id}
208 neutron_client.add_interface_router(router=router_id, body=json_body)
211 print "Error:", sys.exc_info()[0]
215 def remove_interface_router(neutron_client, router_id, subnet_id):
216 json_body = {"subnet_id": subnet_id}
218 neutron_client.remove_interface_router(router=router_id,
222 print "Error:", sys.exc_info()[0]
225 def remove_gateway_router(neutron_client, router_id):
227 neutron_client.remove_gateway_router(router_id)
230 print "Error:", sys.exc_info()[0]
234 def create_neutron_port(neutron_client, name, network_id, ip):
235 json_body = {'port': {
236 'admin_state_up': True,
238 'network_id': network_id,
239 'fixed_ips': [{"ip_address": ip}]
242 port = neutron_client.create_port(body=json_body)
243 return port['port']['id']
245 print "Error:", sys.exc_info()[0]
249 def update_neutron_port(neutron_client, port_id, device_owner):
250 json_body = {'port': {
251 'device_owner': device_owner,
254 port = neutron_client.update_port(port=port_id,
256 return port['port']['id']
258 print "Error:", sys.exc_info()[0]
262 def delete_neutron_port(neutron_client, port_id):
264 neutron_client.delete_port(port_id)
267 print "Error:", sys.exc_info()[0]
271 def get_network_id(neutron_client, network_name):
272 networks = neutron_client.list_networks()['networks']
275 if n['name'] == network_name:
281 def check_neutron_net(neutron_client, net_name):
282 for network in neutron_client.list_networks()['networks']:
283 if network['name'] == net_name:
284 for subnet in network['subnets']:
289 def get_network_list(neutron_client):
290 network_list = neutron_client.list_networks()['networks']
291 if len(network_list) == 0:
297 def get_router_list(neutron_client):
298 router_list = neutron_client.list_routers()['routers']
299 if len(router_list) == 0:
304 def get_port_list(neutron_client):
305 port_list = neutron_client.list_ports()['ports']
306 if len(port_list) == 0:
313 def get_external_net(neutron_client):
314 for network in neutron_client.list_networks()['networks']:
315 if network['router:external']:
316 return network['name']
320 def update_sg_quota(neutron_client, tenant_id, sg_quota, sg_rule_quota):
321 json_body = {"quota": {
322 "security_group": sg_quota,
323 "security_group_rule": sg_rule_quota
327 quota = neutron_client.update_quota(tenant_id=tenant_id,
331 print "Error:", sys.exc_info()[0]
334 def update_cinder_quota(cinder_client, tenant_id, vols_quota, snapshots_quota,gigabytes_quota):
336 "volumes": vols_quota,
337 "snapshots": snapshots_quota,
338 "gigabytes": gigabytes_quota
342 quotas_default=cinder_client.quotas.update(tenant_id,**quotas_values)
345 print "Error:", sys.exc_info()[0]
348 def get_private_net(neutron_client):
349 # Checks if there is an existing shared private network
350 networks = neutron_client.list_networks()['networks']
351 if len(networks) == 0:
354 if (net['router:external'] == False) and (net['shared'] == True):
358 # ################ GLANCE #################
359 def get_images(nova_client):
361 images = nova_client.images.list()
367 def get_image_id(glance_client, image_name):
368 images = glance_client.images.list()
371 if i.name == image_name:
377 def create_glance_image(glance_client, image_name, file_path, public=True):
378 if not os.path.isfile(file_path):
379 print "Error: file "+file_path+" does not exist."
382 with open(file_path) as fimage:
383 image = glance_client.images.create(name=image_name,
386 container_format="bare",
390 print "Error:", sys.exc_info()[0]
393 def delete_glance_image(nova_client, image_id):
395 nova_client.images.delete(image_id)
398 print "Error:", sys.exc_info()[0]
401 # ################ CINDER #################
402 def get_volumes(cinder_client):
404 volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1})
409 def delete_volume(cinder_client, volume_id):
411 cinder_client.volumes.delete(volume_id)
414 print "Error:", sys.exc_info()[0]
417 # ################ CINDER #################
418 def get_security_groups(neutron_client):
420 security_groups = neutron_client.list_security_groups()['security_groups']
421 return security_groups
425 def delete_security_group(neutron_client, secgroup_id):
427 neutron_client.delete_security_group(secgroup_id)
430 print "Error:", sys.exc_info()[0]
434 # ################ KEYSTONE #################
435 def get_tenants(keystone_client):
437 tenants = keystone_client.tenants.list()
443 def get_tenant_id(keystone_client, tenant_name):
444 tenants = keystone_client.tenants.list()
447 if t.name == tenant_name:
452 def get_users(keystone_client):
454 users = keystone_client.users.list()
459 def get_role_id(keystone_client, role_name):
460 roles = keystone_client.roles.list()
463 if r.name == role_name:
469 def get_user_id(keystone_client, user_name):
470 users = keystone_client.users.list()
473 if u.name == user_name:
479 def create_tenant(keystone_client, tenant_name, tenant_description):
481 tenant = keystone_client.tenants.create(tenant_name,
486 print "Error:", sys.exc_info()[0]
490 def delete_tenant(keystone_client, tenant_id):
492 tenant = keystone_client.tenants.delete(tenant_id)
495 print "Error:", sys.exc_info()[0]
499 def create_user(keystone_client, user_name, user_password,
500 user_email, tenant_id):
502 user = keystone_client.users.create(user_name, user_password,
503 user_email, tenant_id,
507 print "Error:", sys.exc_info()[0]
511 def delete_user(keystone_client, user_id):
513 tenant = keystone_client.users.delete(user_id)
516 print "Error:", sys.exc_info()[0]
520 def add_role_user(keystone_client, user_id, role_id, tenant_id):
522 keystone_client.roles.add_user_role(user_id, role_id, tenant_id)
525 print "Error:", sys.exc_info()[0]
529 # ################ UTILS #################
530 def check_internet_connectivity(url='http://www.opnfv.org/'):
532 Check if there is access to the internet
535 urllib2.urlopen(url, timeout=5)
537 except urllib2.URLError:
541 def download_url(url, dest_path):
543 Download a file to a destination path given a URL
545 name = url.rsplit('/')[-1]
546 dest = dest_path + "/" + name
548 response = urllib2.urlopen(url)
549 except (urllib2.HTTPError, urllib2.URLError):
552 with open(dest, 'wb') as f:
553 shutil.copyfileobj(response, f)
557 def execute_command(cmd, logger=None):
559 Execute Linux command
562 logger.debug('Executing command : {}'.format(cmd))
563 output_file = "output.txt"
564 f = open(output_file, 'w+')
565 p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
567 f = open(output_file, 'r')
569 if result != "" and logger:
575 logger.error("Error when executing command %s" % cmd)
579 def get_git_branch(repo_path):
583 repo = Repo(repo_path)
584 branch = repo.active_branch
588 def get_installer_type(logger=None):
590 Get installer type (fuel, foreman, apex, joid, compass)
593 installer = os.environ['INSTALLER_TYPE']
596 logger.error("Impossible to retrieve the installer type")
602 def get_pod_name(logger=None):
604 Get PoD Name from env variable NODE_NAME
607 return os.environ['NODE_NAME']
610 logger.error("Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
614 def push_results_to_db(db_url, case_name, logger, pod_name, git_version, payload):
615 url = db_url + "/results"
616 installer = get_installer_type(logger)
617 params = {"project_name": "functest", "case_name": case_name,
618 "pod_name": pod_name, "installer": installer,
619 "version": git_version, "details": payload}
621 headers = {'Content-Type': 'application/json'}
623 r = requests.post(url, data=json.dumps(params), headers=headers)
627 print "Error:", sys.exc_info()[0]