mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Fixes generators and other misc fixes (#22887)
fixed itertools.imap busting several things that used to be lists, profiles not being set correctly, upon create, when it was a separate method, allowed port having the wrong lowest port (zero is allowed), empty port value should just be interpreted as None.
This commit is contained in:
parent
f5aa9df1fd
commit
2a576a1999
1 changed files with 57 additions and 24 deletions
|
@ -18,10 +18,11 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['preview'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
ANSIBLE_METADATA = {
|
||||
'status': ['preview'],
|
||||
'supported_by': 'community',
|
||||
'metadata_version': '1.0'
|
||||
}
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
|
@ -76,7 +77,9 @@ options:
|
|||
- ip
|
||||
port:
|
||||
description:
|
||||
- Port of the virtual server . Required when state=present and vs does not exist
|
||||
- Port of the virtual server. Required when state=present and vs does
|
||||
not exist. If you specify a value for this field, it must be a number
|
||||
between 0 and 65535.
|
||||
required: false
|
||||
default: None
|
||||
all_profiles:
|
||||
|
@ -196,7 +199,6 @@ deleted:
|
|||
sample: "my-virtual-server"
|
||||
'''
|
||||
|
||||
|
||||
# map of state values
|
||||
STATES = {
|
||||
'enabled': 'STATE_ENABLED',
|
||||
|
@ -225,9 +227,19 @@ def vs_exists(api, vs):
|
|||
return result
|
||||
|
||||
|
||||
def vs_create(api, name, destination, port, pool):
|
||||
_profiles = [[{'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': 'tcp'}]]
|
||||
created = False
|
||||
def vs_create(api, name, destination, port, pool, profiles):
|
||||
if profiles:
|
||||
_profiles = []
|
||||
for profile in profiles:
|
||||
_profiles.append(
|
||||
dict(
|
||||
profile_context='PROFILE_CONTEXT_TYPE_ALL',
|
||||
profile_name=profile
|
||||
)
|
||||
)
|
||||
else:
|
||||
_profiles = [{'profile_context': 'PROFILE_CONTEXT_TYPE_ALL', 'profile_name': 'tcp'}]
|
||||
|
||||
# a bit of a hack to handle concurrent runs of this module.
|
||||
# even though we've checked the vs doesn't exist,
|
||||
# it may exist by the time we run create_vs().
|
||||
|
@ -238,12 +250,11 @@ def vs_create(api, name, destination, port, pool):
|
|||
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)
|
||||
profiles=[_profiles])
|
||||
created = True
|
||||
return created
|
||||
except bigsuds.OperationFailed as e:
|
||||
if "already exists" not in str(e):
|
||||
raise Exception('Error on creating Virtual Server : %s' % e)
|
||||
raise Exception('Error on creating Virtual Server : %s' % e)
|
||||
|
||||
|
||||
def vs_remove(api, name):
|
||||
|
@ -298,9 +309,11 @@ def get_profiles(api, name):
|
|||
|
||||
def set_profiles(api, name, profiles_list):
|
||||
updated = False
|
||||
|
||||
try:
|
||||
if profiles_list is None:
|
||||
return False
|
||||
profiles_list = list(profiles_list)
|
||||
current_profiles = list(map(lambda x: x['profile_name'], get_profiles(api, name)))
|
||||
to_add_profiles = []
|
||||
for x in profiles_list:
|
||||
|
@ -322,6 +335,11 @@ def set_profiles(api, name, profiles_list):
|
|||
profiles=[to_add_profiles]
|
||||
)
|
||||
updated = True
|
||||
current_profiles = list(map(lambda x: x['profile_name'], get_profiles(api, name)))
|
||||
if len(current_profiles) == 0:
|
||||
raise F5ModuleError(
|
||||
"Virtual servers must has at least one profile"
|
||||
)
|
||||
return updated
|
||||
except bigsuds.OperationFailed as e:
|
||||
raise Exception('Error on setting profiles : %s' % e)
|
||||
|
@ -338,6 +356,7 @@ def set_policies(api, name, policies_list):
|
|||
try:
|
||||
if policies_list is None:
|
||||
return False
|
||||
policies_list = list(policies_list)
|
||||
current_policies = get_policies(api, name)
|
||||
to_add_policies = []
|
||||
for x in policies_list:
|
||||
|
@ -376,6 +395,7 @@ def set_enabled_vlans(api, name, vlans_enabled_list):
|
|||
try:
|
||||
if vlans_enabled_list is None:
|
||||
return updated
|
||||
vlans_enabled_list = list(vlans_enabled_list)
|
||||
current_vlans = get_vlan(api, name)
|
||||
|
||||
# Set allowed list back to default ("all")
|
||||
|
@ -632,18 +652,24 @@ def set_fallback_persistence_profile(api, partition, name, persistence_profile):
|
|||
|
||||
|
||||
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()
|
||||
result = None
|
||||
results = api.LocalLB.VirtualAddressV2.get_route_advertisement_state(virtual_addresses=[address])
|
||||
if results:
|
||||
result = results.pop(0)
|
||||
result = result.split("STATE_")[-1].lower()
|
||||
return result
|
||||
|
||||
|
||||
def set_route_advertisement_state(api, destination, partition, route_advertisement_state):
|
||||
updated = False
|
||||
|
||||
if route_advertisement_state is None:
|
||||
return False
|
||||
|
||||
try:
|
||||
state = "STATE_%s" % route_advertisement_state.strip().upper()
|
||||
address = fq_name(partition, destination,)
|
||||
current_route_advertisement_state=get_route_advertisement_status(api,address)
|
||||
current_route_advertisement_state = get_route_advertisement_status(api,address)
|
||||
if current_route_advertisement_state != route_advertisement_state:
|
||||
api.LocalLB.VirtualAddressV2.set_route_advertisement_state(virtual_addresses=[address], states=[state])
|
||||
updated = True
|
||||
|
@ -659,15 +685,19 @@ def main():
|
|||
choices=['present', 'absent', 'disabled', 'enabled']),
|
||||
name=dict(type='str', required=True, aliases=['vs']),
|
||||
destination=dict(type='str', aliases=['address', 'ip']),
|
||||
port=dict(type='int'),
|
||||
port=dict(type='str', default=None),
|
||||
all_policies=dict(type='list'),
|
||||
all_profiles=dict(type='list'),
|
||||
all_profiles=dict(type='list', default=None),
|
||||
all_rules=dict(type='list'),
|
||||
enabled_vlans=dict(type='list'),
|
||||
pool=dict(type='str'),
|
||||
description=dict(type='str'),
|
||||
snat=dict(type='str'),
|
||||
route_advertisement_state=dict(type='str', default='disabled', choices=['enabled', 'disabled']),
|
||||
route_advertisement_state=dict(
|
||||
type='str',
|
||||
default=None,
|
||||
choices=['enabled', 'disabled']
|
||||
),
|
||||
default_persistence_profile=dict(type='str'),
|
||||
fallback_persistence_profile=dict(type='str')
|
||||
))
|
||||
|
@ -698,6 +728,10 @@ def main():
|
|||
name = fq_name(partition, module.params['name'])
|
||||
destination = module.params['destination']
|
||||
port = module.params['port']
|
||||
if port == '' or port is None:
|
||||
port = None
|
||||
else:
|
||||
port = int(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'])
|
||||
|
@ -715,8 +749,8 @@ def main():
|
|||
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")
|
||||
if 0 > port > 65535:
|
||||
module.fail_json(msg="valid ports must be in range 0 - 65535")
|
||||
|
||||
try:
|
||||
api = bigip_api(server, user, password, validate_certs, port=server_port)
|
||||
|
@ -742,7 +776,7 @@ def main():
|
|||
else:
|
||||
update = False
|
||||
if not vs_exists(api, name):
|
||||
if (not destination) or (not port):
|
||||
if (not destination) or (port is None):
|
||||
module.fail_json(msg="both destination and port must be supplied to create a VS")
|
||||
if not module.check_mode:
|
||||
# a bit of a hack to handle concurrent runs of this module.
|
||||
|
@ -751,8 +785,7 @@ 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)
|
||||
vs_create(api, name, destination, port, pool, all_profiles)
|
||||
set_policies(api, name, all_policies)
|
||||
set_enabled_vlans(api, name, all_enabled_vlans)
|
||||
set_rules(api, name, all_rules)
|
||||
|
@ -791,7 +824,7 @@ def main():
|
|||
result['changed'] |= set_route_advertisement_state(api, destination, partition, route_advertisement_state)
|
||||
api.System.Session.submit_transaction()
|
||||
except Exception as e:
|
||||
raise Exception("Error on updating Virtual Server : %s" % e)
|
||||
raise Exception("Error on updating Virtual Server : %s" % str(e))
|
||||
else:
|
||||
# check-mode return value
|
||||
result = {'changed': True}
|
||||
|
|
Loading…
Reference in a new issue