diff options
Diffstat (limited to 'lib/ansible/modules/cloud/ovirt/ovirt_cluster.py')
-rw-r--r-- | lib/ansible/modules/cloud/ovirt/ovirt_cluster.py | 745 |
1 files changed, 0 insertions, 745 deletions
diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_cluster.py b/lib/ansible/modules/cloud/ovirt/ovirt_cluster.py deleted file mode 100644 index dc15c61604..0000000000 --- a/lib/ansible/modules/cloud/ovirt/ovirt_cluster.py +++ /dev/null @@ -1,745 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2016 Red Hat, Inc. -# 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_cluster -short_description: Module to manage clusters in oVirt/RHV -version_added: "2.3" -author: "Ondra Machacek (@machacekondra)" -description: - - "Module to manage clusters in oVirt/RHV" -options: - id: - description: - - "ID of the cluster to manage." - version_added: "2.8" - name: - description: - - "Name of the cluster to manage." - required: true - state: - description: - - "Should the cluster be present or absent." - choices: ['present', 'absent'] - default: present - data_center: - description: - - "Datacenter name where cluster reside." - description: - description: - - "Description of the cluster." - comment: - description: - - "Comment of the cluster." - network: - description: - - "Management network of cluster to access cluster hosts." - ballooning: - description: - - "If I(True) enable memory balloon optimization. Memory balloon is used to - re-distribute / reclaim the host memory based on VM needs - in a dynamic way." - type: bool - virt: - description: - - "If I(True), hosts in this cluster will be used to run virtual machines." - type: bool - gluster: - description: - - "If I(True), hosts in this cluster will be used as Gluster Storage - server nodes, and not for running virtual machines." - - "By default the cluster is created for virtual machine hosts." - type: bool - threads_as_cores: - description: - - "If I(True) the exposed host threads would be treated as cores - which can be utilized by virtual machines." - type: bool - ksm: - description: - - "I I(True) MoM enables to run Kernel Same-page Merging I(KSM) when - necessary and when it can yield a memory saving benefit that - outweighs its CPU cost." - type: bool - ksm_numa: - description: - - "If I(True) enables KSM C(ksm) for best performance inside NUMA nodes." - type: bool - ha_reservation: - description: - - "If I(True) enables the oVirt/RHV to monitor cluster capacity for highly - available virtual machines." - type: bool - trusted_service: - description: - - "If I(True) enables integration with an OpenAttestation server." - type: bool - vm_reason: - description: - - "If I(True) enables an optional reason field when a virtual machine - is shut down from the Manager, allowing the administrator to - provide an explanation for the maintenance." - type: bool - host_reason: - description: - - "If I(True) enables an optional reason field when a host is placed - into maintenance mode from the Manager, allowing the administrator - to provide an explanation for the maintenance." - type: bool - memory_policy: - description: - - "I(disabled) - Disables memory page sharing." - - "I(server) - Sets the memory page sharing threshold to 150% of the system memory on each host." - - "I(desktop) - Sets the memory page sharing threshold to 200% of the system memory on each host." - choices: ['disabled', 'server', 'desktop'] - rng_sources: - description: - - "List that specify the random number generator devices that all hosts in the cluster will use." - - "Supported generators are: I(hwrng) and I(random)." - spice_proxy: - description: - - "The proxy by which the SPICE client will connect to virtual machines." - - "The address must be in the following format: I(protocol://[host]:[port])" - fence_enabled: - description: - - "If I(True) enables fencing on the cluster." - - "Fencing is enabled by default." - type: bool - fence_skip_if_gluster_bricks_up: - description: - - "A flag indicating if fencing should be skipped if Gluster bricks are up and running in the host being fenced." - - "This flag is optional, and the default value is `false`." - type: bool - version_added: "2.8" - fence_skip_if_gluster_quorum_not_met: - description: - - "A flag indicating if fencing should be skipped if Gluster bricks are up and running and Gluster quorum will not - be met without those bricks." - - "This flag is optional, and the default value is `false`." - type: bool - version_added: "2.8" - fence_skip_if_sd_active: - description: - - "If I(True) any hosts in the cluster that are Non Responsive - and still connected to storage will not be fenced." - type: bool - fence_skip_if_connectivity_broken: - description: - - "If I(True) fencing will be temporarily disabled if the percentage - of hosts in the cluster that are experiencing connectivity issues - is greater than or equal to the defined threshold." - - "The threshold can be specified by C(fence_connectivity_threshold)." - type: bool - fence_connectivity_threshold: - description: - - "The threshold used by C(fence_skip_if_connectivity_broken)." - resilience_policy: - description: - - "The resilience policy defines how the virtual machines are prioritized in the migration." - - "Following values are supported:" - - "C(do_not_migrate) - Prevents virtual machines from being migrated. " - - "C(migrate) - Migrates all virtual machines in order of their defined priority." - - "C(migrate_highly_available) - Migrates only highly available virtual machines to prevent overloading other hosts." - choices: ['do_not_migrate', 'migrate', 'migrate_highly_available'] - migration_bandwidth: - description: - - "The bandwidth settings define the maximum bandwidth of both outgoing and incoming migrations per host." - - "Following bandwidth options are supported:" - - "C(auto) - Bandwidth is copied from the I(rate limit) [Mbps] setting in the data center host network QoS." - - "C(hypervisor_default) - Bandwidth is controlled by local VDSM setting on sending host." - - "C(custom) - Defined by user (in Mbps)." - choices: ['auto', 'hypervisor_default', 'custom'] - migration_bandwidth_limit: - description: - - "Set the I(custom) migration bandwidth limit." - - "This parameter is used only when C(migration_bandwidth) is I(custom)." - migration_auto_converge: - description: - - "If I(True) auto-convergence is used during live migration of virtual machines." - - "Used only when C(migration_policy) is set to I(legacy)." - - "Following options are supported:" - - "C(true) - Override the global setting to I(true)." - - "C(false) - Override the global setting to I(false)." - - "C(inherit) - Use value which is set globally." - choices: ['true', 'false', 'inherit'] - migration_compressed: - description: - - "If I(True) compression is used during live migration of the virtual machine." - - "Used only when C(migration_policy) is set to I(legacy)." - - "Following options are supported:" - - "C(true) - Override the global setting to I(true)." - - "C(false) - Override the global setting to I(false)." - - "C(inherit) - Use value which is set globally." - choices: ['true', 'false', 'inherit'] - migration_policy: - description: - - "A migration policy defines the conditions for live migrating - virtual machines in the event of host failure." - - "Following policies are supported:" - - "C(legacy) - Legacy behavior of 3.6 version." - - "C(minimal_downtime) - Virtual machines should not experience any significant downtime." - - "C(suspend_workload) - Virtual machines may experience a more significant downtime." - - "C(post_copy) - Virtual machines should not experience any significant downtime. - If the VM migration is not converging for a long time, the migration will be switched to post-copy. - Added in version I(2.4)." - choices: ['legacy', 'minimal_downtime', 'suspend_workload', 'post_copy'] - serial_policy: - description: - - "Specify a serial number policy for the virtual machines in the cluster." - - "Following options are supported:" - - "C(vm) - Sets the virtual machine's UUID as its serial number." - - "C(host) - Sets the host's UUID as the virtual machine's serial number." - - "C(custom) - Allows you to specify a custom serial number in C(serial_policy_value)." - serial_policy_value: - description: - - "Allows you to specify a custom serial number." - - "This parameter is used only when C(serial_policy) is I(custom)." - scheduling_policy: - description: - - "Name of the scheduling policy to be used for cluster." - scheduling_policy_properties: - description: - - "Custom scheduling policy properties of the cluster." - - "These optional properties override the properties of the - scheduling policy specified by the C(scheduling_policy) parameter." - version_added: "2.6" - cpu_arch: - description: - - "CPU architecture of cluster." - choices: ['x86_64', 'ppc64', 'undefined'] - cpu_type: - description: - - "CPU codename. For example I(Intel SandyBridge Family)." - switch_type: - description: - - "Type of switch to be used by all networks in given cluster. - Either I(legacy) which is using linux bridge or I(ovs) using - Open vSwitch." - choices: ['legacy', 'ovs'] - compatibility_version: - description: - - "The compatibility version of the cluster. All hosts in this - cluster must support at least this compatibility version." - mac_pool: - description: - - "MAC pool to be used by this cluster." - - "C(Note:)" - - "This is supported since oVirt version 4.1." - version_added: 2.4 - external_network_providers: - description: - - "List of references to the external network providers available - in the cluster. If the automatic deployment of the external - network provider is supported, the networks of the referenced - network provider are available on every host in the cluster." - - "This is supported since oVirt version 4.2." - suboptions: - name: - description: - - Name of the external network provider. Either C(name) or C(id) is required. - id: - description: - - ID of the external network provider. Either C(name) or C(id) is required. - version_added: 2.5 - firewall_type: - description: - - "The type of firewall to be used on hosts in this cluster." - - "Up to version 4.1, it was always I(iptables). Since version 4.2, you can choose between I(iptables) and I(firewalld). - For clusters with a compatibility version of 4.2 and higher, the default firewall type is I(firewalld)." - type: str - version_added: 2.8 - choices: ['firewalld', 'iptables'] - gluster_tuned_profile: - description: - - "The name of the U(https://fedorahosted.org/tuned) to set on all the hosts in the cluster. This is not mandatory - and relevant only for clusters with Gluster service." - - "Could be for example I(virtual-host), I(rhgs-sequential-io), I(rhgs-random-io)" - version_added: 2.8 - type: str -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 cluster -- ovirt_cluster: - data_center: mydatacenter - name: mycluster - cpu_type: Intel SandyBridge Family - description: mycluster - compatibility_version: 4.0 - -# Create virt service cluster: -- ovirt_cluster: - data_center: mydatacenter - name: mycluster - cpu_type: Intel Nehalem Family - description: mycluster - switch_type: legacy - compatibility_version: 4.0 - ballooning: true - gluster: false - threads_as_cores: true - ha_reservation: true - trusted_service: false - host_reason: false - vm_reason: true - ksm_numa: true - memory_policy: server - rng_sources: - - hwrng - - random - -# Create cluster with default network provider -- ovirt_cluster: - name: mycluster - data_center: Default - cpu_type: Intel SandyBridge Family - external_network_providers: - - name: ovirt-provider-ovn - -# Remove cluster -- ovirt_cluster: - state: absent - name: mycluster - -# Change cluster Name -- ovirt_cluster: - id: 00000000-0000-0000-0000-000000000000 - name: "new_cluster_name" -''' - -RETURN = ''' -id: - description: ID of the cluster which is managed - returned: On success if cluster is found. - type: str - sample: 7de90f31-222c-436c-a1ca-7e655bd5b60c -cluster: - description: "Dictionary of all the cluster attributes. Cluster attributes can be found on your oVirt/RHV instance - at following url: http://ovirt.github.io/ovirt-engine-api-model/master/#types/cluster." - type: dict - returned: On success if cluster is found. -''' - -import traceback - -try: - import ovirtsdk4.types as otypes -except ImportError: - pass - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.ovirt import ( - BaseModule, - check_sdk, - create_connection, - equal, - ovirt_full_argument_spec, - search_by_name, - get_id_by_name, -) - - -class ClustersModule(BaseModule): - - def __get_major(self, full_version): - if full_version is None: - return None - if isinstance(full_version, otypes.Version): - return full_version.major - return int(full_version.split('.')[0]) - - def __get_minor(self, full_version): - if full_version is None: - return None - if isinstance(full_version, otypes.Version): - return full_version.minor - return int(full_version.split('.')[1]) - - def param(self, name, default=None): - return self._module.params.get(name, default) - - def _get_memory_policy(self): - memory_policy = self.param('memory_policy') - if memory_policy == 'desktop': - return 200 - elif memory_policy == 'server': - return 150 - elif memory_policy == 'disabled': - return 100 - - def _get_policy_id(self): - # These are hardcoded IDs, once there is API, please fix this. - # legacy - 00000000-0000-0000-0000-000000000000 - # minimal downtime - 80554327-0569-496b-bdeb-fcbbf52b827b - # suspend workload if needed - 80554327-0569-496b-bdeb-fcbbf52b827c - # post copy - a7aeedb2-8d66-4e51-bb22-32595027ce71 - migration_policy = self.param('migration_policy') - if migration_policy == 'legacy': - return '00000000-0000-0000-0000-000000000000' - elif migration_policy == 'minimal_downtime': - return '80554327-0569-496b-bdeb-fcbbf52b827b' - elif migration_policy == 'suspend_workload': - return '80554327-0569-496b-bdeb-fcbbf52b827c' - elif migration_policy == 'post_copy': - return 'a7aeedb2-8d66-4e51-bb22-32595027ce71' - - def _get_sched_policy(self): - sched_policy = None - if self.param('scheduling_policy'): - sched_policies_service = self._connection.system_service().scheduling_policies_service() - sched_policy = search_by_name(sched_policies_service, self.param('scheduling_policy')) - if not sched_policy: - raise Exception("Scheduling policy '%s' was not found" % self.param('scheduling_policy')) - - return sched_policy - - def _get_mac_pool(self): - mac_pool = None - if self._module.params.get('mac_pool'): - mac_pool = search_by_name( - self._connection.system_service().mac_pools_service(), - self._module.params.get('mac_pool'), - ) - - return mac_pool - - def _get_external_network_providers(self): - return self.param('external_network_providers') or [] - - def _get_external_network_provider_id(self, external_provider): - return external_provider.get('id') or get_id_by_name( - self._connection.system_service().openstack_network_providers_service(), - external_provider.get('name') - ) - - def _get_external_network_providers_entity(self): - if self.param('external_network_providers') is not None: - return [otypes.ExternalProvider(id=self._get_external_network_provider_id(external_provider)) - for external_provider in self.param('external_network_providers')] - - def build_entity(self): - sched_policy = self._get_sched_policy() - return otypes.Cluster( - id=self.param('id'), - name=self.param('name'), - comment=self.param('comment'), - description=self.param('description'), - ballooning_enabled=self.param('ballooning'), - gluster_service=self.param('gluster'), - virt_service=self.param('virt'), - threads_as_cores=self.param('threads_as_cores'), - ha_reservation=self.param('ha_reservation'), - trusted_service=self.param('trusted_service'), - optional_reason=self.param('vm_reason'), - maintenance_reason_required=self.param('host_reason'), - scheduling_policy=otypes.SchedulingPolicy( - id=sched_policy.id, - ) if sched_policy else None, - serial_number=otypes.SerialNumber( - policy=otypes.SerialNumberPolicy(self.param('serial_policy')), - value=self.param('serial_policy_value'), - ) if ( - self.param('serial_policy') is not None or - self.param('serial_policy_value') is not None - ) else None, - migration=otypes.MigrationOptions( - auto_converge=otypes.InheritableBoolean( - self.param('migration_auto_converge'), - ) if self.param('migration_auto_converge') else None, - bandwidth=otypes.MigrationBandwidth( - assignment_method=otypes.MigrationBandwidthAssignmentMethod( - self.param('migration_bandwidth'), - ) if self.param('migration_bandwidth') else None, - custom_value=self.param('migration_bandwidth_limit'), - ) if ( - self.param('migration_bandwidth') or - self.param('migration_bandwidth_limit') - ) else None, - compressed=otypes.InheritableBoolean( - self.param('migration_compressed'), - ) if self.param('migration_compressed') else None, - policy=otypes.MigrationPolicy( - id=self._get_policy_id() - ) if self.param('migration_policy') else None, - ) if ( - self.param('migration_bandwidth') is not None or - self.param('migration_bandwidth_limit') is not None or - self.param('migration_auto_converge') is not None or - self.param('migration_compressed') is not None or - self.param('migration_policy') is not None - ) else None, - error_handling=otypes.ErrorHandling( - on_error=otypes.MigrateOnError( - self.param('resilience_policy') - ), - ) if self.param('resilience_policy') else None, - fencing_policy=otypes.FencingPolicy( - enabled=self.param('fence_enabled'), - skip_if_gluster_bricks_up=self.param('fence_skip_if_gluster_bricks_up'), - skip_if_gluster_quorum_not_met=self.param('fence_skip_if_gluster_quorum_not_met'), - skip_if_connectivity_broken=otypes.SkipIfConnectivityBroken( - enabled=self.param('fence_skip_if_connectivity_broken'), - threshold=self.param('fence_connectivity_threshold'), - ) if ( - self.param('fence_skip_if_connectivity_broken') is not None or - self.param('fence_connectivity_threshold') is not None - ) else None, - skip_if_sd_active=otypes.SkipIfSdActive( - enabled=self.param('fence_skip_if_sd_active'), - ) if self.param('fence_skip_if_sd_active') is not None else None, - ) if ( - self.param('fence_enabled') is not None or - self.param('fence_skip_if_sd_active') is not None or - self.param('fence_skip_if_connectivity_broken') is not None or - self.param('fence_skip_if_gluster_bricks_up') is not None or - self.param('fence_skip_if_gluster_quorum_not_met') is not None or - self.param('fence_connectivity_threshold') is not None - ) else None, - display=otypes.Display( - proxy=self.param('spice_proxy'), - ) if self.param('spice_proxy') else None, - required_rng_sources=[ - otypes.RngSource(rng) for rng in self.param('rng_sources') - ] if self.param('rng_sources') else None, - memory_policy=otypes.MemoryPolicy( - over_commit=otypes.MemoryOverCommit( - percent=self._get_memory_policy(), - ), - ) if self.param('memory_policy') else None, - ksm=otypes.Ksm( - enabled=self.param('ksm'), - merge_across_nodes=not self.param('ksm_numa'), - ) if ( - self.param('ksm_numa') is not None or - self.param('ksm') is not None - ) else None, - data_center=otypes.DataCenter( - name=self.param('data_center'), - ) if self.param('data_center') else None, - management_network=otypes.Network( - name=self.param('network'), - ) if self.param('network') else None, - cpu=otypes.Cpu( - architecture=otypes.Architecture( - self.param('cpu_arch') - ) if self.param('cpu_arch') else None, - type=self.param('cpu_type'), - ) if ( - self.param('cpu_arch') or self.param('cpu_type') - ) else None, - version=otypes.Version( - major=self.__get_major(self.param('compatibility_version')), - minor=self.__get_minor(self.param('compatibility_version')), - ) if self.param('compatibility_version') else None, - switch_type=otypes.SwitchType( - self.param('switch_type') - ) if self.param('switch_type') else None, - mac_pool=otypes.MacPool( - id=get_id_by_name(self._connection.system_service().mac_pools_service(), self.param('mac_pool')) - ) if self.param('mac_pool') else None, - external_network_providers=self._get_external_network_providers_entity(), - custom_scheduling_policy_properties=[ - otypes.Property( - name=sp.get('name'), - value=str(sp.get('value')), - ) for sp in self.param('scheduling_policy_properties') if sp - ] if self.param('scheduling_policy_properties') is not None else None, - firewall_type=otypes.FirewallType( - self.param('firewall_type') - ) if self.param('firewall_type') else None, - gluster_tuned_profile=self.param('gluster_tuned_profile'), - ) - - def _matches_entity(self, item, entity): - return equal(item.get('id'), entity.id) and equal(item.get('name'), entity.name) - - def _update_check_external_network_providers(self, entity): - if self.param('external_network_providers') is None: - return True - if entity.external_network_providers is None: - return not self.param('external_network_providers') - entity_providers = self._connection.follow_link(entity.external_network_providers) - entity_provider_ids = [provider.id for provider in entity_providers] - entity_provider_names = [provider.name for provider in entity_providers] - for provider in self._get_external_network_providers(): - if provider.get('id'): - if provider.get('id') not in entity_provider_ids: - return False - elif provider.get('name') and provider.get('name') not in entity_provider_names: - return False - for entity_provider in entity_providers: - if not any([self._matches_entity(provider, entity_provider) - for provider in self._get_external_network_providers()]): - return False - return True - - def update_check(self, entity): - sched_policy = self._get_sched_policy() - migration_policy = getattr(entity.migration, 'policy', None) - cluster_cpu = getattr(entity, 'cpu', dict()) - - def check_custom_scheduling_policy_properties(): - if self.param('scheduling_policy_properties'): - current = [] - if entity.custom_scheduling_policy_properties: - current = [(sp.name, str(sp.value)) for sp in entity.custom_scheduling_policy_properties] - passed = [(sp.get('name'), str(sp.get('value'))) for sp in self.param('scheduling_policy_properties') if sp] - for p in passed: - if p not in current: - return False - return True - - return ( - check_custom_scheduling_policy_properties() and - equal(self.param('name'), entity.name) and - equal(self.param('comment'), entity.comment) and - equal(self.param('description'), entity.description) and - equal(self.param('switch_type'), str(entity.switch_type)) and - equal(self.param('cpu_arch'), str(getattr(cluster_cpu, 'architecture', None))) and - equal(self.param('cpu_type'), getattr(cluster_cpu, 'type', None)) and - equal(self.param('ballooning'), entity.ballooning_enabled) and - equal(self.param('gluster'), entity.gluster_service) and - equal(self.param('virt'), entity.virt_service) and - equal(self.param('threads_as_cores'), entity.threads_as_cores) and - equal(self.param('ksm_numa'), not entity.ksm.merge_across_nodes) and - equal(self.param('ksm'), entity.ksm.enabled) and - equal(self.param('ha_reservation'), entity.ha_reservation) and - equal(self.param('trusted_service'), entity.trusted_service) and - equal(self.param('host_reason'), entity.maintenance_reason_required) and - equal(self.param('vm_reason'), entity.optional_reason) and - equal(self.param('spice_proxy'), getattr(entity.display, 'proxy', None)) and - equal(self.param('fence_enabled'), entity.fencing_policy.enabled) and - equal(self.param('fence_skip_if_gluster_bricks_up'), entity.fencing_policy.skip_if_gluster_bricks_up) and - equal(self.param('fence_skip_if_gluster_quorum_not_met'), entity.fencing_policy.skip_if_gluster_quorum_not_met) and - equal(self.param('fence_skip_if_sd_active'), entity.fencing_policy.skip_if_sd_active.enabled) and - equal(self.param('fence_skip_if_connectivity_broken'), entity.fencing_policy.skip_if_connectivity_broken.enabled) and - equal(self.param('fence_connectivity_threshold'), entity.fencing_policy.skip_if_connectivity_broken.threshold) and - equal(self.param('resilience_policy'), str(entity.error_handling.on_error)) and - equal(self.param('migration_bandwidth'), str(entity.migration.bandwidth.assignment_method)) and - equal(self.param('migration_auto_converge'), str(entity.migration.auto_converge)) and - equal(self.param('migration_compressed'), str(entity.migration.compressed)) and - equal(self.param('serial_policy'), str(getattr(entity.serial_number, 'policy', None))) and - equal(self.param('serial_policy_value'), getattr(entity.serial_number, 'value', None)) and - equal(self.param('scheduling_policy'), getattr(self._connection.follow_link(entity.scheduling_policy), 'name', None)) and - equal(self.param('firewall_type'), str(entity.firewall_type)) and - equal(self.param('gluster_tuned_profile'), getattr(entity, 'gluster_tuned_profile', None)) and - equal(self._get_policy_id(), getattr(migration_policy, 'id', None)) and - equal(self._get_memory_policy(), entity.memory_policy.over_commit.percent) and - equal(self.__get_minor(self.param('compatibility_version')), self.__get_minor(entity.version)) and - equal(self.__get_major(self.param('compatibility_version')), self.__get_major(entity.version)) and - equal( - self.param('migration_bandwidth_limit') if self.param('migration_bandwidth') == 'custom' else None, - entity.migration.bandwidth.custom_value - ) and - equal( - sorted(self.param('rng_sources')) if self.param('rng_sources') else None, - sorted([ - str(source) for source in entity.required_rng_sources - ]) - ) and - equal( - get_id_by_name(self._connection.system_service().mac_pools_service(), self.param('mac_pool'), raise_error=False), - entity.mac_pool.id - ) and - self._update_check_external_network_providers(entity) - ) - - -def main(): - argument_spec = ovirt_full_argument_spec( - state=dict( - choices=['present', 'absent'], - default='present', - ), - name=dict(default=None, required=True), - id=dict(default=None), - ballooning=dict(default=None, type='bool', aliases=['balloon']), - gluster=dict(default=None, type='bool'), - virt=dict(default=None, type='bool'), - threads_as_cores=dict(default=None, type='bool'), - ksm_numa=dict(default=None, type='bool'), - ksm=dict(default=None, type='bool'), - ha_reservation=dict(default=None, type='bool'), - trusted_service=dict(default=None, type='bool'), - vm_reason=dict(default=None, type='bool'), - host_reason=dict(default=None, type='bool'), - memory_policy=dict(default=None, choices=['disabled', 'server', 'desktop'], aliases=['performance_preset']), - rng_sources=dict(default=None, type='list'), - spice_proxy=dict(default=None), - fence_enabled=dict(default=None, type='bool'), - fence_skip_if_gluster_bricks_up=dict(default=None, type='bool'), - fence_skip_if_gluster_quorum_not_met=dict(default=None, type='bool'), - fence_skip_if_sd_active=dict(default=None, type='bool'), - fence_skip_if_connectivity_broken=dict(default=None, type='bool'), - fence_connectivity_threshold=dict(default=None, type='int'), - resilience_policy=dict(default=None, choices=['migrate_highly_available', 'migrate', 'do_not_migrate']), - migration_bandwidth=dict(default=None, choices=['auto', 'hypervisor_default', 'custom']), - migration_bandwidth_limit=dict(default=None, type='int'), - migration_auto_converge=dict(default=None, choices=['true', 'false', 'inherit']), - migration_compressed=dict(default=None, choices=['true', 'false', 'inherit']), - migration_policy=dict( - default=None, - choices=['legacy', 'minimal_downtime', 'suspend_workload', 'post_copy'] - ), - serial_policy=dict(default=None, choices=['vm', 'host', 'custom']), - serial_policy_value=dict(default=None), - scheduling_policy=dict(default=None), - data_center=dict(default=None), - description=dict(default=None), - comment=dict(default=None), - network=dict(default=None), - cpu_arch=dict(default=None, choices=['ppc64', 'undefined', 'x86_64']), - cpu_type=dict(default=None), - switch_type=dict(default=None, choices=['legacy', 'ovs']), - compatibility_version=dict(default=None), - mac_pool=dict(default=None), - external_network_providers=dict(default=None, type='list'), - scheduling_policy_properties=dict(type='list'), - firewall_type=dict(choices=['iptables', 'firewalld'], default=None), - gluster_tuned_profile=dict(default=None), - ) - module = AnsibleModule( - argument_spec=argument_spec, - supports_check_mode=True, - ) - - check_sdk(module) - - try: - auth = module.params.pop('auth') - connection = create_connection(auth) - clusters_service = connection.system_service().clusters_service() - clusters_module = ClustersModule( - connection=connection, - module=module, - service=clusters_service, - ) - - state = module.params['state'] - if state == 'present': - ret = clusters_module.create() - elif state == 'absent': - ret = clusters_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() |