Skip to content

Commit

Permalink
vmware_host_acceptance: Remove acceptance_level
Browse files Browse the repository at this point in the history
  • Loading branch information
mariolenz committed Oct 13, 2023
1 parent 1699bcf commit ccec2e2
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 73 deletions.
4 changes: 4 additions & 0 deletions changelogs/fragments/1872-vmware_host_acceptance.yml
Original file line number Diff line number Diff line change
@@ -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).
1 change: 1 addition & 0 deletions meta/runtime.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
77 changes: 19 additions & 58 deletions plugins/modules/vmware_host_acceptance.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
'''
Expand Down Expand Up @@ -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
Expand All @@ -126,60 +104,43 @@ 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(
argument_spec=argument_spec,
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__":
Expand Down
107 changes: 107 additions & 0 deletions plugins/modules/vmware_host_acceptance_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2018, Abhijeet Kasurde <[email protected]>
# 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()
41 changes: 28 additions & 13 deletions tests/integration/targets/vmware_host_acceptance/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions tests/integration/targets/vmware_host_acceptance_info/aliases
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
cloud/vcenter
needs/target/prepare_vmware_tests
zuul/vmware/vcenter_1esxi
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Test code for the vmware_host_acceptance module.
# Copyright: (c) 2018, Abhijeet Kasurde <[email protected]>
# 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
1 change: 0 additions & 1 deletion tests/sanity/ignore-2.15.txt
Original file line number Diff line number Diff line change
@@ -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
1 change: 0 additions & 1 deletion tests/sanity/ignore-2.16.txt
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ccec2e2

Please sign in to comment.