From 436095f576c8619c5012f2237c9217ee0d1a7867 Mon Sep 17 00:00:00 2001 From: Gaurav Rastogi Date: Fri, 24 Feb 2017 08:38:16 -0800 Subject: [PATCH] New module for setting up Avi Pool (#21241) * New module for setting up Avi Pool * Fixed inconsistency between argspec and documentation regarding defaults and required attributes * Added support for module_check --- lib/ansible/modules/network/avi/avi_pool.py | 372 ++++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 lib/ansible/modules/network/avi/avi_pool.py diff --git a/lib/ansible/modules/network/avi/avi_pool.py b/lib/ansible/modules/network/avi/avi_pool.py new file mode 100644 index 0000000000..801b1af336 --- /dev/null +++ b/lib/ansible/modules/network/avi/avi_pool.py @@ -0,0 +1,372 @@ +#!/usr/bin/python +# +# Created on Aug 25, 2016 +# @author: Gaurav Rastogi (grastogi@avinetworks.com) +# Eric Anderson (eanderson@avinetworks.com) +# module_check: supported +# Avi Version: 16.3.8 +# +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +ANSIBLE_METADATA = {'status': ['preview'], 'supported_by': 'community', 'version': '1.0'} + +DOCUMENTATION = ''' +--- +module: avi_pool +author: Gaurav Rastogi (grastogi@avinetworks.com) + +short_description: Module for setup of Pool Avi RESTful Object +description: + - This module is used to configure Pool object + - more examples at U(https://github.com/avinetworks/devops) +requirements: [ avisdk ] +version_added: "2.3" +options: + state: + description: + - The state that should be applied on the entity. + default: present + choices: ["absent","present"] + a_pool: + description: + - Name of container cloud application that constitutes a pool in a a-b pool configuration, if different from vs app. + ab_pool: + description: + - A/b pool configuration. + ab_priority: + description: + - Priority of this pool in a a-b pool pair. + - Internally used. + apic_epg_name: + description: + - Synchronize cisco apic epg members with pool servers. + application_persistence_profile_ref: + description: + - Persistence will ensure the same user sticks to the same server for a desired duration of time. + - It is a reference to an object of type applicationpersistenceprofile. + autoscale_launch_config_ref: + description: + - Reference to the launch configuration profile. + - It is a reference to an object of type autoscalelaunchconfig. + autoscale_networks: + description: + - Network ids for the launch configuration. + autoscale_policy_ref: + description: + - Reference to server autoscale policy. + - It is a reference to an object of type serverautoscalepolicy. + capacity_estimation: + description: + - Inline estimation of capacity of servers. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + capacity_estimation_ttfb_thresh: + description: + - The maximum time-to-first-byte of a server. + - Default value when not specified in API or module is interpreted by Avi Controller as 0. + cloud_config_cksum: + description: + - Checksum of cloud configuration for pool. + - Internally set by cloud connector. + cloud_ref: + description: + - It is a reference to an object of type cloud. + connection_ramp_duration: + description: + - Duration for which new connections will be gradually ramped up to a server recently brought online. + - Useful for lb algorithms that are least connection based. + - Default value when not specified in API or module is interpreted by Avi Controller as 10. + created_by: + description: + - Creator name. + default_server_port: + description: + - Traffic sent to servers will use this destination server port unless overridden by the server's specific port attribute. + - The ssl checkbox enables avi to server encryption. + - Default value when not specified in API or module is interpreted by Avi Controller as 80. + description: + description: + - A description of the pool. + domain_name: + description: + - Comma separated list of domain names which will be used to verify the common names or subject alternative names presented by server certificates. + - It is performed only when common name check host_check_enabled is enabled. + east_west: + description: + - Inherited config from virtualservice. + enabled: + description: + - Enable or disable the pool. + - Disabling will terminate all open connections and pause health monitors. + - Default value when not specified in API or module is interpreted by Avi Controller as True. + fail_action: + description: + - Enable an action - close connection, http redirect, local http response, or backup pool - when a pool failure happens. + - By default, a connection will be closed, in case the pool experiences a failure. + fewest_tasks_feedback_delay: + description: + - Periodicity of feedback for fewest tasks server selection algorithm. + - Default value when not specified in API or module is interpreted by Avi Controller as 10. + graceful_disable_timeout: + description: + - Used to gracefully disable a server. + - Virtual service waits for the specified time before terminating the existing connections to the servers that are disabled. + - Default value when not specified in API or module is interpreted by Avi Controller as 1. + health_monitor_refs: + description: + - Verify server health by applying one or more health monitors. + - Active monitors generate synthetic traffic from each service engine and mark a server up or down based on the response. + - The passive monitor listens only to client to server communication. + - It raises or lowers the ratio of traffic destined to a server based on successful responses. + - It is a reference to an object of type healthmonitor. + host_check_enabled: + description: + - Enable common name check for server certificate. + - If enabled and no explicit domain name is specified, avi will use the incoming host header to do the match. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + inline_health_monitor: + description: + - The passive monitor will monitor client to server connections and requests and adjust traffic load to servers based on successful responses. + - This may alter the expected behavior of the lb method, such as round robin. + - Default value when not specified in API or module is interpreted by Avi Controller as True. + ipaddrgroup_ref: + description: + - Use list of servers from ip address group. + - It is a reference to an object of type ipaddrgroup. + lb_algorithm: + description: + - The load balancing algorithm will pick a server within the pool's list of available servers. + - Default value when not specified in API or module is interpreted by Avi Controller as LB_ALGORITHM_LEAST_CONNECTIONS. + lb_algorithm_consistent_hash_hdr: + description: + - Http header name to be used for the hash key. + lb_algorithm_hash: + description: + - Criteria used as a key for determining the hash between the client and server. + - Default value when not specified in API or module is interpreted by Avi Controller as LB_ALGORITHM_CONSISTENT_HASH_SOURCE_IP_ADDRESS. + max_concurrent_connections_per_server: + description: + - The maximum number of concurrent connections allowed to each server within the pool. + - Default value when not specified in API or module is interpreted by Avi Controller as 0. + max_conn_rate_per_server: + description: + - Rate limit connections to each server. + name: + description: + - The name of the pool. + required: true + networks: + description: + - (internal-use) networks designated as containing servers for this pool. + - The servers may be further narrowed down by a filter. + - This field is used internally by avi, not editable by the user. + pki_profile_ref: + description: + - Avi will validate the ssl certificate present by a server against the selected pki profile. + - It is a reference to an object of type pkiprofile. + placement_networks: + description: + - Manually select the networks and subnets used to provide reachability to the pool's servers. + - Specify the subnet using the following syntax 10-1-1-0/24. + - Use static routes in vrf configuration when pool servers are not directly connected butroutable from the service engine. + prst_hdr_name: + description: + - Header name for custom header persistence. + request_queue_depth: + description: + - Minimum number of requests to be queued when pool is full. + - Default value when not specified in API or module is interpreted by Avi Controller as 128. + request_queue_enabled: + description: + - Enable request queue when pool is full. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + rewrite_host_header_to_server_name: + description: + - Rewrite incoming host header to server name of the server to which the request is proxied. + - Enabling this feature rewrites host header for requests to all servers in the pool. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + rewrite_host_header_to_sni: + description: + - If sni server name is specified, rewrite incoming host header to the sni server name. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + server_auto_scale: + description: + - Server autoscale. + - Not used anymore. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + server_count: + description: + - Number of server_count. + - Default value when not specified in API or module is interpreted by Avi Controller as 0. + server_name: + description: + - Fully qualified dns hostname which will be used in the tls sni extension in server connections if sni is enabled. + - If no value is specified, avi will use the incoming host header instead. + server_reselect: + description: + - Server reselect configuration for http requests. + servers: + description: + - The pool directs load balanced traffic to this list of destination servers. + - The servers can be configured by ip address, name, network or via ip address group. + sni_enabled: + description: + - Enable tls sni for server connections. + - If disabled, avi will not send the sni extension as part of the handshake. + - Default value when not specified in API or module is interpreted by Avi Controller as True. + ssl_key_and_certificate_ref: + description: + - Service engines will present a client ssl certificate to the server. + - It is a reference to an object of type sslkeyandcertificate. + ssl_profile_ref: + description: + - When enabled, avi re-encrypts traffic to the backend servers. + - The specific ssl profile defines which ciphers and ssl versions will be supported. + - It is a reference to an object of type sslprofile. + tenant_ref: + description: + - It is a reference to an object of type tenant. + url: + description: + - Avi controller URL of the object. + use_service_port: + description: + - Do not translate the client's destination port when sending the connection to the server. + - The pool or servers specified service port will still be used for health monitoring. + - Default value when not specified in API or module is interpreted by Avi Controller as False. + uuid: + description: + - Uuid of the pool. + vrf_ref: + description: + - Virtual routing context that the pool is bound to. + - This is used to provide the isolation of the set of networks the pool is attached to. + - The pool inherits the virtual routing conext of the virtual service, and this field is used only internally, and is set by pb-transform. + - It is a reference to an object of type vrfcontext. +extends_documentation_fragment: + - avi +''' + + +EXAMPLES = ''' +- name: Create a Pool with two servers and HTTP monitor + avi_pool: + controller: 10.10.1.20 + username: avi_user + password: avi_password + name: testpool1 + description: testpool1 + state: present + health_monitor_refs: + - '/api/healthmonitor?name=System-HTTP' + servers: + - ip: + addr: 10.10.2.20 + type: V4 + - ip: + addr: 10.10.2.21 + type: V4 +''' +RETURN = ''' +obj: + description: Pool (api/pool) object + returned: success, changed + type: dict +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.avi import avi_common_argument_spec + + +HAS_AVI = True +try: + from avi.sdk.utils.ansible_utils import avi_ansible_api +except ImportError: + HAS_AVI = False + + +def main(): + argument_specs = dict( + state=dict(default='present', + choices=['absent', 'present']), + a_pool=dict(type='str',), + ab_pool=dict(type='dict',), + ab_priority=dict(type='int',), + apic_epg_name=dict(type='str',), + application_persistence_profile_ref=dict(type='str',), + autoscale_launch_config_ref=dict(type='str',), + autoscale_networks=dict(type='list',), + autoscale_policy_ref=dict(type='str',), + capacity_estimation=dict(type='bool',), + capacity_estimation_ttfb_thresh=dict(type='int',), + cloud_config_cksum=dict(type='str',), + cloud_ref=dict(type='str',), + connection_ramp_duration=dict(type='int',), + created_by=dict(type='str',), + default_server_port=dict(type='int',), + description=dict(type='str',), + domain_name=dict(type='list',), + east_west=dict(type='bool',), + enabled=dict(type='bool',), + fail_action=dict(type='dict',), + fewest_tasks_feedback_delay=dict(type='int',), + graceful_disable_timeout=dict(type='int',), + health_monitor_refs=dict(type='list',), + host_check_enabled=dict(type='bool',), + inline_health_monitor=dict(type='bool',), + ipaddrgroup_ref=dict(type='str',), + lb_algorithm=dict(type='str',), + lb_algorithm_consistent_hash_hdr=dict(type='str',), + lb_algorithm_hash=dict(type='str',), + max_concurrent_connections_per_server=dict(type='int',), + max_conn_rate_per_server=dict(type='dict',), + name=dict(type='str', required=True), + networks=dict(type='list',), + pki_profile_ref=dict(type='str',), + placement_networks=dict(type='list',), + prst_hdr_name=dict(type='str',), + request_queue_depth=dict(type='int',), + request_queue_enabled=dict(type='bool',), + rewrite_host_header_to_server_name=dict(type='bool',), + rewrite_host_header_to_sni=dict(type='bool',), + server_auto_scale=dict(type='bool',), + server_count=dict(type='int',), + server_name=dict(type='str',), + server_reselect=dict(type='dict',), + servers=dict(type='list',), + sni_enabled=dict(type='bool',), + ssl_key_and_certificate_ref=dict(type='str',), + ssl_profile_ref=dict(type='str',), + tenant_ref=dict(type='str',), + url=dict(type='str',), + use_service_port=dict(type='bool',), + uuid=dict(type='str',), + vrf_ref=dict(type='str',), + ) + argument_specs.update(avi_common_argument_spec()) + module = AnsibleModule( + argument_spec=argument_specs, supports_check_mode=True) + if not HAS_AVI: + return module.fail_json(msg=( + 'Avi python API SDK (avisdk) is not installed. ' + 'For more details visit https://github.com/avinetworks/sdk.')) + return avi_ansible_api(module, 'pool', + set([])) + + +if __name__ == '__main__': + main()