diff options
Diffstat (limited to 'lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py')
-rw-r--r-- | lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py | 651 |
1 files changed, 0 insertions, 651 deletions
diff --git a/lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py b/lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py deleted file mode 100644 index 74d5e208e6..0000000000 --- a/lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py +++ /dev/null @@ -1,651 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright: (c) 2017, F5 Networks Inc. -# 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': 'certified'} - -DOCUMENTATION = r''' ---- -module: bigip_monitor_tcp_half_open -short_description: Manages F5 BIG-IP LTM tcp half-open monitors -description: Manages F5 BIG-IP LTM tcp half-open monitors. -version_added: 2.4 -options: - name: - description: - - Monitor name. - type: str - required: True - parent: - description: - - The parent template of this monitor template. Once this value has - been set, it cannot be changed. By default, this value is the C(tcp_half_open) - parent on the C(Common) partition. - type: str - default: /Common/tcp_half_open - description: - description: - - The description of the monitor. - type: str - version_added: 2.7 - ip: - description: - - IP address part of the IP/port definition. If this parameter is not - provided when creating a new monitor, then the default value will be - '*'. - - If this value is an IP address, and the C(type) is C(tcp) (the default), - then a C(port) number must be specified. - type: str - port: - description: - - Port address part of the IP/port definition. If this parameter is not - provided when creating a new monitor, then the default value will be - '*'. Note that if specifying an IP address, a value between 1 and 65535 - must be specified - type: str - version_added: 2.5 - interval: - description: - - The interval specifying how frequently the monitor instance of this - template will run. If this parameter is not provided when creating - a new monitor, then the default value will be 5. This value B(must) - be less than the C(timeout) value. - type: int - timeout: - description: - - The number of seconds in which the node or service must respond to - the monitor request. If the target responds within the set time - period, it is considered up. If the target does not respond within - the set time period, it is considered down. You can change this - number to any number you want, however, it should be 3 times the - interval number of seconds plus 1 second. If this parameter is not - provided when creating a new monitor, then the default value will be 16. - type: int - time_until_up: - description: - - Specifies the amount of time in seconds after the first successful - response before a node will be marked up. A value of 0 will cause a - node to be marked up immediately after a valid response is received - from the node. If this parameter is not provided when creating - a new monitor, then the default value will be 0. - type: int - partition: - description: - - Device partition to manage resources on. - type: str - default: Common - version_added: 2.5 - state: - description: - - When C(present), ensures that the monitor exists. - - When C(absent), ensures the monitor is removed. - type: str - choices: - - present - - absent - default: present - version_added: 2.5 -notes: - - Requires BIG-IP software version >= 12 -extends_documentation_fragment: f5 -author: - - Tim Rupp (@caphrim007) - - Wojciech Wypior (@wojtek0806) -''' - -EXAMPLES = r''' -- name: Create TCP half-open Monitor - bigip_monitor_tcp_half_open: - state: present - ip: 10.10.10.10 - name: my_tcp_monitor - provider: - server: lb.mydomain.com - user: admin - password: secret - delegate_to: localhost - -- name: Remove TCP half-open Monitor - bigip_monitor_tcp_half_open: - state: absent - name: my_tcp_monitor - provider: - server: lb.mydomain.com - user: admin - password: secret - delegate_to: localhost - -- name: Add half-open monitor for all addresses, port 514 - bigip_monitor_tcp_half_open: - port: 514 - name: my_tcp_monitor - provider: - password: secret - server: lb.mydomain.com - user: admin - delegate_to: localhost -''' - -RETURN = r''' -parent: - description: New parent template of the monitor. - returned: changed - type: str - sample: tcp -description: - description: The description of the monitor. - returned: changed - type: str - sample: Important Monitor -ip: - description: The new IP of IP/port definition. - returned: changed - type: str - sample: 10.12.13.14 -interval: - description: The new interval in which to run the monitor check. - returned: changed - type: int - sample: 2 -timeout: - description: The new timeout in which the remote system must respond to the monitor. - returned: changed - type: int - sample: 10 -time_until_up: - description: The new time in which to mark a system as up after first successful response. - returned: changed - type: int - sample: 2 -''' - -import os - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.basic import env_fallback - - -try: - from library.module_utils.network.f5.bigip import F5RestClient - 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 f5_argument_spec - from library.module_utils.network.f5.common import transform_name - from library.module_utils.network.f5.ipaddress import is_valid_ip - from library.module_utils.network.f5.compare import cmp_str_with_none -except ImportError: - from ansible.module_utils.network.f5.bigip import F5RestClient - 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 f5_argument_spec - from ansible.module_utils.network.f5.common import transform_name - from ansible.module_utils.network.f5.ipaddress import is_valid_ip - from ansible.module_utils.network.f5.compare import cmp_str_with_none - - -class Parameters(AnsibleF5Parameters): - api_map = { - 'timeUntilUp': 'time_until_up', - 'defaultsFrom': 'parent', - 'recv': 'receive', - } - - api_attributes = [ - 'timeUntilUp', - 'defaultsFrom', - 'interval', - 'timeout', - 'destination', - 'description', - ] - - returnables = [ - 'parent', - 'ip', - 'port', - 'interval', - 'timeout', - 'time_until_up', - 'description', - ] - - updatables = [ - 'destination', - 'interval', - 'timeout', - 'time_until_up', - 'description', - ] - - @property - def destination(self): - if self.ip is None and self.port is None: - return None - destination = '{0}:{1}'.format(self.ip, self.port) - return destination - - @destination.setter - def destination(self, value): - ip, port = value.split(':') - self._values['ip'] = ip - self._values['port'] = port - - @property - def interval(self): - if self._values['interval'] is None: - return None - - # Per BZ617284, the BIG-IP UI does not raise a warning about this. - # So I raise the error instead. - if 1 > int(self._values['interval']) > 86400: - raise F5ModuleError( - "Interval value must be between 1 and 86400" - ) - return int(self._values['interval']) - - @property - def timeout(self): - if self._values['timeout'] is None: - return None - return int(self._values['timeout']) - - @property - def ip(self): - if self._values['ip'] is None: - return None - elif self._values['ip'] in ['*', '0.0.0.0']: - return '*' - elif is_valid_ip(self._values['ip']): - return self._values['ip'] - raise F5ModuleError( - "The provided 'ip' parameter is not an IP address." - ) - - @property - def port(self): - if self._values['port'] is None: - return None - elif self._values['port'] == '*': - return '*' - return int(self._values['port']) - - @property - def time_until_up(self): - if self._values['time_until_up'] is None: - return None - return int(self._values['time_until_up']) - - @property - def parent(self): - if self._values['parent'] is None: - return None - if self._values['parent'].startswith('/'): - parent = os.path.basename(self._values['parent']) - result = '/{0}/{1}'.format(self.partition, parent) - else: - result = '/{0}/{1}'.format(self.partition, self._values['parent']) - return result - - @property - def type(self): - return 'tcp_half_open' - - -class ApiParameters(Parameters): - @property - def description(self): - if self._values['description'] in [None, 'none']: - return None - return self._values['description'] - - -class ModuleParameters(Parameters): - @property - def description(self): - if self._values['description'] is None: - return None - elif self._values['description'] in ['none', '']: - return '' - return self._values['description'] - - -class Changes(Parameters): - def to_return(self): - result = {} - try: - for returnable in self.returnables: - result[returnable] = getattr(self, returnable) - result = self._filter_params(result) - except Exception: - pass - return result - - -class UsableChanges(Changes): - pass - - -class ReportableChanges(Changes): - pass - - -class Difference(object): - def __init__(self, want, have=None): - self.want = want - self.have = have - - def compare(self, param): - try: - result = getattr(self, param) - return result - except AttributeError: - result = self.__default(param) - return result - - @property - def parent(self): - if self.want.parent != self.have.parent: - raise F5ModuleError( - "The parent monitor cannot be changed" - ) - - @property - def destination(self): - if self.want.ip is None and self.want.port is None: - return None - if self.want.port is None: - self.want.update({'port': self.have.port}) - if self.want.ip is None: - self.want.update({'ip': self.have.ip}) - - if self.want.port in [None, '*'] and self.want.ip != '*': - raise F5ModuleError( - "Specifying an IP address requires that a port number be specified" - ) - - if self.want.destination != self.have.destination: - return self.want.destination - - @property - def interval(self): - if self.want.timeout is not None and self.want.interval is not None: - if self.want.interval >= self.want.timeout: - raise F5ModuleError( - "Parameter 'interval' must be less than 'timeout'." - ) - elif self.want.timeout is not None: - if self.have.interval >= self.want.timeout: - raise F5ModuleError( - "Parameter 'interval' must be less than 'timeout'." - ) - elif self.want.interval is not None: - if self.want.interval >= self.have.timeout: - raise F5ModuleError( - "Parameter 'interval' must be less than 'timeout'." - ) - if self.want.interval != self.have.interval: - return self.want.interval - - def __default(self, param): - attr1 = getattr(self.want, param) - try: - attr2 = getattr(self.have, param) - if attr1 != attr2: - return attr1 - except AttributeError: - return attr1 - - @property - def description(self): - return cmp_str_with_none(self.want.description, self.have.description) - - -class ModuleManager(object): - def __init__(self, *args, **kwargs): - self.module = kwargs.get('module', None) - self.client = F5RestClient(**self.module.params) - self.want = ModuleParameters(params=self.module.params) - self.have = ApiParameters() - self.changes = UsableChanges() - - def _set_changed_options(self): - changed = {} - for key in Parameters.returnables: - if getattr(self.want, key) is not None: - changed[key] = getattr(self.want, key) - if changed: - self.changes = UsableChanges(params=changed) - - def _update_changed_options(self): - diff = Difference(self.want, self.have) - updatables = Parameters.updatables - changed = dict() - for k in updatables: - change = diff.compare(k) - if change is None: - continue - else: - if isinstance(change, dict): - changed.update(change) - else: - changed[k] = change - if changed: - self.changes = UsableChanges(params=changed) - return True - return False - - def should_update(self): - result = self._update_changed_options() - if result: - return True - return False - - def exec_module(self): - changed = False - result = dict() - state = self.want.state - - if state == "present": - changed = self.present() - elif state == "absent": - changed = self.absent() - - reportable = ReportableChanges(params=self.changes.to_return()) - changes = reportable.to_return() - result.update(**changes) - result.update(dict(changed=changed)) - self._announce_deprecations(result) - return result - - def _announce_deprecations(self, result): - warnings = result.pop('__warnings', []) - for warning in warnings: - self.client.module.deprecate( - msg=warning['msg'], - version=warning['version'] - ) - - def present(self): - if self.exists(): - return self.update() - else: - return self.create() - - def exists(self): - uri = "https://{0}:{1}/mgmt/tm/ltm/monitor/tcp-half-open/{2}".format( - self.client.provider['server'], - self.client.provider['server_port'], - transform_name(self.want.partition, self.want.name) - ) - resp = self.client.api.get(uri) - try: - response = resp.json() - except ValueError: - return False - if resp.status == 404 or 'code' in response and response['code'] == 404: - return False - return True - - def update(self): - self.have = self.read_current_from_device() - if not self.should_update(): - return False - if self.module.check_mode: - return True - self.update_on_device() - return True - - def remove(self): - if self.module.check_mode: - return True - self.remove_from_device() - if self.exists(): - raise F5ModuleError("Failed to delete the resource.") - return True - - def create(self): - self._set_changed_options() - self._set_default_creation_values() - if self.module.check_mode: - return True - self.create_on_device() - return True - - def _set_default_creation_values(self): - if self.want.timeout is None: - self.want.update({'timeout': 16}) - if self.want.interval is None: - self.want.update({'interval': 5}) - if self.want.time_until_up is None: - self.want.update({'time_until_up': 0}) - if self.want.ip is None: - self.want.update({'ip': '*'}) - if self.want.port is None: - self.want.update({'port': '*'}) - - def create_on_device(self): - params = self.changes.api_params() - params['name'] = self.want.name - params['partition'] = self.want.partition - uri = "https://{0}:{1}/mgmt/tm/ltm/monitor/tcp-half-open/".format( - self.client.provider['server'], - self.client.provider['server_port'] - ) - resp = self.client.api.post(uri, json=params) - try: - response = resp.json() - except ValueError as ex: - raise F5ModuleError(str(ex)) - - if 'code' in response and response['code'] in [400, 403]: - if 'message' in response: - raise F5ModuleError(response['message']) - else: - raise F5ModuleError(resp.content) - - def update_on_device(self): - params = self.changes.api_params() - uri = "https://{0}:{1}/mgmt/tm/ltm/monitor/tcp-half-open/{2}".format( - self.client.provider['server'], - self.client.provider['server_port'], - transform_name(self.want.partition, self.want.name) - ) - resp = self.client.api.patch(uri, json=params) - try: - response = resp.json() - except ValueError as ex: - raise F5ModuleError(str(ex)) - - if 'code' in response and response['code'] == 400: - if 'message' in response: - raise F5ModuleError(response['message']) - else: - raise F5ModuleError(resp.content) - - def absent(self): - if self.exists(): - return self.remove() - return False - - def remove_from_device(self): - uri = "https://{0}:{1}/mgmt/tm/ltm/monitor/tcp-half-open/{2}".format( - self.client.provider['server'], - self.client.provider['server_port'], - transform_name(self.want.partition, self.want.name) - ) - resp = self.client.api.delete(uri) - if resp.status == 200: - return True - - def read_current_from_device(self): - uri = "https://{0}:{1}/mgmt/tm/ltm/monitor/tcp-half-open/{2}".format( - self.client.provider['server'], - self.client.provider['server_port'], - transform_name(self.want.partition, self.want.name) - ) - resp = self.client.api.get(uri) - try: - response = resp.json() - except ValueError as ex: - raise F5ModuleError(str(ex)) - - if 'code' in response and response['code'] == 400: - if 'message' in response: - raise F5ModuleError(response['message']) - else: - raise F5ModuleError(resp.content) - return ApiParameters(params=response) - - -class ArgumentSpec(object): - def __init__(self): - self.supports_check_mode = True - argument_spec = dict( - name=dict(required=True), - parent=dict(default='/Common/tcp_half_open'), - description=dict(), - ip=dict(), - port=dict(), - interval=dict(type='int'), - timeout=dict(type='int'), - time_until_up=dict(type='int'), - state=dict( - default='present', - choices=['present', 'absent'] - ), - partition=dict( - default='Common', - fallback=(env_fallback, ['F5_PARTITION']) - ) - ) - self.argument_spec = {} - self.argument_spec.update(f5_argument_spec) - self.argument_spec.update(argument_spec) - - -def main(): - spec = ArgumentSpec() - - module = AnsibleModule( - argument_spec=spec.argument_spec, - supports_check_mode=spec.supports_check_mode, - ) - - try: - mm = ModuleManager(module=module) - results = mm.exec_module() - module.exit_json(**results) - except F5ModuleError as ex: - module.fail_json(msg=str(ex)) - - -if __name__ == '__main__': - main() |