From 3a4bfc731d13d3f6ee29b15258ded4aab3ec151f Mon Sep 17 00:00:00 2001
From: Tim Rupp <caphrim007@gmail.com>
Date: Wed, 29 Jun 2016 00:09:37 -0700
Subject: [PATCH] Adds coding conventions for the bigip-virtual-server module
 (#2473)

A number of coding conventions have been adopted for new F5 modules
that are in development. To ensure common usage across the modules,
this module needed to be updated to reflect those conventions.
---
 .../extras/network/f5/bigip_virtual_server.py | 678 ++++++++++--------
 1 file changed, 372 insertions(+), 306 deletions(-)

diff --git a/lib/ansible/modules/extras/network/f5/bigip_virtual_server.py b/lib/ansible/modules/extras/network/f5/bigip_virtual_server.py
index b4bb7f5eb8..93e13c2e77 100644
--- a/lib/ansible/modules/extras/network/f5/bigip_virtual_server.py
+++ b/lib/ansible/modules/extras/network/f5/bigip_virtual_server.py
@@ -23,183 +23,181 @@ DOCUMENTATION = '''
 module: bigip_virtual_server
 short_description: "Manages F5 BIG-IP LTM virtual servers"
 description:
-    - "Manages F5 BIG-IP LTM virtual servers via iControl SOAP API"
+  - "Manages F5 BIG-IP LTM virtual servers via iControl SOAP API"
 version_added: "2.1"
 author:
-    - Etienne Carriere (@Etienne-Carriere)
-    - Tim Rupp (@caphrim007)
+  - Etienne Carriere (@Etienne-Carriere)
+  - Tim Rupp (@caphrim007)
 notes:
-    - "Requires BIG-IP software version >= 11"
-    - "F5 developed module 'bigsuds' required (see http://devcentral.f5.com)"
-    - "Best run as a local_action in your playbook"
+  - "Requires BIG-IP software version >= 11"
+  - "F5 developed module 'bigsuds' required (see http://devcentral.f5.com)"
+  - "Best run as a local_action in your playbook"
 requirements:
-    - bigsuds
+  - bigsuds
 options:
-    server:
-        description:
-            - BIG-IP host
-        required: true
-    server_port:
-        description:
-            - BIG-IP server port
-        required: false
-        default: 443
-        version_added: "2.2"
-    user:
-        description:
-            - BIG-IP username
-        required: true
-        default: null
-        choices: []
-        aliases: []
-    password:
-        description:
-            - BIG-IP password
-        required: true
-        default: null
-        choices: []
-        aliases: []
-    validate_certs:
-        description:
-            - If C(no), SSL certificates will not be validated. This should only be used
-              on personally controlled sites using self-signed certificates.
-        required: false
-        default: 'yes'
-        choices: ['yes', 'no']
-        version_added: 2.0
-    state:
-        description:
-            - Virtual Server state
-            - Absent, delete the VS if present
-            - present (and its synonym enabled), create if needed the VS and set state to enabled
-            - disabled, create if needed the VS and set state to disabled
-        required: false
-        default: present
-        choices: ['present', 'absent', 'enabled', 'disabled']
-        aliases: []
-    partition:
-        description:
-            - Partition
-        required: false
-        default: 'Common'
-        choices: []
-        aliases: []
-    name:
-        description:
-            - "Virtual server name."
-        required: true
-        aliases: ['vs']
-    destination:
-        description:
-            - "Destination IP of the virtual server (only host is currently supported) . Required when state=present and vs does not exist."
-        required: true
-        default: null
-        choices: []
-        aliases: ['address', 'ip']
-    port:
-        description:
-            - "Port of the virtual server . Required when state=present and vs does not exist"
-        required: false
-        default: None
-    all_profiles:
-        description:
-            - "List of all Profiles (HTTP,ClientSSL,ServerSSL,etc) that must be used by the virtual server"
-        required: false
-        default: None
-    all_rules:
-        version_added: "2.2"
-        description:
-            - "List of rules to be applied in priority order"
-        required: false
-        default: None
-    pool:
-        description:
-            - "Default pool for the virtual server"
-        required: false
-        default: None
-    snat:
-        description:
-            - "Source network address policy"
-        required: false
-        default: None
-    default_persistence_profile:
-        description:
-            - "Default Profile which manages the session persistence"
-        required: false
-        default: None
+  server:
     description:
-        description:
-            - "Virtual server description."
-        required: false
-        default: None
+      - BIG-IP host
+    required: true
+  server_port:
+    description:
+      - BIG-IP server port
+    required: false
+    default: 443
+    version_added: "2.2"
+  user:
+    description:
+      - BIG-IP username
+    required: true
+  password:
+    description:
+      - BIG-IP password
+    required: true
+  validate_certs:
+    description:
+      - If C(no), SSL certificates will not be validated. This should only be used
+        on personally controlled sites using self-signed certificates.
+    required: false
+    default: 'yes'
+    choices:
+      - yes
+      - no
+  state:
+    description:
+      - Virtual Server state
+      - Absent, delete the VS if present
+      - C(present) (and its synonym enabled), create if needed the VS and set
+        state to enabled
+      - C(disabled), create if needed the VS and set state to disabled
+    required: false
+    default: present
+    choices:
+      - present
+      - absent
+      - enabled
+      - disabled
+    aliases: []
+  partition:
+    description:
+      - Partition
+    required: false
+    default: 'Common'
+  name:
+    description:
+      - Virtual server name
+    required: true
+    aliases:
+      - vs
+  destination:
+    description:
+      - Destination IP of the virtual server (only host is currently supported).
+        Required when state=present and vs does not exist.
+    required: true
+    aliases:
+      - address
+      - ip
+  port:
+    description:
+      - Port of the virtual server . Required when state=present and vs does not exist
+    required: false
+    default: None
+  all_profiles:
+    description:
+      - List of all Profiles (HTTP,ClientSSL,ServerSSL,etc) that must be used
+        by the virtual server
+    required: false
+    default: None
+  all_rules:
+    version_added: "2.2"
+    description:
+      - List of rules to be applied in priority order
+    required: false
+    default: None
+  pool:
+    description:
+      - Default pool for the virtual server
+    required: false
+    default: None
+  snat:
+    description:
+      - Source network address policy
+    required: false
+    default: None
+  default_persistence_profile:
+    description:
+      - Default Profile which manages the session persistence
+    required: false
+    default: None
+  description:
+    description:
+      - Virtual server description
+    required: false
+    default: None
 '''
 
 EXAMPLES = '''
+- name: Add virtual server
+  bigip_virtual_server:
+      server: lb.mydomain.net
+      user: admin
+      password: secret
+      state: present
+      partition: MyPartition
+      name: myvirtualserver
+      destination: "{{ ansible_default_ipv4['address'] }}"
+      port: 443
+      pool: "{{ mypool }}"
+      snat: Automap
+      description: Test Virtual Server
+      all_profiles:
+          - http
+          - clientssl
+  delegate_to: localhost
 
-## playbook task examples:
+- name: Modify Port of the Virtual Server
+  bigip_virtual_server:
+      server: lb.mydomain.net
+      user: admin
+      password: secret
+      state: present
+      partition: MyPartition
+      name: myvirtualserver
+      port: 8080
+  delegate_to: localhost
 
----
-# file bigip-test.yml
-# ...
-  - name: Add VS
-    local_action:
-        module: bigip_virtual_server
-        server: lb.mydomain.net
-        user: admin
-        password: secret
-        state: present
-        partition: MyPartition
-        name: myvirtualserver
-        destination: "{{ ansible_default_ipv4['address'] }}"
-        port: 443
-        pool: "{{ mypool }}"
-        snat: Automap
-        description: Test Virtual Server
-        all_profiles:
-            - http
-            - clientssl
-
-  - name: Modify Port of the Virtual Server
-    local_action:
-        module: bigip_virtual_server
-        server: lb.mydomain.net
-        user: admin
-        password: secret
-        state: present
-        partition: MyPartition
-        name: myvirtualserver
-        port: 8080
-
-  - name: Delete virtual server
-    local_action:
-        module: bigip_virtual_server
-        server: lb.mydomain.net
-        user: admin
-        password: secret
-        state: absent
-        partition: MyPartition
-        name: myvirtualserver
+- name: Delete virtual server
+  bigip_virtual_server:
+      server: lb.mydomain.net
+      user: admin
+      password: secret
+      state: absent
+      partition: MyPartition
+      name: myvirtualserver
+  delegate_to: localhost
 '''
 
 RETURN = '''
 ---
 deleted:
-  description: Name of a virtual server that was deleted
-  returned: virtual server was successfully deleted on state=absent
-  type: string
+    description: Name of a virtual server that was deleted
+    returned: changed
+    type: string
+    sample: "my-virtual-server"
 '''
 
 
-# ==========================
-# bigip_virtual_server module specific
-#
-
 # map of state values
-STATES={'enabled': 'STATE_ENABLED',
-        'disabled': 'STATE_DISABLED'}
-STATUSES={'enabled': 'SESSION_STATUS_ENABLED',
-          'disabled': 'SESSION_STATUS_DISABLED',
-          'offline': 'SESSION_STATUS_FORCED_DISABLED'}
+STATES = {
+    'enabled': 'STATE_ENABLED',
+    'disabled': 'STATE_DISABLED'
+}
+
+STATUSES = {
+    'enabled': 'SESSION_STATUS_ENABLED',
+    'disabled': 'SESSION_STATUS_DISABLED',
+    'offline': 'SESSION_STATUS_FORCED_DISABLED'
+}
+
 
 def vs_exists(api, vs):
     # hack to determine if pool exists
@@ -207,7 +205,7 @@ def vs_exists(api, vs):
     try:
         api.LocalLB.VirtualServer.get_object_status(virtual_servers=[vs])
         result = True
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         if "was not found" in str(e):
             result = False
         else:
@@ -215,8 +213,9 @@ def vs_exists(api, vs):
             raise
     return result
 
-def vs_create(api,name,destination,port,pool):
-    _profiles=[[{'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': 'tcp'}]]
+
+def vs_create(api, name, destination, port, pool):
+    _profiles = [[{'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': 'tcp'}]]
     created = False
     # a bit of a hack to handle concurrent runs of this module.
     # even though we've checked the vs doesn't exist,
@@ -225,211 +224,278 @@ def vs_create(api,name,destination,port,pool):
     # about it!
     try:
         api.LocalLB.VirtualServer.create(
-            definitions = [{'name': [name], 'address': [destination], 'port': port, 'protocol': 'PROTOCOL_TCP'}],
-            wildmasks = ['255.255.255.255'],
-            resources = [{'type': 'RESOURCE_TYPE_POOL', 'default_pool_name': pool}],
-            profiles = _profiles)
+            definitions=[{'name': [name], 'address': [destination], 'port': port, 'protocol': 'PROTOCOL_TCP'}],
+            wildmasks=['255.255.255.255'],
+            resources=[{'type': 'RESOURCE_TYPE_POOL', 'default_pool_name': pool}],
+            profiles=_profiles)
         created = True
         return created
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         if "already exists" not in str(e):
             raise Exception('Error on creating Virtual Server : %s' % e)
 
