diff --git a/lib/ansible/modules/cloud/kubevirt/kubevirt_template.py b/lib/ansible/modules/cloud/kubevirt/kubevirt_template.py index 0e3885122ee..9970d5b484e 100644 --- a/lib/ansible/modules/cloud/kubevirt/kubevirt_template.py +++ b/lib/ansible/modules/cloud/kubevirt/kubevirt_template.py @@ -210,6 +210,7 @@ from ansible.module_utils.k8s.common import AUTH_ARG_SPEC from ansible.module_utils.kubevirt import ( virtdict, KubeVirtRawModule, + API_GROUP, MAX_SUPPORTED_API_VERSION ) @@ -355,7 +356,7 @@ class KubeVirtVMTemplate(KubeVirtRawModule): vm_definition['spec']['template']['spec']['networks'] = [self.params.get('default_network')] # Set kubevirt API version: - vm_definition['apiVersion'] = MAX_SUPPORTED_API_VERSION + vm_definition['apiVersion'] = '%s/%s' % (API_GROUP, MAX_SUPPORTED_API_VERSION) # Contruct k8s vm API object: vm_template = vm_definition['spec']['template'] diff --git a/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py b/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py index dca63dcc7ae..bb75a57e22f 100644 --- a/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py +++ b/lib/ansible/modules/cloud/kubevirt/kubevirt_vm.py @@ -62,6 +62,14 @@ options: 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 + template: + description: + - "Template to used to create a virtual machine." + type: str + parameters: + description: + - "Value of parameters to be replaced in template parameters." + type: dict extends_documentation_fragment: - k8s_auth_options @@ -234,6 +242,8 @@ VM_ARG_SPEC = { 'default': 'present' }, 'datavolumes': {'type': 'list'}, + 'template': {'type': 'str'}, + 'parameters': {'type': 'dict'}, } @@ -308,6 +318,7 @@ class KubeVirtVM(KubeVirtRawModule): def execute_module(self): # Parse parameters specific for this module: + self.client = self.get_api_client() definition = virtdict() ephemeral = self.params.get('ephemeral') state = self.params.get('state') @@ -315,10 +326,31 @@ class KubeVirtVM(KubeVirtRawModule): if not ephemeral: definition['spec']['running'] = state == 'running' - # Execute the CURD of VM: + # Construct the API object definition: + vm_template = self.params.get('template') + processedtemplate = {} + if vm_template: + # Find the template the VM should be created from: + template_resource = self.client.resources.get(api_version='template.openshift.io/v1', kind='Template', name='templates') + proccess_template = template_resource.get(name=vm_template, namespace=self.params.get('namespace')) + + # Set proper template values set by Ansible parameter 'parameters': + for k, v in self.params.get('parameters', {}).items(): + for parameter in proccess_template.parameters: + if parameter.name == k: + parameter.value = v + + # Proccess the template: + processedtemplates_res = self.client.resources.get(api_version='template.openshift.io/v1', kind='Template', name='processedtemplates') + processedtemplate = processedtemplates_res.create(proccess_template.to_dict()).to_dict()['objects'][0] + template = definition if ephemeral else definition['spec']['template'] kind = 'VirtualMachineInstance' if ephemeral else 'VirtualMachine' + template['labels']['vm.cnv.io/name'] = self.params.get('name') dummy, definition = self.construct_vm_definition(kind, definition, template) + definition = dict(self.merge_dicts(processedtemplate, definition)) + + # Create the VM: result = self.execute_crud(kind, definition) changed = result['changed']