Skip to content

Commit

Permalink
consolidate argument specs and doc fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
mikemorency committed Dec 11, 2024
1 parent 94ea806 commit 9d32d91
Show file tree
Hide file tree
Showing 12 changed files with 182 additions and 171 deletions.
4 changes: 4 additions & 0 deletions changelogs/fragments/88-consolidate-arg-specs-and-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
minor_changes:
- doc fragments - Remove redundant fragments. Update pyvmomi modules to use new consolidated docs
- argument specs - Remove redundant argument specs. Update pyvmomi modules to use new consolidated spec
152 changes: 51 additions & 101 deletions plugins/doc_fragments/vmware.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,121 +11,71 @@


class ModuleDocFragment(object):
# Parameters for VMware modules
DOCUMENTATION = r'''
# This document fragment serves as a base for all vmware modules. If you are using the REST API SDK in your module,
# you should use the REST_COMPATIBLE_DOCUMENTATION fragment. Otherwise, you can use this BASE_DOCUMENTATION.
# BASE_DOCUMENTATION covers the arg spec provided by the base_argument_spec() function, while
# REST_COMPATIBLE_DOCUMENTATION covers the arg spec provided by the rest_compatible_argument_spec() function
BASE_DOCUMENTATION = r'''
notes:
- All modules require API write access and hence is not supported on a free ESXi license.
- All variables and VMware object names are case sensitive.
- >-
Modules may rely on the 'requests' python library, which does not use the system certificate store by default. You can
specify the certificate store by setting the REQUESTS_CA_BUNDLE environment variable.
Example: 'export REQUESTS_CA_BUNDLE=/path/to/your/ca_bundle.pem'
options:
hostname:
description:
- The hostname or IP address of the vSphere vCenter or ESXi server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_HOST) will be used instead.
type: str
username:
description:
- The username of the vSphere vCenter or ESXi server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_USER) will be used instead.
type: str
aliases: [ admin, user ]
password:
description:
- The password of the vSphere vCenter or ESXi server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PASSWORD) will be used instead.
type: str
aliases: [ pass, pwd ]
validate_certs:
description:
- Allows connection when SSL certificates are not valid. Set to V(false) when certificates are not trusted.
- If the value is not specified in the task, the value of environment variable E(VMWARE_VALIDATE_CERTS) will be used instead.
type: bool
default: true
port:
description:
- The port number of the vSphere vCenter or ESXi server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PORT) will be used instead.
type: int
default: 443
datacenter:
description:
- The datacenter to use when connecting to a vCenter.
type: str
aliases: [ datacenter_name ]
cluster:
description:
- The cluster to use when connecting to a vCenter.
type: str
aliases: [ cluster_name ]
proxy_host:
description:
- Address of a proxy that will receive all HTTPS requests and relay them.
- The format is a hostname or a IP.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PROXY_HOST) will be used instead.
type: str
required: false
proxy_port:
description:
- Port of the HTTP proxy that will receive all HTTPS requests and relay them.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PROXY_PORT) will be used instead.
type: int
required: false
'''

# This doc fragment is specific to vcenter modules like vcenter_license
VCENTER_DOCUMENTATION = r'''
notes:
- All modules require API write access and hence is not supported on a free ESXi license.
options:
hostname:
description:
hostname:
description:
- The hostname or IP address of the vSphere vCenter server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_HOST) will be used instead.
type: str
username:
description:
type: str
username:
description:
- The username of the vSphere vCenter server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_USER) will be used instead.
type: str
aliases: [ admin, user ]
password:
description:
type: str
aliases: [ admin, user ]
password:
description:
- The password of the vSphere vCenter server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PASSWORD) will be used instead.
type: str
aliases: [ pass, pwd ]
validate_certs:
description:
type: str
aliases: [ pass, pwd ]
validate_certs:
description:
- Allows connection when SSL certificates are not valid. Set to V(false) when certificates are not trusted.
- If the value is not specified in the task, the value of environment variable E(VMWARE_VALIDATE_CERTS) will be used instead.
type: bool
default: true
port:
description:
type: bool
default: true
port:
description:
- The port number of the vSphere vCenter server.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PORT) will be used instead.
type: int
default: 443
datacenter:
description:
- The datacenter to use when connecting to a vCenter.
type: str
aliases: [ datacenter_name ]
cluster:
description:
- The cluster to use when connecting to a vCenter.
type: str
aliases: [ cluster_name ]
proxy_host:
description:
type: int
default: 443
proxy_host:
description:
- Address of a proxy that will receive all HTTPS requests and relay them.
- The format is a hostname or a IP.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PROXY_HOST) will be used instead.
type: str
required: false
proxy_port:
description:
- Port of the HTTP proxy that will receive all HTTPS requests and relay them.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PROXY_PORT) will be used instead.
type: int
required: false
'''
type: str
required: false
proxy_port:
description:
- Port of the HTTP proxy that will receive all HTTPS requests and relay them.
- If the value is not specified in the task, the value of environment variable E(VMWARE_PROXY_PORT) will be used instead.
type: int
required: false
'''
# Use this document fragment a base for any vmware modules that use the REST API SDK. If your module uses
# both the REST SDK and pyvmomi, you should still use this doc fragment
REST_COMPATIBLE_DOCUMENTATION = BASE_DOCUMENTATION + r'''
proxy_protocol:
description:
- The proxy connection protocol to use.
- This is option is used if the correct proxy protocol cannot be automatically determined.
type: str
choices: [ http, https ]
default: https
aliases: [protocol]
'''
42 changes: 1 addition & 41 deletions plugins/module_utils/_vmware.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,54 +32,14 @@
PYVMOMI_IMP_ERR = traceback.format_exc()
HAS_PYVMOMI = False

