summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Lenz <m@riolenz.de>2019-02-26 21:46:03 +0100
committerToshio Kuratomi <a.badger@gmail.com>2019-03-01 15:12:57 -0800
commit2aa96cdec5910392360323310a2156806188c6bd (patch)
tree502a7e001d5d2f190aa9591c1ed120fb4e51e47b
parent88106ce626806455ccf8380d0e6a5a82b381a578 (diff)
downloadansible-2aa96cdec5910392360323310a2156806188c6bd.tar.gz
[Backport 2.7] VMware: Fix KeyError in vmware_host_config_manager
-rw-r--r--changelogs/fragments/44561-vmware_host_config_manager-fix_key_error.yml2
-rw-r--r--lib/ansible/modules/cloud/vmware/vmware_host_config_manager.py52
2 files changed, 26 insertions, 28 deletions
diff --git a/changelogs/fragments/44561-vmware_host_config_manager-fix_key_error.yml b/changelogs/fragments/44561-vmware_host_config_manager-fix_key_error.yml
new file mode 100644
index 0000000000..a44e0dc5cd
--- /dev/null
+++ b/changelogs/fragments/44561-vmware_host_config_manager-fix_key_error.yml
@@ -0,0 +1,2 @@
+bugfixes:
+- Fixed KeyError issue in vmware_host_config_manager when a supported option isn't already set (https://github.com/ansible/ansible/issues/44561).
diff --git a/lib/ansible/modules/cloud/vmware/vmware_host_config_manager.py b/lib/ansible/modules/cloud/vmware/vmware_host_config_manager.py
index bde525995a..2baf52d35b 100644
--- a/lib/ansible/modules/cloud/vmware/vmware_host_config_manager.py
+++ b/lib/ansible/modules/cloud/vmware/vmware_host_config_manager.py
@@ -127,45 +127,41 @@ class VmwareConfigManager(PyVmomi):
for host in self.hosts:
option_manager = host.configManager.advancedOption
host_facts = {}
- for option in option_manager.QueryOptions():
- host_facts[option.key] = dict(value=option.value)
-
for s_option in option_manager.supportedOption:
- host_facts[s_option.key].update(
- option_type=s_option.optionType,
- )
+ host_facts[s_option.key] = dict(option_type=s_option.optionType, value=None)
+
+ for option in option_manager.QueryOptions():
+ if option.key in host_facts:
+ host_facts[option.key].update(
+ value=option.value,
+ )
change_option_list = []
for option_key, option_value in self.options.items():
if option_key in host_facts:
- # Make sure option_type is defined some values do not have
- # it defined and appear to be read only.
- if 'option_type' in host_facts[option_key]:
- # We handle all supported types here so we can give meaningful errors.
- option_type = host_facts[option_key]['option_type']
- if self.is_boolean(option_value) and isinstance(option_type, vim.option.BoolOption):
- option_value = self.is_truthy(option_value)
- elif (isinstance(option_value, integer_types) or self.is_integer(option_value))\
- and isinstance(option_type, vim.option.IntOption):
- option_value = VmomiSupport.vmodlTypes['int'](option_value)
- elif (isinstance(option_value, integer_types) or self.is_integer(option_value, 'long'))\
- and isinstance(option_type, vim.option.LongOption):
- option_value = VmomiSupport.vmodlTypes['long'](option_value)
- elif isinstance(option_value, float) and isinstance(option_type, vim.option.FloatOption):
- pass
- elif isinstance(option_value, string_types) and isinstance(option_type, (vim.option.StringOption, vim.option.ChoiceOption)):
- pass
- else:
- self.module.fail_json(msg="Provided value is of type %s."
- " Option %s expects: %s" % (type(option_value), option_key, type(option_type)))
+ # We handle all supported types here so we can give meaningful errors.
+ option_type = host_facts[option_key]['option_type']
+ if self.is_boolean(option_value) and isinstance(option_type, vim.option.BoolOption):
+ option_value = self.is_truthy(option_value)
+ elif (isinstance(option_value, integer_types) or self.is_integer(option_value))\
+ and isinstance(option_type, vim.option.IntOption):
+ option_value = VmomiSupport.vmodlTypes['int'](option_value)
+ elif (isinstance(option_value, integer_types) or self.is_integer(option_value, 'long'))\
+ and isinstance(option_type, vim.option.LongOption):
+ option_value = VmomiSupport.vmodlTypes['long'](option_value)
+ elif isinstance(option_value, float) and isinstance(option_type, vim.option.FloatOption):
+ pass
+ elif isinstance(option_value, string_types) and isinstance(option_type, (vim.option.StringOption, vim.option.ChoiceOption)):
+ pass
else:
- self.module.fail_json(msg="Cannot change read only option %s to %s." % (option_key, option_value))
+ self.module.fail_json(msg="Provided value is of type %s."
+ " Option %s expects: %s" % (type(option_value), option_key, type(option_type)))
if option_value != host_facts[option_key]['value']:
change_option_list.append(vim.option.OptionValue(key=option_key, value=option_value))
changed = True
else: # Don't silently drop unknown options. This prevents typos from falling through the cracks.
- self.module.fail_json(msg="Unknown option %s" % option_key)
+ self.module.fail_json(msg="Unsupported option %s" % option_key)
if changed:
try:
option_manager.UpdateOptions(changedValue=change_option_list)