summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ansible/modules/cloud/vmware/vmware_host_package_facts.py135
-rw-r--r--test/integration/targets/vmware_host_package_facts/aliases3
-rw-r--r--test/integration/targets/vmware_host_package_facts/tasks/main.yml66
3 files changed, 204 insertions, 0 deletions
diff --git a/lib/ansible/modules/cloud/vmware/vmware_host_package_facts.py b/lib/ansible/modules/cloud/vmware/vmware_host_package_facts.py
new file mode 100644
index 0000000000..ee7ef22883
--- /dev/null
+++ b/lib/ansible/modules/cloud/vmware/vmware_host_package_facts.py
@@ -0,0 +1,135 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2018, Abhijeet Kasurde <akasurde@redhat.com>
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+
+ANSIBLE_METADATA = {
+ 'metadata_version': '1.1',
+ 'status': ['preview'],
+ 'supported_by': 'community'
+}
+
+DOCUMENTATION = r'''
+---
+module: vmware_host_package_facts
+short_description: Gathers facts about available packages on an ESXi host
+description:
+- This module can be used to gather facts about available packages and their status on an ESXi host.
+version_added: '2.5'
+author:
+- Abhijeet Kasurde (@akasurde)
+notes:
+- Tested on vSphere 6.5
+requirements:
+- python >= 2.6
+- PyVmomi
+options:
+ cluster_name:
+ description:
+ - Name of the cluster.
+ - Package facts about each ESXi server will be returned for given cluster.
+ - If C(esxi_hostname) is not given, this parameter is required.
+ esxi_hostname:
+ description:
+ - ESXi hostname.
+ - Package facts about this ESXi server will be returned.
+ - If C(cluster_name) is not given, this parameter is required.
+extends_documentation_fragment: vmware.documentation
+'''
+
+EXAMPLES = r'''
+- name: Gather facts about all ESXi Host in given Cluster
+ vmware_host_package_facts:
+ hostname: '{{ vcenter_hostname }}'
+ username: '{{ vcenter_username }}'
+ password: '{{ vcenter_password }}'
+ cluster_name: cluster_name
+ register: cluster_host_packages
+
+- name: Gather facts about ESXi Host
+ vmware_host_package_facts:
+ hostname: '{{ vcenter_hostname }}'
+ username: '{{ vcenter_username }}'
+ password: '{{ vcenter_password }}'
+ esxi_hostname: '{{ esxi_hostname }}'
+ register: host_packages
+'''
+
+RETURN = r'''
+hosts_package_facts:
+ description:
+ - dict with hostname as key and dict with package facts as value
+ returned: hosts_package_facts
+ type: dict
+ sample: { "hosts_package_facts": { "localhost.localdomain": []}}
+'''
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.vmware import vmware_argument_spec, PyVmomi
+
+
+class VmwarePackageManager(PyVmomi):
+ def __init__(self, module):
+ super(VmwarePackageManager, self).__init__(module)
+ cluster_name = self.params.get('cluster_name', None)
+ esxi_host_name = self.params.get('esxi_hostname', None)
+ self.hosts = []
+ if cluster_name:
+ cluster_obj = self.find_cluster_by_name(cluster_name=cluster_name)
+ if cluster_obj:
+ self.hosts = [host for host in cluster_obj.host]
+ else:
+ module.fail_json(changed=False, msg="Cluster '%s' not found" % cluster_name)
+ elif esxi_host_name:
+ esxi_host_obj = self.find_hostsystem_by_name(host_name=esxi_host_name)
+ if esxi_host_obj:
+ self.hosts = [esxi_host_obj]
+ else:
+ module.fail_json(changed=False, msg="ESXi '%s' not found" % esxi_host_name)
+
+ def gather_package_facts(self):
+ hosts_facts = {}
+ for host in self.hosts:
+ host_package_facts = []
+ host_pkg_mgr = host.configManager.imageConfigManager
+ if host_pkg_mgr:
+ pkgs = host_pkg_mgr.FetchSoftwarePackages()
+ for pkg in pkgs:
+ host_package_facts.append(dict(name=pkg.name,
+ version=pkg.version,
+ vendor=pkg.vendor,
+ summary=pkg.summary,
+ description=pkg.description,
+ acceptance_level=pkg.acceptanceLevel,
+ maintenance_mode_required=pkg.maintenanceModeRequired,
+ creation_date=pkg.creationDate,
+ )
+ )
+ hosts_facts[host.name] = host_package_facts
+ return 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_package_config = VmwarePackageManager(module)
+ module.exit_json(changed=False, hosts_package_facts=vmware_host_package_config.gather_package_facts())
+
+
+if __name__ == "__main__":
+ main()
diff --git a/test/integration/targets/vmware_host_package_facts/aliases b/test/integration/targets/vmware_host_package_facts/aliases
new file mode 100644
index 0000000000..6ee4e3d4f9
--- /dev/null
+++ b/test/integration/targets/vmware_host_package_facts/aliases
@@ -0,0 +1,3 @@
+posix/ci/cloud/group4/vcenter
+cloud/vcenter
+
diff --git a/test/integration/targets/vmware_host_package_facts/tasks/main.yml b/test/integration/targets/vmware_host_package_facts/tasks/main.yml
new file mode 100644
index 0000000000..26826fd3a0
--- /dev/null
+++ b/test/integration/targets/vmware_host_package_facts/tasks/main.yml
@@ -0,0 +1,66 @@
+# Test code for the vmware_host_package_facts module.
+# Copyright: (c) 2018, Abhijeet Kasurde <akasurde@redhat.com>
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# TODO: vcsim does not support Package Manager related to operations
+#- name: make sure pyvmomi is installed
+# pip:
+# name: pyvmomi
+# state: latest
+# when: "{{ ansible_user_id == 'root' }}"
+
+#- name: store the vcenter container ip
+# set_fact:
+# vcsim: "{{ lookup('env', 'vcenter_host') }}"
+
+#- debug: var=vcsim
+
+#- name: Wait for Flask controller to come up online
+# wait_for:
+# host: "{{ vcsim }}"
+# port: 5000
+# state: started
+
+#- name: kill vcsim
+# uri:
+# url: http://{{ vcsim }}:5000/killall
+
+#- name: start vcsim
+# uri:
+# url: http://{{ vcsim }}:5000/spawn?cluster=2
+# register: vcsim_instance
+
+#- debug:
+# var: vcsim_instance
+
+#- name: Wait for vcsim server to come up online
+# wait_for:
+# host: "{{ vcsim }}"
+# port: 443
+# state: started
+
+#- name: get a list of hosts from vcsim
+# uri:
+# url: http://{{ vcsim }}:5000/govc_find?filter=H
+# register: hosts
+
+#- name: get a host
+# set_fact:
+# host1: "{{ hosts.json[0] | basename }}"
+
+#- debug: var=host1
+
+#- name: Gather facts about all hosts in given cluster
+# vmware_host_package_facts:
+# hostname: "{{ vcsim }}"
+# username: "{{ user }}"
+# password: "{{ passwd }}"
+# esxi_hostname: "{{ host1 }}"
+# validate_certs: no
+# register: host_packages
+
+#- debug: var=host_packages
+
+#- assert:
+# that:
+# - host_packages.hosts_package_facts is defined