diff options
author | xudan <xudan16@huawei.com> | 2018-02-27 01:54:02 -0500 |
---|---|---|
committer | Georg Kunz <georg.kunz@ericsson.com> | 2018-03-01 14:21:03 +0000 |
commit | c729d5c0b053eb7762426b78682fc0eeca033e81 (patch) | |
tree | 35d82d22502e3cd577d7a08be84a1ac55c770bf7 | |
parent | 5640d95a5d4ba0781ef66518dff57cf97a0a6431 (diff) |
Bugfix: Dovetail tool will crash when hosts.yaml file with incorrect format
If the hosts.yaml file is like,
—
hosts_info:
192.168.141.101:
it will raise an exception,
File "/usr/local/lib/python2.7/dist-packages/dovetail/utils/dovetail_utils.py",
line 227, in add_hosts_info
names=hostnames)
File "/usr/local/lib/python2.7/dist-packages/python_hosts/hosts.py",
line 54, in _init_
raise Exception('Address and Name(s) must be specified.')
Exception: Address and Name(s) must be specified.
If the hosts.yaml file is empty, it will crash with,
File "/usr/local/lib/python2.7/dist-packages/dovetail/container.py",
line 174, in create
if hosts_yaml['hosts_info']:
TypeError: 'NoneType' object has no attribute '_getitem_'
JIRA: DOVETAIL-621
Change-Id: I547928e514b3294c048379459c07df89879fbb03
Signed-off-by: xudan <xudan16@huawei.com>
-rw-r--r-- | dovetail/container.py | 16 | ||||
-rw-r--r-- | dovetail/utils/dovetail_utils.py | 35 |
2 files changed, 35 insertions, 16 deletions
diff --git a/dovetail/container.py b/dovetail/container.py index 8b4f0fcd..63ce2db8 100644 --- a/dovetail/container.py +++ b/dovetail/container.py @@ -8,7 +8,6 @@ # import os -import yaml import utils.dovetail_logger as dt_logger import utils.dovetail_utils as dt_utils @@ -169,20 +168,7 @@ class Container(object): envs = envs + ' -e BUILD_TAG=%s-%s' % (dovetail_config['build_tag'], testcase_name) - hosts_config = "" - hosts_config_file = os.path.join(dovetail_config['config_dir'], - 'hosts.yaml') - if os.path.isfile(hosts_config_file): - with open(hosts_config_file) as f: - hosts_yaml = yaml.safe_load(f) - if hosts_yaml['hosts_info']: - for ip, hostnames in hosts_yaml['hosts_info'].iteritems(): - dt_utils.add_hosts_info(ip, hostnames) - names_str = ' '.join(hostname for hostname in hostnames) - hosts_config += ' --add-host=\'{}\':{} '.format(names_str, - ip) - cls.logger.debug('Get hosts info {}:{}.'.format(ip, - names_str)) + hosts_config = dt_utils.get_hosts_info(cls.logger) config = "" if type.lower() == "functest": diff --git a/dovetail/utils/dovetail_utils.py b/dovetail/utils/dovetail_utils.py index 97186da0..2c16ca71 100644 --- a/dovetail/utils/dovetail_utils.py +++ b/dovetail/utils/dovetail_utils.py @@ -222,9 +222,12 @@ def check_docker_version(logger=None): def add_hosts_info(ip, hostnames): hosts = python_hosts.Hosts(path='/etc/hosts') + filtered_hostnames = [hostname for hostname in hostnames if hostname] + if not ip or not filtered_hostnames: + return new_entry = python_hosts.HostsEntry(entry_type='ipv4', address=ip, - names=hostnames) + names=filtered_hostnames) hosts.add([new_entry]) hosts.write() @@ -346,3 +349,33 @@ def check_cacert_file(cacert, logger=None): .format(dt_cfg.dovetail_config['config_dir'])) return False return True + + +def get_hosts_info(logger=None): + hosts_config = "" + hosts_config_file = os.path.join(dt_cfg.dovetail_config['config_dir'], + 'hosts.yaml') + if not os.path.isfile(hosts_config_file): + return hosts_config + with open(hosts_config_file) as f: + hosts_yaml = yaml.safe_load(f) + if not hosts_yaml: + logger.debug("File {} is empty.".format(hosts_config_file)) + return hosts_config + try: + if not hosts_yaml['hosts_info']: + return hosts_config + for ip, hostnames in hosts_yaml['hosts_info'].iteritems(): + if not hostnames: + continue + add_hosts_info(ip, hostnames) + names_str = ' '.join(hostname for hostname in hostnames + if hostname) + if not names_str: + continue + hosts_config += ' --add-host=\'{}\':{} '.format(names_str, ip) + logger.debug('Get hosts info {}:{}.'.format(ip, names_str)) + except KeyError as e: + logger.error("There is no key {} in file {}" + .format(e, hosts_config_file)) + return hosts_config |