From 8d5ee33e0fa2e5a2b622be186209622434a07338 Mon Sep 17 00:00:00 2001 From: Tim Rupp Date: Mon, 16 Jan 2017 23:47:39 -0800 Subject: [PATCH] Adds fallback_persistence_profile and all_policies to BIG-IP virtual servers (#20261) This patch adds the ability for users to specify a fallback persistence profile for their virtual servers and a list of policies for the VS. --- .../network/f5/bigip_virtual_server.py | 90 ++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/lib/ansible/modules/network/f5/bigip_virtual_server.py b/lib/ansible/modules/network/f5/bigip_virtual_server.py index 0626e5ff265..a2aae5dad6f 100644 --- a/lib/ansible/modules/network/f5/bigip_virtual_server.py +++ b/lib/ansible/modules/network/f5/bigip_virtual_server.py @@ -84,6 +84,12 @@ options: by the virtual server required: false default: None + all_policies: + description: + - List of all policies enabled for the virtual server. + required: false + default: None + version_added: "2.3" all_rules: version_added: "2.2" description: @@ -116,6 +122,13 @@ options: - Default Profile which manages the session persistence required: false default: None + fallback_persistence_profile: + description: + - Specifies the persistence profile you want the system to use if it + cannot use the specified default persistence profile. + required: false + default: None + version_added: "2.3" route_advertisement_state: description: - Enable route advertisement for destination @@ -313,6 +326,43 @@ def set_profiles(api, name, profiles_list): raise Exception('Error on setting profiles : %s' % e) +def get_policies(api, name): + return api.LocalLB.VirtualServer.get_content_policy( + virtual_servers=[name] + )[0] + + +def set_policies(api, name, policies_list): + updated = False + try: + if policies_list is None: + return False + current_policies = get_policies(api, name) + to_add_policies = [] + for x in policies_list: + if x not in current_policies: + to_add_policies.append(x) + to_del_policies = [] + for x in current_policies: + if x not in policies_list: + to_del_policies.append(x) + if len(to_del_policies) > 0: + api.LocalLB.VirtualServer.remove_content_policy( + virtual_servers=[name], + policies=[to_del_policies] + ) + updated = True + if len(to_add_policies) > 0: + api.LocalLB.VirtualServer.add_content_policy( + virtual_servers=[name], + policies=[to_add_policies] + ) + updated = True + return updated + except bigsuds.OperationFailed as e: + raise Exception('Error on setting policies : %s' % e) + + def get_vlan(api, name): return api.LocalLB.VirtualServer.get_vlan( virtual_servers=[name] @@ -550,6 +600,36 @@ def set_default_persistence_profiles(api, name, persistence_profile): raise Exception('Error on setting default persistence profile : %s' % e) +def get_fallback_persistence_profile(api, name): + return api.LocalLB.VirtualServer.get_fallback_persistence_profile( + virtual_servers=[name] + )[0] + + +def set_fallback_persistence_profile(api, partition, name, persistence_profile): + updated = False + if persistence_profile is None: + return updated + try: + # This is needed because the SOAP API expects this to be an "empty" + # value to set the fallback profile to "None". The fq_name function + # does not take "None" into account though, so I do that here. + if persistence_profile != "": + persistence_profile = fq_name(partition, persistence_profile) + + current_fallback_profile = get_fallback_persistence_profile(api, name) + + if current_fallback_profile != persistence_profile: + api.LocalLB.VirtualServer.set_fallback_persistence_profile( + virtual_servers=[name], + profile_names=[persistence_profile] + ) + updated = True + return updated + except bigsuds.OperationFailed as e: + raise Exception('Error on setting fallback persistence profile : %s' % e) + + def get_route_advertisement_status(api, address): result = api.LocalLB.VirtualAddressV2.get_route_advertisement_state(virtual_addresses=[address]).pop(0) result = result.split("STATE_")[-1].lower() @@ -579,6 +659,7 @@ def main(): name=dict(type='str', required=True, aliases=['vs']), destination=dict(type='str', aliases=['address', 'ip']), port=dict(type='int'), + all_policies=dict(type='list'), all_profiles=dict(type='list'), all_rules=dict(type='list'), enabled_vlans=dict(type='list'), @@ -586,7 +667,8 @@ def main(): description=dict(type='str'), snat=dict(type='str'), route_advertisement_state=dict(type='str', default='disabled', choices=['enabled', 'disabled']), - default_persistence_profile=dict(type='str') + default_persistence_profile=dict(type='str'), + fallback_persistence_profile=dict(type='str') )) module = AnsibleModule( @@ -614,6 +696,7 @@ def main(): destination = module.params['destination'] port = module.params['port'] all_profiles = fq_list_names(partition, module.params['all_profiles']) + all_policies = fq_list_names(partition, module.params['all_policies']) all_rules = fq_list_names(partition, module.params['all_rules']) enabled_vlans = module.params['enabled_vlans'] @@ -627,6 +710,7 @@ def main(): snat = module.params['snat'] route_advertisement_state = module.params['route_advertisement_state'] default_persistence_profile = fq_name(partition, module.params['default_persistence_profile']) + fallback_persistence_profile = module.params['fallback_persistence_profile'] if 1 > port > 65535: module.fail_json(msg="valid ports must be in range 1 - 65535") @@ -666,11 +750,13 @@ def main(): try: vs_create(api, name, destination, port, pool) set_profiles(api, name, all_profiles) + set_policies(api, name, all_policies) set_enabled_vlans(api, name, all_enabled_vlans) set_rules(api, name, all_rules) set_snat(api, name, snat) set_description(api, name, description) set_default_persistence_profiles(api, name, default_persistence_profile) + set_fallback_persistence_profile(api, partition, name, fallback_persistence_profile) set_state(api, name, state) set_route_advertisement_state(api, destination, partition, route_advertisement_state) result = {'changed': True} @@ -693,9 +779,11 @@ def main(): result['changed'] |= set_description(api, name, description) result['changed'] |= set_snat(api, name, snat) result['changed'] |= set_profiles(api, name, all_profiles) + result['changed'] |= set_policies(api, name, all_policies) result['changed'] |= set_enabled_vlans(api, name, all_enabled_vlans) result['changed'] |= set_rules(api, name, all_rules) result['changed'] |= set_default_persistence_profiles(api, name, default_persistence_profile) + result['changed'] |= set_fallback_persistence_profile(api, partition, name, fallback_persistence_profile) result['changed'] |= set_state(api, name, state) result['changed'] |= set_route_advertisement_state(api, destination, partition, route_advertisement_state) api.System.Session.submit_transaction()