diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_vms.py b/lib/ansible/modules/cloud/ovirt/ovirt_vms.py index 6cc5832afef..034f3762161 100644 --- a/lib/ansible/modules/cloud/ovirt/ovirt_vms.py +++ b/lib/ansible/modules/cloud/ovirt/ovirt_vms.py @@ -66,6 +66,24 @@ options: - "Specify if latest template version should be used, when running a stateless VM." - "If this parameter is set to I(true) stateless VM is created." version_added: "2.3" + storage_domain: + description: + - "Name of the storage domain where all template disks should be created." + - "This parameter is considered only when C(template) is provided." + - "C(**IMPORTANT**)" + - "This parameter is not idempotent, if the VM exists and you specfiy different storage domain, + disk won't move." + version_added: "2.4" + disk_format: + description: + - "Specify format of the disk." + - "If (cow) format is used, disk will by created as sparse, so space will be allocated for the volume as needed, also known as I(thin provision)." + - "If (raw) format is used, disk storage will be allocated right away, also known as I(preallocated)." + - "Note that this option isn't idempotent as it's not currently possible to change format of the disk via API." + - "This parameter is considered only when C(template) and C(storage domain) is provided." + choices: ['cow', 'raw'] + default: cow + version_added: "2.4" memory: description: - "Amount of memory of the Virtual Machine. Prefix uses IEC 60027-2 standard (for example 1GiB, 1024MiB)." @@ -476,6 +494,15 @@ ovirt_vms: username: user password: password +# create vm from template and create all disks on specific storage domain +ovirt_vms: + name: vm_test + cluster: mycluster + template: mytemplate + storage_domain: mynfs + nics: + - name: nic1 + # Remove VM, if VM is running it will be stopped: ovirt_vms: state: absent @@ -542,13 +569,47 @@ class VmsModule(BaseModule): return template + def __get_storage_domain_and_all_template_disks(self, template): + + if self.param('template') is None: + return None + + if self.param('storage_domain') is None: + return None + + disks = list() + + for att in self._connection.follow_link(template.disk_attachments): + disks.append( + otypes.DiskAttachment( + disk=otypes.Disk( + id=att.disk.id, + format=otypes.DiskFormat(self.param('disk_format')), + storage_domains=[ + otypes.StorageDomain( + id=get_id_by_name( + self._connection.system_service().storage_domains_service(), + self.param('storage_domain') + ) + ) + ] + ) + ) + ) + + return disks + def build_entity(self): template = self.__get_template_with_version() + + disk_attachments = self.__get_storage_domain_and_all_template_disks(template) + return otypes.Vm( name=self.param('name'), cluster=otypes.Cluster( name=self.param('cluster') ) if self.param('cluster') else None, + disk_attachments=disk_attachments, template=otypes.Template( id=template.id, ) if template else None, @@ -1005,6 +1066,8 @@ def main(): template=dict(default=None), template_version=dict(default=None, type='int'), use_latest_template_version=dict(default=None, type='bool'), + storage_domain=dict(default=None), + disk_format=dict(choices=['cow','raw'], default='cow'), disks=dict(default=[], type='list'), memory=dict(default=None), memory_guaranteed=dict(default=None),