summaryrefslogtreecommitdiffstats
path: root/dovetail/utils/dovetail_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'dovetail/utils/dovetail_utils.py')
-rw-r--r--dovetail/utils/dovetail_utils.py101
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.'