from ansible.module_utils.basic import env_fallback, missing_required_lib
from ansible.module_utils.basic import missing_required_lib


class ApiAccessError(Exception):
def __init__(self, *args, **kwargs):
super(ApiAccessError, self).__init__(*args, **kwargs)


def vmware_argument_spec():
return dict(
hostname=dict(type='str',
required=False,
fallback=(env_fallback, ['VMWARE_HOST']),
),
username=dict(type='str',
aliases=['user', 'admin'],
required=False,
fallback=(env_fallback, ['VMWARE_USER'])),
password=dict(type='str',
aliases=['pass', 'pwd'],
required=False,
no_log=True,
fallback=(env_fallback, ['VMWARE_PASSWORD'])),
cluster=dict(type='str',
aliases=['cluster_name'],
required=False),
datacenter=dict(type='str',
aliases=['datacenter_name'],
required=False),
port=dict(type='int',
default=443,
fallback=(env_fallback, ['VMWARE_PORT'])),
validate_certs=dict(type='bool',
required=False,
default=True,
fallback=(env_fallback, ['VMWARE_VALIDATE_CERTS'])
),
proxy_host=dict(type='str',
required=False,
default=None,
fallback=(env_fallback, ['VMWARE_PROXY_HOST'])),
proxy_port=dict(type='int',
required=False,
default=None,
fallback=(env_fallback, ['VMWARE_PROXY_PORT'])),
)


def connect_to_api(module, disconnect_atexit=True, return_si=False, hostname=None, username=None, password=None,
port=None, validate_certs=None,
httpProxyHost=None, httpProxyPort=None):
Expand Down
72 changes: 72 additions & 0 deletions plugins/module_utils/_vmware_argument_spec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from ansible.module_utils.basic import env_fallback


def rest_compatible_argument_spec():
"""
This returns a dictionary that can be used as the baseline for all REST module specs.
If your module uses the REST API, you should use this instead of the base_argument_spec.
If your module uses both this and the pyvmomi SDK, you should still use this spec.
"""
return {
**base_argument_spec(),
**dict(
proxy_protocol=dict(
type='str',
default='https',
choices=['https', 'http'],
aliases=['protocol']
),
)
}


