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 delete_neutron_net(neutron_client, network_id):
148 neutron_client.delete_network(network_id)
151 print "Error:", sys.exc_info()[0]
155 def create_neutron_subnet(neutron_client, name, cidr, net_id):
156 json_body = {'subnets': [{'name': name, 'cidr': cidr,
157 'ip_version': 4, 'network_id': net_id}]}
159 subnet = neutron_client.create_subnet(body=json_body)
160 return subnet['subnets'][0]['id']
162 print "Error:", sys.exc_info()[0]
166 def delete_neutron_subnet(neutron_client, subnet_id):
168 neutron_client.delete_subnet(subnet_id)
171 print "Error:", sys.exc_info()[0]
175 def create_neutron_router(neutron_client, name):
176 json_body = {'router': {'name': name, 'admin_state_up': True}}
178 router = neutron_client.create_router(json_body)
179 return router['router']['id']
181 print "Error:", sys.exc_info()[0]
185 def delete_neutron_router(neutron_client, router_id):
186 json_body = {'router': {'id': router_id}}
188 neutron_client.delete_router(router=router_id)
191 print "Error:", sys.exc_info()[0]
195 def add_interface_router(neutron_client, router_id, subnet_id):
196 json_body = {"subnet_id": subnet_id}
198 neutron_client.add_interface_router(router=router_id, body=json_body)
201 print "Error:", sys.exc_info()[0]
205 def remove_interface_router(neutron_client, router_id, subnet_id):
206 json_body = {"subnet_id": subnet_id}
208 neutron_client.remove_interface_router(router=router_id,
212 print "Error:", sys.exc_info()[0]
215 def remove_gateway_router(neutron_client, router_id):
217 neutron_client.remove_gateway_router(router_id)
220 print "Error:", sys.exc_info()[0]
224 def create_neutron_port(neutron_client, name, network_id, ip):
225 json_body = {'port': {
226 'admin_state_up': True,
228 'network_id': network_id,
229 'fixed_ips': [{"ip_address": ip}]
232 port = neutron_client.create_port(body=json_body)
233 return port['port']['id']
235 print "Error:", sys.exc_info()[0]
239 def update_neutron_port(neutron_client, port_id, device_owner):
240 json_body = {'port': {
241 'device_owner': device_owner,
244 port = neutron_client.update_port(port=port_id,
246 return port['port']['id']
248 print "Error:", sys.exc_info()[0]
252 def delete_neutron_port(neutron_client, port_id):
254 neutron_client.delete_port(port_id)
257 print "Error:", sys.exc_info()[0]
261 def get_network_id(neutron_client, network_name):
262 networks = neutron_client.list_networks()['networks']
265 if n['name'] == network_name:
271 def check_neutron_net(neutron_client, net_name):
272 for network in neutron_client.list_networks()['networks']:
273 if network['name'] == net_name:
274 for subnet in network['subnets']:
279 def get_network_list(neutron_client):
280 network_list = neutron_client.list_networks()['networks']
281 if len(network_list) == 0:
287 def get_router_list(neutron_client):
288 router_list = neutron_client.list_routers()['routers']
289 if len(router_list) == 0:
294 def get_port_list(neutron_client):
295 port_list = neutron_client.list_ports()['ports']
296 if len(port_list) == 0:
303 def get_external_net(neutron_client):
304 for network in neutron_client.list_networks()['networks']:
305 if network['router:external']:
306 return network['name']
310 def update_sg_quota(neutron_client, tenant_id, sg_quota, sg_rule_quota):
311 json_body = {"quota": {
312 "security_group": sg_quota,
313 "security_group_rule": sg_rule_quota
317 quota = neutron_client.update_quota(tenant_id=tenant_id,
321 print "Error:", sys.exc_info()[0]
324 def update_cinder_quota(cinder_client, tenant_id, vols_quota, snapshots_quota,gigabytes_quota):
326 "volumes": vols_quota,
327 "snapshots": snapshots_quota,
328 "gigabytes": gigabytes_quota
332 quotas_default=cinder_client.quotas.update(tenant_id,**quotas_values)
335 print "Error:", sys.exc_info()[0]
338 def get_private_net(neutron_client):
339 # Checks if there is an existing private network
340 networks = neutron_client.list_networks()['networks']
341 if len(networks) == 0:
344 if net['router:external'] == False:
348 # ################ GLANCE #################
349 def get_images(nova_client):
351 images = nova_client.images.list()
357 def get_image_id(glance_client, image_name):
358 images = glance_client.images.list()
361 if i.name == image_name:
367 def create_glance_image(glance_client, image_name, file_path, public=True):
368 if not os.path.isfile(file_path):
369 print "Error: file "+file_path+" does not exist."
372 with open(file_path) as fimage:
373 image = glance_client.images.create(name=image_name,
376 container_format="bare",
380 print "Error:", sys.exc_info()[0]
383 def delete_glance_image(nova_client, image_id):
385 nova_client.images.delete(image_id)
388 print "Error:", sys.exc_info()[0]
391 # ################ CINDER #################
392 def get_volumes(cinder_client):
394 volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1})
399 def delete_volume(cinder_client, volume_id):
401 cinder_client.volumes.delete(volume_id)
404 print "Error:", sys.exc_info()[0]
407 # ################ CINDER #################
408 def get_security_groups(neutron_client):
410 security_groups = neutron_client.list_security_groups()['security_groups']
411 return security_groups
415 def delete_security_group(neutron_client, secgroup_id):
417 neutron_client.delete_security_group(secgroup_id)
420 print "Error:", sys.exc_info()[0]
424 # ################ KEYSTONE #################
425 def get_tenants(keystone_client):
427 tenants = keystone_client.tenants.list()
433 def get_tenant_id(keystone_client, tenant_name):
434 tenants = keystone_client.tenants.list()
437 if t.name == tenant_name:
442 def get_users(keystone_client):
444 users = keystone_client.users.list()
449 def get_role_id(keystone_client, role_name):
450 roles = keystone_client.roles.list()
453 if r.name == role_name:
459 def get_user_id(keystone_client, user_name):
460 users = keystone_client.users.list()
463 if u.name == user_name:
469 def create_tenant(keystone_client, tenant_name, tenant_description):
471 tenant = keystone_client.tenants.create(tenant_name,
476 print "Error:", sys.exc_info()[0]
480 def delete_tenant(keystone_client, tenant_id):
482 tenant = keystone_client.tenants.delete(tenant_id)
485 print "Error:", sys.exc_info()[0]
489 def create_user(keystone_client, user_name, user_password,
490 user_email, tenant_id):
492 user = keystone_client.users.create(user_name, user_password,
493 user_email, tenant_id,
497 print "Error:", sys.exc_info()[0]
501 def delete_user(keystone_client, user_id):
503 tenant = keystone_client.users.delete(user_id)
506 print "Error:", sys.exc_info()[0]
510 def add_role_user(keystone_client, user_id, role_id, tenant_id):
512 keystone_client.roles.add_user_role(user_id, role_id, tenant_id)
515 print "Error:", sys.exc_info()[0]
519 # ################ UTILS #################
520 def check_internet_connectivity(url='http://www.opnfv.org/'):
522 Check if there is access to the internet
525 urllib2.urlopen(url, timeout=5)
527 except urllib2.URLError:
531 def download_url(url, dest_path):
533 Download a file to a destination path given a URL
535 name = url.rsplit('/')[-1]
536 dest = dest_path + "/" + name
538 response = urllib2.urlopen(url)
539 except (urllib2.HTTPError, urllib2.URLError):
542 with open(dest, 'wb') as f:
543 shutil.copyfileobj(response, f)
547 def execute_command(cmd, logger=None):
549 Execute Linux command
552 logger.debug('Executing command : {}'.format(cmd))
553 output_file = "output.txt"
554 f = open(output_file, 'w+')
555 p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
557 f = open(output_file, 'r')
559 if result != "" and logger:
565 logger.error("Error when executing command %s" % cmd)
569 def get_git_branch(repo_path):
573 repo = Repo(repo_path)
574 branch = repo.active_branch
578 def get_installer_type(logger=None):
580 Get installer type (fuel, foreman, apex, joid, compass)
583 installer = os.environ['INSTALLER_TYPE']
586 logger.error("Impossible to retrieve the installer type")
592 def get_pod_name(logger=None):
594 Get PoD Name from env variable NODE_NAME
597 return os.environ['NODE_NAME']
600 logger.error("Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
604 def push_results_to_db(db_url, case_name, logger, pod_name, git_version, payload):
605 url = db_url + "/results"
606 installer = get_installer_type(logger)
607 params = {"project_name": "functest", "case_name": case_name,
608 "pod_name": pod_name, "installer": installer,
609 "version": git_version, "details": payload}
611 headers = {'Content-Type': 'application/json'}
613 r = requests.post(url, data=json.dumps(params), headers=headers)
617 print "Error:", sys.exc_info()[0]