summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py')
-rw-r--r--lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py592
1 files changed, 0 insertions, 592 deletions
diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py b/lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py
deleted file mode 100644
index 63e0471c17..0000000000
--- a/lib/ansible/modules/cloud/ovirt/ovirt_instance_type.py
+++ /dev/null
@@ -1,592 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2017, Ansible Project
-# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-
-ANSIBLE_METADATA = {'metadata_version': '1.1',
- 'status': ['preview'],
- 'supported_by': 'community'}
-
-DOCUMENTATION = '''
----
-module: ovirt_instance_type
-short_description: Module to manage Instance Types in oVirt/RHV
-version_added: "2.8"
-author:
-- Martin Necas (@mnecas)
-- Ondra Machacek (@machacekondra)
-description:
- - This module manages whole lifecycle of the Instance Type in oVirt/RHV.
-options:
- name:
- description:
- - Name of the Instance Type to manage.
- - If instance type don't exists C(name) is required. Otherwise C(id) or C(name) can be used.
- id:
- description:
- - ID of the Instance Type to manage.
- state:
- description:
- - Should the Instance Type be present/absent.
- - I(present) state will create/update instance type and don't change its state if it already exists.
- choices: [ absent, present ]
- default: present
- memory:
- description:
- - Amount of memory of the Instance Type. Prefix uses IEC 60027-2 standard (for example 1GiB, 1024MiB).
- - Default value is set by engine.
- memory_guaranteed:
- description:
- - Amount of minimal guaranteed memory of the Instance Type.
- Prefix uses IEC 60027-2 standard (for example 1GiB, 1024MiB).
- - C(memory_guaranteed) parameter can't be lower than C(memory) parameter.
- - Default value is set by engine.
- nics:
- description:
- - List of NICs, which should be attached to Virtual Machine. NIC is described by following dictionary.
- - C(name) - Name of the NIC.
- - C(profile_name) - Profile name where NIC should be attached.
- - C(interface) - Type of the network interface. One of following I(virtio), I(e1000), I(rtl8139), default is I(virtio).
- - C(mac_address) - Custom MAC address of the network interface, by default it's obtained from MAC pool.
- - NOTE - This parameter is used only when C(state) is I(running) or I(present) and is able to only create NICs.
- To manage NICs of the instance type in more depth please use M(ovirt_nic) module instead.
- memory_max:
- description:
- - Upper bound of instance type memory up to which memory hot-plug can be performed.
- Prefix uses IEC 60027-2 standard (for example 1GiB, 1024MiB).
- - Default value is set by engine.
- cpu_cores:
- description:
- - Number of virtual CPUs cores of the Instance Type.
- - Default value is set by oVirt/RHV engine.
- cpu_sockets:
- description:
- - Number of virtual CPUs sockets of the Instance Type.
- - Default value is set by oVirt/RHV engine.
- cpu_threads:
- description:
- - Number of virtual CPUs sockets of the Instance Type.
- - Default value is set by oVirt/RHV engine.
- operating_system:
- description:
- - Operating system of the Instance Type.
- - Default value is set by oVirt/RHV engine.
- - "Possible values: debian_7, freebsd, freebsdx64, other, other_linux,
- other_linux_ppc64, other_ppc64, rhel_3, rhel_4, rhel_4x64, rhel_5, rhel_5x64,
- rhel_6, rhel_6x64, rhel_6_ppc64, rhel_7x64, rhel_7_ppc64, sles_11, sles_11_ppc64,
- ubuntu_12_04, ubuntu_12_10, ubuntu_13_04, ubuntu_13_10, ubuntu_14_04, ubuntu_14_04_ppc64,
- windows_10, windows_10x64, windows_2003, windows_2003x64, windows_2008, windows_2008x64,
- windows_2008r2x64, windows_2008R2x64, windows_2012x64, windows_2012R2x64, windows_7,
- windows_7x64, windows_8, windows_8x64, windows_xp"
- boot_devices:
- description:
- - List of boot devices which should be used to boot. For example C([ cdrom, hd ]).
- - Default value is set by oVirt/RHV engine.
- choices: [ cdrom, hd, network ]
- serial_console:
- description:
- - "I(True) enable VirtIO serial console, I(False) to disable it. By default is chosen by oVirt/RHV engine."
- type: bool
- usb_support:
- description:
- - "I(True) enable USB support, I(False) to disable it. By default is chosen by oVirt/RHV engine."
- type: bool
- high_availability:
- description:
- - If I(yes) Instance Type will be set as highly available.
- - If I(no) Instance Type won't be set as highly available.
- - If no value is passed, default value is set by oVirt/RHV engine.
- type: bool
- high_availability_priority:
- description:
- - Indicates the priority of the instance type inside the run and migration queues.
- Instance Type with higher priorities will be started and migrated before instance types with lower
- priorities. The value is an integer between 0 and 100. The higher the value, the higher the priority.
- - If no value is passed, default value is set by oVirt/RHV engine.
- watchdog:
- description:
- - "Assign watchdog device for the instance type."
- - "Watchdogs is a dictionary which can have following values:"
- - "C(model) - Model of the watchdog device. For example: I(i6300esb), I(diag288) or I(null)."
- - "C(action) - Watchdog action to be performed when watchdog is triggered. For example: I(none), I(reset), I(poweroff), I(pause) or I(dump)."
- host:
- description:
- - Specify host where Instance Type should be running. By default the host is chosen by engine scheduler.
- - This parameter is used only when C(state) is I(running) or I(present).
- graphical_console:
- description:
- - "Assign graphical console to the instance type."
- - "Graphical console is a dictionary which can have following values:"
- - "C(headless_mode) - If I(true) disable the graphics console for this instance type."
- - "C(protocol) - Graphical protocol, a list of I(spice), I(vnc), or both."
- description:
- description:
- - "Description of the instance type."
- cpu_mode:
- description:
- - "CPU mode of the instance type. It can be some of the following: I(host_passthrough), I(host_model) or I(custom)."
- - "For I(host_passthrough) CPU type you need to set C(placement_policy) to I(pinned)."
- - "If no value is passed, default value is set by oVirt/RHV engine."
- rng_device:
- description:
- - "Random number generator (RNG). You can choose of one the following devices I(urandom), I(random) or I(hwrng)."
- - "In order to select I(hwrng), you must have it enabled on cluster first."
- - "/dev/urandom is used for cluster version >= 4.1, and /dev/random for cluster version <= 4.0"
- rng_bytes:
- description:
- - "Number of bytes allowed to consume per period."
- rng_period:
- description:
- - "Duration of one period in milliseconds."
- placement_policy:
- description:
- - "The configuration of the instance type's placement policy."
- - "Placement policy can be one of the following values:"
- - "C(migratable) - Allow manual and automatic migration."
- - "C(pinned) - Do not allow migration."
- - "C(user_migratable) - Allow manual migration only."
- - "If no value is passed, default value is set by oVirt/RHV engine."
- cpu_pinning:
- description:
- - "CPU Pinning topology to map instance type CPU to host CPU."
- - "CPU Pinning topology is a list of dictionary which can have following values:"
- - "C(cpu) - Number of the host CPU."
- - "C(vcpu) - Number of the instance type CPU."
- soundcard_enabled:
- description:
- - "If I(true), the sound card is added to the instance type."
- type: bool
- smartcard_enabled:
- description:
- - "If I(true), use smart card authentication."
- type: bool
- virtio_scsi:
- description:
- - "If I(true), virtio scsi will be enabled."
- type: bool
- io_threads:
- description:
- - "Number of IO threads used by instance type. I(0) means IO threading disabled."
- ballooning_enabled:
- description:
- - "If I(true), use memory ballooning."
- - "Memory balloon is a guest device, which may be used to re-distribute / reclaim the host memory
- based on instance type needs in a dynamic way. In this way it's possible to create memory over commitment states."
- type: bool
-extends_documentation_fragment: ovirt
-'''
-
-EXAMPLES = '''
-# Examples don't contain auth parameter for simplicity,
-# look at ovirt_auth module to see how to reuse authentication:
-
-# Create instance type
-- name: Create instance type
- ovirt_instance_type:
- state: present
- name: myit
- rng_device: hwrng
- rng_bytes: 200
- rng_period: 200
- soundcard_enabled: true
- virtio_scsi: true
- boot_devices:
- - network
-
-# Remove instance type
-- ovirt_instance_type:
- state: absent
- name: myit
-
-
-# Create instance type with predefined memory and cpu limits.
-- ovirt_instance_type:
- state: present
- name: myit
- memory: 2GiB
- cpu_cores: 2
- cpu_sockets: 2
- nics:
- - name: nic1
-
-# Enable usb support and serial console
-- ovirt_instance_type:
- name: myit
- usb_support: True
- serial_console: True
-
-# Use graphical console with spice and vnc
-- name: Create a instance type that has the console configured for both Spice and VNC
- ovirt_instance_type:
- name: myit
- graphical_console:
- protocol:
- - spice
- - vnc
-'''
-
-
-RETURN = '''
-
-id:
- description: ID of the instance type which is managed
- returned: On success if instance type is found.
- type: str
- sample: 7de90f31-222c-436c-a1ca-7e655bd5b60c
-instancetype:
- description: "Dictionary of all the instance type attributes. instance type attributes can be found on your oVirt/RHV instance
- at following url: http://ovirt.github.io/ovirt-engine-api-model/master/#types/instance_type."
- returned: On success if instance type is found.
- type: dict
-'''
-
-from ansible.module_utils.basic import AnsibleModule
-import traceback
-
-from ansible.module_utils.ovirt import (
- BaseModule,
- check_params,
- check_sdk,
- convert_to_bytes,
- create_connection,
- equal,
- get_dict_of_struct,
- get_entity,
- get_link_name,
- get_id_by_name,
- ovirt_full_argument_spec,
- search_by_attributes,
- search_by_name,
- wait,
-)
-
-try:
- import ovirtsdk4.types as otypes
-except ImportError:
- pass
-
-
-class InstanceTypeModule(BaseModule):
- def build_entity(self):
- return otypes.InstanceType(
- id=self.param('id'),
- name=self.param('name'),
- console=(
- otypes.Console(enabled=self.param('serial_console'))
- ) if self.param('serial_console') is not None else None,
- usb=(
- otypes.Usb(enabled=self.param('usb_support'))
- ) if self.param('usb_support') is not None else None,
- high_availability=otypes.HighAvailability(
- enabled=self.param('high_availability'),
- priority=self.param('high_availability_priority'),
- ) if self.param('high_availability') is not None or self.param('high_availability_priority') else None,
- cpu=otypes.Cpu(
- topology=otypes.CpuTopology(
- cores=self.param('cpu_cores'),
- sockets=self.param('cpu_sockets'),
- threads=self.param('cpu_threads'),
- ) if any((
- self.param('cpu_cores'),
- self.param('cpu_sockets'),
- self.param('cpu_threads')
- )) else None,
- cpu_tune=otypes.CpuTune(
- vcpu_pins=[
- otypes.VcpuPin(vcpu=int(pin['vcpu']), cpu_set=str(pin['cpu'])) for pin in self.param('cpu_pinning')
- ],
- ) if self.param('cpu_pinning') else None,
- mode=otypes.CpuMode(self.param('cpu_mode')) if self.param(
- 'cpu_mode') else None,
- ) if any((
- self.param('cpu_cores'),
- self.param('cpu_sockets'),
- self.param('cpu_threads'),
- self.param('cpu_mode'),
- self.param('cpu_pinning')
- )) else None,
- os=otypes.OperatingSystem(
- type=self.param('operating_system'),
- boot=otypes.Boot(
- devices=[
- otypes.BootDevice(dev) for dev in self.param('boot_devices')
- ],
- ) if self.param('boot_devices') else None
- ),
- rng_device=otypes.RngDevice(
- source=otypes.RngSource(self.param('rng_device')),
- rate=otypes.Rate(
- bytes=self.param('rng_bytes'),
- period=self.param('rng_period')
- )
- ) if self.param('rng_device') else None,
- memory=convert_to_bytes(
- self.param('memory')
- ) if self.param('memory') else None,
- virtio_scsi=otypes.VirtioScsi(
- enabled=self.param('virtio_scsi')
- ) if self.param('virtio_scsi') else None,
- memory_policy=otypes.MemoryPolicy(
- guaranteed=convert_to_bytes(self.param('memory_guaranteed')),
- ballooning=self.param('ballooning_enabled'),
- max=convert_to_bytes(self.param('memory_max')),
- ) if any((
- self.param('memory_guaranteed'),
- self.param('ballooning_enabled') is not None,
- self.param('memory_max')
- )) else None,
- description=self.param('description'),
- placement_policy=otypes.VmPlacementPolicy(
- affinity=otypes.VmAffinity(self.param('placement_policy')),
- hosts=[
- otypes.Host(name=self.param('host')),
- ] if self.param('host') else None,
- ) if self.param('placement_policy') else None,
- soundcard_enabled=self.param('soundcard_enabled'),
- display=otypes.Display(
- smartcard_enabled=self.param('smartcard_enabled')
- ) if self.param('smartcard_enabled') is not None else None,
- io=otypes.Io(
- threads=self.param('io_threads'),
- ) if self.param('io_threads') is not None else None,
- )
-
- def __attach_watchdog(self, entity):
- watchdogs_service = self._service.service(entity.id).watchdogs_service()
- watchdog = self.param('watchdog')
- if watchdog is not None:
- current_watchdog = next(iter(watchdogs_service.list()), None)
- if watchdog.get('model') is None and current_watchdog:
- watchdogs_service.watchdog_service(current_watchdog.id).remove()
- return True
- elif watchdog.get('model') is not None and current_watchdog is None:
- watchdogs_service.add(
- otypes.Watchdog(
- model=otypes.WatchdogModel(watchdog.get('model').lower()),
- action=otypes.WatchdogAction(watchdog.get('action')),
- )
- )
- return True
- elif current_watchdog is not None:
- if (
- str(current_watchdog.model).lower() != watchdog.get('model').lower() or
- str(current_watchdog.action).lower() != watchdog.get('action').lower()
- ):
- watchdogs_service.watchdog_service(current_watchdog.id).update(
- otypes.Watchdog(
- model=otypes.WatchdogModel(watchdog.get('model')),
- action=otypes.WatchdogAction(watchdog.get('action')),
- )
- )
- return True
- return False
-
- def __get_vnic_profile_id(self, nic):
- """
- Return VNIC profile ID looked up by it's name, because there can be
- more VNIC profiles with same name, other criteria of filter is cluster.
- """
- vnics_service = self._connection.system_service().vnic_profiles_service()
- clusters_service = self._connection.system_service().clusters_service()
- cluster = search_by_name(clusters_service, self.param('cluster'))
- profiles = [
- profile for profile in vnics_service.list()
- if profile.name == nic.get('profile_name')
- ]
- cluster_networks = [
- net.id for net in self._connection.follow_link(cluster.networks)
- ]
- try:
- return next(
- profile.id for profile in profiles
- if profile.network.id in cluster_networks
- )
- except StopIteration:
- raise Exception(
- "Profile '%s' was not found in cluster '%s'" % (
- nic.get('profile_name'),
- self.param('cluster')
- )
- )
-
- def __attach_nics(self, entity):
- # Attach NICs to instance type, if specified:
- nics_service = self._service.service(entity.id).nics_service()
- for nic in self.param('nics'):
- if search_by_name(nics_service, nic.get('name')) is None:
- if not self._module.check_mode:
- nics_service.add(
- otypes.Nic(
- name=nic.get('name'),
- interface=otypes.NicInterface(
- nic.get('interface', 'virtio')
- ),
- vnic_profile=otypes.VnicProfile(
- id=self.__get_vnic_profile_id(nic),
- ) if nic.get('profile_name') else None,
- mac=otypes.Mac(
- address=nic.get('mac_address')
- ) if nic.get('mac_address') else None,
- )
- )
- self.changed = True
-
- def __attach_graphical_console(self, entity):
- graphical_console = self.param('graphical_console')
- if not graphical_console:
- return False
-
- it_service = self._service.instance_type_service(entity.id)
- gcs_service = it_service.graphics_consoles_service()
- graphical_consoles = gcs_service.list()
- # Remove all graphical consoles if there are any:
- if bool(graphical_console.get('headless_mode')):
- if not self._module.check_mode:
- for gc in graphical_consoles:
- gcs_service.console_service(gc.id).remove()
- return len(graphical_consoles) > 0
-
- # If there are not gc add any gc to be added:
- protocol = graphical_console.get('protocol')
- if isinstance(protocol, str):
- protocol = [protocol]
-
- current_protocols = [str(gc.protocol) for gc in graphical_consoles]
- if not current_protocols:
- if not self._module.check_mode:
- for p in protocol:
- gcs_service.add(
- otypes.GraphicsConsole(
- protocol=otypes.GraphicsType(p),
- )
- )
- return True
-
- # Update consoles:
- if sorted(protocol) != sorted(current_protocols):
- if not self._module.check_mode:
- for gc in graphical_consoles:
- gcs_service.console_service(gc.id).remove()
- for p in protocol:
- gcs_service.add(
- otypes.GraphicsConsole(
- protocol=otypes.GraphicsType(p),
- )
- )
- return True
-
- def post_update(self, entity):
- self.post_present(entity.id)
-
- def post_present(self, entity_id):
- entity = self._service.service(entity_id).get()
- self.changed = self.__attach_nics(entity)
- self.changed = self.__attach_watchdog(entity)
- self.changed = self.__attach_graphical_console(entity)
-
- def update_check(self, entity):
- cpu_mode = getattr(entity.cpu, 'mode')
- it_display = entity.display
- return (
- not self.param('kernel_params_persist') and
- equal(convert_to_bytes(self.param('memory_guaranteed')), entity.memory_policy.guaranteed) and
- equal(convert_to_bytes(self.param('memory_max')), entity.memory_policy.max) and
- equal(self.param('cpu_cores'), entity.cpu.topology.cores) and
- equal(self.param('cpu_sockets'), entity.cpu.topology.sockets) and
- equal(self.param('cpu_threads'), entity.cpu.topology.threads) and
- equal(self.param('cpu_mode'), str(cpu_mode) if cpu_mode else None) and
- equal(self.param('type'), str(entity.type)) and
- equal(self.param('name'), str(entity.name)) and
- equal(self.param('operating_system'), str(entity.os.type)) and
- equal(self.param('soundcard_enabled'), entity.soundcard_enabled) and
- equal(self.param('smartcard_enabled'), getattr(it_display, 'smartcard_enabled', False)) and
- equal(self.param('io_threads'), entity.io.threads) and
- equal(self.param('ballooning_enabled'), entity.memory_policy.ballooning) and
- equal(self.param('serial_console'), getattr(entity.console, 'enabled', None)) and
- equal(self.param('usb_support'), entity.usb.enabled) and
- equal(self.param('virtio_scsi'), getattr(entity, 'smartcard_enabled', False)) and
- equal(self.param('high_availability'), entity.high_availability.enabled) and
- equal(self.param('high_availability_priority'), entity.high_availability.priority) and
- equal(self.param('boot_devices'), [str(dev) for dev in getattr(entity.os.boot, 'devices', [])]) and
- equal(self.param('description'), entity.description) and
- equal(self.param('rng_device'), str(entity.rng_device.source) if entity.rng_device else None) and
- equal(self.param('rng_bytes'), entity.rng_device.rate.bytes if entity.rng_device else None) and
- equal(self.param('rng_period'), entity.rng_device.rate.period if entity.rng_device else None) and
- equal(self.param('placement_policy'), str(entity.placement_policy.affinity) if entity.placement_policy else None)
- )
-
-
-def main():
- argument_spec = ovirt_full_argument_spec(
- state=dict(type='str', default='present',
- choices=['absent', 'present']),
- name=dict(type='str'),
- id=dict(type='str'),
- memory=dict(type='str'),
- memory_guaranteed=dict(type='str'),
- memory_max=dict(type='str'),
- cpu_sockets=dict(type='int'),
- cpu_cores=dict(type='int'),
- cpu_threads=dict(type='int'),
- operating_system=dict(type='str'),
- boot_devices=dict(type='list', choices=['cdrom', 'hd', 'network']),
- serial_console=dict(type='bool'),
- usb_support=dict(type='bool'),
- high_availability=dict(type='bool'),
- high_availability_priority=dict(type='int'),
- watchdog=dict(type='dict'),
- host=dict(type='str'),
- graphical_console=dict(type='dict'),
- description=dict(type='str'),
- cpu_mode=dict(type='str'),
- rng_device=dict(type='str'),
- rng_bytes=dict(type='int', default=None),
- rng_period=dict(type='int', default=None),
- placement_policy=dict(type='str'),
- cpu_pinning=dict(type='list'),
- soundcard_enabled=dict(type='bool', default=None),
- virtio_scsi=dict(type='bool', default=None),
- smartcard_enabled=dict(type='bool', default=None),
- io_threads=dict(type='int', default=None),
- nics=dict(type='list', default=[]),
- ballooning_enabled=dict(type='bool', default=None),
- )
- module = AnsibleModule(
- argument_spec=argument_spec,
- supports_check_mode=True,
- required_one_of=[['id', 'name']],
- )
-
- check_sdk(module)
- check_params(module)
-
- try:
- state = module.params['state']
- auth = module.params.pop('auth')
- connection = create_connection(auth)
- its_service = connection.system_service().instance_types_service()
- its_module = InstanceTypeModule(
- connection=connection,
- module=module,
- service=its_service,
- )
- it = its_module.search_entity()
-
- if state == 'present':
- ret = its_module.create(
- entity=it
- )
- its_module.post_present(ret['id'])
- ret['changed'] = its_module.changed
- elif state == 'absent':
- ret = its_module.remove()
- module.exit_json(**ret)
- except Exception as e:
- module.fail_json(msg=str(e), exception=traceback.format_exc())
- finally:
- connection.close(logout=auth.get('token') is None)
-
-
-if __name__ == "__main__":
- main()