summaryrefslogtreecommitdiff
path: root/lib/ansible/modules
diff options
context:
space:
mode:
authorAbhijeet Kasurde <akasurde@redhat.com>2019-06-28 11:57:26 +0530
committerToshio Kuratomi <a.badger@gmail.com>2019-07-16 11:56:14 -0700
commit0306b9a90752a775a061a943cb6309438922b374 (patch)
tree340f594afac4bb268cab717823fb419a691563e9 /lib/ansible/modules
parent28077887c29903857d984b369c4d97ad94630849 (diff)
downloadansible-0306b9a90752a775a061a943cb6309438922b374.tar.gz
[2.8] VMware: Set vapp settings while creating VM
vApp Settings can be set while creating VM. Fixes: #50617 (cherry picked from commit 760dc19284ff34c63c29ad320c036e1288080181) Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
Diffstat (limited to 'lib/ansible/modules')
-rw-r--r--lib/ansible/modules/cloud/vmware/vmware_guest.py124
1 files changed, 80 insertions, 44 deletions
diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py
index 70180d23e9..4bd5731527 100644
--- a/lib/ansible/modules/cloud/vmware/vmware_guest.py
+++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py
@@ -1410,51 +1410,84 @@ class PyVmomiHelper(PyVmomi):
new_vmconfig_spec = vim.vApp.VmConfigSpec()
- # This is primarily for vcsim/integration tests, unset vAppConfig was not seen on my deployments
- orig_spec = vm_obj.config.vAppConfig if vm_obj.config.vAppConfig else new_vmconfig_spec
-
- vapp_properties_current = dict((x.id, x) for x in orig_spec.property)
- vapp_properties_to_change = dict((x['id'], x) for x in self.params['vapp_properties'])
-
- # each property must have a unique key
- # init key counter with max value + 1
- all_keys = [x.key for x in orig_spec.property]
- new_property_index = max(all_keys) + 1 if all_keys else 0
-
- for property_id, property_spec in vapp_properties_to_change.items():
- is_property_changed = False
- new_vapp_property_spec = vim.vApp.PropertySpec()
-
- if property_id in vapp_properties_current:
- if property_spec.get('operation') == 'remove':
- new_vapp_property_spec.operation = 'remove'
- new_vapp_property_spec.removeKey = vapp_properties_current[property_id].key
- is_property_changed = True
+ if vm_obj:
+ # VM exists
+ # This is primarily for vcsim/integration tests, unset vAppConfig was not seen on my deployments
+ orig_spec = vm_obj.config.vAppConfig if vm_obj.config.vAppConfig else new_vmconfig_spec
+
+ vapp_properties_current = dict((x.id, x) for x in orig_spec.property)
+ vapp_properties_to_change = dict((x['id'], x) for x in self.params['vapp_properties'])
+
+ # each property must have a unique key
+ # init key counter with max value + 1
+ all_keys = [x.key for x in orig_spec.property]
+ new_property_index = max(all_keys) + 1 if all_keys else 0
+
+ for property_id, property_spec in vapp_properties_to_change.items():
+ is_property_changed = False
+ new_vapp_property_spec = vim.vApp.PropertySpec()
+
+ if property_id in vapp_properties_current:
+ if property_spec.get('operation') == 'remove':
+ new_vapp_property_spec.operation = 'remove'
+ new_vapp_property_spec.removeKey = vapp_properties_current[property_id].key
+ is_property_changed = True
+ else:
+ # this is 'edit' branch
+ new_vapp_property_spec.operation = 'edit'
+ new_vapp_property_spec.info = vapp_properties_current[property_id]
+ try:
+ for property_name, property_value in property_spec.items():
+
+ if property_name == 'operation':
+ # operation is not an info object property
+ # if set to anything other than 'remove' we don't fail
+ continue
+
+ # Updating attributes only if needed
+ if getattr(new_vapp_property_spec.info, property_name) != property_value:
+ setattr(new_vapp_property_spec.info, property_name, property_value)
+ is_property_changed = True
+
+ except Exception as e:
+ msg = "Failed to set vApp property field='%s' and value='%s'. Error: %s" % (property_name, property_value, to_text(e))
+ self.module.fail_json(msg=msg)
else:
- # this is 'edit' branch
- new_vapp_property_spec.operation = 'edit'
- new_vapp_property_spec.info = vapp_properties_current[property_id]
- try:
- for property_name, property_value in property_spec.items():
-
- if property_name == 'operation':
- # operation is not an info object property
- # if set to anything other than 'remove' we don't fail
- continue
-
- # Updating attributes only if needed
- if getattr(new_vapp_property_spec.info, property_name) != property_value:
- setattr(new_vapp_property_spec.info, property_name, property_value)
- is_property_changed = True
+ if property_spec.get('operation') == 'remove':
+ # attempt to delete non-existent property
+ continue
+
+ # this is add new property branch
+ new_vapp_property_spec.operation = 'add'
+
+ property_info = vim.vApp.PropertyInfo()
+ property_info.classId = property_spec.get('classId')
+ property_info.instanceId = property_spec.get('instanceId')
+ property_info.id = property_spec.get('id')
+ property_info.category = property_spec.get('category')
+ property_info.label = property_spec.get('label')
+ property_info.type = property_spec.get('type', 'string')
+ property_info.userConfigurable = property_spec.get('userConfigurable', True)
+ property_info.defaultValue = property_spec.get('defaultValue')
+ property_info.value = property_spec.get('value', '')
+ property_info.description = property_spec.get('description')
+
+ new_vapp_property_spec.info = property_info
+ new_vapp_property_spec.info.key = new_property_index
+ new_property_index += 1
+ is_property_changed = True
- except Exception as e:
- self.module.fail_json(msg="Failed to set vApp property field='%s' and value='%s'. Error: %s"
- % (property_name, property_value, to_text(e)))
- else:
- if property_spec.get('operation') == 'remove':
- # attemp to delete non-existent property
- continue
+ if is_property_changed:
+ new_vmconfig_spec.property.append(new_vapp_property_spec)
+ else:
+ # New VM
+ all_keys = [x.key for x in new_vmconfig_spec.property]
+ new_property_index = max(all_keys) + 1 if all_keys else 0
+ vapp_properties_to_change = dict((x['id'], x) for x in self.params['vapp_properties'])
+ is_property_changed = False
+ for property_id, property_spec in vapp_properties_to_change.items():
+ new_vapp_property_spec = vim.vApp.PropertySpec()
# this is add new property branch
new_vapp_property_spec.operation = 'add'
@@ -1474,8 +1507,10 @@ class PyVmomiHelper(PyVmomi):
new_vapp_property_spec.info.key = new_property_index
new_property_index += 1
is_property_changed = True
- if is_property_changed:
- new_vmconfig_spec.property.append(new_vapp_property_spec)
+
+ if is_property_changed:
+ new_vmconfig_spec.property.append(new_vapp_property_spec)
+
if new_vmconfig_spec.property:
self.configspec.vAppConfig = new_vmconfig_spec
self.change_detected = True
@@ -2132,6 +2167,7 @@ class PyVmomiHelper(PyVmomi):
self.configure_cpu_and_memory(vm_obj=vm_obj, vm_creation=True)
self.configure_hardware_params(vm_obj=vm_obj)
self.configure_resource_alloc_info(vm_obj=vm_obj)
+ self.configure_vapp_properties(vm_obj=vm_obj)
self.configure_disks(vm_obj=vm_obj)
self.configure_network(vm_obj=vm_obj)
self.configure_cdrom(vm_obj=vm_obj)