|
|
|
@ -27,9 +27,7 @@ options:
|
|
|
|
|
description:
|
|
|
|
|
- Specifies to which Simple Network Management Protocol (SNMP) version
|
|
|
|
|
the trap destination applies.
|
|
|
|
|
choices:
|
|
|
|
|
- 1
|
|
|
|
|
- 2c
|
|
|
|
|
choices: ['1', '2c']
|
|
|
|
|
community:
|
|
|
|
|
description:
|
|
|
|
|
- Specifies the community name for the trap destination.
|
|
|
|
@ -45,14 +43,18 @@ options:
|
|
|
|
|
- Specifies the name of the trap network. This option is not supported in
|
|
|
|
|
versions of BIG-IP < 12.1.0. If used on versions < 12.1.0, it will simply
|
|
|
|
|
be ignored.
|
|
|
|
|
- The value C(default) was removed in BIG-IP version 13.1.0. Specifying this
|
|
|
|
|
value when configuring a BIG-IP will cause the module to stop and report
|
|
|
|
|
an error. The usual remedy is to choose one of the other options, such as
|
|
|
|
|
C(management).
|
|
|
|
|
choices:
|
|
|
|
|
- other
|
|
|
|
|
- management
|
|
|
|
|
- default
|
|
|
|
|
state:
|
|
|
|
|
description:
|
|
|
|
|
- When C(present), ensures that the cloud connector exists. When
|
|
|
|
|
C(absent), ensures that the cloud connector does not exist.
|
|
|
|
|
- When C(present), ensures that the resource exists.
|
|
|
|
|
- When C(absent), ensures that the resource does not exist.
|
|
|
|
|
default: present
|
|
|
|
|
choices:
|
|
|
|
|
- present
|
|
|
|
@ -132,30 +134,23 @@ from ansible.module_utils.basic import AnsibleModule
|
|
|
|
|
from ansible.module_utils.basic import env_fallback
|
|
|
|
|
from distutils.version import LooseVersion
|
|
|
|
|
|
|
|
|
|
HAS_DEVEL_IMPORTS = False
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# Sideband repository used for dev
|
|
|
|
|
from library.module_utils.network.f5.bigip import HAS_F5SDK
|
|
|
|
|
from library.module_utils.network.f5.bigip import F5Client
|
|
|
|
|
from library.module_utils.network.f5.common import F5ModuleError
|
|
|
|
|
from library.module_utils.network.f5.common import AnsibleF5Parameters
|
|
|
|
|
from library.module_utils.network.f5.common import cleanup_tokens
|
|
|
|
|
from library.module_utils.network.f5.common import fqdn_name
|
|
|
|
|
from library.module_utils.network.f5.common import f5_argument_spec
|
|
|
|
|
try:
|
|
|
|
|
from library.module_utils.network.f5.common import iControlUnexpectedHTTPError
|
|
|
|
|
except ImportError:
|
|
|
|
|
HAS_F5SDK = False
|
|
|
|
|
HAS_DEVEL_IMPORTS = True
|
|
|
|
|
except ImportError:
|
|
|
|
|
# Upstream Ansible
|
|
|
|
|
from ansible.module_utils.network.f5.bigip import HAS_F5SDK
|
|
|
|
|
from ansible.module_utils.network.f5.bigip import F5Client
|
|
|
|
|
from ansible.module_utils.network.f5.common import F5ModuleError
|
|
|
|
|
from ansible.module_utils.network.f5.common import AnsibleF5Parameters
|
|
|
|
|
from ansible.module_utils.network.f5.common import cleanup_tokens
|
|
|
|
|
from ansible.module_utils.network.f5.common import fqdn_name
|
|
|
|
|
from ansible.module_utils.network.f5.common import f5_argument_spec
|
|
|
|
|
try:
|
|
|
|
|
from ansible.module_utils.network.f5.common import iControlUnexpectedHTTPError
|
|
|
|
@ -190,7 +185,36 @@ class Parameters(AnsibleF5Parameters):
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NetworkedParameters(Parameters):
|
|
|
|
|
class V3Parameters(Parameters):
|
|
|
|
|
updatables = [
|
|
|
|
|
'snmp_version', 'community', 'destination', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
returnables = [
|
|
|
|
|
'snmp_version', 'community', 'destination', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
api_attributes = [
|
|
|
|
|
'version', 'community', 'host', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def network(self):
|
|
|
|
|
if self._values['network'] is None:
|
|
|
|
|
return None
|
|
|
|
|
network = str(self._values['network'])
|
|
|
|
|
if network == 'management':
|
|
|
|
|
return 'mgmt'
|
|
|
|
|
elif network == 'default':
|
|
|
|
|
raise F5ModuleError(
|
|
|
|
|
"'default' is not a valid option for this version of BIG-IP. "
|
|
|
|
|
"Use either 'management', 'or 'other' instead."
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class V2Parameters(Parameters):
|
|
|
|
|
updatables = [
|
|
|
|
|
'snmp_version', 'community', 'destination', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
@ -216,7 +240,7 @@ class NetworkedParameters(Parameters):
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NonNetworkedParameters(Parameters):
|
|
|
|
|
class V1Parameters(Parameters):
|
|
|
|
|
updatables = [
|
|
|
|
|
'snmp_version', 'community', 'destination', 'port'
|
|
|
|
|
]
|
|
|
|
@ -241,20 +265,20 @@ class ModuleManager(object):
|
|
|
|
|
self.kwargs = kwargs
|
|
|
|
|
|
|
|
|
|
def exec_module(self):
|
|
|
|
|
if self.is_version_non_networked():
|
|
|
|
|
manager = NonNetworkedManager(**self.kwargs)
|
|
|
|
|
if self.is_version_without_network():
|
|
|
|
|
manager = V1Manager(**self.kwargs)
|
|
|
|
|
elif self.is_version_with_default_network():
|
|
|
|
|
manager = V2Manager(**self.kwargs)
|
|
|
|
|
else:
|
|
|
|
|
manager = NetworkedManager(**self.kwargs)
|
|
|
|
|
manager = V3Manager(**self.kwargs)
|
|
|
|
|
|
|
|
|
|
return manager.exec_module()
|
|
|
|
|
|
|
|
|
|
def is_version_non_networked(self):
|
|
|
|
|
"""Checks to see if the TMOS version is less than 13
|
|
|
|
|
|
|
|
|
|
Anything less than BIG-IP 13.x does not support users
|
|
|
|
|
on different partitions.
|
|
|
|
|
def is_version_without_network(self):
|
|
|
|
|
"""Is current BIG-IP version missing "network" value support
|
|
|
|
|
|
|
|
|
|
:return: Bool
|
|
|
|
|
Returns:
|
|
|
|
|
bool: True when it is missing. False otherwise.
|
|
|
|
|
"""
|
|
|
|
|
version = self.client.api.tmos_version
|
|
|
|
|
if LooseVersion(version) < LooseVersion('12.1.0'):
|
|
|
|
@ -262,6 +286,18 @@ class ModuleManager(object):
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def is_version_with_default_network(self):
|
|
|
|
|
"""Is current BIG-IP version missing "default" network value support
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
bool: True when it is missing. False otherwise.
|
|
|
|
|
"""
|
|
|
|
|
version = self.client.api.tmos_version
|
|
|
|
|
if LooseVersion(version) < LooseVersion('13.1.0'):
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BaseManager(object):
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
@ -365,33 +401,72 @@ class BaseManager(object):
|
|
|
|
|
result.delete()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NetworkedManager(BaseManager):
|
|
|
|
|
class V3Manager(BaseManager):
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super(V3Manager, self).__init__(**kwargs)
|
|
|
|
|
self.required_resources = [
|
|
|
|
|
'version', 'community', 'destination', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
|
self.want = V3Parameters(params=self.module.params)
|
|
|
|
|
self.changes = V3Parameters()
|
|
|
|
|
|
|
|
|
|
def _set_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in V3Parameters.returnables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
changed[key] = getattr(self.want, key)
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = V3Parameters(params=changed)
|
|
|
|
|
|
|
|
|
|
def _update_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in V3Parameters.updatables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
attr1 = getattr(self.want, key)
|
|
|
|
|
attr2 = getattr(self.have, key)
|
|
|
|
|
if attr1 != attr2:
|
|
|
|
|
changed[key] = attr1
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = V3Parameters(params=changed)
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def read_current_from_device(self):
|
|
|
|
|
resource = self.client.api.tm.sys.snmp.traps_s.trap.load(
|
|
|
|
|
name=self.want.name,
|
|
|
|
|
partition=self.want.partition
|
|
|
|
|
)
|
|
|
|
|
result = resource.attrs
|
|
|
|
|
return V3Parameters(params=result)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class V2Manager(BaseManager):
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super(NetworkedManager, self).__init__(**kwargs)
|
|
|
|
|
super(V2Manager, self).__init__(**kwargs)
|
|
|
|
|
self.required_resources = [
|
|
|
|
|
'version', 'community', 'destination', 'port', 'network'
|
|
|
|
|
]
|
|
|
|
|
self.want = NetworkedParameters(params=self.module.params)
|
|
|
|
|
self.changes = NetworkedParameters()
|
|
|
|
|
self.want = V2Parameters(params=self.module.params)
|
|
|
|
|
self.changes = V2Parameters()
|
|
|
|
|
|
|
|
|
|
def _set_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in NetworkedParameters.returnables:
|
|
|
|
|
for key in V2Parameters.returnables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
changed[key] = getattr(self.want, key)
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = NetworkedParameters(params=changed)
|
|
|
|
|
self.changes = V2Parameters(params=changed)
|
|
|
|
|
|
|
|
|
|
def _update_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in NetworkedParameters.updatables:
|
|
|
|
|
for key in V2Parameters.updatables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
attr1 = getattr(self.want, key)
|
|
|
|
|
attr2 = getattr(self.have, key)
|
|
|
|
|
if attr1 != attr2:
|
|
|
|
|
changed[key] = attr1
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = NetworkedParameters(params=changed)
|
|
|
|
|
self.changes = V2Parameters(params=changed)
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -402,7 +477,7 @@ class NetworkedManager(BaseManager):
|
|
|
|
|
)
|
|
|
|
|
result = resource.attrs
|
|
|
|
|
self._ensure_network(result)
|
|
|
|
|
return NetworkedParameters(params=result)
|
|
|
|
|
return V2Parameters(params=result)
|
|
|
|
|
|
|
|
|
|
def _ensure_network(self, result):
|
|
|
|
|
# BIG-IP's value for "default" is that the key does not
|
|
|
|
@ -415,33 +490,33 @@ class NetworkedManager(BaseManager):
|
|
|
|
|
result['network'] = 'default'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NonNetworkedManager(BaseManager):
|
|
|
|
|
class V1Manager(BaseManager):
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super(NonNetworkedManager, self).__init__(**kwargs)
|
|
|
|
|
super(V1Manager, self).__init__(**kwargs)
|
|
|
|
|
self.required_resources = [
|
|
|
|
|
'version', 'community', 'destination', 'port'
|
|
|
|
|
]
|
|
|
|
|
self.want = NonNetworkedParameters(params=self.module.params)
|
|
|
|
|
self.changes = NonNetworkedParameters()
|
|
|
|
|
self.want = V1Parameters(params=self.module.params)
|
|
|
|
|
self.changes = V1Parameters()
|
|
|
|
|
|
|
|
|
|
def _set_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in NonNetworkedParameters.returnables:
|
|
|
|
|
for key in V1Parameters.returnables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
changed[key] = getattr(self.want, key)
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = NonNetworkedParameters(params=changed)
|
|
|
|
|
self.changes = V1Parameters(params=changed)
|
|
|
|
|
|
|
|
|
|
def _update_changed_options(self):
|
|
|
|
|
changed = {}
|
|
|
|
|
for key in NonNetworkedParameters.updatables:
|
|
|
|
|
for key in V1Parameters.updatables:
|
|
|
|
|
if getattr(self.want, key) is not None:
|
|
|
|
|
attr1 = getattr(self.want, key)
|
|
|
|
|
attr2 = getattr(self.have, key)
|
|
|
|
|
if attr1 != attr2:
|
|
|
|
|
changed[key] = attr1
|
|
|
|
|
if changed:
|
|
|
|
|
self.changes = NonNetworkedParameters(params=changed)
|
|
|
|
|
self.changes = V1Parameters(params=changed)
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -451,7 +526,7 @@ class NonNetworkedManager(BaseManager):
|
|
|
|
|
partition=self.want.partition
|
|
|
|
|
)
|
|
|
|
|
result = resource.attrs
|
|
|
|
|
return NonNetworkedParameters(params=result)
|
|
|
|
|
return V1Parameters(params=result)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ArgumentSpec(object):
|
|
|
|
@ -464,7 +539,7 @@ class ArgumentSpec(object):
|
|
|
|
|
snmp_version=dict(
|
|
|
|
|
choices=['1', '2c']
|
|
|
|
|
),
|
|
|
|
|
community=dict(),
|
|
|
|
|
community=dict(no_log=True),
|
|
|
|
|
destination=dict(),
|
|
|
|
|
port=dict(),
|
|
|
|
|
network=dict(
|
|
|
|
|