forked from ansible/ansible
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
VMware: new module: vmware_host_capability_facts (ansible#36497)
Signed-off-by: Abhijeet Kasurde <[email protected]>
- Loading branch information
Showing
3 changed files
with
309 additions
and
0 deletions.
There are no files selected for viewing
217 changes: 217 additions & 0 deletions
217
lib/ansible/modules/cloud/vmware/vmware_host_capability_facts.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,217 @@ | ||
#!/usr/bin/python | ||
# -*- coding: utf-8 -*- | ||
# 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) | ||
|
||
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_capability_facts | ||
short_description: Gathers facts about an ESXi host's capability information | ||
description: | ||
- This module can be used to gather facts about an ESXi host's capability information when ESXi hostname or Cluster name is given. | ||
version_added: 2.6 | ||
author: | ||
- Abhijeet Kasurde (@akasurde) | ||
notes: | ||
- Tested on vSphere 6.5 | ||
requirements: | ||
- python >= 2.6 | ||
- PyVmomi | ||
options: | ||
cluster_name: | ||
description: | ||
- Name of the cluster from all host systems to be used for facts gathering. | ||
- If C(esxi_hostname) is not given, this parameter is required. | ||
esxi_hostname: | ||
description: | ||
- ESXi hostname to gather facts from. | ||
- If C(cluster_name) is not given, this parameter is required. | ||
extends_documentation_fragment: vmware.documentation | ||
''' | ||
|
||
EXAMPLES = r''' | ||
- name: Gather capability facts about all ESXi Host in given Cluster | ||
vmware_host_capability_facts: | ||
hostname: '{{ vcenter_hostname }}' | ||
username: '{{ vcenter_username }}' | ||
password: '{{ vcenter_password }}' | ||
cluster_name: cluster_name | ||
register: all_cluster_hosts_facts | ||
- name: Gather capability facts about ESXi Host | ||
vmware_host_capability_facts: | ||
hostname: '{{ vcenter_hostname }}' | ||
username: '{{ vcenter_username }}' | ||
password: '{{ vcenter_password }}' | ||
esxi_hostname: '{{ esxi_hostname }}' | ||
register: hosts_facts | ||
''' | ||
|
||
RETURN = r''' | ||
hosts_capability_facts: | ||
description: metadata about host's capability infromation | ||
returned: always | ||
type: dict | ||
sample: { | ||
"esxi_hostname_0001": { | ||
"accel3dSupported": false, | ||
"backgroundSnapshotsSupported": false, | ||
"checkpointFtCompatibilityIssues": [], | ||
"checkpointFtSupported": false, | ||
"cloneFromSnapshotSupported": true, | ||
"cpuHwMmuSupported": true, | ||
} | ||
} | ||
''' | ||
|
||
from ansible.module_utils.basic import AnsibleModule | ||
from ansible.module_utils.vmware import vmware_argument_spec, PyVmomi | ||
|
||
|
||
class CapabilityFactsManager(PyVmomi): | ||
def __init__(self, module): | ||
super(CapabilityFactsManager, 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) | ||
|
||
def gather_host_capability_facts(self): | ||
hosts_capability_facts = dict() | ||
for host in self.hosts: | ||
hc = host.capability | ||
hosts_capability_facts[host.name] = dict( | ||
recursiveResourcePoolsSupported=hc.recursiveResourcePoolsSupported, | ||
cpuMemoryResourceConfigurationSupported=hc.cpuMemoryResourceConfigurationSupported, | ||
rebootSupported=hc.rebootSupported, | ||
shutdownSupported=hc.shutdownSupported, | ||
vmotionSupported=hc.vmotionSupported, | ||
standbySupported=hc.standbySupported, | ||
ipmiSupported=hc.ipmiSupported, | ||
maxSupportedVMs=hc.maxSupportedVMs, | ||
maxRunningVMs=hc.maxRunningVMs, | ||
maxSupportedVcpus=hc.maxSupportedVcpus, | ||
maxRegisteredVMs=hc.maxRegisteredVMs, | ||
datastorePrincipalSupported=hc.datastorePrincipalSupported, | ||
sanSupported=hc.sanSupported, | ||
nfsSupported=hc.nfsSupported, | ||
iscsiSupported=hc.iscsiSupported, | ||
vlanTaggingSupported=hc.vlanTaggingSupported, | ||
nicTeamingSupported=hc.nicTeamingSupported, | ||
highGuestMemSupported=hc.highGuestMemSupported, | ||
maintenanceModeSupported=hc.maintenanceModeSupported, | ||
suspendedRelocateSupported=hc.suspendedRelocateSupported, | ||
restrictedSnapshotRelocateSupported=hc.restrictedSnapshotRelocateSupported, | ||
perVmSwapFiles=hc.perVmSwapFiles, | ||
localSwapDatastoreSupported=hc.localSwapDatastoreSupported, | ||
unsharedSwapVMotionSupported=hc.unsharedSwapVMotionSupported, | ||
backgroundSnapshotsSupported=hc.backgroundSnapshotsSupported, | ||
preAssignedPCIUnitNumbersSupported=hc.preAssignedPCIUnitNumbersSupported, | ||
screenshotSupported=hc.screenshotSupported, | ||
scaledScreenshotSupported=hc.scaledScreenshotSupported, | ||
storageVMotionSupported=hc.storageVMotionSupported, | ||
vmotionWithStorageVMotionSupported=hc.vmotionWithStorageVMotionSupported, | ||
vmotionAcrossNetworkSupported=hc.vmotionAcrossNetworkSupported, | ||
maxNumDisksSVMotion=hc.maxNumDisksSVMotion, | ||
hbrNicSelectionSupported=hc.hbrNicSelectionSupported, | ||
vrNfcNicSelectionSupported=hc.vrNfcNicSelectionSupported, | ||
recordReplaySupported=hc.recordReplaySupported, | ||
ftSupported=hc.ftSupported, | ||
replayUnsupportedReason=hc.replayUnsupportedReason, | ||
checkpointFtSupported=hc.checkpointFtSupported, | ||
smpFtSupported=hc.smpFtSupported, | ||
maxVcpusPerFtVm=hc.maxVcpusPerFtVm, | ||
loginBySSLThumbprintSupported=hc.loginBySSLThumbprintSupported, | ||
cloneFromSnapshotSupported=hc.cloneFromSnapshotSupported, | ||
deltaDiskBackingsSupported=hc.deltaDiskBackingsSupported, | ||
perVMNetworkTrafficShapingSupported=hc.perVMNetworkTrafficShapingSupported, | ||
tpmSupported=hc.tpmSupported, | ||
virtualExecUsageSupported=hc.virtualExecUsageSupported, | ||
storageIORMSupported=hc.storageIORMSupported, | ||
vmDirectPathGen2Supported=hc.vmDirectPathGen2Supported, | ||
vmDirectPathGen2UnsupportedReasonExtended=hc.vmDirectPathGen2UnsupportedReasonExtended, | ||
vStorageCapable=hc.vStorageCapable, | ||
snapshotRelayoutSupported=hc.snapshotRelayoutSupported, | ||
firewallIpRulesSupported=hc.firewallIpRulesSupported, | ||
servicePackageInfoSupported=hc.servicePackageInfoSupported, | ||
maxHostRunningVms=hc.maxHostRunningVms, | ||
maxHostSupportedVcpus=hc.maxHostSupportedVcpus, | ||
vmfsDatastoreMountCapable=hc.vmfsDatastoreMountCapable, | ||
eightPlusHostVmfsSharedAccessSupported=hc.eightPlusHostVmfsSharedAccessSupported, | ||
nestedHVSupported=hc.nestedHVSupported, | ||
vPMCSupported=hc.vPMCSupported, | ||
interVMCommunicationThroughVMCISupported=hc.interVMCommunicationThroughVMCISupported, | ||
scheduledHardwareUpgradeSupported=hc.scheduledHardwareUpgradeSupported, | ||
featureCapabilitiesSupported=hc.featureCapabilitiesSupported, | ||
latencySensitivitySupported=hc.latencySensitivitySupported, | ||
storagePolicySupported=hc.storagePolicySupported, | ||
accel3dSupported=hc.accel3dSupported, | ||
reliableMemoryAware=hc.reliableMemoryAware, | ||
multipleNetworkStackInstanceSupported=hc.multipleNetworkStackInstanceSupported, | ||
messageBusProxySupported=hc.messageBusProxySupported, | ||
vsanSupported=hc.vsanSupported, | ||
vFlashSupported=hc.vFlashSupported, | ||
hostAccessManagerSupported=hc.hostAccessManagerSupported, | ||
provisioningNicSelectionSupported=hc.provisioningNicSelectionSupported, | ||
nfs41Supported=hc.nfs41Supported, | ||
nfs41Krb5iSupported=hc.nfs41Krb5iSupported, | ||
turnDiskLocatorLedSupported=hc.turnDiskLocatorLedSupported, | ||
virtualVolumeDatastoreSupported=hc.virtualVolumeDatastoreSupported, | ||
markAsSsdSupported=hc.markAsSsdSupported, | ||
markAsLocalSupported=hc.markAsLocalSupported, | ||
smartCardAuthenticationSupported=hc.smartCardAuthenticationSupported, | ||
cryptoSupported=hc.cryptoSupported, | ||
oneKVolumeAPIsSupported=hc.oneKVolumeAPIsSupported, | ||
gatewayOnNicSupported=hc.gatewayOnNicSupported, | ||
upitSupported=hc.upitSupported, | ||
cpuHwMmuSupported=hc.cpuHwMmuSupported, | ||
encryptedVMotionSupported=hc.encryptedVMotionSupported, | ||
encryptionChangeOnAddRemoveSupported=hc.encryptionChangeOnAddRemoveSupported, | ||
encryptionHotOperationSupported=hc.encryptionHotOperationSupported, | ||
encryptionWithSnapshotsSupported=hc.encryptionWithSnapshotsSupported, | ||
encryptionFaultToleranceSupported=hc.encryptionFaultToleranceSupported, | ||
encryptionMemorySaveSupported=hc.encryptionMemorySaveSupported, | ||
encryptionRDMSupported=hc.encryptionRDMSupported, | ||
encryptionVFlashSupported=hc.encryptionVFlashSupported, | ||
encryptionCBRCSupported=hc.encryptionCBRCSupported, | ||
encryptionHBRSupported=hc.encryptionHBRSupported, | ||
supportedVmfsMajorVersion=[version for version in hc.supportedVmfsMajorVersion], | ||
vmDirectPathGen2UnsupportedReason=[reason for reason in hc.vmDirectPathGen2UnsupportedReason], | ||
ftCompatibilityIssues=[issue for issue in hc.ftCompatibilityIssues], | ||
checkpointFtCompatibilityIssues=[issue for issue in hc.checkpointFtCompatibilityIssues], | ||
smpFtCompatibilityIssues=[issue for issue in hc.smpFtCompatibilityIssues], | ||
replayCompatibilityIssues=[issue for issue in hc.replayCompatibilityIssues], | ||
) | ||
return hosts_capability_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'], | ||
] | ||
) | ||
|
||
host_capability_manager = CapabilityFactsManager(module) | ||
module.exit_json(changed=False, | ||
hosts_capability_facts=host_capability_manager.gather_host_capability_facts()) | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |
3 changes: 3 additions & 0 deletions
3
test/integration/targets/vmware_host_capability_facts/aliases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
posix/ci/cloud/group4/vcenter | ||
cloud/vcenter | ||
|
89 changes: 89 additions & 0 deletions
89
test/integration/targets/vmware_host_capability_facts/tasks/main.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
# Test code for the vmware_host_capability_facts 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) | ||
|
||
# TODO: vcsim does not support host system capabilities | ||
#- 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 Cluster from vcsim | ||
# uri: | ||
# url: http://{{ vcsim }}:5000/govc_find?filter=CCR | ||
# register: clusters | ||
|
||
#- name: get a cluster | ||
# set_fact: | ||
# ccr1: "{{ clusters.json[0] | basename }}" | ||
|
||
#- 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=ccr1 | ||
#- debug: var=host1 | ||
|
||
#- name: Gather capability facts for all ESXi host from given cluster | ||
# vmware_host_capability_facts: | ||
# hostname: "{{ vcsim }}" | ||
# username: "{{ vcsim_instance.json.username }}" | ||
# password: "{{ vcsim_instance.json.password }}" | ||
# validate_certs: False | ||
# cluster_name: "{{ ccr1 }}" | ||
# register: capability_0001_results | ||
|
||
#- assert: | ||
# that: | ||
# - "not capability_0001_results.changed" | ||
# - "capability_0001_results.hosts_capability_facts is defined" | ||
|
||
#- name: Gather capability facts for ESXi host | ||
# vmware_host_capability_facts: | ||
# hostname: "{{ vcsim }}" | ||
# username: "{{ vcsim_instance.json.username }}" | ||
# password: "{{ vcsim_instance.json.password }}" | ||
# validate_certs: False | ||
# esxi_hostname: "{{ host1 }}" | ||
# register: capability_0002_results | ||
|
||
#- assert: | ||
# that: | ||
# - "not capability_0002_results.changed" | ||
# - "capability_0002_results.hosts_capability_facts is defined" |