From 2af67f0dce9e31fe1ea8de5b0bcb323cf915a958 Mon Sep 17 00:00:00 2001 From: Wojciech Wypior Date: Tue, 6 Aug 2019 18:11:02 +0100 Subject: [PATCH] fixes issue with RD encoding in names (#59990) fixes issue with file download function on ASM file transfer endpoints corrects doc fragments removes not used parameters corrects various sanity failures previously ignored across multiple modules --- lib/ansible/module_utils/network/f5/common.py | 15 +- .../module_utils/network/f5/icontrol.py | 39 ++ .../network/f5/bigip_apm_policy_import.py | 1 + .../network/f5/bigip_asm_policy_fetch.py | 6 +- .../modules/network/f5/bigip_cli_alias.py | 7 + .../modules/network/f5/bigip_cli_script.py | 6 + .../modules/network/f5/bigip_command.py | 6 + .../modules/network/f5/bigip_config.py | 1 + .../modules/network/f5/bigip_device_dns.py | 1 + .../modules/network/f5/bigip_device_info.py | 222 +++++++- .../network/f5/bigip_firewall_log_profile.py | 1 + .../network/f5/bigip_gtm_topology_region.py | 1 + .../modules/network/f5/bigip_iapp_template.py | 1 + .../bigip_message_routing_transport_config.py | 1 + .../modules/network/f5/bigip_monitor_dns.py | 1 + lib/ansible/modules/network/f5/bigip_node.py | 1 + .../network/f5/bigip_profile_client_ssl.py | 1 + .../modules/network/f5/bigip_profile_http.py | 2 +- .../modules/network/f5/bigip_provision.py | 295 +++++++++-- lib/ansible/modules/network/f5/bigip_ucs.py | 2 +- lib/ansible/modules/network/f5/bigip_user.py | 4 +- lib/ansible/modules/network/f5/bigip_vlan.py | 2 +- .../f5/bigiq_application_fastl4_tcp.py | 3 +- .../f5/bigiq_application_fastl4_udp.py | 1 + .../f5/bigiq_application_https_offload.py | 1 + .../network/f5/bigiq_device_discovery.py | 1 + lib/ansible/plugins/doc_fragments/f5.py | 6 +- test/sanity/ignore.txt | 476 ------------------ 28 files changed, 556 insertions(+), 548 deletions(-) diff --git a/lib/ansible/module_utils/network/f5/common.py b/lib/ansible/module_utils/network/f5/common.py index 21910e57a92..9b3aa710922 100644 --- a/lib/ansible/module_utils/network/f5/common.py +++ b/lib/ansible/module_utils/network/f5/common.py @@ -32,6 +32,7 @@ f5_provider_spec = { ), 'server_port': dict( type='int', + default=443, fallback=(env_fallback, ['F5_SERVER_PORT']) ), 'user': dict( @@ -47,6 +48,7 @@ f5_provider_spec = { ), 'validate_certs': dict( type='bool', + default='yes', fallback=(env_fallback, ['F5_VALIDATE_CERTS']) ), 'transport': dict( @@ -55,7 +57,6 @@ f5_provider_spec = { ), 'timeout': dict(type='int'), 'auth_provider': dict(), - 'proxy_to': dict(), } f5_argument_spec = { @@ -171,8 +172,8 @@ def run_commands(module, commands, check_rc=True): def flatten_boolean(value): - truthy = list(BOOLEANS_TRUE) + ['enabled', 'True'] - falsey = list(BOOLEANS_FALSE) + ['disabled', 'False'] + truthy = list(BOOLEANS_TRUE) + ['enabled', 'True', 'true'] + falsey = list(BOOLEANS_FALSE) + ['disabled', 'False', 'false'] if value is None: return None elif value in truthy: @@ -251,6 +252,7 @@ def transform_name(partition='', name='', sub_path=''): if name: name = name.replace('/', '~') + name = name.replace('%', '%25') if partition: partition = partition.replace('/', '~') @@ -415,7 +417,6 @@ class F5BaseClient(object): self.merge_provider_auth_provider_param(result, provider) self.merge_provider_user_param(result, provider) self.merge_provider_password_param(result, provider) - self.merge_proxy_to_param(result, provider) return result @@ -490,12 +491,6 @@ class F5BaseClient(object): else: result['password'] = None - def merge_proxy_to_param(self, result, provider): - if self.validate_params('proxy_to', provider): - result['proxy_to'] = provider['proxy_to'] - else: - result['proxy_to'] = None - class AnsibleF5Parameters(object): def __init__(self, *args, **kwargs): diff --git a/lib/ansible/module_utils/network/f5/icontrol.py b/lib/ansible/module_utils/network/f5/icontrol.py index 57d0bb727b9..1b596cf5f46 100644 --- a/lib/ansible/module_utils/network/f5/icontrol.py +++ b/lib/ansible/module_utils/network/f5/icontrol.py @@ -296,6 +296,45 @@ class TransactionContextManager(object): raise Exception +def download_asm_file(client, url, dest): + """Download an ASM file from the remote device + + This method handles issues with ASM file endpoints that allow + downloads of ASM objects on the BIG-IP. + + Arguments: + client (object): The F5RestClient connection object. + url (string): The URL to download. + dest (string): The location on (Ansible controller) disk to store the file. + + Returns: + bool: True on success. False otherwise. + """ + + with open(dest, 'wb') as fileobj: + headers = { + 'Content-Type': 'application/json' + } + data = {'headers': headers, + 'verify': False + } + + response = client.api.get(url, headers=headers, json=data) + if response.status == 200: + if 'Content-Length' not in response.headers: + error_message = "The Content-Length header is not present." + raise F5ModuleError(error_message) + + length = response.headers['Content-Length'] + + if int(length) > 0: + fileobj.write(response.content) + else: + error = "Invalid Content-Length value returned: %s ," \ + "the value should be greater than 0" % length + raise F5ModuleError(error) + + def download_file(client, url, dest): """Download a file from the remote device diff --git a/lib/ansible/modules/network/f5/bigip_apm_policy_import.py b/lib/ansible/modules/network/f5/bigip_apm_policy_import.py index 9ea91d6af73..94ee3d3f6a4 100644 --- a/lib/ansible/modules/network/f5/bigip_apm_policy_import.py +++ b/lib/ansible/modules/network/f5/bigip_apm_policy_import.py @@ -46,6 +46,7 @@ options: partition: description: - Device partition to manage resources on. + type: str default: Common notes: - Due to ID685681 it is not possible to execute ng_* tools via REST api on v12.x and 13.x, once this is fixed diff --git a/lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py b/lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py index aeea033e26f..52b0c1345df 100644 --- a/lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py +++ b/lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py @@ -183,7 +183,7 @@ try: from library.module_utils.network.f5.common import fq_name from library.module_utils.network.f5.common import f5_argument_spec from library.module_utils.network.f5.common import flatten_boolean - from library.module_utils.network.f5.icontrol import download_file + from library.module_utils.network.f5.icontrol import download_asm_file from library.module_utils.network.f5.icontrol import module_provisioned except ImportError: from ansible.module_utils.network.f5.bigip import F5RestClient @@ -192,7 +192,7 @@ except ImportError: from ansible.module_utils.network.f5.common import fq_name from ansible.module_utils.network.f5.common import f5_argument_spec from ansible.module_utils.network.f5.common import flatten_boolean - from ansible.module_utils.network.f5.icontrol import download_file + from ansible.module_utils.network.f5.icontrol import download_asm_file from ansible.module_utils.network.f5.icontrol import module_provisioned @@ -592,7 +592,7 @@ class ModuleManager(object): self.want.file ) try: - download_file(self.client, url, dest) + download_asm_file(self.client, url, dest) except F5ModuleError: raise F5ModuleError( "Failed to download the file." diff --git a/lib/ansible/modules/network/f5/bigip_cli_alias.py b/lib/ansible/modules/network/f5/bigip_cli_alias.py index 1d3d2db8d90..656f85d0da0 100644 --- a/lib/ansible/modules/network/f5/bigip_cli_alias.py +++ b/lib/ansible/modules/network/f5/bigip_cli_alias.py @@ -23,11 +23,13 @@ options: name: description: - Specifies the name of the alias. + type: str required: True scope: description: - The scope of the alias; whether it is shared on the system, or usable only for the user who created it. + type: str default: shared choices: - private @@ -35,18 +37,22 @@ options: command: description: - The command to alias. + type: str description: description: - Description of the alias. + type: str partition: description: - Device partition to manage resources on. - This parameter is disregarded when the C(scope) is C(private). + type: str default: Common state: description: - When C(present), ensures that the resource exists. - When C(absent), ensures the resource is removed. + type: str default: present choices: - present @@ -54,6 +60,7 @@ options: extends_documentation_fragment: f5 author: - Tim Rupp (@caphrim007) + - Wojciech Wypior (@wojtek0806) ''' EXAMPLES = r''' diff --git a/lib/ansible/modules/network/f5/bigip_cli_script.py b/lib/ansible/modules/network/f5/bigip_cli_script.py index 1d7b5bf71de..d9f1b3441c1 100644 --- a/lib/ansible/modules/network/f5/bigip_cli_script.py +++ b/lib/ansible/modules/network/f5/bigip_cli_script.py @@ -25,6 +25,7 @@ options: name: description: - Specifies the name of the script. + type: str required: True content: description: @@ -32,17 +33,21 @@ options: - This parameter is typically used in conjunction with Ansible's C(file), or template lookup plugins. If this sounds foreign to you, see the examples in this documentation. + type: str description: description: - Description of the cli script. + type: str partition: description: - Device partition to manage resources on. + type: str default: Common state: description: - When C(present), ensures that the script exists. - When C(absent), ensures the script is removed. + type: str default: present choices: - present @@ -50,6 +55,7 @@ options: extends_documentation_fragment: f5 author: - Tim Rupp (@caphrim007) + - Wojciech Wypior (@wojtek0806) ''' EXAMPLES = r''' diff --git a/lib/ansible/modules/network/f5/bigip_command.py b/lib/ansible/modules/network/f5/bigip_command.py index e312eabf504..ac39547273d 100644 --- a/lib/ansible/modules/network/f5/bigip_command.py +++ b/lib/ansible/modules/network/f5/bigip_command.py @@ -39,6 +39,7 @@ options: logic that is outside of C(tmsh) (such as grep'ing, awk'ing or other shell related things that are not C(tmsh), this behavior is not supported. required: True + type: raw wait_for: description: - Specifies what to evaluate from the output of the command @@ -46,6 +47,7 @@ options: the task to wait for a particular conditional to be true before moving forward. If the conditional is not true by the configured retries, the task fails. See examples. + type: list aliases: ['waitfor'] match: description: @@ -55,6 +57,7 @@ options: then all conditionals in the I(wait_for) must be satisfied. If the value is set to C(any) then only one of the values must be satisfied. + type: str choices: - any - all @@ -65,6 +68,7 @@ options: before it is considered failed. The command is run on the target device every retry and evaluated against the I(wait_for) conditionals. + type: int default: 10 interval: description: @@ -72,6 +76,7 @@ options: of the command. If the command does not pass the specified conditional, the interval indicates how to long to wait before trying the command again. + type: int default: 1 transport: description: @@ -97,6 +102,7 @@ options: chdir: description: - Change into this directory before running the command. + type: str version_added: 2.6 extends_documentation_fragment: f5 author: diff --git a/lib/ansible/modules/network/f5/bigip_config.py b/lib/ansible/modules/network/f5/bigip_config.py index 1ce3186ab5d..6ac426a5e51 100644 --- a/lib/ansible/modules/network/f5/bigip_config.py +++ b/lib/ansible/modules/network/f5/bigip_config.py @@ -50,6 +50,7 @@ options: C(tmsh) command C(load sys config from-terminal merge). - If you need to read configuration from a file or template, use Ansible's C(file) or C(template) lookup plugins respectively. + type: str verify: description: - Validates the specified configuration to see whether they are diff --git a/lib/ansible/modules/network/f5/bigip_device_dns.py b/lib/ansible/modules/network/f5/bigip_device_dns.py index 7a03e89e5fc..2a9c8c6d746 100644 --- a/lib/ansible/modules/network/f5/bigip_device_dns.py +++ b/lib/ansible/modules/network/f5/bigip_device_dns.py @@ -44,6 +44,7 @@ options: ip_version: description: - Specifies whether the DNS specifies IP addresses using IPv4 or IPv6. + type: int choices: - 4 - 6 diff --git a/lib/ansible/modules/network/f5/bigip_device_info.py b/lib/ansible/modules/network/f5/bigip_device_info.py index 79a3b268ed3..6d914fc0870 100644 --- a/lib/ansible/modules/network/f5/bigip_device_info.py +++ b/lib/ansible/modules/network/f5/bigip_device_info.py @@ -90,6 +90,7 @@ options: - traffic-groups - trunks - udp-profiles + - users - vcmp-guests - virtual-addresses - virtual-servers @@ -153,6 +154,7 @@ options: - "!traffic-groups" - "!trunks" - "!udp-profiles" + - "!users" - "!vcmp-guests" - "!virtual-addresses" - "!virtual-servers" @@ -6088,6 +6090,53 @@ udp_profiles: type: bool sample: yes sample: hash/dictionary of values +users: + description: Details of the users on the system + returned: When C(users) is specified in C(gather_subset). + type: complex + contains: + description: + description: + - Description of the resource. + returned: queried + type: str + sample: Admin user + full_path: + description: + - Full name of the resource as known to BIG-IP. + returned: queried + type: str + sample: admin + name: + description: + - Relative name of the resource in BIG-IP. + returned: queried + type: str + sample: admin + partition_access: + description: + - Partition that user has access to, including user role. + returned: queried + type: complex + contains: + name: + description: + - Name of patition + returned: queried + type: str + sample: all-partitions + role: + description: + - Role allowed to user on parition + returned: queried + type: str + sample: auditor + shell: + description: + - The shell assigned to the user account + returned: queried + type: str + sample: tmsh vcmp_guests: description: vCMP related information. returned: When C(vcmp-guests) is specified in C(gather_subset). @@ -6165,6 +6214,12 @@ vcmp_guests: returned: queried type: str sample: bridged + vlans: + description: + - List of VLANs on which the guest is either enabled or disabled. + returned: queried + type: list + sample: ['/Common/vlan1', '/Common/vlan2'] min_number_of_slots: description: - Specifies the minimum number of slots that the guest must be assigned to. @@ -14529,6 +14584,88 @@ class TrunksFactManager(BaseManager): return {} +class UsersParameters(BaseParameters): + api_map = { + 'fullPath': 'full_path', + 'partitionAccess': 'partition_access', + } + + returnables = [ + 'full_path', + 'name', + 'description', + 'partition_access', + 'shell', + ] + + @property + def partition_access(self): + result = [] + if self._values['partition_access'] is None: + return [] + for partition in self._values['partition_access']: + del partition['nameReference'] + result.append(partition) + return result + + @property + def shell(self): + if self._values['shell'] in [None, 'none']: + return None + return self._values['shell'] + + +class UsersFactManager(BaseManager): + def __init__(self, *args, **kwargs): + self.client = kwargs.get('client', None) + self.module = kwargs.get('module', None) + super(UsersFactManager, self).__init__(**kwargs) + self.want = UsersParameters(params=self.module.params) + + def exec_module(self): + facts = self._exec_module() + result = dict(users=facts) + return result + + def _exec_module(self): + results = [] + facts = self.read_facts() + for item in facts: + attrs = item.to_return() + results.append(attrs) + results = sorted(results, key=lambda k: k['full_path']) + return results + + def read_facts(self): + results = [] + collection = self.read_collection_from_device() + for resource in collection: + attrs = resource + params = UsersParameters(params=attrs) + results.append(params) + return results + + def read_collection_from_device(self): + uri = "https://{0}:{1}/mgmt/tm/auth/user".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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) + if 'items' not in response: + return [] + result = response['items'] + return result + + class UdpProfilesParameters(BaseParameters): api_map = { 'fullPath': 'full_path', @@ -14672,6 +14809,7 @@ class VcmpGuestsParameters(BaseParameters): 'mgmt_route', 'mgmt_address', 'mgmt_network', + 'vlans', 'min_number_of_slots', 'number_of_slots', 'ssl_mode', @@ -15241,20 +15379,85 @@ class VirtualServersParameters(BaseParameters): return False def _read_current_message_routing_profiles_from_device(self): - collection1 = self.client.api.tm.ltm.profile.diameters.get_collection() - collection2 = self.client.api.tm.ltm.profile.sips.get_collection() - result = [x.name for x in collection1] - result += [x.name for x in collection2] + result = [] + result += self._read_diameter_profiles_from_device() + result += self._read_sip_profiles_from_device() + return result + + def _read_diameter_profiles_from_device(self): + uri = "https://{0}:{1}/mgmt/tm/ltm/profile/diameter/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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) + result = [x['name'] for x in response['items']] + return result + + def _read_sip_profiles_from_device(self): + uri = "https://{0}:{1}/mgmt/tm/ltm/profile/sip/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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) + result = [x['name'] for x in response['items']] return result def _read_current_fastl4_profiles_from_device(self): - collection = self.client.api.tm.ltm.profile.fastl4s.get_collection() - result = [x.name for x in collection] + uri = "https://{0}:{1}/mgmt/tm/ltm/profile/fastl4/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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) + result = [x['name'] for x in response['items']] return result def _read_current_fasthttp_profiles_from_device(self): - collection = self.client.api.tm.ltm.profile.fasthttps.get_collection() - result = [x.name for x in collection] + uri = "https://{0}:{1}/mgmt/tm/ltm/profile/fasthttp/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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) + result = [x['name'] for x in response['items']] return result @property @@ -15760,6 +15963,7 @@ class ModuleManager(object): 'traffic-groups': TrafficGroupsFactManager, 'trunks': TrunksFactManager, 'udp-profiles': UdpProfilesFactManager, + 'users': UsersFactManager, 'vcmp-guests': VcmpGuestsFactManager, 'virtual-addresses': VirtualAddressesFactManager, 'virtual-servers': VirtualServersFactManager, @@ -15959,6 +16163,7 @@ class ArgumentSpec(object): 'traffic-groups', 'trunks', 'udp-profiles', + 'users', 'vcmp-guests', 'virtual-addresses', 'virtual-servers', @@ -16026,6 +16231,7 @@ class ArgumentSpec(object): '!traffic-groups', '!trunks', '!udp-profiles', + '!users', '!vcmp-guests', '!virtual-addresses', '!virtual-servers', diff --git a/lib/ansible/modules/network/f5/bigip_firewall_log_profile.py b/lib/ansible/modules/network/f5/bigip_firewall_log_profile.py index 47600626eea..77320041735 100644 --- a/lib/ansible/modules/network/f5/bigip_firewall_log_profile.py +++ b/lib/ansible/modules/network/f5/bigip_firewall_log_profile.py @@ -100,6 +100,7 @@ options: - To specify the log_publisher on a different partition from the AFM log profile, specify the name in fullpath format, e.g. C(/Foobar/log-publisher), otherwise the partition for log publisher is inferred from C(partition) module parameter. + type: str rate_limit: description: - Defines a rate limit for all combined port misuse log messages per second. Beyond this rate limit, diff --git a/lib/ansible/modules/network/f5/bigip_gtm_topology_region.py b/lib/ansible/modules/network/f5/bigip_gtm_topology_region.py index 4cf784e68dd..8d019348e50 100644 --- a/lib/ansible/modules/network/f5/bigip_gtm_topology_region.py +++ b/lib/ansible/modules/network/f5/bigip_gtm_topology_region.py @@ -23,6 +23,7 @@ options: name: description: - Specifies the name of the region. + type: str required: True region_members: description: diff --git a/lib/ansible/modules/network/f5/bigip_iapp_template.py b/lib/ansible/modules/network/f5/bigip_iapp_template.py index f59e74ed4e9..21b40d63d36 100644 --- a/lib/ansible/modules/network/f5/bigip_iapp_template.py +++ b/lib/ansible/modules/network/f5/bigip_iapp_template.py @@ -65,6 +65,7 @@ options: partition: description: - Device partition to manage resources on. + type: str default: Common extends_documentation_fragment: f5 author: diff --git a/lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py b/lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py index 85e9d7bf1df..fe64faa7a34 100644 --- a/lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py +++ b/lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py @@ -42,6 +42,7 @@ options: description: - Specifies the type of source address translation associated with the specified transport config. - When set to C(snat) the C(pool) parameter needs to contain a name for a valid LSN or SNAT pool. + type: str choices: - snat - none diff --git a/lib/ansible/modules/network/f5/bigip_monitor_dns.py b/lib/ansible/modules/network/f5/bigip_monitor_dns.py index 5069d98eed2..c1af44afaf4 100644 --- a/lib/ansible/modules/network/f5/bigip_monitor_dns.py +++ b/lib/ansible/modules/network/f5/bigip_monitor_dns.py @@ -23,6 +23,7 @@ options: name: description: - Specifies the name of the monitor. + type: str required: True parent: description: diff --git a/lib/ansible/modules/network/f5/bigip_node.py b/lib/ansible/modules/network/f5/bigip_node.py index a83c8ffc1ad..856284cdaeb 100644 --- a/lib/ansible/modules/network/f5/bigip_node.py +++ b/lib/ansible/modules/network/f5/bigip_node.py @@ -186,6 +186,7 @@ options: - Monitor rule type when C(monitors) is specified. - When creating a new pool, if this value is not specified, the default of 'all' will be used. + type: str choices: - all - at_least diff --git a/lib/ansible/modules/network/f5/bigip_profile_client_ssl.py b/lib/ansible/modules/network/f5/bigip_profile_client_ssl.py index 852864a4a7f..63ac5851907 100644 --- a/lib/ansible/modules/network/f5/bigip_profile_client_ssl.py +++ b/lib/ansible/modules/network/f5/bigip_profile_client_ssl.py @@ -138,6 +138,7 @@ options: - Specifies the fully qualified DNS hostname of the server used in Server Name Indication communications. When creating a new profile, the setting is provided by the parent profile. - The server name can also be a wildcard string containing the asterisk C(*) character. + type: str version_added: 2.8 sni_default: description: diff --git a/lib/ansible/modules/network/f5/bigip_profile_http.py b/lib/ansible/modules/network/f5/bigip_profile_http.py index e8bacf62265..683aadb5f90 100644 --- a/lib/ansible/modules/network/f5/bigip_profile_http.py +++ b/lib/ansible/modules/network/f5/bigip_profile_http.py @@ -1719,7 +1719,7 @@ class ArgumentSpec(object): poll_interval=dict(type='int'), poll_interval_global=dict(type='bool'), sampling_rate=dict(type='int'), - sampling_rate_global=dict(type='int'), + sampling_rate_global=dict(type='bool'), ) ), state=dict( diff --git a/lib/ansible/modules/network/f5/bigip_provision.py b/lib/ansible/modules/network/f5/bigip_provision.py index 6832b6261bf..4643f6d34e5 100644 --- a/lib/ansible/modules/network/f5/bigip_provision.py +++ b/lib/ansible/modules/network/f5/bigip_provision.py @@ -38,9 +38,12 @@ options: - ilx - lc - ltm + - mgmt - pem - sam + - sslo - swg + - urldb - vcmp aliases: - name @@ -51,21 +54,38 @@ options: For example, changing one module to C(dedicated) requires setting all others to C(none). Setting the level of a module to C(none) means that the module is not activated. - - This parameter is not relevant to C(cgnat) and will not be applied to the - C(cgnat) module. + - Use c(state) absent to set c(level) to none and de-provision module. + - This parameter is not relevant to C(cgnat - pre tmos 15.0) or C(mgmt) and will not be + applied to the C(cgnat - pre tmos 15.0) or C(mgmt) module. type: str choices: - dedicated - nominal - minimum default: nominal + memory: + description: + - Sets additional memory for management module. This is in addition to + minimum allocated RAM of 1264MB. + - The accepted value range is C(0 - 8192). Maximum value is restricted by + systems available RAM. + - Specifying C(large) reserves an additional 500MB for mgmt module. + - Specifying C(medium) reserves an additional 200MB for mgmt module. + - Specifying C(small) reserves no additional RAM for mgmt module. + - Use Large for configurations containing more than 2000 objects, or + more specifically, for any configuration that exceeds 1000 objects + per 2 GB of installed memory. Changing the Management C(mgmt) size + after initial provisioning causes a reprovision operation + type: str + version_added: 2.9 state: description: - The state of the provisioned module on the system. When C(present), guarantees that the specified module is provisioned at the requested level provided that there are sufficient resources on the device (such - as physical RAM) to support the provisioned module. When C(absent), - de-provision the module. + as physical RAM) to support the provisioned module. + - When C(absent), de-provision the module. + - C(absent), is not a relevent option to C(mgmt) module as module can not be de-provisioned. type: str choices: - present @@ -74,6 +94,7 @@ options: extends_documentation_fragment: f5 author: - Tim Rupp (@caphrim007) + - Greg Crosby (@crosbygw) ''' EXAMPLES = r''' @@ -96,6 +117,16 @@ EXAMPLES = r''' password: secret user: admin delegate_to: localhost + +- name: Provision mgmt with medium amount of memory. + bigip_provision: + module: mgmt + memory: medium + provider: + server: lb.mydomain.com + password: secret + user: admin + delegate_to: localhost ''' RETURN = r''' @@ -104,11 +135,17 @@ level: returned: changed type: str sample: minimum +memory: + description: The new provisioned amount of memory for mgmt module. + returned: changed + type: str + sample: large ''' import time from ansible.module_utils.basic import AnsibleModule +from distutils.version import LooseVersion try: from library.module_utils.network.f5.bigip import F5RestClient @@ -116,28 +153,36 @@ try: 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.icontrol import TransactionContextManager + from library.module_utils.network.f5.icontrol import tmos_version 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.icontrol import TransactionContextManager + from ansible.module_utils.network.f5.icontrol import tmos_version class Parameters(AnsibleF5Parameters): - api_attributes = ['level'] + api_map = { + 'value': 'memory', + } - returnables = ['level'] + api_attributes = [ + 'level', + 'value', + ] - updatables = ['level', 'cgnat'] + returnables = [ + 'level', + 'memory', + ] - @property - def level(self): - if self._values['level'] is None: - return None - if self.state == 'absent': - return 'none' - return str(self._values['level']) + updatables = [ + 'level', + 'cgnat', + 'memory', + ] class ApiParameters(Parameters): @@ -145,7 +190,37 @@ class ApiParameters(Parameters): class ModuleParameters(Parameters): - pass + + def _validate_memory_limit(self, limit): + if self._values['memory'] == 'small': + return '0' + if self._values['memory'] == 'medium': + return '200' + if self._values['memory'] == 'large': + return '500' + if 0 <= int(limit) <= 8192: + return str(limit) + raise F5ModuleError( + "Valid 'memory' must be in range 0 - 8192, 'small', 'medium', or 'large'." + ) + + @property + def level(self): + if self._values['level'] is None: + return None + if self._values['module'] == 'mgmt': + return None + if self.state == 'absent': + return 'none' + return str(self._values['level']) + + @property + def memory(self): + if self._values['memory'] is None: + return None + if self._values['module'] != 'mgmt': + return None + return int(self._validate_memory_limit(self._values['memory'])) class Changes(Parameters): @@ -165,7 +240,17 @@ class UsableChanges(Changes): class ReportableChanges(Changes): - pass + @property + def memory(self): + if self._values['memory'] is None: + return None + if self._values['memory'] == '0': + return 'small' + if self._values['memory'] == '200': + return 'medium' + if self._values['memory'] == '500': + return 'large' + return str(self._values['memory']) class Difference(object): @@ -234,19 +319,26 @@ class ModuleManager(object): changed = self.present() elif state == "absent": changed = self.absent() - - changes = self.changes.to_return() + reportable = ReportableChanges(params=self.changes.to_return()) + changes = reportable.to_return() result.update(**changes) result.update(dict(changed=changed)) return result + def version_is_greater_or_equal_15(self): + version = tmos_version(self.client) + if LooseVersion(version) >= LooseVersion('15.0.0'): + return True + else: + return False + def present(self): if self.exists(): return False return self.update() def exists(self): - if self.want.module == 'cgnat': + if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15(): uri = "https://{0}:{1}/mgmt/tm/sys/feature-module/cgnat/".format( self.client.provider['server'], self.client.provider['server_port'], @@ -257,7 +349,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -266,6 +358,25 @@ class ModuleManager(object): return False elif 'enabled' in response and response['enabled'] is True: return True + elif self.want.module == 'mgmt': + uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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 + if str(response['value']) != 0 and self.want.memory == 0: + return False + if str(response['value']) == 0 and self.want.memory == 0: + return True + if str(response['value']) == self.want.memory: + return True + return False try: for x in range(0, 5): uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format( @@ -279,7 +390,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -303,11 +414,9 @@ class ModuleManager(object): return False if self.module.check_mode: return True - result = self.update_on_device() - if self.want.module == 'cgnat': + if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15(): return result - self._wait_for_module_provisioning() if self.want.module == 'vcmp': @@ -318,6 +427,10 @@ class ModuleManager(object): self._wait_for_asm_ready() if self.want.module == 'afm': self._wait_for_afm_ready() + if self.want.module == 'cgnat': + self._wait_for_cgnat_ready() + if self.want.module == 'mgmt': + self._wait_for_mgmt_ready() return True def should_reboot(self): @@ -334,7 +447,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -404,11 +517,11 @@ class ModuleManager(object): return False def update_on_device(self): - if self.want.module == 'cgnat': + if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15(): if self.changes.cgnat: return self.provision_cgnat_on_device() return False - elif self.want.level == 'dedicated': + elif self.want.level == 'dedicated' and self.want.module != 'mgmt': self.provision_dedicated_on_device() else: self.provision_non_dedicated_on_device() @@ -425,7 +538,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -444,7 +557,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -461,7 +574,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -474,7 +587,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -482,25 +595,31 @@ class ModuleManager(object): def provision_non_dedicated_on_device(self): params = self.want.api_params() - uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format( - self.client.provider['server'], - self.client.provider['server_port'], - self.want.module - ) + if self.want.module == 'mgmt': + uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + else: + uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format( + self.client.provider['server'], + self.client.provider['server_port'], + self.want.module + ) 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 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: raise F5ModuleError(resp.content) def read_current_from_device(self): - if self.want.module == 'cgnat': + if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15(): uri = "https://{0}:{1}/mgmt/tm/sys/feature-module/cgnat/".format( self.client.provider['server'], self.client.provider['server_port'], @@ -511,12 +630,27 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: raise F5ModuleError(resp.content) + elif self.want.module == 'mgmt': + uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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'] in [400, 404]: + if 'message' in response: + raise F5ModuleError(response['message']) + else: + raise F5ModuleError(resp.content) else: uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format( self.client.provider['server'], @@ -529,7 +663,7 @@ class ModuleManager(object): except ValueError as ex: raise F5ModuleError(str(ex)) - if 'code' in response and response['code'] == 400: + if 'code' in response and response['code'] in [400, 404]: if 'message' in response: raise F5ModuleError(response['message']) else: @@ -544,7 +678,7 @@ class ModuleManager(object): def remove(self): if self.module.check_mode: return True - if self.want.module == 'cgnat': + if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15(): return self.deprovision_cgnat_on_device() self.remove_from_device() @@ -760,6 +894,78 @@ class ModuleManager(object): pass time.sleep(5) + def _wait_for_cgnat_ready(self): + """Waits specifically for CGNAT + + Starting in TMOS 15.0 cgnat can take longer to actually start up than all the previous checks take. + This check here is specifically waiting for a cgnat API to stop raising + errors. + :return: + """ + nops = 0 + while nops < 3: + try: + uri = "https://{0}:{1}/mgmt/tm/ltm/lsn-pool".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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'] in [400, 403]: + if 'message' in response: + raise F5ModuleError(response['message']) + else: + raise F5ModuleError(resp.content) + + if len(response['items']) >= 0: + nops += 1 + else: + nops = 0 + except Exception as ex: + pass + time.sleep(5) + + def _wait_for_mgmt_ready(self): + """Waits specifically for CGNAT + + Modifying memory reserve for mgmt can take longer to actually start up than all the previous checks take. + This check here is specifically waiting for a cgnat API to stop raising + errors. + :return: + """ + nops = 0 + while nops < 3: + try: + uri = "https://{0}:{1}/mgmt/tm".format( + self.client.provider['server'], + self.client.provider['server_port'], + ) + 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'] in [400, 403]: + if 'message' in response: + raise F5ModuleError(response['message']) + else: + raise F5ModuleError(resp.content) + + if len(response['items']) >= 0: + nops += 1 + else: + nops = 0 + except Exception as ex: + pass + time.sleep(5) + def _restart_asm(self): try: params = dict( @@ -848,9 +1054,9 @@ class ArgumentSpec(object): module=dict( required=True, choices=[ - 'afm', 'am', 'sam', 'asm', 'avr', 'fps', - 'gtm', 'lc', 'ltm', 'pem', 'swg', 'ilx', - 'apm', 'vcmp', 'cgnat' + 'afm', 'am', 'apm', 'asm', 'avr', 'cgnat', + 'fps', 'gtm', 'ilx', 'lc', 'ltm', 'mgmt', + 'pem', 'sam', 'sslo', 'swg', 'urldb', 'vcmp' ], aliases=['name'] ), @@ -858,6 +1064,7 @@ class ArgumentSpec(object): default='nominal', choices=['nominal', 'dedicated', 'minimum'] ), + memory=dict(), state=dict( default='present', choices=['present', 'absent'] diff --git a/lib/ansible/modules/network/f5/bigip_ucs.py b/lib/ansible/modules/network/f5/bigip_ucs.py index 7c9fcfd7baa..a3c7f592ba4 100644 --- a/lib/ansible/modules/network/f5/bigip_ucs.py +++ b/lib/ansible/modules/network/f5/bigip_ucs.py @@ -58,7 +58,7 @@ options: passphrase: description: - Specifies the passphrase that is necessary to load the specified UCS file. - type: bool + type: str reset_trust: description: - When specified, the device and trust domain certs and keys are not diff --git a/lib/ansible/modules/network/f5/bigip_user.py b/lib/ansible/modules/network/f5/bigip_user.py index ee224704ec1..78bb6a6456e 100644 --- a/lib/ansible/modules/network/f5/bigip_user.py +++ b/lib/ansible/modules/network/f5/bigip_user.py @@ -1068,9 +1068,9 @@ class ArgumentSpec(object): def __init__(self): self.supports_check_mode = True argument_spec = dict( - name=dict( + username_credential=dict( required=True, - aliases=['username_credential'] + aliases=['name'] ), password_credential=dict( no_log=True, diff --git a/lib/ansible/modules/network/f5/bigip_vlan.py b/lib/ansible/modules/network/f5/bigip_vlan.py index f69f11b3130..f48cb0a8ff1 100644 --- a/lib/ansible/modules/network/f5/bigip_vlan.py +++ b/lib/ansible/modules/network/f5/bigip_vlan.py @@ -902,7 +902,7 @@ class ArgumentSpec(object): options=dict( interface=dict(), tagging=dict( - choice=['tagged', 'untagged'] + choices=['tagged', 'untagged'] ) ) ), diff --git a/lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py b/lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py index aa176d8e060..d6207886cdc 100644 --- a/lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py +++ b/lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py @@ -53,6 +53,7 @@ options: inbound_virtual: description: - Settings to configure the virtual which will receive the inbound connection. + type: dict suboptions: address: description: @@ -72,8 +73,8 @@ options: - The port that the virtual listens for connections on. - When creating a new application, if this parameter is not specified, the default value of C(8080) will be used. + type: str default: 8080 - type: dict service_environment: description: - Specifies the name of service environment that the application will be diff --git a/lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py b/lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py index ff0d78963b8..7f0cc5fdd63 100644 --- a/lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py +++ b/lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py @@ -53,6 +53,7 @@ options: inbound_virtual: description: - Settings to configure the virtual which will receive the inbound connection. + type: dict suboptions: address: description: diff --git a/lib/ansible/modules/network/f5/bigiq_application_https_offload.py b/lib/ansible/modules/network/f5/bigiq_application_https_offload.py index 9f623f8a7c4..6dff4a59be8 100644 --- a/lib/ansible/modules/network/f5/bigiq_application_https_offload.py +++ b/lib/ansible/modules/network/f5/bigiq_application_https_offload.py @@ -152,6 +152,7 @@ options: - Specifies the name of service environment or the hostname of the BIG-IP that the application will be deployed to. - When creating a new application, this parameter is required. + type: str add_analytics: description: - Collects statistics of the BIG-IP that the application is deployed to. diff --git a/lib/ansible/modules/network/f5/bigiq_device_discovery.py b/lib/ansible/modules/network/f5/bigiq_device_discovery.py index ded36f1ece2..d0440f9164f 100644 --- a/lib/ansible/modules/network/f5/bigiq_device_discovery.py +++ b/lib/ansible/modules/network/f5/bigiq_device_discovery.py @@ -119,6 +119,7 @@ options: statistics: description: - Specify the statistics collection for discovered device. + type: dict suboptions: enable: description: diff --git a/lib/ansible/plugins/doc_fragments/f5.py b/lib/ansible/plugins/doc_fragments/f5.py index 2535bf6f11b..e247021e3cf 100644 --- a/lib/ansible/plugins/doc_fragments/f5.py +++ b/lib/ansible/plugins/doc_fragments/f5.py @@ -52,7 +52,6 @@ options: for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. type: int - default: 10 ssh_keyfile: description: - Specifies the SSH keyfile to use to authenticate the connection to @@ -66,6 +65,11 @@ options: type: str choices: [ cli, rest ] default: rest + auth_provider: + description: + - Configures the auth provider for to obtain authentication tokens from the remote device. + - This option is really used when working with BIG-IQ devices. + type: str notes: - For more information on using Ansible to manage F5 Networks devices see U(https://www.ansible.com/integrations/networks/f5). - Requires BIG-IP software version >= 12. diff --git a/test/sanity/ignore.txt b/test/sanity/ignore.txt index 82ef715cbf2..dff84c62d07 100644 --- a/test/sanity/ignore.txt +++ b/test/sanity/ignore.txt @@ -3682,504 +3682,28 @@ lib/ansible/modules/network/exos/exos_command.py validate-modules:E338 lib/ansible/modules/network/exos/exos_config.py validate-modules:E337 lib/ansible/modules/network/exos/exos_config.py validate-modules:E338 lib/ansible/modules/network/exos/exos_facts.py validate-modules:E337 -lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E324 lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E337 lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E322 -lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E324 lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E337 -lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E338 -lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E322 -lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E324 lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E337 lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_command.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_command.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_command.py validate-modules:E337 -lib/ansible/modules/network/f5/bigip_command.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_config.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_config.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_config.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E337 -lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E324 lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E326 -lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E324 lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E335 -lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E338 lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E324 lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E326 lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E337 lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E338 lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E340 -lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_node.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_node.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_node.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E338 lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E324 lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E326 lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E337 lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E338 lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E340 lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E324 lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E326 lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E337 lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E338 lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E340 -lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E325 -lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E335 -lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_user.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_user.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_user.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E326 -lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E338 -lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E322 -lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E324 -lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E337 -lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E337 -lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E338 -lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E322 -lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E324 -lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E338 lib/ansible/modules/network/fortimanager/fmgr_device.py validate-modules:E337 lib/ansible/modules/network/fortimanager/fmgr_device_config.py validate-modules:E337 lib/ansible/modules/network/fortimanager/fmgr_device_group.py validate-modules:E337