From e3c79979c2dced60db57535aab2b6f4106c05245 Mon Sep 17 00:00:00 2001 From: MyronFanQiu <49134743+MyronFanQiu@users.noreply.github.com> Date: Mon, 8 Apr 2019 11:41:53 +0800 Subject: [PATCH] support caching options (#51387) (#54710) --- .../cloud/azure/azure_rm_manageddisk.py | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/ansible/modules/cloud/azure/azure_rm_manageddisk.py b/lib/ansible/modules/cloud/azure/azure_rm_manageddisk.py index 599a275549f..f4e5b0d3d96 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_manageddisk.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_manageddisk.py @@ -93,6 +93,17 @@ options: - To detach a disk from a vm, explicitly set to ''. - If this option is unset, the value will not be changed. version_added: 2.5 + attach_caching: + description: + - "Disk caching policy controlled by VM. Will be used when attached to the VM defined by C(managed_by)." + - "If this option is different from the current caching policy, + the managed disk will be deattached from the VM and attached with current caching option again." + - "Allowed values: '', read_only, read_write." + choices: + - '' + - read_only + - read_write + version_added: 2.8 tags: description: - Tags to assign to the managed disk. @@ -138,6 +149,7 @@ EXAMPLES = ''' resource_group: myResourceGroup disk_size_gb: 4 managed_by: testvm001 + attach_caching: read_only - name: Unmount the managed disk to VM azure_rm_manageddisk: @@ -245,6 +257,10 @@ class AzureRMManagedDisk(AzureRMModuleBase): zone=dict( type='str', choices=['', '1', '2', '3'] + ), + attach_caching=dict( + type='str', + choices=['', 'read_only', 'read_write'] ) ) required_if = [ @@ -267,6 +283,7 @@ class AzureRMManagedDisk(AzureRMModuleBase): self.tags = None self.zone = None self.managed_by = None + self.attach_caching = None super(AzureRMManagedDisk, self).__init__( derived_arg_spec=self.module_arg_spec, required_if=required_if, @@ -302,7 +319,7 @@ class AzureRMManagedDisk(AzureRMModuleBase): if self.managed_by or self.managed_by == '': vm_name = parse_resource_id(disk_instance.get('managed_by', '')).get('name') if disk_instance else None vm_name = vm_name or '' - if self.managed_by != vm_name: + if self.managed_by != vm_name or self.is_attach_caching_option_different(vm_name, result): changed = True if not self.check_mode: if vm_name: @@ -330,7 +347,11 @@ class AzureRMManagedDisk(AzureRMModuleBase): # prepare the data disk params = self.compute_models.ManagedDiskParameters(id=disk.get('id'), storage_account_type=disk.get('storage_account_type')) - data_disk = self.compute_models.DataDisk(lun=lun, create_option=self.compute_models.DiskCreateOptionTypes.attach, managed_disk=params) + caching_options = self.compute_models.CachingTypes[self.attach_caching] if self.attach_caching and self.attach_caching != '' else None + data_disk = self.compute_models.DataDisk(lun=lun, + create_option=self.compute_models.DiskCreateOptionTypes.attach, + managed_disk=params, + caching=caching_options) vm.storage_profile.data_disks.append(data_disk) self._update_vm(vm_name, vm) @@ -436,6 +457,17 @@ class AzureRMManagedDisk(AzureRMModuleBase): except CloudError as e: self.log('Did not find managed disk') + def is_attach_caching_option_different(self, vm_name, disk): + resp = False + if vm_name: + vm = self._get_vm(vm_name) + correspondence = next((d for d in vm.storage_profile.data_disks if d.name.lower() == disk.get('name').lower()), None) + if correspondence and correspondence.caching.name != self.attach_caching: + resp = True + if correspondence.caching.name == 'none' and self.attach_caching == '': + resp = False + return resp + def main(): """Main execution"""