def base_argument_spec():
"""
This returns a dictionary that can be used as the baseline for all vmware module specs. Any arguments
common to both the REST API SDK and pyvmomi SDK should be placed here.
If your module uses the REST API, you should use the rest_compatible_argument_spec since that
includes additional arguments specific to that SDK.
"""
return dict(
hostname=dict(
type='str',
required=False,
fallback=(env_fallback, ['VMWARE_HOST']),
),
username=dict(
type='str',
aliases=['user', 'admin'],
required=False,
fallback=(env_fallback, ['VMWARE_USER'])
),
password=dict(
type='str',
aliases=['pass', 'pwd'],
required=False,
no_log=True,
fallback=(env_fallback, ['VMWARE_PASSWORD'])
),
port=dict(
type='int',
default=443,
fallback=(env_fallback, ['VMWARE_PORT'])
),
validate_certs=dict(
type='bool',
required=False,
default=True,
fallback=(env_fallback, ['VMWARE_VALIDATE_CERTS'])
),
proxy_host=dict(
type='str',
required=False,
default=None,
fallback=(env_fallback, ['VMWARE_PROXY_HOST'])
),
proxy_port=dict(
type='int',
required=False,
default=None,
fallback=(env_fallback, ['VMWARE_PROXY_PORT'])
),
)
10 changes: 6 additions & 4 deletions plugins/modules/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
- module: community.vmware.vmware_cluster_ha
- module: community.vmware.vmware_cluster_vsan
extends_documentation_fragment:
- vmware.vmware.vmware.documentation
- vmware.vmware.vmware.base_documentation
'''

EXAMPLES = r'''
Expand Down Expand Up @@ -92,8 +92,10 @@
from ansible.module_utils._text import to_native

from ansible_collections.vmware.vmware.plugins.module_utils._vmware import (
PyVmomi,
vmware_argument_spec
PyVmomi
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_argument_spec import (
base_argument_spec
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_tasks import (
TaskError,
Expand Down Expand Up @@ -182,7 +184,7 @@ def get_cluster_outputs(self):
def main():
module = AnsibleModule(
argument_spec={
**vmware_argument_spec(), **dict(
**base_argument_spec(), **dict(
cluster=dict(type='str', required=True, aliases=['cluster_name', 'name']),
datacenter=dict(type='str', required=True, aliases=['datacenter_name']),
state=dict(type='str', default='present', choices=['absent', 'present']),
Expand Down
10 changes: 6 additions & 4 deletions plugins/modules/cluster_dpm.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
choices: [ 1, 2, 3, 4, 5 ]
extends_documentation_fragment:
- vmware.vmware.vmware.documentation
- vmware.vmware.vmware.base_documentation
'''

EXAMPLES = r'''
Expand Down Expand Up @@ -110,8 +110,10 @@

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.vmware.vmware.plugins.module_utils._vmware import (
PyVmomi,
vmware_argument_spec
PyVmomi
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_argument_spec import (
base_argument_spec
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_tasks import (
TaskError,
Expand Down Expand Up @@ -208,7 +210,7 @@ def apply_dpm_configuration(self):
def main():
module = AnsibleModule(
argument_spec={
**vmware_argument_spec(), **dict(
**base_argument_spec(), **dict(
cluster=dict(type='str', required=True, aliases=['cluster_name']),
datacenter=dict(type='str', required=True, aliases=['datacenter_name']),
enable=dict(type='bool', default=True),
Expand Down
10 changes: 6 additions & 4 deletions plugins/modules/cluster_drs.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
default: false
extends_documentation_fragment:
- vmware.vmware.vmware.documentation
- vmware.vmware.vmware.base_documentation
'''

EXAMPLES = r'''
Expand Down Expand Up @@ -136,8 +136,10 @@

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.vmware.vmware.plugins.module_utils._vmware import (
PyVmomi,
vmware_argument_spec
PyVmomi
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_argument_spec import (
base_argument_spec
)
from ansible_collections.vmware.vmware.plugins.module_utils._vmware_tasks import (
TaskError,
Expand Down Expand Up @@ -246,7 +248,7 @@ def apply_drs_configuration(self):
def main():
module = AnsibleModule(
argument_spec={
**vmware_argument_spec(), **dict(
**base_argument_spec(), **dict(
cluster=dict(type='str', required=True, aliases=['cluster_name']),
datacenter=dict(type='str', required=True, aliases=['datacenter_name']),
enable=dict(type='bool', default=True),
Expand Down
Loading

0 comments on commit 9d32d91

Please sign in to comment.