-def vs_remove(api,name):
-    api.LocalLB.VirtualServer.delete_virtual_server(virtual_servers = [name ])
+
+def vs_remove(api, name):
+    api.LocalLB.VirtualServer.delete_virtual_server(
+        virtual_servers=[name]
+    )
 
 
-def get_rules(api,name):
-    return api.LocalLB.VirtualServer.get_rule(virtual_servers = [name])[0]
+def get_rules(api, name):
+    return api.LocalLB.VirtualServer.get_rule(
+        virtual_servers=[name]
+    )[0]
 
 
-def set_rules(api,name,rules_list):
-    updated=False
+def set_rules(api, name, rules_list):
+    updated = False
     if rules_list is None:
         return False
     rules_list = list(enumerate(rules_list))
     try:
-        current_rules=map(lambda x: (x['priority'], x['rule_name']), get_rules(api,name))
-        to_add_rules=[]
+        current_rules = map(lambda x: (x['priority'], x['rule_name']), get_rules(api, name))
+        to_add_rules = []
         for i, x in rules_list:
-            if (i ,x) not in current_rules:
+            if (i, x) not in current_rules:
                 to_add_rules.append({'priority': i, 'rule_name': x})
-        to_del_rules=[]
+        to_del_rules = []
         for i, x in current_rules:
             if (i, x) not in rules_list:
                 to_del_rules.append({'priority': i, 'rule_name': x})
