ovirt_vm: Add option to export the VMs (#47113)

The commit adds the feature to export the VM to export domain and as
OVA.
pull/45073/merge
Nijin Ashok 6 years ago committed by ansibot
parent c5d0461561
commit 29c76c5a93

@ -28,7 +28,7 @@ options:
- ID of the Virtual Machine to manage. - ID of the Virtual Machine to manage.
state: state:
description: description:
- Should the Virtual Machine be running/stopped/present/absent/suspended/next_run/registered. - Should the Virtual Machine be running/stopped/present/absent/suspended/next_run/registered/exported.
When C(state) is I(registered) and the unregistered VM's name When C(state) is I(registered) and the unregistered VM's name
belongs to an already registered in engine VM in the same DC belongs to an already registered in engine VM in the same DC
then we fail to register the unregistered template. then we fail to register the unregistered template.
@ -36,8 +36,9 @@ options:
- I(running) state will create/update VM and start it. - I(running) state will create/update VM and start it.
- I(next_run) state updates the VM and if the VM has next run configuration it will be rebooted. - I(next_run) state updates the VM and if the VM has next run configuration it will be rebooted.
- Please check I(notes) to more detailed description of states. - Please check I(notes) to more detailed description of states.
- I(exported) state will export the VM to export domain or as OVA.
- I(registered) is supported since 2.4. - I(registered) is supported since 2.4.
choices: [ absent, next_run, present, registered, running, stopped, suspended ] choices: [ absent, next_run, present, registered, running, stopped, suspended, exported ]
default: present default: present
cluster: cluster:
description: description:
@ -558,6 +559,24 @@ options:
- "C(headless_mode) - If I(true) disable the graphics console for this virtual machine." - "C(headless_mode) - If I(true) disable the graphics console for this virtual machine."
- "C(protocol) - Graphical protocol, a list of I(spice), I(vnc), or both." - "C(protocol) - Graphical protocol, a list of I(spice), I(vnc), or both."
version_added: "2.5" version_added: "2.5"
exclusive:
description:
- "When C(state) is I(exported) this parameter indicates if the existing VM with the
same name should be overwritten."
version_added: "2.8"
type: bool
export_domain:
description:
- "When C(state) is I(exported)this parameter specifies the name of the export storage domain."
version_added: "2.8"
export_ova:
description:
- Dictionary of values to be used to export VM as OVA.
- C(host) - The name of the destination host where the OVA has to be exported.
- C(directory) - The name of the directory where the OVA has to be exported.
- C(filename) - The name of the exported OVA file.
version_added: "2.8"
notes: notes:
- If VM is in I(UNASSIGNED) or I(UNKNOWN) state before any operation, the module will fail. - If VM is in I(UNASSIGNED) or I(UNKNOWN) state before any operation, the module will fail.
If VM is in I(IMAGE_LOCKED) state before any operation, we try to wait for VM to be I(DOWN). If VM is in I(IMAGE_LOCKED) state before any operation, we try to wait for VM to be I(DOWN).
@ -899,6 +918,15 @@ EXAMPLES = '''
- name: pci_0000_00_08_0 - name: pci_0000_00_08_0
state: present state: present
- name: Export the VM as OVA
ovirt_vm:
name: myvm
state: exported
cluster: mycluster
export_ova:
host: myhost
filename: myvm.ova
directory: /tmp/
''' '''
@ -937,6 +965,7 @@ from ansible.module_utils.ovirt import (
get_link_name, get_link_name,
get_id_by_name, get_id_by_name,
ovirt_full_argument_spec, ovirt_full_argument_spec,
search_by_attributes,
search_by_name, search_by_name,
wait, wait,
) )
@ -1159,6 +1188,15 @@ class VmsModule(BaseModule):
initialization=self.get_initialization() if self.param('cloud_init_persist') else None, initialization=self.get_initialization() if self.param('cloud_init_persist') else None,
) )
def _get_export_domain_service(self):
provider_name = self._module.params['export_domain']
export_sds_service = self._connection.system_service().storage_domains_service()
export_sd_id = get_id_by_name(export_sds_service, provider_name)
return export_sds_service.service(export_sd_id)
def post_export_action(self, entity):
self._service = self._get_export_domain_service().vms_service()
def update_check(self, entity): def update_check(self, entity):
res = self._update_check(entity) res = self._update_check(entity)
if entity.next_run_configuration_exists: if entity.next_run_configuration_exists:
@ -1919,7 +1957,7 @@ def control_state(vm, vms_service, module):
def main(): def main():
argument_spec = ovirt_full_argument_spec( argument_spec = ovirt_full_argument_spec(
state=dict(type='str', default='present', choices=['absent', 'next_run', 'present', 'registered', 'running', 'stopped', 'suspended']), state=dict(type='str', default='present', choices=['absent', 'next_run', 'present', 'registered', 'running', 'stopped', 'suspended', 'exported']),
name=dict(type='str'), name=dict(type='str'),
id=dict(type='str'), id=dict(type='str'),
cluster=dict(type='str'), cluster=dict(type='str'),
@ -1997,6 +2035,9 @@ def main():
watchdog=dict(type='dict'), watchdog=dict(type='dict'),
host_devices=dict(type='list'), host_devices=dict(type='list'),
graphical_console=dict(type='dict'), graphical_console=dict(type='dict'),
exclusive=dict(type='bool'),
export_domain=dict(default=None),
export_ova=dict(type='dict'),
) )
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
@ -2199,6 +2240,29 @@ def main():
'id': vm.id, 'id': vm.id,
'vm': get_dict_of_struct(vm) 'vm': get_dict_of_struct(vm)
} }
elif state == 'exported':
if module.params['export_domain']:
export_service = vms_module._get_export_domain_service()
export_vm = search_by_attributes(export_service.vms_service(), id=vm.id)
ret = vms_module.action(
entity=vm,
action='export',
action_condition=lambda t: export_vm is None or module.params['exclusive'],
wait_condition=lambda t: t is not None,
post_action=vms_module.post_export_action,
storage_domain=otypes.StorageDomain(id=export_service.get().id),
exclusive=module.params['exclusive'],
)
elif module.params['export_ova']:
export_vm = module.params['export_ova']
ret = vms_module.action(
entity=vm,
action='export_to_path_on_host',
host=otypes.Host(name=export_vm.get('host')),
directory=export_vm.get('directory'),
filename=export_vm.get('filename'),
)
module.exit_json(**ret) module.exit_json(**ret)
except Exception as e: except Exception as e:

Loading…
Cancel
Save