Improved property output to include override data.

Jira-Issue: OPENSTACK-715
This commit is contained in:
Borne Mace 2016-03-10 13:45:22 -08:00
parent f9db085a73
commit 57c1acfd3a
3 changed files with 125 additions and 24 deletions

View File

@ -211,7 +211,8 @@ class PropertyList(Lister):
property_list = ansible_properties.get_all_unique()
data = self._get_list_data(property_list)
override_flags = ansible_properties.get_all_override_flags()
data = self._get_list_data(property_list, override_flags)
header = self._get_list_header()
return (header, data)
@ -222,21 +223,25 @@ class PropertyList(Lister):
header = None
if self.is_long_flag:
if self.is_global:
header = (u._('Property Name'), u._('Property Value'),
u._('Overrides'), u._('Original Value'))
header = (u._('OVR'),
u._('Property Name'), u._('Property Value'),
u._('Original Value'))
else:
header = (u._('Property Name'), u._('Property Value'),
u._('Overrides'), u._('Original Value'),
header = (u._('OVR'),
u._('Property Name'), u._('Property Value'),
u._('Original Value'),
self.list_type)
else:
if self.is_global:
header = (u._('Property Name'), u._('Property Value'))
header = (u._('OVR'),
u._('Property Name'), u._('Property Value'))
else:
header = (u._('Property Name'), u._('Property Value'),
header = (u._('OVR'),
u._('Property Name'), u._('Property Value'),
self.list_type)
return header
def _get_list_data(self, property_list):
def _get_list_data(self, property_list, override_flags):
data = []
if property_list:
property_length = utils.get_property_list_length()
@ -252,30 +257,42 @@ class PropertyList(Lister):
if not include_prop:
continue
ovr_global = '-'
ovr_group = '-'
ovr_host = '-'
if prop.name in override_flags:
override_flag_set = override_flags[prop.name]
if override_flag_set.ovr_global:
ovr_global = '*'
if override_flag_set.ovr_group:
ovr_group = 'G'
if override_flag_set.ovr_host:
ovr_host = 'H'
prop_ovr = ovr_global + ovr_group + ovr_host
if self.is_long_flag:
if self.is_global:
data.append((prop.name, prop.value,
prop.overrides,
data.append((prop_ovr, prop.name, prop.value,
prop.orig_value))
else:
data.append((prop.name, prop.value,
prop.overrides,
data.append((prop_ovr, prop.name, prop.value,
prop.orig_value, prop.target))
else:
if self.is_global:
data.append((prop.name, prop.value))
data.append((prop_ovr, prop.name, prop.value))
else:
data.append((prop.name, prop.value,
data.append((prop_ovr, prop.name, prop.value,
prop.target))
else:
if self.is_long_flag:
if self.is_global:
data.append(('', '', '', ''))
data.append(('', '', '', '', ''))
else:
data.append(('', '', '', '', ''))
else:
if self.is_global:
data.append(('', ''))
data.append(('', '', ''))
else:
data.append(('', '', ''))

View File

@ -50,17 +50,15 @@ class AnsibleProperties(object):
self.globals_path = ''
self.global_props = []
self.unique_global_props = {}
self.unique_override_flags = {}
self.group_props = {}
self.host_props = {}
if load_globals:
self._load_properties_roles()
self._load_properties_all()
self._load_properties_global()
if load_hosts:
self._load_properties_hostvars()
if load_groups:
self._load_properties_groupvars()
self._load_properties_roles()
self._load_properties_all()
self._load_properties_global()
self._load_properties_hostvars()
self._load_properties_groupvars()
def _load_properties_roles(self):
start_dir = os.path.join(get_kolla_home(), ANSIBLE_ROLES_PATH)
@ -100,15 +98,19 @@ class AnsibleProperties(object):
globals_contents = yaml.safe_load(globals_data)
for key, value in globals_contents.items():
overrides = False
override_flags = OverrideFlags()
orig_value = None
if key in self.unique_global_props:
overrides = True
override_flags.ovr_global = True
orig_value = self.unique_global_props[key].value
ansible_prop = AnsibleProperty(key, value,
GLOBALS_FILENAME,
overrides, orig_value)
ansible_prop.override_flags = override_flags
self.global_props.append(ansible_prop)
self.unique_global_props[key] = ansible_prop
self.unique_override_flags[key] = override_flags
def _load_properties_hostvars(self):
host_dir = get_host_vars_dir()
@ -121,9 +123,14 @@ class AnsibleProperties(object):
props = []
for key, value in host_contents.items():
overrides = False
override_flags = OverrideFlags()
if key in self.unique_override_flags:
override_flags = self.unique_override_flags[key]
orig_value = None
if key in self.unique_global_props:
overrides = True
override_flags.ovr_host = True
self.unique_override_flags[key] = override_flags
orig_value = self.unique_global_props[key].value
ansible_prop = AnsibleProperty(key, value,
hostfile,
@ -138,6 +145,9 @@ class AnsibleProperties(object):
if (groupfile == 'all.yml'):
continue
self.group_props[groupfile] = []
# don't load __RESERVED__ as a group property list as it is globals
if groupfile == '__RESERVED__':
continue
with open(os.path.join(group_dir, groupfile)) as group_data:
group_contents = yaml.safe_load(group_data)
if group_contents is None:
@ -145,9 +155,14 @@ class AnsibleProperties(object):
props = []
for key, value in group_contents.items():
overrides = False
override_flags = OverrideFlags()
if key in self.unique_override_flags:
override_flags = self.unique_override_flags[key]
orig_value = None
if key in self.unique_global_props:
overrides = True
override_flags.ovr_group = True
self.unique_override_flags[key] = override_flags
orig_value = self.unique_global_props[key].value
ansible_prop = AnsibleProperty(key, value,
groupfile,
@ -210,6 +225,9 @@ class AnsibleProperties(object):
unique_list.append(value)
return sorted(unique_list, key=lambda x: x.name)
def get_all_override_flags(self):
return self.unique_override_flags
# TODO(bmace) -- if this isn't used for 2.1.x it should be removed
# property listing is still being tweaked so leaving for
# the time being in case we want to use it
@ -339,3 +357,11 @@ class AnsibleProperty(object):
self.overrides = overrides
self.orig_value = orig_value
self.target = target
class OverrideFlags(object):
def __init__(self):
self.ovr_global = False
self.ovr_group = False
self.ovr_host = False

View File

@ -62,6 +62,37 @@ class TestFunctional(KollaCliTest):
# test all host vars
self._properties_test(hosts=['all'])
# test property override output
ovr_key = 'enable_haproxy'
ovr_value = 'no'
# clear property values before test
self.run_cli_cmd('property clear %s' % ovr_key)
self.run_cli_cmd('property clear %s --host=all' % ovr_key)
self.run_cli_cmd('property clear %s --group=all' % ovr_key)
# global property override test
self.run_cli_cmd('property set %s %s' % (ovr_key, ovr_value))
json_str = self.run_cli_cmd('property list -f json')
msg = self._override_test(json_str, ovr_key, ovr_value, '*--')
self.assertEqual(msg, '', 'override check failed: %s' % msg)
# host property override test
self.run_cli_cmd('property set %s %s --host=%s' %
(ovr_key, ovr_value, host))
json_str = self.run_cli_cmd('property list -f json --host=%s' % host)
msg = self._override_test(json_str, ovr_key,
ovr_value, '*-H', host=host)
self.assertEqual(msg, '', 'host override check failed: %s' % msg)
# group property override test
self.run_cli_cmd('property set %s %s --group=%s' %
(ovr_key, ovr_value, group))
json_str = self.run_cli_cmd('property list -f json --group=%s' % group)
msg = self._override_test(json_str, ovr_key,
ovr_value, '*GH', group=group)
self.assertEqual(msg, '', 'group override check failed: %s' % msg)
# check that group_var files are deleted
# when groups are deleted
for group in groups:
@ -216,6 +247,33 @@ class TestFunctional(KollaCliTest):
break
return bad_path
def _override_test(self, json_str, key, value, ovr_string,
host=None, group=None):
error_msg = ''
props = json.loads(json_str.strip())
for prop in props:
if group is not None:
if prop['Group'] == group:
error_msg = self._check_override_value(prop, key,
value, ovr_string)
elif host is not None:
if prop['Host'] == host:
error_msg = self._check_override_value(prop, key,
value, ovr_string)
else:
error_msg = self._check_override_value(prop, key,
value, ovr_string)
return error_msg
def _check_override_value(self, prop, key, value, ovr_string):
error_msg = ''
if(prop['Property Name'] == key and
prop['Property Value'] == value and
prop['OVR'] != ovr_string):
error_msg = ('override value mismatch for '
'key:%s value:%s ovr:%s target:%s' %
(key, value, prop['OVR'], ovr_string))
return error_msg
if __name__ == '__main__':
unittest.main()