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 delete_neutron_port(neutron_client, port_id):
241 neutron_client.delete_port(port_id)
244 print "Error:", sys.exc_info()[0]
248 def get_network_id(neutron_client, network_name):
249 networks = neutron_client.list_networks()['networks']
252 if n['name'] == network_name:
258 def check_neutron_net(neutron_client, net_name):
259 for network in neutron_client.list_networks()['networks']:
260 if network['name'] == net_name:
261 for subnet in network['subnets']:
266 def get_network_list(neutron_client):
267 network_list = neutron_client.list_networks()['networks']
268 if len(network_list) == 0:
274 def get_router_list(neutron_client):
275 router_list = neutron_client.list_routers()['routers']
276 if len(router_list) == 0:
281 def get_port_list(neutron_client):
282 port_list = neutron_client.list_ports()['ports']
283 if len(port_list) == 0:
290 def get_external_net(neutron_client):
291 for network in neutron_client.list_networks()['networks']:
292 if network['router:external']:
293 return network['name']
297 def update_sg_quota(neutron_client, tenant_id, sg_quota, sg_rule_quota):
298 json_body = {"quota": {
299 "security_group": sg_quota,
300 "security_group_rule": sg_rule_quota
304 quota = neutron_client.update_quota(tenant_id=tenant_id,
308 print "Error:", sys.exc_info()[0]
312 def get_private_net(neutron_client):
313 # Checks if there is an existing private network
314 networks = neutron_client.list_networks()['networks']
315 if len(networks) == 0:
318 if net['router:external'] == False:
322 # ################ GLANCE #################
323 def get_images(nova_client):
325 images = nova_client.images.list()
331 def get_image_id(glance_client, image_name):
332 images = glance_client.images.list()
335 if i.name == image_name:
341 def create_glance_image(glance_client, image_name, file_path, public=True):
342 if not os.path.isfile(file_path):
343 print "Error: file "+file_path+" does not exist."
346 with open(file_path) as fimage:
347 image = glance_client.images.create(name=image_name,
350 container_format="bare",
354 print "Error:", sys.exc_info()[0]
357 def delete_glance_image(nova_client, image_id):
359 nova_client.images.delete(image_id)
362 print "Error:", sys.exc_info()[0]
365 # ################ CINDER #################
366 def get_volumes(cinder_client):
368 volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1})
373 def delete_volume(cinder_client, volume_id):
375 cinder_client.volumes.delete(volume_id)
378 print "Error:", sys.exc_info()[0]
381 # ################ CINDER #################
382 def get_security_groups(neutron_client):
384 security_groups = neutron_client.list_security_groups()['security_groups']
385 return security_groups
389 def delete_security_group(neutron_client, secgroup_id):
391 neutron_client.delete_security_group(secgroup_id)
394 print "Error:", sys.exc_info()[0]
398 # ################ KEYSTONE #################
399 def get_tenants(keystone_client):
401 tenants = keystone_client.tenants.list()
407 def get_tenant_id(keystone_client, tenant_name):
408 tenants = keystone_client.tenants.list()
411 if t.name == tenant_name:
416 def get_users(keystone_client):
418 users = keystone_client.users.list()
423 def get_role_id(keystone_client, role_name):
424 roles = keystone_client.roles.list()
427 if r.name == role_name:
433 def get_user_id(keystone_client, user_name):
434 users = keystone_client.users.list()
437 if u.name == user_name:
443 def create_tenant(keystone_client, tenant_name, tenant_description):
445 tenant = keystone_client.tenants.create(tenant_name,
450 print "Error:", sys.exc_info()[0]
454 def delete_tenant(keystone_client, tenant_id):
456 tenant = keystone_client.tenants.delete(tenant_id)
459 print "Error:", sys.exc_info()[0]
463 def create_user(keystone_client, user_name, user_password,
464 user_email, tenant_id):
466 user = keystone_client.users.create(user_name, user_password,
467 user_email, tenant_id,
471 print "Error:", sys.exc_info()[0]
475 def delete_user(keystone_client, user_id):
477 tenant = keystone_client.users.delete(user_id)
480 print "Error:", sys.exc_info()[0]
484 def add_role_user(keystone_client, user_id, role_id, tenant_id):
486 keystone_client.roles.add_user_role(user_id, role_id, tenant_id)
489 print "Error:", sys.exc_info()[0]
493 # ################ UTILS #################
494 def check_internet_connectivity(url='http://www.opnfv.org/'):
496 Check if there is access to the internet
499 urllib2.urlopen(url, timeout=5)
501 except urllib2.URLError:
505 def download_url(url, dest_path):
507 Download a file to a destination path given a URL
509 name = url.rsplit('/')[-1]
510 dest = dest_path + "/" + name
512 response = urllib2.urlopen(url)
513 except (urllib2.HTTPError, urllib2.URLError):
516 with open(dest, 'wb') as f:
517 shutil.copyfileobj(response, f)
521 def execute_command(cmd, logger=None):
523 Execute Linux command
526 logger.debug('Executing command : {}'.format(cmd))
527 output_file = "output.txt"
528 f = open(output_file, 'w+')
529 p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
531 f = open(output_file, 'r')
533 if result != "" and logger:
539 logger.error("Error when executing command %s" % cmd)
543 def get_git_branch(repo_path):
547 repo = Repo(repo_path)
548 branch = repo.active_branch
552 def get_installer_type(logger=None):
554 Get installer type (fuel, foreman, apex, joid, compass)
557 installer = os.environ['INSTALLER_TYPE']
560 logger.error("Impossible to retrieve the installer type")
566 def get_pod_name(logger=None):
568 Get PoD Name from env variable NODE_NAME
571 return os.environ['NODE_NAME']
574 logger.error("Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
578 def push_results_to_db(db_url, case_name, logger, pod_name, git_version, payload):
579 url = db_url + "/results"
580 installer = get_installer_type(logger)
581 params = {"project_name": "functest", "case_name": case_name,
582 "pod_name": pod_name, "installer": installer,
583 "version": git_version, "details": payload}
585 headers = {'Content-Type': 'application/json'}
587 r = requests.post(url, data=json.dumps(params), headers=headers)
591 print "Error:", sys.exc_info()[0]