From ccec2e294d48c5dc082fe3751888c57d763a31ae Mon Sep 17 00:00:00 2001 From: Mario Lenz Date: Fri, 13 Oct 2023 16:30:02 +0200 Subject: [PATCH] vmware_host_acceptance: Remove acceptance_level --- .../fragments/1872-vmware_host_acceptance.yml | 4 + meta/runtime.yml | 1 + plugins/modules/vmware_host_acceptance.py | 77 ++++--------- .../modules/vmware_host_acceptance_info.py | 107 ++++++++++++++++++ .../vmware_host_acceptance/tasks/main.yml | 41 ++++--- .../vmware_host_acceptance_info/aliases | 3 + .../tasks/main.yml | 22 ++++ tests/sanity/ignore-2.15.txt | 1 - tests/sanity/ignore-2.16.txt | 1 - 9 files changed, 184 insertions(+), 73 deletions(-) create mode 100644 changelogs/fragments/1872-vmware_host_acceptance.yml create mode 100644 plugins/modules/vmware_host_acceptance_info.py create mode 100644 tests/integration/targets/vmware_host_acceptance_info/aliases create mode 100644 tests/integration/targets/vmware_host_acceptance_info/tasks/main.yml diff --git a/changelogs/fragments/1872-vmware_host_acceptance.yml b/changelogs/fragments/1872-vmware_host_acceptance.yml new file mode 100644 index 0000000000..e6007f5549 --- /dev/null +++ b/changelogs/fragments/1872-vmware_host_acceptance.yml @@ -0,0 +1,4 @@ +breaking_changes: + - vmware_host_acceptance - Removed `acceptance_level` and used its options in `state`. This also means there will be no `state` `list` anymore. + In order to get information about the current acceptance level, use the new module `vmware_host_acceptance_info` + (https://github.com/ansible-collections/community.vmware/issues/1872). diff --git a/meta/runtime.yml b/meta/runtime.yml index 5c068a7202..53833f4f8d 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -87,6 +87,7 @@ action_groups: - vmware_guest_video - vmware_host - vmware_host_acceptance + - vmware_host_acceptance_info - vmware_host_active_directory - vmware_host_auto_start - vmware_host_capability_info diff --git a/plugins/modules/vmware_host_acceptance.py b/plugins/modules/vmware_host_acceptance.py index bbc989e02a..5f3f6f1056 100644 --- a/plugins/modules/vmware_host_acceptance.py +++ b/plugins/modules/vmware_host_acceptance.py @@ -33,22 +33,12 @@ type: str state: description: - - Set or list acceptance level of the given ESXi host. - - 'If set to C(list), then will return current acceptance level of given host system/s.' - - If set to C(present), then will set given acceptance level. - choices: [ list, present ] - required: false - default: 'list' - type: str - acceptance_level: - description: - - Name of acceptance level. - If set to C(partner), then accept only partner and VMware signed and certified VIBs. - If set to C(vmware_certified), then accept only VIBs that are signed and certified by VMware. - If set to C(vmware_accepted), then accept VIBs that have been accepted by VMware. - If set to C(community), then accept all VIBs, even those that are not signed. choices: [ community, partner, vmware_accepted, vmware_certified ] - required: false + required: true type: str extends_documentation_fragment: - community.vmware.vmware.documentation @@ -62,8 +52,7 @@ username: '{{ vcenter_username }}' password: '{{ vcenter_password }}' cluster_name: cluster_name - acceptance_level: 'community' - state: present + state: 'community' delegate_to: localhost register: cluster_acceptance_level @@ -73,18 +62,7 @@ username: '{{ vcenter_username }}' password: '{{ vcenter_password }}' esxi_hostname: '{{ esxi_hostname }}' - acceptance_level: 'vmware_accepted' - state: present - delegate_to: localhost - register: host_acceptance_level - -- name: Get acceptance level from the given ESXi Host - community.vmware.vmware_host_acceptance: - hostname: '{{ vcenter_hostname }}' - username: '{{ vcenter_username }}' - password: '{{ vcenter_password }}' - esxi_hostname: '{{ esxi_hostname }}' - state: list + state: 'vmware_accepted' delegate_to: localhost register: host_acceptance_level ''' @@ -115,9 +93,9 @@ def __init__(self, module): self.hosts = self.get_all_host_objs(cluster_name=cluster_name, esxi_host_name=esxi_host_name) self.desired_state = self.params.get('state') self.hosts_facts = {} - self.acceptance_level = self.params.get('acceptance_level') - def gather_acceptance_facts(self): + def set_acceptance_level(self): + change = [] for host in self.hosts: self.hosts_facts[host.name] = dict(level='', error='NA') host_image_config_mgr = host.configManager.imageConfigManager @@ -126,45 +104,31 @@ def gather_acceptance_facts(self): self.hosts_facts[host.name]['level'] = host_image_config_mgr.HostImageConfigGetAcceptance() except vim.fault.HostConfigFault as e: self.hosts_facts[host.name]['error'] = to_native(e.msg) - - def set_acceptance_level(self): - change = [] - for host in self.hosts: host_changed = False - if self.hosts_facts[host.name]['level'] != self.acceptance_level: - host_image_config_mgr = host.configManager.imageConfigManager - if host_image_config_mgr: - try: - if self.module.check_mode: - self.hosts_facts[host.name]['level'] = self.acceptance_level - else: - host_image_config_mgr.UpdateHostImageAcceptanceLevel(newAcceptanceLevel=self.acceptance_level) - self.hosts_facts[host.name]['level'] = host_image_config_mgr.HostImageConfigGetAcceptance() - host_changed = True - except vim.fault.HostConfigFault as e: - self.hosts_facts[host.name]['error'] = to_native(e.msg) + if self.hosts_facts[host.name]['level'] != self.desired_state: + try: + if self.module.check_mode: + self.hosts_facts[host.name]['level'] = self.desired_state + else: + host_image_config_mgr.UpdateHostImageAcceptanceLevel(newAcceptanceLevel=self.desired_state) + self.hosts_facts[host.name]['level'] = host_image_config_mgr.HostImageConfigGetAcceptance() + host_changed = True + except vim.fault.HostConfigFault as e: + self.hosts_facts[host.name]['error'] = to_native(e.msg) change.append(host_changed) self.module.exit_json(changed=any(change), facts=self.hosts_facts) - def check_acceptance_state(self): - self.gather_acceptance_facts() - if self.desired_state == 'list': - self.module.exit_json(changed=False, facts=self.hosts_facts) - self.set_acceptance_level() - def main(): argument_spec = vmware_argument_spec() argument_spec.update( cluster_name=dict(type='str', required=False), esxi_hostname=dict(type='str', required=False), - acceptance_level=dict(type='str', - choices=['community', 'partner', 'vmware_accepted', 'vmware_certified'] - ), state=dict(type='str', - choices=['list', 'present'], - default='list'), + choices=['community', 'partner', 'vmware_accepted', 'vmware_certified'], + required=True + ), ) module = AnsibleModule( @@ -172,14 +136,11 @@ def main(): required_one_of=[ ['cluster_name', 'esxi_hostname'], ], - required_if=[ - ['state', 'present', ['acceptance_level']], - ], supports_check_mode=True ) vmware_host_accept_config = VMwareAccpetanceManager(module) - vmware_host_accept_config.check_acceptance_state() + vmware_host_accept_config.set_acceptance_level() if __name__ == "__main__": diff --git a/plugins/modules/vmware_host_acceptance_info.py b/plugins/modules/vmware_host_acceptance_info.py new file mode 100644 index 0000000000..0aeaf6988a --- /dev/null +++ b/plugins/modules/vmware_host_acceptance_info.py @@ -0,0 +1,107 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2018, Abhijeet Kasurde +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = r''' +--- +module: vmware_host_acceptance_info +short_description: Manage the host acceptance level of an ESXi host +description: +- This module can be used to manage the host acceptance level of an ESXi host. +- The host acceptance level controls the acceptance level of each VIB on a ESXi host. +author: +- Abhijeet Kasurde (@Akasurde) +options: + cluster_name: + description: + - Name of the cluster. + - Acceptance level of all ESXi host system in the given cluster will be managed. + - If C(esxi_hostname) is not given, this parameter is required. + type: str + esxi_hostname: + description: + - ESXi hostname. + - Acceptance level of this ESXi host system will be managed. + - If C(cluster_name) is not given, this parameter is required. + type: str +extends_documentation_fragment: +- community.vmware.vmware.documentation + +''' + +EXAMPLES = r''' +- name: Get acceptance level from the given ESXi Host + community.vmware.vmware_host_acceptance_info: + hostname: '{{ vcenter_hostname }}' + username: '{{ vcenter_username }}' + password: '{{ vcenter_password }}' + esxi_hostname: '{{ esxi_hostname }}' + delegate_to: localhost + register: host_acceptance_level +''' + +RETURN = r''' +host_acceptance_info: + description: + - dict with hostname as key and dict with acceptance level facts, error as value + returned: facts + type: dict + sample: { "facts": { "localhost.localdomain": { "error": "NA", "level": "vmware_certified" }}} +''' + +try: + from pyVmomi import vim +except ImportError: + pass +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.community.vmware.plugins.module_utils.vmware import vmware_argument_spec, PyVmomi +from ansible.module_utils._text import to_native + + +class VMwareAccpetanceManager(PyVmomi): + def __init__(self, module): + super(VMwareAccpetanceManager, self).__init__(module) + cluster_name = self.params.get('cluster_name', None) + esxi_host_name = self.params.get('esxi_hostname', None) + self.hosts = self.get_all_host_objs(cluster_name=cluster_name, esxi_host_name=esxi_host_name) + self.hosts_facts = {} + + def gather_acceptance_info(self): + for host in self.hosts: + self.hosts_facts[host.name] = dict(level='', error='NA') + host_image_config_mgr = host.configManager.imageConfigManager + if host_image_config_mgr: + try: + self.hosts_facts[host.name]['level'] = host_image_config_mgr.HostImageConfigGetAcceptance() + except vim.fault.HostConfigFault as e: + self.hosts_facts[host.name]['error'] = to_native(e.msg) + self.module.exit_json(changed=False, host_acceptance_info=self.hosts_facts) + + +def main(): + argument_spec = vmware_argument_spec() + argument_spec.update( + cluster_name=dict(type='str', required=False), + esxi_hostname=dict(type='str', required=False), + ) + + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=[ + ['cluster_name', 'esxi_hostname'], + ], + ) + + vmware_host_accept_config = VMwareAccpetanceManager(module) + vmware_host_accept_config.gather_acceptance_info() + + +if __name__ == "__main__": + main() diff --git a/tests/integration/targets/vmware_host_acceptance/tasks/main.yml b/tests/integration/targets/vmware_host_acceptance/tasks/main.yml index 9d3352e6d6..cab3aa2224 100644 --- a/tests/integration/targets/vmware_host_acceptance/tasks/main.yml +++ b/tests/integration/targets/vmware_host_acceptance/tasks/main.yml @@ -7,33 +7,48 @@ vars: setup_attach_host: true -- name: Change acceptance level of given hosts +- name: Change acceptance level of given host in check mode vmware_host_acceptance: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" esxi_hostname: '{{ esxi1 }}' validate_certs: false - acceptance_level: community - state: present - register: host_acceptance_info -- debug: var=host_acceptance_info + state: community + register: host_acceptance_community_check_mode + check_mode: true +- debug: var=host_acceptance_community_check_mode - assert: that: - - host_acceptance_info.facts is defined + - host_acceptance_community_check_mode.facts is defined + - host_acceptance_community_check_mode.changed -- name: Change acceptance level of given hosts in check mode +- name: Change acceptance level of given host vmware_host_acceptance: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" esxi_hostname: '{{ esxi1 }}' validate_certs: false - acceptance_level: community - state: present - register: host_acceptance_info_check_mode - check_mode: true -- debug: var=host_acceptance_info_check_mode + state: community + register: host_acceptance_community +- debug: var=host_acceptance_community +- assert: + that: + - host_acceptance_community.facts is defined + - host_acceptance_community.changed + +- name: Change acceptance level of given host again (idempotency) + vmware_host_acceptance: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + esxi_hostname: '{{ esxi1 }}' + validate_certs: false + state: community + register: host_acceptance_community_again +- debug: var=host_acceptance_community_again - assert: that: - - host_acceptance_info_check_mode.facts is defined + - host_acceptance_community_again.facts is defined + - host_acceptance_community_again.changed is false diff --git a/tests/integration/targets/vmware_host_acceptance_info/aliases b/tests/integration/targets/vmware_host_acceptance_info/aliases new file mode 100644 index 0000000000..07e8732a30 --- /dev/null +++ b/tests/integration/targets/vmware_host_acceptance_info/aliases @@ -0,0 +1,3 @@ +cloud/vcenter +needs/target/prepare_vmware_tests +zuul/vmware/vcenter_1esxi diff --git a/tests/integration/targets/vmware_host_acceptance_info/tasks/main.yml b/tests/integration/targets/vmware_host_acceptance_info/tasks/main.yml new file mode 100644 index 0000000000..ec2c59fcf5 --- /dev/null +++ b/tests/integration/targets/vmware_host_acceptance_info/tasks/main.yml @@ -0,0 +1,22 @@ +# Test code for the vmware_host_acceptance module. +# Copyright: (c) 2018, Abhijeet Kasurde +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +- import_role: + name: prepare_vmware_tests + vars: + setup_attach_host: true + +- name: Gather acceptance level of given host + vmware_host_acceptance: + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + esxi_hostname: '{{ esxi1 }}' + validate_certs: false + register: result +- debug: var=result +- assert: + that: + - result.host_acceptance_info is defined + - result.changed is false diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index 0ea6498e99..8203d89907 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -1,3 +1,2 @@ plugins/modules/vmware_deploy_ovf.py replace-urlopen!skip plugins/modules/vmware_deploy_ovf.py use-argspec-type-path!skip -plugins/modules/vmware_host_acceptance.py validate-modules:parameter-state-invalid-choice diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index 0ea6498e99..8203d89907 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -1,3 +1,2 @@ plugins/modules/vmware_deploy_ovf.py replace-urlopen!skip plugins/modules/vmware_deploy_ovf.py use-argspec-type-path!skip -plugins/modules/vmware_host_acceptance.py validate-modules:parameter-state-invalid-choice