diff options
Diffstat (limited to 'dovetail/utils/dovetail_utils.py')
-rw-r--r-- | dovetail/utils/dovetail_utils.py | 101 |
1 files changed, 76 insertions, 25 deletions
diff --git a/dovetail/utils/dovetail_utils.py b/dovetail/utils/dovetail_utils.py index 2e7b6102..1c4aca9d 100644 --- a/dovetail/utils/dovetail_utils.py +++ b/dovetail/utils/dovetail_utils.py @@ -12,6 +12,7 @@ from __future__ import print_function import sys import os import re +import requests import subprocess from collections import Mapping, Set, Sequence import json @@ -19,10 +20,12 @@ from datetime import datetime from distutils.version import LooseVersion import yaml import python_hosts +import docker +from docker.types import Mount from dovetail import constants -from dovetail_config import DovetailConfig as dt_cfg -from openstack_utils import OS_Utils +from dovetail.utils.dovetail_config import DovetailConfig as dt_cfg +from dovetail.utils.openstack_utils import OS_Utils def exec_log(verbose, logger, msg, level, flush=False): @@ -58,8 +61,9 @@ def exec_cmd(cmd, logger=None, exit_on_error=False, info=False, count = 1 DEBUG = os.getenv('DEBUG') for line in iter(p.stdout.readline, b''): - exec_log(verbose, logger, line.strip(), level, True) - stdout += line + exec_log(verbose, logger, line.strip().decode('unicode-escape'), + level, True) + stdout += str(line) if progress_bar and (DEBUG is None or DEBUG.lower() != 'true'): show_progress_bar(count) count += 1 @@ -77,13 +81,13 @@ def exec_cmd(cmd, logger=None, exit_on_error=False, info=False, # walkthrough the object, yield path and value -# dual python 2/3 compatability, inspired by the "six" library -string_types = (str, unicode) if str is bytes else (str, bytes) -# iteritems = lambda mapping: getattr(mapping, 'iteritems', mapping.items)() +# dual python 2/3 compatibility, inspired by the "six" library +string_types = (str, 'unicode') if str is bytes else (str, bytes) +# items = lambda mapping: getattr(mapping, 'items', mapping.items)() -def iteritems(mapping): - return getattr(mapping, 'iteritems', mapping.items)() +def items(mapping): + return getattr(mapping, 'items', mapping.items)() def objwalk(obj, path=(), memo=None): @@ -91,7 +95,7 @@ def objwalk(obj, path=(), memo=None): memo = set() iterator = None if isinstance(obj, Mapping): - iterator = iteritems + iterator = items elif isinstance(obj, (Sequence, Set)) and not isinstance(obj, string_types): iterator = enumerate @@ -157,20 +161,17 @@ def show_progress_bar(length): def check_docker_version(logger=None): - server_ret, server_ver = \ - exec_cmd("sudo docker version -f'{{.Server.Version}}'", logger=logger) - client_ret, client_ver = \ - exec_cmd("sudo docker version -f'{{.Client.Version}}'", logger=logger) - if server_ret == 0: - logger.debug('docker server version: {}'.format(server_ver)) - if server_ret != 0 or (LooseVersion(server_ver) < LooseVersion('1.12.3')): + client = docker.from_env() + server_ver = None + try: + server_ver = client.version()['Version'] + except Exception: + logger.error('Failed to get Docker server version') + if server_ver and (LooseVersion(server_ver) >= LooseVersion('1.12.3')): + logger.debug('Docker server version: {}'.format(server_ver)) + else: logger.error("Don't support this Docker server version. " "Docker server should be updated to at least 1.12.3.") - if client_ret == 0: - logger.debug('docker client version: {}'.format(client_ver)) - if client_ret != 0 or (LooseVersion(client_ver) < LooseVersion('1.12.3')): - logger.error("Don't support this Docker client version. " - "Docker client should be updated to at least 1.12.3.") def add_hosts_info(ip, hostnames): @@ -316,7 +317,7 @@ def check_cacert_file(cacert, logger=None): def get_hosts_info(logger=None): - hosts_config = '' + hosts_config = {} hosts_config_file = os.path.join(dt_cfg.dovetail_config['config_dir'], 'hosts.yaml') if not os.path.isfile(hosts_config_file): @@ -333,7 +334,7 @@ def get_hosts_info(logger=None): logger.error('There is no key hosts_info in file {}' .format(hosts_config_file)) return hosts_config - for ip, hostnames in hosts_info.iteritems(): + for ip, hostnames in hosts_info.items(): if not hostnames: continue add_hosts_info(ip, hostnames) @@ -341,7 +342,7 @@ def get_hosts_info(logger=None): if hostname) if not names_str: continue - hosts_config += ' --add-host=\'{}\':{} '.format(names_str, ip) + hosts_config[names_str] = ip logger.debug('Get hosts info {}:{}.'.format(ip, names_str)) return hosts_config @@ -405,3 +406,53 @@ def get_openstack_info(logger): get_hosts_info(logger) get_openstack_endpoint(logger) get_hardware_info(logger) + + +def push_results_to_db(case_name, details, start_date, stop_date, logger): + """ + Push results to OPNFV TestAPI DB when running with OPNFV CI jobs. + All results can be filtered with TestAPI. + http://testresults.opnfv.org/test/#/results + """ + try: + url = os.getenv('TEST_DB_URL') + data = {'project_name': 'dovetail', 'case_name': case_name, + 'details': details, 'start_date': start_date, + 'stop_date': stop_date} + data['criteria'] = details['criteria'] if details else 'FAIL' + data['installer'] = os.getenv('INSTALLER_TYPE') + data['scenario'] = os.getenv('DEPLOY_SCENARIO') + data['pod_name'] = os.getenv('NODE_NAME') + data['build_tag'] = os.getenv('BUILD_TAG') + data['version'] = os.getenv('VERSION') + req = requests.post(url, data=json.dumps(data, sort_keys=True), + headers={'Content-Type': 'application/json'}) + req.raise_for_status() + logger.debug('The results were successfully pushed to DB.') + return True + except Exception: + logger.exception('The results cannot be pushed to DB.') + return False + + +def get_mount_list(project_cfg): + mount_list = [] + mounts = get_value_from_dict('mounts', project_cfg) + for mount in mounts: + if mount: + param_dict = {} + for param in mount.split(','): + key_word = param.split('=') + + if len(key_word) != 2: + return None, 'Error mount {}.'.format(mount) + + param_dict[key_word[0]] = key_word[1] + try: + mount_list.append(Mount(target=param_dict['target'], + source=param_dict['source'], + type='bind')) + except Exception as e: + return None, e + + return mount_list, 'Successfully to get mount list.' |