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]
325 def get_private_net(neutron_client):
326 # Checks if there is an existing private network
327 networks = neutron_client.list_networks()['networks']
328 if len(networks) == 0:
331 if net['router:external'] == False:
335 # ################ GLANCE #################
336 def get_images(nova_client):
338 images = nova_client.images.list()
344 def get_image_id(glance_client, image_name):
345 images = glance_client.images.list()
348 if i.name == image_name:
354 def create_glance_image(glance_client, image_name, file_path, public=True):
355 if not os.path.isfile(file_path):
356 print "Error: file "+file_path+" does not exist."
359 with open(file_path) as fimage:
360 image = glance_client.images.create(name=image_name,
363 container_format="bare",
367 print "Error:", sys.exc_info()[0]
370 def delete_glance_image(nova_client, image_id):
372 nova_client.images.delete(image_id)
375 print "Error:", sys.exc_info()[0]
378 # ################ CINDER #################
379 def get_volumes(cinder_client):
381 volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1})
386 def delete_volume(cinder_client, volume_id):
388 cinder_client.volumes.delete(volume_id)
391 print "Error:", sys.exc_info()[0]
394 # ################ CINDER #################
395 def get_security_groups(neutron_client):
397 security_groups = neutron_client.list_security_groups()['security_groups']
398 return security_groups
402 def delete_security_group(neutron_client, secgroup_id):
404 neutron_client.delete_security_group(secgroup_id)
407 print "Error:", sys.exc_info()[0]
411 # ################ KEYSTONE #################
412 def get_tenants(keystone_client):
414 tenants = keystone_client.tenants.list()
420 def get_tenant_id(keystone_client, tenant_name):
421 tenants = keystone_client.tenants.list()
424 if t.name == tenant_name:
429 def get_users(keystone_client):
431 users = keystone_client.users.list()
436 def get_role_id(keystone_client, role_name):
437 roles = keystone_client.roles.list()
440 if r.name == role_name:
446 def get_user_id(keystone_client, user_name):
447 users = keystone_client.users.list()
450 if u.name == user_name:
456 def create_tenant(keystone_client, tenant_name, tenant_description):
458 tenant = keystone_client.tenants.create(tenant_name,
463 print "Error:", sys.exc_info()[0]
467 def delete_tenant(keystone_client, tenant_id):
469 tenant = keystone_client.tenants.delete(tenant_id)
472 print "Error:", sys.exc_info()[0]
476 def create_user(keystone_client, user_name, user_password,
477 user_email, tenant_id):
479 user = keystone_client.users.create(user_name, user_password,
480 user_email, tenant_id,
484 print "Error:", sys.exc_info()[0]
488 def delete_user(keystone_client, user_id):
490 tenant = keystone_client.users.delete(user_id)
493 print "Error:", sys.exc_info()[0]
497 def add_role_user(keystone_client, user_id, role_id, tenant_id):
499 keystone_client.roles.add_user_role(user_id, role_id, tenant_id)
502 print "Error:", sys.exc_info()[0]
506 # ################ UTILS #################
507 def check_internet_connectivity(url='http://www.opnfv.org/'):
509 Check if there is access to the internet
512 urllib2.urlopen(url, timeout=5)
514 except urllib2.URLError:
518 def download_url(url, dest_path):
520 Download a file to a destination path given a URL
522 name = url.rsplit('/')[-1]
523 dest = dest_path + "/" + name
525 response = urllib2.urlopen(url)
526 except (urllib2.HTTPError, urllib2.URLError):
529 with open(dest, 'wb') as f:
530 shutil.copyfileobj(response, f)
534 def execute_command(cmd, logger=None):
536 Execute Linux command
539 logger.debug('Executing command : {}'.format(cmd))
540 output_file = "output.txt"
541 f = open(output_file, 'w+')
542 p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
544 f = open(output_file, 'r')
546 if result != "" and logger:
552 logger.error("Error when executing command %s" % cmd)
556 def get_git_branch(repo_path):
560 repo = Repo(repo_path)
561 branch = repo.active_branch
565 def get_installer_type(logger=None):
567 Get installer type (fuel, foreman, apex, joid, compass)
570 installer = os.environ['INSTALLER_TYPE']
573 logger.error("Impossible to retrieve the installer type")
579 def get_pod_name(logger=None):
581 Get PoD Name from env variable NODE_NAME
584 return os.environ['NODE_NAME']
587 logger.error("Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
591 def push_results_to_db(db_url, case_name, logger, pod_name, git_version, payload):
592 url = db_url + "/results"
593 installer = get_installer_type(logger)
594 params = {"project_name": "functest", "case_name": case_name,
595 "pod_name": pod_name, "installer": installer,
596 "version": git_version, "details": payload}
598 headers = {'Content-Type': 'application/json'}
600 r = requests.post(url, data=json.dumps(params), headers=headers)
604 print "Error:", sys.exc_info()[0]