From 6b2c2f169a005e30bb3494cab78f2b55feefc7e1 Mon Sep 17 00:00:00 2001 From: Ondra Machacek Date: Tue, 5 Mar 2019 12:43:40 +0100 Subject: [PATCH] kubevirt: Add datavolumes support (#52998) --- lib/ansible/module_utils/kubevirt.py | 52 +++++++++++++++++++ .../modules/cloud/kubevirt/kubevirt_vm.py | 7 +++ 2 files changed, 59 insertions(+) diff --git a/lib/ansible/module_utils/kubevirt.py b/lib/ansible/module_utils/kubevirt.py index 5bbcacce492..3318527bf07 100644 --- a/lib/ansible/module_utils/kubevirt.py +++ b/lib/ansible/module_utils/kubevirt.py @@ -154,6 +154,54 @@ class KubeVirtRawModule(KubernetesRawModule): return existing + def _define_datavolumes(self, datavolumes, spec): + """ + Takes datavoulmes parameter of Ansible and create kubevirt API datavolumesTemplateSpec + structure from it + """ + if not datavolumes: + return + + spec['dataVolumeTemplates'] = [] + for dv in datavolumes: + # Add datavolume to datavolumetemplates spec: + dvt = virtdict() + dvt['metadata']['name'] = dv.get('name') + dvt['spec']['pvc'] = { + 'accessModes': dv.get('pvc').get('accessModes'), + 'resources': { + 'requests': { + 'storage': dv.get('pvc').get('storage'), + } + } + } + dvt['spec']['source'] = dv.get('source') + spec['dataVolumeTemplates'].append(dvt) + + # Add datavolume to disks spec: + if not spec['template']['spec']['domain']['devices']['disks']: + spec['template']['spec']['domain']['devices']['disks'] = [] + + spec['template']['spec']['domain']['devices']['disks'].append( + { + 'name': dv.get('name'), + 'disk': dv.get('disk', {'bus': 'virtio'}), + } + ) + + # Add datavolume to volumes spec: + if not spec['template']['spec']['volumes']: + spec['template']['spec']['volumes'] = [] + + spec['template']['spec']['volumes'].append( + { + 'dataVolume': { + 'name': dv.get('name') + }, + 'name': dv.get('name'), + } + ) + def _define_cloud_init(self, cloud_init_nocloud, template_spec): """ Takes the user's cloud_init_nocloud parameter and fill it in kubevirt @@ -237,6 +285,7 @@ class KubeVirtRawModule(KubernetesRawModule): memory = params.get('memory') cpu_cores = params.get('cpu_cores') labels = params.get('labels') + datavolumes = params.get('datavolumes') interfaces = params.get('interfaces') cloud_init_nocloud = params.get('cloud_init_nocloud') machine_type = params.get('machine_type') @@ -266,6 +315,9 @@ class KubeVirtRawModule(KubernetesRawModule): # Define interfaces: self._define_interfaces(interfaces, template_spec) + # Define datavolumes: + self._define_datavolumes(datavolumes, definition['spec']) + # Perform create/absent action: definition = dict(self.merge_dicts(self.resource_definitions[0], definition)) resource = self.find_supported_resource(kind) diff --git a/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py b/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py index 6fdbfd64563..c91b7e58ec6 100644 --- a/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py +++ b/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py @@ -56,6 +56,12 @@ options: - Works only with C(state) I(present) and I(absent). type: bool default: false + datavolumes: + description: + - "DataVolumes are a way to automate importing virtual machine disks onto pvcs during the virtual machine's + launch flow. Without using a DataVolume, users have to prepare a pvc with a disk image before assigning + it to a VM or VMI manifest. With a DataVolume, both the pvc creation and import is automated on behalf of the user." + type: list extends_documentation_fragment: - k8s_auth_options @@ -218,6 +224,7 @@ VM_ARG_SPEC = { ], 'default': 'present' }, + 'datavolumes': {'type': 'list'}, }