-        if len(to_del_rules)>0:
-            api.LocalLB.VirtualServer.remove_rule(virtual_servers = [name],rules = [to_del_rules])
-            updated=True
-        if len(to_add_rules)>0:
-            api.LocalLB.VirtualServer.add_rule(virtual_servers = [name],rules= [to_add_rules])
-            updated=True
+        if len(to_del_rules) > 0:
+            api.LocalLB.VirtualServer.remove_rule(
+                virtual_servers=[name],
+                rules=[to_del_rules]
+            )
+            updated = True
+        if len(to_add_rules) > 0:
+            api.LocalLB.VirtualServer.add_rule(
+                virtual_servers=[name],
+                rules=[to_add_rules]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting profiles : %s' % e)
 
-def get_profiles(api,name):
-    return api.LocalLB.VirtualServer.get_profile(virtual_servers = [name])[0]
+
+def get_profiles(api, name):
+    return api.LocalLB.VirtualServer.get_profile(
+        virtual_servers=[name]
+    )[0]
 
 
-def set_profiles(api,name,profiles_list):
-    updated=False
+def set_profiles(api, name, profiles_list):
+    updated = False
     try:
         if profiles_list is None:
             return False
-        current_profiles=map(lambda x:x['profile_name'], get_profiles(api,name))
-        to_add_profiles=[]
+        current_profiles = map(lambda x: x['profile_name'], get_profiles(api, name))
+        to_add_profiles = []
         for x in profiles_list:
             if x not in current_profiles:
                 to_add_profiles.append({'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': x})
-        to_del_profiles=[]
+        to_del_profiles = []
         for x in current_profiles:
-            if (x not in profiles_list) and (x!= "/Common/tcp"):
+            if (x not in profiles_list) and (x != "/Common/tcp"):
                 to_del_profiles.append({'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': x})
-        if len(to_del_profiles)>0:
-            api.LocalLB.VirtualServer.remove_profile(virtual_servers = [name],profiles = [to_del_profiles])
-            updated=True
-        if len(to_add_profiles)>0:
-            api.LocalLB.VirtualServer.add_profile(virtual_servers = [name],profiles= [to_add_profiles])
-            updated=True
+        if len(to_del_profiles) > 0:
+            api.LocalLB.VirtualServer.remove_profile(
+                virtual_servers=[name],
+                profiles=[to_del_profiles]
+            )
+            updated = True
+        if len(to_add_profiles) > 0:
+            api.LocalLB.VirtualServer.add_profile(
+                virtual_servers=[name],
+                profiles=[to_add_profiles]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting profiles : %s' % e)
 
-def set_snat(api,name,snat):
+
+def set_snat(api, name, snat):
     updated = False
     try:
-        current_state=get_snat_type(api,name)
+        current_state = get_snat_type(api, name)
         if snat is None:
             return updated
         elif snat == 'None' and current_state != 'SRC_TRANS_NONE':
-            api.LocalLB.VirtualServer.set_source_address_translation_none(virtual_servers = [name])
+            api.LocalLB.VirtualServer.set_source_address_translation_none(
+                virtual_servers=[name]
+            )
             updated = True
         elif snat == 'Automap' and current_state != 'SRC_TRANS_AUTOMAP':
-            api.LocalLB.VirtualServer.set_source_address_translation_automap(virtual_servers = [name])
+            api.LocalLB.VirtualServer.set_source_address_translation_automap(
+                virtual_servers=[name]
+            )
             updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting snat : %s' % e)
 
-def get_snat_type(api,name):
-    return api.LocalLB.VirtualServer.get_source_address_translation_type(virtual_servers = [name])[0]
+
+def get_snat_type(api, name):
+    return api.LocalLB.VirtualServer.get_source_address_translation_type(
+        virtual_servers=[name]
+    )[0]
 
 
-def get_pool(api,name):
-    return api.LocalLB.VirtualServer.get_default_pool_name(virtual_servers = [name])[0]
+def get_pool(api, name):
+    return api.LocalLB.VirtualServer.get_default_pool_name(
+        virtual_servers=[name]
+    )[0]
 
-def set_pool(api,name,pool):
-    updated=False
+
+def set_pool(api, name, pool):
+    updated = False
     try:
-        current_pool = get_pool (api,name)
+        current_pool = get_pool(api, name)
         if pool is not None and (pool != current_pool):
-            api.LocalLB.VirtualServer.set_default_pool_name(virtual_servers = [name],default_pools = [pool])
-            updated=True
+            api.LocalLB.VirtualServer.set_default_pool_name(
+                virtual_servers=[name],
+                default_pools=[pool]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting pool : %s' % e)
 
 
-def get_destination(api,name):
-    return api.LocalLB.VirtualServer.get_destination_v2(virtual_servers = [name])[0]
+def get_destination(api, name):
+    return api.LocalLB.VirtualServer.get_destination_v2(
+        virtual_servers=[name]
+    )[0]
 
-def set_destination(api,name,destination):
-    updated=False
+
+def set_destination(api, name, destination):
+    updated = False
     try:
-        current_destination = get_destination(api,name)
-        if destination is not None  and destination != current_destination['address']:
-            api.LocalLB.VirtualServer.set_destination_v2(virtual_servers = [name],destinations=[{'address': destination, 'port': current_destination['port']}])
-            updated=True
+        current_destination = get_destination(api, name)
+        if destination is not None and destination != current_destination['address']:
+            api.LocalLB.VirtualServer.set_destination_v2(
+                virtual_servers=[name],
+                destinations=[{'address': destination, 'port': current_destination['port']}]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
-        raise Exception('Error on setting destination : %s'% e )
+    except bigsuds.OperationFailed as e:
+        raise Exception('Error on setting destination : %s' % e)
 
 
-def set_port(api,name,port):
-    updated=False
+def set_port(api, name, port):
+    updated = False
     try:
-        current_destination = get_destination(api,name)
-        if port is not None  and port != current_destination['port']:
-            api.LocalLB.VirtualServer.set_destination_v2(virtual_servers = [name],destinations=[{'address': current_destination['address'], 'port': port}])
-            updated=True
+        current_destination = get_destination(api, name)
+        if port is not None and port != current_destination['port']:
+            api.LocalLB.VirtualServer.set_destination_v2(
+                virtual_servers=[name],
+                destinations=[{'address': current_destination['address'], 'port': port}]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
-        raise Exception('Error on setting port : %s'% e )
+    except bigsuds.OperationFailed as e:
+        raise Exception('Error on setting port : %s' % e)
 
-def get_state(api,name):
-    return api.LocalLB.VirtualServer.get_enabled_state(virtual_servers = [name])[0]
 
-def set_state(api,name,state):
-    updated=False
+def get_state(api, name):
+    return api.LocalLB.VirtualServer.get_enabled_state(
+        virtual_servers=[name]
+    )[0]
+
+
+def set_state(api, name, state):
+    updated = False
     try:
-        current_state=get_state(api,name)
+        current_state = get_state(api, name)
         # We consider that being present is equivalent to enabled
         if state == 'present':
-            state='enabled'
+            state = 'enabled'
         if STATES[state] != current_state:
-            api.LocalLB.VirtualServer.set_enabled_state(virtual_servers=[name],states=[STATES[state]])
-            updated=True
+            api.LocalLB.VirtualServer.set_enabled_state(
+                virtual_servers=[name],
+                states=[STATES[state]]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
-        raise Exception('Error on setting state : %s'% e )
+    except bigsuds.OperationFailed as e:
+        raise Exception('Error on setting state : %s' % e)
 
-def get_description(api,name):
-    return api.LocalLB.VirtualServer.get_description(virtual_servers = [name])[0]
 
-def set_description(api,name,description):
-    updated=False
+def get_description(api, name):
+    return api.LocalLB.VirtualServer.get_description(
+        virtual_servers=[name]
+    )[0]
+
+
+def set_description(api, name, description):
+    updated = False
     try:
-        current_description = get_description(api,name)
+        current_description = get_description(api, name)
         if description is not None and current_description != description:
-            api.LocalLB.VirtualServer.set_description(virtual_servers =[name],descriptions=[description])
-            updated=True
+            api.LocalLB.VirtualServer.set_description(
+                virtual_servers=[name],
+                descriptions=[description]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting description : %s ' % e)
 
-def get_persistence_profiles(api,name):
-    return api.LocalLB.VirtualServer.get_persistence_profile(virtual_servers = [name])[0]
 
-def set_default_persistence_profiles(api,name,persistence_profile):
-    updated=False
+def get_persistence_profiles(api, name):
+    return api.LocalLB.VirtualServer.get_persistence_profile(
+        virtual_servers=[name]
+    )[0]
+
+
+def set_default_persistence_profiles(api, name, persistence_profile):
+    updated = False
     if persistence_profile is None:
         return updated
     try:
-        current_persistence_profiles = get_persistence_profiles(api,name)
-        default=None
+        current_persistence_profiles = get_persistence_profiles(api, name)
+        default = None
         for profile in current_persistence_profiles:
             if profile['default_profile']:
-                default=profile['profile_name']
+                default = profile['profile_name']
                 break
         if default is not None and default != persistence_profile:
-            api.LocalLB.VirtualServer.remove_persistence_profile(virtual_servers=[name],profiles=[[{'profile_name':default,'default_profile' : True}]])
+            api.LocalLB.VirtualServer.remove_persistence_profile(
+                virtual_servers=[name],
+                profiles=[[{'profile_name': default, 'default_profile': True}]]
+            )
         if default != persistence_profile:
-            api.LocalLB.VirtualServer.add_persistence_profile(virtual_servers=[name],profiles=[[{'profile_name':persistence_profile,'default_profile' : True}]])
-            updated=True
+            api.LocalLB.VirtualServer.add_persistence_profile(
+                virtual_servers=[name],
+                profiles=[[{'profile_name': persistence_profile, 'default_profile': True}]]
+            )
+            updated = True
         return updated
-    except bigsuds.OperationFailed, e:
+    except bigsuds.OperationFailed as e:
         raise Exception('Error on setting default persistence profile : %s' % e)
 
+
 def main():
     argument_spec = f5_argument_spec()
-    argument_spec.update( dict(
-            state = dict(type='str', default='present',
-                         choices=['present', 'absent', 'disabled', 'enabled']),
-            name = dict(type='str', required=True,aliases=['vs']),
-            destination = dict(type='str', aliases=['address', 'ip']),
-            port = dict(type='int'),
-            all_profiles = dict(type='list'),
-            all_rules = dict(type='list'),
-            pool=dict(type='str'),
-            description = dict(type='str'),
-            snat=dict(type='str'),
-            default_persistence_profile=dict(type='str')
-        )
-    )
+    argument_spec.update(dict(
+        state=dict(type='str', default='present',
+                   choices=['present', 'absent', 'disabled', 'enabled']),
+        name=dict(type='str', required=True, aliases=['vs']),
+        destination=dict(type='str', aliases=['address', 'ip']),
+        port=dict(type='int'),
+        all_profiles=dict(type='list'),
+        all_rules=dict(type='list'),
+        pool=dict(type='str'),
+        description=dict(type='str'),
+        snat=dict(type='str'),
+        default_persistence_profile=dict(type='str')
+    ))
 
     module = AnsibleModule(
-        argument_spec = argument_spec,
+        argument_spec=argument_spec,
         supports_check_mode=True
     )
 
@@ -449,34 +515,34 @@ def main():
     partition = module.params['partition']
     validate_certs = module.params['validate_certs']
 
-    name = fq_name(partition,module.params['name'])
-    destination=module.params['destination']
-    port=module.params['port']
-    all_profiles=fq_list_names(partition,module.params['all_profiles'])
-    all_rules=fq_list_names(partition,module.params['all_rules'])
-    pool=fq_name(partition,module.params['pool'])
+    name = fq_name(partition, module.params['name'])
+    destination = module.params['destination']
+    port = module.params['port']
+    all_profiles = fq_list_names(partition, module.params['all_profiles'])
+    all_rules = fq_list_names(partition, module.params['all_rules'])
+    pool = fq_name(partition, module.params['pool'])
     description = module.params['description']
     snat = module.params['snat']
-    default_persistence_profile=fq_name(partition,module.params['default_persistence_profile'])
+    default_persistence_profile = fq_name(partition, module.params['default_persistence_profile'])
 
     if 1 > port > 65535:
         module.fail_json(msg="valid ports must be in range 1 - 65535")
-  
+
     try:
         api = bigip_api(server, user, password, validate_certs, port=server_port)
         result = {'changed': False}  # default
 
         if state == 'absent':
             if not module.check_mode:
-                if vs_exists(api,name):
+                if vs_exists(api, name):
                     # hack to handle concurrent runs of module
                     # pool might be gone before we actually remove
                     try:
-                        vs_remove(api,name)
-                        result = {'changed' : True, 'deleted' : name }
-                    except bigsuds.OperationFailed, e:
+                        vs_remove(api, name)
+                        result = {'changed': True, 'deleted': name}
+                    except bigsuds.OperationFailed as e:
                         if "was not found" in str(e):
-                            result['changed']= False
+                            result['changed'] = False
                         else:
                             raise
             else:
@@ -495,15 +561,15 @@ def main():
                     # this catches the exception and does something smart
                     # about it!
                     try:
-                        vs_create(api,name,destination,port,pool)
-                        set_profiles(api,name,all_profiles)
-                        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_state(api,name,state)
+                        vs_create(api, name, destination, port, pool)
+                        set_profiles(api, name, all_profiles)
+                        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_state(api, name, state)
                         result = {'changed': True}
-                    except bigsuds.OperationFailed, e:
+                    except bigsuds.OperationFailed as e:
                         raise Exception('Error on creating Virtual Server : %s' % e)
                 else:
                     # check-mode return value
@@ -516,23 +582,23 @@ def main():
                     # Have a transaction for all the changes
                     try:
                         api.System.Session.start_transaction()
-                        result['changed']|=set_destination(api,name,fq_name(partition,destination))
-                        result['changed']|=set_port(api,name,port)
-                        result['changed']|=set_pool(api,name,pool)
-                        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_rules(api,name,all_rules)
-                        result['changed']|=set_default_persistence_profiles(api,name,default_persistence_profile)
-                        result['changed']|=set_state(api,name,state)
+                        result['changed'] |= set_destination(api, name, fq_name(partition, destination))
+                        result['changed'] |= set_port(api, name, port)
+                        result['changed'] |= set_pool(api, name, pool)
+                        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_rules(api, name, all_rules)
+                        result['changed'] |= set_default_persistence_profiles(api, name, default_persistence_profile)
+                        result['changed'] |= set_state(api, name, state)
                         api.System.Session.submit_transaction()
-                    except Exception,e:
+                    except Exception as e:
                         raise Exception("Error on updating Virtual Server : %s" % e)
                 else:
                     # check-mode return value
                     result = {'changed': True}
 
-    except Exception, e:
+    except Exception as e:
         module.fail_json(msg="received exception: %s" % e)
 
     module.exit_json(**result)