diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest_disk.py b/lib/ansible/modules/cloud/vmware/vmware_guest_disk.py index bc070fbb1bf..a4bdd5096ee 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest_disk.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest_disk.py @@ -113,6 +113,42 @@ options: - ' If C(state) is set to C(present), disk will be added if not present at given SCSI Controller and Unit Number.' - ' If C(state) is set to C(present) and disk exists with different size, disk size is increased.' - ' Reducing disk size is not allowed.' + suboptions: + iolimit: + description: + - Section specifies the shares and limit for storage I/O resource. + suboptions: + limit: + description: + - Section specifies values for limit where the utilization of a virtual machine will not exceed, even if there are available resources. + shares: + description: + - Specifies different types of shares user can add for the given disk. + suboptions: + level: + description: + - Specifies different level for the shares section. + - Valid values are low, normal, high, custom. + level_value: + description: + - Custom value when C(level) is set as C(custom). + type: int + type: list + elements: dict + shares: + description: + - section for iolimit section tells about what are all different types of shares user can add for disk. + suboptions: + level: + description: + - tells about different level for the shares section, valid values are low,normal,high,custom. + type: str + level_value: + description: + - custom value when level is set as custom. + type: int + type: list + elements: dict default: [] type: list extends_documentation_fragment: vmware.documentation @@ -156,7 +192,51 @@ EXAMPLES = ''' delegate_to: localhost register: disk_facts -- name: Remove disk from virtual machine using name +- name: Add disks with specified shares to the virtual machine + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ datacenter_name }}" + validate_certs: no + disk: + - size_gb: 1 + type: thin + datastore: datacluster0 + state: present + scsi_controller: 1 + unit_number: 1 + disk_mode: 'independent_persistent' + shares: + level: custom + level_value: 1300 + delegate_to: localhost + register: test_custom_shares + +- name: create new disk with custom IO limits and shares in IO Limits + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ datacenter_name }}" + validate_certs: no + disk: + - size_gb: 1 + type: thin + datastore: datacluster0 + state: present + scsi_controller: 1 + unit_number: 1 + disk_mode: 'independent_persistent' + iolimit: + limit: 1506 + shares: + level: custom + level_value: 1305 + delegate_to: localhost + register: test_custom_IoLimit_shares + +- name: Remove disks from virtual machine using name vmware_guest_disk: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" @@ -324,6 +404,26 @@ class PyVmomiHelper(PyVmomi): return changed, results + def get_ioandshares_diskconfig(self, disk_spec, disk): + io_disk_spec = vim.StorageResourceManager.IOAllocationInfo() + if 'iolimit' in disk: + io_disk_spec.limit = disk['iolimit']['limit'] + if 'shares' in disk['iolimit']: + shares_spec = vim.SharesInfo() + shares_spec.level = disk['iolimit']['shares']['level'] + if shares_spec.level == 'custom': + shares_spec.shares = disk['iolimit']['shares']['level_value'] + io_disk_spec.shares = shares_spec + disk_spec.device.storageIOAllocation = io_disk_spec + if 'shares' in disk: + shares_spec = vim.SharesInfo() + shares_spec.level = disk['shares']['level'] + if shares_spec.level == 'custom': + shares_spec.shares = disk['shares']['level_value'] + io_disk_spec.shares = shares_spec + disk_spec.device.storageIOAllocation = io_disk_spec + return disk_spec + def ensure_disks(self, vm_obj=None): """ Manage internal state of virtual machine disks @@ -391,6 +491,7 @@ class PyVmomiHelper(PyVmomi): else: disk_spec.device.backing.fileName = disk['filename'] disk_spec.device.backing.datastore = disk['datastore'] + disk_spec = self.get_ioandshares_diskconfig(disk_spec, disk) self.config_spec.deviceChange.append(disk_spec) disk_change = True current_scsi_info[scsi_controller]['disks'][disk['disk_unit_number']] = disk_spec.device @@ -403,11 +504,12 @@ class PyVmomiHelper(PyVmomi): # Edit and no resizing allowed if disk['size'] < disk_spec.device.capacityInKB: self.module.fail_json(msg="Given disk size at disk index [%s] is smaller than found (%d < %d)." - " Reducing disks is not allowed." % (disk['disk_index'], - disk['size'], - disk_spec.device.capacityInKB)) + "Reducing disks is not allowed." % (disk['disk_index'], + disk['size'], + disk_spec.device.capacityInKB)) if disk['size'] != disk_spec.device.capacityInKB: disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit + disk_spec = self.get_ioandshares_diskconfig(disk_spec, disk) disk_spec.device.capacityInKB = disk['size'] self.config_spec.deviceChange.append(disk_spec) disk_change = True @@ -632,7 +734,10 @@ class PyVmomiHelper(PyVmomi): " 'scsi_type' value from ['%s']" % (disk_index, "', '".join(self.scsi_device_type.keys()))) current_disk['scsi_type'] = scsi_contrl_type - + if 'shares' in disk: + current_disk['shares'] = disk['shares'] + if 'iolimit' in disk: + current_disk['iolimit'] = disk['iolimit'] disks_data.append(current_disk) return disks_data @@ -691,6 +796,11 @@ class PyVmomiHelper(PyVmomi): disk_index = 0 for disk in vm_obj.config.hardware.device: if isinstance(disk, vim.vm.device.VirtualDisk): + if disk.storageIOAllocation is None: + disk.storageIOAllocation = vim.StorageResourceManager.IOAllocationInfo() + disk.storageIOAllocation.shares = vim.SharesInfo() + if disk.shares is None: + disk.shares = vim.SharesInfo() disks_facts[disk_index] = dict( key=disk.key, label=disk.deviceInfo.label, @@ -703,6 +813,11 @@ class PyVmomiHelper(PyVmomi): backing_eagerlyscrub=bool(disk.backing.eagerlyScrub), controller_key=disk.controllerKey, unit_number=disk.unitNumber, + iolimit_limit=disk.storageIOAllocation.limit, + iolimit_shares_level=disk.storageIOAllocation.shares.level, + iolimit_shares_limit=disk.storageIOAllocation.shares.shares, + shares_level=disk.shares.level, + shares_limit=disk.shares.shares, capacity_in_kb=disk.capacityInKB, capacity_in_bytes=disk.capacityInBytes, ) diff --git a/test/integration/targets/vmware_guest_disk/tasks/main.yml b/test/integration/targets/vmware_guest_disk/tasks/main.yml index 6f38b6131df..6c2d1c2cbbf 100644 --- a/test/integration/targets/vmware_guest_disk/tasks/main.yml +++ b/test/integration/targets/vmware_guest_disk/tasks/main.yml @@ -77,3 +77,156 @@ assert: that: - test_create_disk2 is changed + +- name: create new disk with custom shares + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ dc1 }}" + validate_certs: no + name: "{{ virtual_machines[0].name }}" + disk: + - size_gb: 1 + type: eagerzeroedthick + datastore: "{{ rw_datastore }}" + disk_mode: "independent_nonpersistent" + scsi_controller: 1 + state: present + unit_number: 4 + shares: + level: custom + level_value: 1300 + register: test_custom_shares + +- debug: + msg: "{{ test_custom_shares }}" + +- name: assert that changes were made + assert: + that: + - test_custom_shares is changed + +- name: create new disk with custom IO limits and shares in IO Limits + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ dc1 }}" + validate_certs: no + name: "{{ virtual_machines[0].name }}" + disk: + - size_gb: 1 + type: eagerzeroedthick + datastore: "{{ rw_datastore }}" + disk_mode: "independent_nonpersistent" + scsi_controller: 2 + state: present + unit_number: 4 + iolimit: + limit: 1506 + shares: + level: custom + level_value: 1305 + register: test_custom_IoLimit_shares + +- debug: + msg: "{{ test_custom_IoLimit_shares }}" + +- name: assert that changes were made + assert: + that: + - test_custom_IoLimit_shares is changed + +- name: Update disk for custom IO limits in IO Limits + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ dc1 }}" + validate_certs: no + name: "{{ virtual_machines[0].name }}" + disk: + - size_gb: 2 + type: eagerzeroedthick + datastore: "{{ rw_datastore }}" + disk_mode: "independent_nonpersistent" + scsi_controller: 2 + state: present + unit_number: 4 + iolimit: + limit: 1500 + shares: + level: custom + level_value: 1305 + register: test_custom_IoLimit + +- debug: + msg: "{{ test_custom_IoLimit }}" + +- name: assert that changes were made + assert: + that: + - test_custom_IoLimit is changed + +- name: Update disk for shares of IO limits + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ dc1 }}" + validate_certs: no + name: "{{ virtual_machines[0].name }}" + disk: + - size_gb: 3 + type: eagerzeroedthick + datastore: "{{ rw_datastore }}" + disk_mode: "independent_nonpersistent" + scsi_controller: 2 + state: present + unit_number: 4 + iolimit: + limit: 1500 + shares: + level: low + level_value: 650 + register: test_shares_IoLimit + +- debug: + msg: "{{ test_shares_IoLimit }}" + +- name: assert that changes were made + assert: + that: + - test_shares_IoLimit is changed + +- name: Update disk for shares and IoLimits of IO limits + vmware_guest_disk: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + datacenter: "{{ dc1 }}" + validate_certs: no + name: "{{ virtual_machines[0].name }}" + disk: + - size_gb: 4 + type: eagerzeroedthick + datastore: "{{ rw_datastore }}" + disk_mode: "independent_nonpersistent" + scsi_controller: 2 + state: present + unit_number: 4 + iolimit: + limit: 1507 + shares: + level: high + level_value: 1200 + register: test_shares_IoLimits + +- debug: + msg: "{{ test_shares_IoLimits }}" + +- name: assert that changes were made + assert: + that: + - test_shares_IoLimits is changed