From c65c841ef3782b4a7ce78c6b4df3ac103bb63871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ne=C4=8Das?= Date: Fri, 31 Aug 2018 09:00:04 +0200 Subject: [PATCH] add ovirt attach host devic (#44714) --- lib/ansible/modules/cloud/ovirt/ovirt_vm.py | 51 ++++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_vm.py b/lib/ansible/modules/cloud/ovirt/ovirt_vm.py index 0f444616ca..3e307e1469 100644 --- a/lib/ansible/modules/cloud/ovirt/ovirt_vm.py +++ b/lib/ansible/modules/cloud/ovirt/ovirt_vm.py @@ -245,10 +245,14 @@ options: custom_compatibility_version: description: - "Enables a virtual machine to be customized to its own compatibility version. If - `C(custom_compatibility_version)` is set, it overrides the cluster's compatibility version + 'C(custom_compatibility_version)' is set, it overrides the cluster's compatibility version for this particular virtual machine." version_added: "2.7" - + host_devices: + description: + - Single Root I/O Virtualization - technology that allows single device to expose multiple endpoints that can be passed to VMs + - host_devices is an list which contain dictinary with name and state of device + version_added: "2.7" delete_protected: description: - If I(yes) Virtual Machine will be set as delete protected. @@ -853,6 +857,7 @@ EXAMPLES = ''' protocol: - spice - vnc + # Execute remote viever to VM - block: - name: Create a ticket for console for a running VM @@ -870,6 +875,19 @@ EXAMPLES = ''' - name: Run remote viewer with file command: remote-viewer ~/vvfile.vv +# Default value of host_device state is present +- name: Attach host devices to virtual machine + ovirt_vm: + name: myvm + host: myhost + placement_policy: pinned + host_devices: + - name: pci_0000_00_06_0 + - name: pci_0000_00_07_0 + state: absent + - name: pci_0000_00_08_0 + state: present + ''' @@ -1214,6 +1232,7 @@ class VmsModule(BaseModule): self.changed = self.__attach_numa_nodes(entity) self.changed = self.__attach_watchdog(entity) self.changed = self.__attach_graphical_console(entity) + self.changed = self.__attach_host_devices(entity) def pre_remove(self, entity): # Forcibly stop the VM, if it's not in DOWN state: @@ -1608,6 +1627,33 @@ class VmsModule(BaseModule): ) return self._initialization + def __attach_host_devices(self, entity): + vm_service = self._service.service(entity.id) + host_devices_service = vm_service.host_devices_service() + host_devices = self.param('host_devices') + updated = False + if host_devices: + device_names = [dev.name for dev in host_devices_service.list()] + for device in host_devices: + device_name = device.get('name') + state = device.get('state', 'present') + if state == 'absent' and device_name in device_names: + updated = True + if not self._module.check_mode: + device_id = get_id_by_name(host_devices_service, device.get('name')) + host_devices_service.device_service(device_id).remove() + + elif state == 'present' and device_name not in device_names: + updated = True + if not self._module.check_mode: + host_devices_service.add( + otypes.HostDevice( + name=device.get('name'), + ) + ) + + return updated + def _get_role_mappings(module): roleMappings = list() @@ -1925,6 +1971,7 @@ def main(): numa_nodes=dict(type='list', default=[]), custom_properties=dict(type='list'), watchdog=dict(type='dict'), + host_devices=dict(type='list'), graphical_console=dict(type='dict'), ) module = AnsibleModule(