adds multiple new parameters to bigip_profile_http (#58183)

This commit is contained in:
Wojciech Wypior 2019-06-21 15:16:48 +01:00 committed by Tim Rupp
parent 022b5d8b79
commit 655ad7456d

View file

@ -123,7 +123,7 @@ options:
version_added: 2.8 version_added: 2.8
server_agent_name: server_agent_name:
description: description:
- Specifies the string used as the server name in traffic generated by LTM. - Specifies the string used as the server name in traffic generated by BIG-IP.
- To remove the entry completely a value of C(none) or C('') should be set. - To remove the entry completely a value of C(none) or C('') should be set.
- When creating a new profile, if this parameter is not specified, the - When creating a new profile, if this parameter is not specified, the
default is provided by the parent profile. default is provided by the parent profile.
@ -150,10 +150,216 @@ options:
hsts_mode: hsts_mode:
description: description:
- When set to C(yes), enables the HSTS settings. - When set to C(yes), enables the HSTS settings.
- When creating a new profile, if this parameter is not specified, the - When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
default is provided by the parent profile.
type: bool type: bool
version_added: 2.8 version_added: 2.8
accept_xff:
description:
- Enables or disables trusting the client IP address, and statistics from the client IP address,
based on the request's XFF (X-forwarded-for) headers, if they exist.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: bool
version_added: 2.9
xff_alternative_names:
description:
- Specifies alternative XFF headers instead of the default X-forwarded-for header.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: list
version_added: 2.9
fallback_host:
description:
- Specifies an HTTP fallback host.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: str
version_added: 2.9
fallback_status_codes:
description:
- Specifies one or more HTTP error codes from server responses that should trigger
a redirection to the fallback host.
- The accepted valid error codes are as defined by rfc2616.
- The codes can be specified as individual items or as valid ranges e.g. C(400-417) or C(500-505).
- Mixing response code range across error types is invalid e.g. defining C(400-505) will raise an error.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: list
version_added: 2.9
oneconnect_transformations:
description:
- Enables the system to perform HTTP header transformations for the purpose of keeping server-side
connections open. This feature requires configuration of a OneConnect profile.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: bool
version_added: 2.9
request_chunking:
description:
- Specifies how to handle chunked and unchunked requests.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: str
choices:
- rechunk
- selective
- preserve
version_added: 2.9
response_chunking:
description:
- Specifies how to handle chunked and unchunked responses.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
type: str
choices:
- rechunk
- selective
- preserve
version_added: 2.9
enforcement:
description:
- Specifies protocol enforcement settings for the HTTP profile.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
suboptions:
truncated_redirects:
description:
- Specifies what happens if a truncated redirect is seen from a server.
- If C(yes), the redirect will be forwarded to the client, otherwise the malformed HTTP
will be silently ignored.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: bool
excess_client_headers:
description:
- Specifies the behavior when too many client headers are received.
- If set to C(pass-through), will switch to pass through mode, when C(reject) the connection will be rejected.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- reject
- pass-through
excess_server_headers:
description:
- Specifies the behavior when too many server headers are received.
- If set to C(pass-through), will switch to pass through mode, when C(reject) the connection will be rejected.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- reject
- pass-through
oversize_client_headers:
description:
- Specifies the behavior when too-large client headers are received.
- If set to C(pass-through), will switch to pass through mode, when C(reject) the connection will be rejected.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- reject
- pass-through
oversize_server_headers:
description:
- Specifies the behavior when too-large server headers are received.
- If set to C(pass-through), will switch to pass through mode, when C(reject) the connection will be rejected.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- reject
- pass-through
pipeline:
description:
- Enables HTTP/1.1 pipelining, allowing clients to make requests even when prior requests have not received
a response.
- In order for this to succeed, however, destination servers must include support for pipelining.
- If set to C(pass-through), pipelined data will cause the BIG-IP to immediately switch to pass-through mode
and disable the HTTP filter.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- allow
- reject
- pass-through
unknown_method:
description:
- Specifies whether to allow, reject or switch to pass-through mode when an unknown HTTP method is parsed.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
choices:
- allow
- reject
- pass-through
max_header_count:
description:
- Specifies the maximum number of headers allowed in HTTP request/response.
- The valid value range is between 16 and 4096 inclusive.
- When set to C(default) the value of this parameter will be C(64)
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
max_header_size:
description:
- Specifies the maximum header size specified in bytes.
- The valid value range is between 0 and 4294967295 inclusive.
- When set to C(default) the value of this parameter will be C(32768) bytes
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
max_requests:
description:
- Specifies the number of requests that the system accepts on a per-connection basis.
- The valid value range is between 0 and 4294967295 inclusive.
- When set to C(default) the value of this parameter will be C(0), which means the system
will not limit the number of requests per connection.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: str
known_methods:
description:
- Specifies which HTTP methods count as being known, removing RFC-defined methods from this list
will cause the HTTP filter to not recognize them.
- "The default list provided with the system include: C(CONNECT), C(DELETE), C(GET),
C(HEAD), C(LOCK), C(OPTIONS), C(POST), C(PROPFIND), C(PUT), C(TRACE) ,C(UNLOCK). The list can be appended by
by specifying C(default) keyword as one of the list elements."
- The C(default) keyword can also be used to restore the default C(known_methods) on the system.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: list
type: dict
version_added: 2.9
sflow:
description:
- Specifies sFlow settings for the HTTP profile.
- When creating a new profile, if this parameter is not specified, the default is provided by the parent profile.
suboptions:
poll_interval:
description:
- Specifies the maximum interval in seconds between two pollings.
- The valid value range is between 0 and 4294967295 seconds inclusive.
- For this setting to take effect the C(poll_interval_global) parameter must be set to C(no).
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: int
poll_interval_global:
description:
- Specifies whether the global HTTP poll-interval setting overrides the object-level Cpoll-interval setting.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: bool
sampling_rate:
description:
- Specifies the ratio of packets observed to the samples generated. For example, a sampling rate of C(2000)
specifies that 1 sample will be randomly generated for every 2000 packets observed.
- The valid value range is between 0 and 4294967295 packets inclusive.
- For this setting to take effect the C(sampling_rate_global) parameter must be set to C(no).
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: int
sampling_rate_global:
description:
- Specifies whether the global HTTP sampling-rate setting overrides the object-level sampling-rate setting.
- When creating a new profile, if this parameter is not specified, the default is provided
by the parent profile.
type: bool
type: dict
version_added: 2.9
partition: partition:
description: description:
- Device partition to manage resources on. - Device partition to manage resources on.
@ -208,6 +414,11 @@ EXAMPLES = r'''
''' '''
RETURN = r''' RETURN = r'''
parent:
description: Specifies the profile from which this profile inherits settings.
returned: changed
type: str
sample: /Common/http
description: description:
description: Description of the profile. description: Description of the profile.
returned: changed returned: changed
@ -218,6 +429,36 @@ proxy_type:
returned: changed returned: changed
type: str type: str
sample: explicit sample: explicit
hsts_mode:
description: Enables the HSTS settings.
returned: changed
type: bool
sample: no
maximum_age:
description: The maximum length of time, in seconds, that HSTS functionality requests that clients only use HTTPS.
returned: changed
type: str
sample: indefinite
include_subdomains:
description: Applies the HSTS policy to the HSTS host and its sub-domains.
returned: changed
type: bool
sample: yes
server_agent_name:
description: The string used as the server name in traffic generated by BIG-IP.
returned: changed
type: str
sample: foobar
header_erase:
description: The name of a header, in an HTTP request, which the system removes from request.
returned: changed
type: str
sample: FOO:BAR
header_insert:
description: The string that the system inserts as a header in an HTTP request.
returned: changed
type: str
sample: FOO:BAR
insert_xforwarded_for: insert_xforwarded_for:
description: Insert X-Forwarded-For-Header. description: Insert X-Forwarded-For-Header.
returned: changed returned: changed
@ -238,8 +479,126 @@ dns_resolver:
returned: changed returned: changed
type: str type: str
sample: '/Common/FooBar' sample: '/Common/FooBar'
accept_xff:
description: Enables or disables trusting the client IP address, and statistics from the client IP address.
returned: changed
type: bool
sample: yes
xff_alternative_names:
description: Specifies alternative XFF headers instead of the default X-forwarded-for header.
returned: changed
type: list
sample: ['FooBar', 'client1']
fallback_host:
description: Specifies an HTTP fallback host.
returned: changed
type: str
sample: 'foobar.com'
fallback_status_codes:
description: HTTP error codes from server responses that should trigger a redirection to the fallback host.
returned: changed
type: list
sample: ['400-404', '500', '501']
oneconnect_transformations:
description: Enables or disables HTTP header transformations.
returned: changed
type: bool
sample: no
request_chunking:
description: Specifies how to handle chunked and unchunked requests.
returned: changed
type: str
sample: rechunk
response_chunking:
description: Specifies how to handle chunked and unchunked responses.
returned: changed
type: str
sample: rechunk
enforcement:
description: Specifies protocol enforcement settings for the HTTP profile.
type: complex
returned: changed
contains:
truncated_redirects:
description: Specifies what happens if a truncated redirect is seen from a server.
returned: changed
type: bool
sample: yes
excess_server_headers:
description: Specifies the behavior when too many server headers are received.
returned: changed
type: str
sample: pass-through
oversize_client_headers:
description: Specifies the behavior when too-large client headers are received.
returned: changed
type: str
sample: reject
oversize_server_headers:
description: Specifies the behavior when too-large server headers are received.
returned: changed
type: str
sample: reject
pipeline:
description: Allows, rejects or switches to pass-through mode when dealing with pipelined data.
returned: changed
type: str
sample: allow
unknown_method:
description: Allows, rejects or switches to pass-through mode when an unknown HTTP method is parsed.
returned: changed
type: str
sample: allow
max_header_count:
description: The maximum number of headers allowed in HTTP request/response.
returned: changed
type: str
sample: 4096
max_header_size:
description: The maximum header size specified in bytes.
returned: changed
type: str
sample: default
max_requests:
description: The number of requests that the system accepts on a per-connection basis.
returned: changed
type: str
sample: default
known_methods:
description: The list of known HTTP methods.
returned: changed
type: list
sample: ['default', 'FOO', 'BAR']
sample: hash/dictionary of values
sflow:
description: Specifies sFlow settings for the HTTP profile.
type: complex
returned: changed
contains:
poll_interval:
description: Specifies the maximum interval in seconds between two pollings.
returned: changed
type: int
sample: 30
poll_interval_global:
description: Enables/Disables overriding HTTP poll-interval setting.
returned: changed
type: bool
sample: yes
sampling_rate:
description: Specifies the ratio of packets observed to the samples generated.
returned: changed
type: int
sample: 2000
sampling_rate_global:
description: Enables/Disables overriding HTTP sampling-rate setting.
returned: changed
type: bool
sample: yes
sample: hash/dictionary of values
''' '''
import re
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback from ansible.module_utils.basic import env_fallback
@ -251,6 +610,7 @@ try:
from library.module_utils.network.f5.common import f5_argument_spec 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.common import flatten_boolean
from library.module_utils.network.f5.common import transform_name from library.module_utils.network.f5.common import transform_name
from library.module_utils.network.f5.compare import cmp_simple_list
from library.module_utils.network.f5.urls import check_header_validity from library.module_utils.network.f5.urls import check_header_validity
except ImportError: except ImportError:
from ansible.module_utils.network.f5.bigip import F5RestClient from ansible.module_utils.network.f5.bigip import F5RestClient
@ -260,6 +620,7 @@ except ImportError:
from ansible.module_utils.network.f5.common import f5_argument_spec 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.common import flatten_boolean
from ansible.module_utils.network.f5.common import transform_name from ansible.module_utils.network.f5.common import transform_name
from ansible.module_utils.network.f5.compare import cmp_simple_list
from ansible.module_utils.network.f5.urls import check_header_validity from ansible.module_utils.network.f5.urls import check_header_validity
@ -278,6 +639,13 @@ class Parameters(AnsibleF5Parameters):
'includeSubdomains': 'include_subdomains', 'includeSubdomains': 'include_subdomains',
'maximumAge': 'maximum_age', 'maximumAge': 'maximum_age',
'mode': 'hsts_mode', 'mode': 'hsts_mode',
'acceptXff': 'accept_xff',
'xffAlternativeNames': 'xff_alternative_names',
'fallbackHost': 'fallback_host',
'fallbackStatusCodes': 'fallback_status_codes',
'oneconnectTransformations': 'oneconnect_transformations',
'requestChunking': 'request_chunking',
'responseChunking': 'response_chunking',
} }
api_attributes = [ api_attributes = [
@ -293,6 +661,15 @@ class Parameters(AnsibleF5Parameters):
'headerInsert', 'headerInsert',
'hsts', 'hsts',
'serverAgentName', 'serverAgentName',
'acceptXff',
'xffAlternativeNames',
'fallbackHost',
'fallbackStatusCodes',
'oneconnectTransformations',
'requestChunking',
'responseChunking',
'enforcement',
'sflow',
] ]
returnables = [ returnables = [
@ -310,6 +687,28 @@ class Parameters(AnsibleF5Parameters):
'server_agent_name', 'server_agent_name',
'header_erase', 'header_erase',
'header_insert', 'header_insert',
'accept_xff',
'xff_alternative_names',
'fallback_host',
'fallback_status_codes',
'oneconnect_transformations',
'request_chunking',
'response_chunking',
'truncated_redirects',
'excess_client_headers',
'excess_server_headers',
'oversize_client_headers',
'oversize_server_headers',
'pipeline',
'unknown_method',
'max_header_count',
'max_header_size',
'max_requests',
'known_methods',
'poll_interval',
'poll_interval_global',
'sampling_rate',
'sampling_rate_global',
] ]
updatables = [ updatables = [
@ -326,10 +725,92 @@ class Parameters(AnsibleF5Parameters):
'server_agent_name', 'server_agent_name',
'header_erase', 'header_erase',
'header_insert', 'header_insert',
'accept_xff',
'xff_alternative_names',
'fallback_host',
'fallback_status_codes',
'oneconnect_transformations',
'request_chunking',
'response_chunking',
'truncated_redirects',
'excess_client_headers',
'excess_server_headers',
'oversize_client_headers',
'oversize_server_headers',
'pipeline',
'unknown_method',
'max_header_count',
'max_header_size',
'max_requests',
'known_methods',
'poll_interval',
'poll_interval_global',
'sampling_rate',
'sampling_rate_global',
] ]
class ApiParameters(Parameters): class ApiParameters(Parameters):
@property
def poll_interval(self):
return self._values['sflow']['pollInterval']
@property
def poll_interval_global(self):
return self._values['sflow']['pollIntervalGlobal']
@property
def sampling_rate(self):
return self._values['sflow']['samplingRate']
@property
def sampling_rate_global(self):
return self._values['sflow']['samplingRateGlobal']
@property
def truncated_redirects(self):
return self._values['enforcement']['truncatedRedirects']
@property
def excess_client_headers(self):
return self._values['enforcement']['excessClientHeaders']
@property
def excess_server_headers(self):
return self._values['enforcement']['excessServerHeaders']
@property
def oversize_client_headers(self):
return self._values['enforcement']['oversizeClientHeaders']
@property
def oversize_server_headers(self):
return self._values['enforcement']['oversizeServerHeaders']
@property
def pipeline(self):
return self._values['enforcement']['pipeline']
@property
def unknown_method(self):
return self._values['enforcement']['unknownMethod']
@property
def max_header_count(self):
return self._values['enforcement']['maxHeaderCount']
@property
def max_header_size(self):
return self._values['enforcement']['maxHeaderSize']
@property
def max_requests(self):
return self._values['enforcement']['maxRequests']
@property
def known_methods(self):
return self._values['enforcement'].get('knownMethods', None)
@property @property
def dns_resolver(self): def dns_resolver(self):
if self._values['explicit_proxy'] is None: if self._values['explicit_proxy'] is None:
@ -364,6 +845,42 @@ class ApiParameters(Parameters):
class ModuleParameters(Parameters): class ModuleParameters(Parameters):
@property
def accept_xff(self):
result = flatten_boolean(self._values['accept_xff'])
if result is None:
return None
if result == 'yes':
return 'enabled'
return 'disabled'
@property
def fallback_status_codes(self):
if self._values['fallback_status_codes'] is None:
return None
p1 = r'(?!([4][0-1][0-7]))\d{3}'
p2 = r'(?!(50[0-5]))\d{3}'
for code in self._values['fallback_status_codes']:
match_4xx = re.search(p1, code)
if match_4xx:
match_5xx = re.search(p2, code)
if match_5xx:
raise F5ModuleError(
'Invalid HTTP error code or error code range specified.'
)
return self._values['fallback_status_codes']
@property
def oneconnect_transformations(self):
result = flatten_boolean(self._values['oneconnect_transformations'])
if result is None:
return None
if result == 'yes':
return 'enabled'
return 'disabled'
@property @property
def proxy_type(self): def proxy_type(self):
if self._values['proxy_type'] is None: if self._values['proxy_type'] is None:
@ -477,6 +994,153 @@ class ModuleParameters(Parameters):
check_header_validity(header_insert) check_header_validity(header_insert)
return header_insert return header_insert
@property
def excess_client_headers(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['excess_client_headers']
@property
def excess_server_headers(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['excess_server_headers']
@property
def oversize_client_headers(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['oversize_client_headers']
@property
def oversize_server_headers(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['oversize_server_headers']
@property
def pipeline(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['pipeline']
@property
def unknown_method(self):
if self._values['enforcement'] is None:
return None
return self._values['enforcement']['unknown_method']
@property
def truncated_redirects(self):
if self._values['enforcement'] is None:
return None
result = flatten_boolean(self._values['enforcement']['truncated_redirects'])
if result is None:
return None
if result == 'yes':
return 'enabled'
return 'disabled'
@property
def max_header_count(self):
if self._values['enforcement'] is None:
return None
if self._values['enforcement']['max_header_count'] is None:
return None
if self._values['enforcement']['max_header_count'] == 'default':
return 64
if 16 <= int(self._values['enforcement']['max_header_count']) <= 4096:
return int(self._values['enforcement']['max_header_count'])
raise F5ModuleError(
"Valid 'max_header_count' must be in range 16 - 4096, or 'default'."
)
@property
def max_header_size(self):
if self._values['enforcement'] is None:
return None
if self._values['enforcement']['max_header_size'] is None:
return None
if self._values['enforcement']['max_header_size'] == 'default':
return 32768
if 0 <= int(self._values['enforcement']['max_header_size']) <= 4294967295:
return int(self._values['enforcement']['max_header_size'])
raise F5ModuleError(
"Valid 'max_header_size' must be in range 0 - 4294967295, or 'default'."
)
@property
def max_requests(self):
if self._values['enforcement'] is None:
return None
if self._values['enforcement']['max_requests'] is None:
return None
if self._values['enforcement']['max_requests'] == 'default':
return 0
if 0 <= int(self._values['enforcement']['max_requests']) <= 4294967295:
return int(self._values['enforcement']['max_requests'])
raise F5ModuleError(
"Valid 'max_requests' must be in range 0 - 4294967295, or 'default'."
)
@property
def known_methods(self):
if self._values['enforcement'] is None:
return None
defaults = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'LOCK', 'OPTIONS', 'POST', 'PROPFIND', 'PUT', 'TRACE', 'UNLOCK']
known = self._values['enforcement']['known_methods']
if known is None:
return None
if len(known) == 1:
if known[0] == 'default':
return defaults
if known[0] == '':
return []
if 'default' in known:
to_return = [method for method in known if method != 'default']
to_return.extend(defaults)
return to_return
result = [method for method in known]
return result
@property
def poll_interval(self):
if self._values['sflow'] is None:
return None
if self._values['sflow']['poll_interval'] is None:
return None
if 0 <= self._values['sflow']['poll_interval'] <= 4294967295:
return self._values['sflow']['poll_interval']
raise F5ModuleError(
"Valid 'poll_interval' must be in range 0 - 4294967295 seconds."
)
@property
def sampling_rate(self):
if self._values['sflow'] is None:
return None
if self._values['sflow']['sampling_rate'] is None:
return None
if 0 <= self._values['sflow']['sampling_rate'] <= 4294967295:
return self._values['sflow']['sampling_rate']
raise F5ModuleError(
"Valid 'sampling_rate' must be in range 0 - 4294967295 packets."
)
@property
def poll_interval_global(self):
if self._values['sflow'] is None:
return None
result = flatten_boolean(self._values['sflow']['poll_interval_global'])
return result
@property
def sampling_rate_global(self):
if self._values['sflow'] is None:
return None
result = flatten_boolean(self._values['sflow']['sampling_rate_global'])
return result
class Changes(Parameters): class Changes(Parameters):
def to_return(self): def to_return(self):
@ -515,8 +1179,65 @@ class UsableChanges(Changes):
return None return None
return result return result
@property
def enforcement(self):
to_filter = dict(
excessClientHeaders=self._values['excess_client_headers'],
excessServerHeaders=self._values['excess_server_headers'],
knownMethods=self._values['known_methods'],
maxHeaderCount=self._values['max_header_count'],
maxHeaderSize=self._values['max_header_size'],
maxRequests=self._values['max_requests'],
oversizeClientHeaders=self._values['oversize_client_headers'],
oversizeServerHeaders=self._values['oversize_server_headers'],
pipeline=self._values['pipeline'],
truncatedRedirects=self._values['truncated_redirects'],
unknownMethod=self._values['unknown_method']
)
result = self._filter_params(to_filter)
if result:
return result
@property
def sflow(self):
to_filter = dict(
pollInterval=self._values['poll_interval'],
pollIntervalGlobal=self._values['poll_interval_global'],
samplingRate=self._values['sampling_rate'],
samplingRateGlobal=self._values['sampling_rate_global'],
)
result = self._filter_params(to_filter)
if result:
return result
class ReportableChanges(Changes): class ReportableChanges(Changes):
returnables = [
'parent',
'description',
'insert_xforwarded_for',
'redirect_rewrite',
'encrypt_cookies',
'proxy_type',
'explicit_proxy',
'dns_resolver',
'hsts_mode',
'maximum_age',
'include_subdomains',
'server_agent_name',
'header_erase',
'header_insert',
'accept_xff',
'xff_alternative_names',
'fallback_host',
'fallback_status_codes',
'oneconnect_transformations',
'request_chunking',
'response_chunking',
'enforcement',
'sflow'
]
@property @property
def insert_xforwarded_for(self): def insert_xforwarded_for(self):
if self._values['insert_xforwarded_for'] is None: if self._values['insert_xforwarded_for'] is None:
@ -549,6 +1270,92 @@ class ReportableChanges(Changes):
return 'indefinite' return 'indefinite'
return int(self._values['maximum_age']) return int(self._values['maximum_age'])
@property
def truncated_redirects(self):
result = flatten_boolean(self._values['truncated_redirects'])
return result
@property
def max_header_count(self):
if self._values['max_header_count'] is None:
return None
if self._values['max_header_count'] == 64:
return 'default'
return str(self._values['max_header_count'])
@property
def max_header_size(self):
if self._values['max_header_size'] is None:
return None
if self._values['max_header_size'] == 32768:
return 'default'
return str(self._values['max_header_size'])
@property
def max_requests(self):
if self._values['max_requests'] is None:
return None
if self._values['max_requests'] == 0:
return 'default'
return str(self._values['max_requests'])
@property
def known_methods(self):
defaults = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'LOCK', 'OPTIONS', 'POST', 'PROPFIND', 'PUT', 'TRACE', 'UNLOCK']
known = self._values['known_methods']
if known is None:
return None
if not known:
return ['']
if set(known) == set(defaults):
return ['default']
if set(known).issuperset(set(defaults)):
result = [item for item in known if item not in defaults]
result.append('default')
return result
return known
@property
def enforcement(self):
to_filter = dict(
excess_client_headers=self._values['excess_client_headers'],
excess_server_headers=self._values['excess_server_headers'],
known_methods=self.known_methods,
max_header_count=self.max_header_count,
max_header_size=self.max_header_size,
max_requests=self.max_requests,
oversize_client_headers=self._values['oversize_client_headers'],
oversize_server_headers=self._values['oversize_server_headers'],
pipeline=self._values['pipeline'],
truncated_redirects=self.truncated_redirects,
unknown_method=self._values['unknown_method']
)
result = self._filter_params(to_filter)
if result:
return result
@property
def accept_xff(self):
result = flatten_boolean(self._values['accept_xff'])
return result
@property
def oneconnect_transformations(self):
result = flatten_boolean(self._values['oneconnect_transformations'])
return result
@property
def sflow(self):
to_filter = dict(
poll_interval=self._values['poll_interval'],
poll_interval_global=self._values['poll_interval_global'],
sampling_rate=self._values['sampling_rate'],
sampling_rate_global=self._values['sampling_rate_global'],
)
result = self._filter_params(to_filter)
if result:
return result
class Difference(object): class Difference(object):
def __init__(self, want, have=None): def __init__(self, want, have=None):
@ -643,6 +1450,21 @@ class Difference(object):
result = self.want.encrypt_cookie_secret result = self.want.encrypt_cookie_secret
return result return result
@property
def xff_alternative_names(self):
result = cmp_simple_list(self.want.xff_alternative_names, self.have.xff_alternative_names)
return result
@property
def fallback_status_codes(self):
result = cmp_simple_list(self.want.fallback_status_codes, self.have.fallback_status_codes)
return result
@property
def known_methods(self):
result = cmp_simple_list(self.want.known_methods, self.have.known_methods)
return result
class ModuleManager(object): class ModuleManager(object):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -832,10 +1654,20 @@ class ModuleManager(object):
class ArgumentSpec(object): class ArgumentSpec(object):
def __init__(self): def __init__(self):
self.supports_check_mode = True self.supports_check_mode = True
self.chunk = ['rechunk', 'selective', 'preserve']
self.choices = ['pass-through', 'reject']
self.select = ['allow', 'pass-through', 'reject']
argument_spec = dict( argument_spec = dict(
name=dict(required=True), name=dict(required=True),
parent=dict(default='/Common/http'), parent=dict(default='/Common/http'),
description=dict(), description=dict(),
accept_xff=dict(type='bool'),
xff_alternative_names=dict(type='list'),
fallback_host=dict(),
fallback_status_codes=dict(type='list'),
oneconnect_transformations=dict(type='bool'),
request_chunking=dict(choices=self.chunk),
response_chunking=dict(choices=self.chunk),
proxy_type=dict( proxy_type=dict(
choices=[ choices=[
'reverse', 'reverse',
@ -865,6 +1697,31 @@ class ArgumentSpec(object):
hsts_mode=dict(type='bool'), hsts_mode=dict(type='bool'),
maximum_age=dict(), maximum_age=dict(),
include_subdomains=dict(type='bool'), include_subdomains=dict(type='bool'),
enforcement=dict(
type='dict',
options=dict(
truncated_redirects=dict(type='bool'),
excess_client_headers=dict(choices=self.choices),
excess_server_headers=dict(choices=self.choices),
oversize_client_headers=dict(choices=self.choices),
oversize_server_headers=dict(choices=self.choices),
pipeline=dict(choices=self.select),
unknown_method=dict(choices=self.select),
max_header_count=dict(),
max_header_size=dict(),
max_requests=dict(),
known_methods=dict(type='list'),
)
),
sflow=dict(
type='dict',
options=dict(
poll_interval=dict(type='int'),
poll_interval_global=dict(type='bool'),
sampling_rate=dict(type='int'),
sampling_rate_global=dict(type='int'),
)
),
state=dict( state=dict(
default='present', default='present',
choices=['present', 'absent'] choices=['present', 'absent']