support caching options (#51387) (#54710)

This commit is contained in:
MyronFanQiu 2019-04-08 11:41:53 +08:00 committed by Zim Kalinowski
parent ea609c3492
commit e3c79979c2

View file

@ -93,6 +93,17 @@ options:
- To detach a disk from a vm, explicitly set to ''. - To detach a disk from a vm, explicitly set to ''.
- If this option is unset, the value will not be changed. - If this option is unset, the value will not be changed.
version_added: 2.5 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: tags:
description: description:
- Tags to assign to the managed disk. - Tags to assign to the managed disk.
@ -138,6 +149,7 @@ EXAMPLES = '''
resource_group: myResourceGroup resource_group: myResourceGroup
disk_size_gb: 4 disk_size_gb: 4
managed_by: testvm001 managed_by: testvm001
attach_caching: read_only
- name: Unmount the managed disk to VM - name: Unmount the managed disk to VM
azure_rm_manageddisk: azure_rm_manageddisk:
@ -245,6 +257,10 @@ class AzureRMManagedDisk(AzureRMModuleBase):
zone=dict( zone=dict(
type='str', type='str',
choices=['', '1', '2', '3'] choices=['', '1', '2', '3']
),
attach_caching=dict(
type='str',
choices=['', 'read_only', 'read_write']
) )
) )
required_if = [ required_if = [
@ -267,6 +283,7 @@ class AzureRMManagedDisk(AzureRMModuleBase):
self.tags = None self.tags = None
self.zone = None self.zone = None
self.managed_by = None self.managed_by = None
self.attach_caching = None
super(AzureRMManagedDisk, self).__init__( super(AzureRMManagedDisk, self).__init__(
derived_arg_spec=self.module_arg_spec, derived_arg_spec=self.module_arg_spec,
required_if=required_if, required_if=required_if,
@ -302,7 +319,7 @@ class AzureRMManagedDisk(AzureRMModuleBase):
if self.managed_by or self.managed_by == '': 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 = parse_resource_id(disk_instance.get('managed_by', '')).get('name') if disk_instance else None
vm_name = vm_name or '' 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 changed = True
if not self.check_mode: if not self.check_mode:
if vm_name: if vm_name:
@ -330,7 +347,11 @@ class AzureRMManagedDisk(AzureRMModuleBase):
# prepare the data disk # prepare the data disk
params = self.compute_models.ManagedDiskParameters(id=disk.get('id'), storage_account_type=disk.get('storage_account_type')) 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) vm.storage_profile.data_disks.append(data_disk)
self._update_vm(vm_name, vm) self._update_vm(vm_name, vm)
@ -436,6 +457,17 @@ class AzureRMManagedDisk(AzureRMModuleBase):
except CloudError as e: except CloudError as e:
self.log('Did not find managed disk') 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(): def main():
"""Main execution""" """Main execution"""