mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-08-22 14:01:42 -07:00
Update f5 module utils from downstream (#45819)
* various refactoring * lgtm fixes * bigiq support to different auth providers
This commit is contained in:
parent
1ed3bd9168
commit
35e0434042
5 changed files with 255 additions and 90 deletions
|
@ -7,6 +7,7 @@ from __future__ import absolute_import, division, print_function
|
|||
__metaclass__ = type
|
||||
|
||||
|
||||
import os
|
||||
import time
|
||||
|
||||
try:
|
||||
|
@ -73,14 +74,21 @@ class F5RestClient(F5BaseClient):
|
|||
return self._client
|
||||
for x in range(0, 10):
|
||||
try:
|
||||
provider = self.provider['auth_provider'] or 'local'
|
||||
url = "https://{0}:{1}/mgmt/shared/authn/login".format(
|
||||
self.provider['server'], self.provider['server_port']
|
||||
)
|
||||
payload = {
|
||||
'username': self.provider['user'],
|
||||
'password': self.provider['password'],
|
||||
'loginProviderName': self.provider['auth_provider'] or 'local'
|
||||
}
|
||||
|
||||
# - local is a special provider that is baked into the system and
|
||||
# has no loginReference
|
||||
if provider != 'local':
|
||||
login_ref = self.get_login_ref(provider)
|
||||
payload.update(login_ref)
|
||||
|
||||
session = iControlRestSession()
|
||||
session.verify = self.provider['validate_certs']
|
||||
response = session.post(url, json=payload)
|
||||
|
@ -102,3 +110,68 @@ class F5RestClient(F5BaseClient):
|
|||
if exc is not None:
|
||||
error += ' The reported error was "{0}".'.format(str(exc))
|
||||
raise F5ModuleError(error)
|
||||
|
||||
def get_login_ref(self, provider):
|
||||
info = self.read_provider_info_from_device()
|
||||
uuids = [os.path.basename(os.path.dirname(x['link'])) for x in info['providers'] if '-' in x['link']]
|
||||
if provider in uuids:
|
||||
name = self.get_name_of_provider_id(info, provider)
|
||||
if not name:
|
||||
raise F5ModuleError(
|
||||
"No name found for the provider '{0}'".format(provider)
|
||||
)
|
||||
return dict(
|
||||
loginReference=dict(
|
||||
link="https://localhost/mgmt/cm/system/authn/providers/{0}/{1}/login".format(name, provider)
|
||||
)
|
||||
)
|
||||
names = [os.path.basename(os.path.dirname(x['link'])) for x in info['providers'] if '-' in x['link']]
|
||||
if names.count(provider) > 1:
|
||||
raise F5ModuleError(
|
||||
"Ambiguous auth_provider provided. Please specify a specific provider ID."
|
||||
)
|
||||
uuid = self.get_id_of_provider_name(info, provider)
|
||||
if not uuid:
|
||||
raise F5ModuleError(
|
||||
"No name found for the provider '{0}'".format(provider)
|
||||
)
|
||||
return dict(
|
||||
loginReference=dict(
|
||||
link="https://localhost/mgmt/cm/system/authn/providers/{0}/{1}/login".format(provider, uuid)
|
||||
)
|
||||
)
|
||||
|
||||
def get_name_of_provider_id(self, info, provider):
|
||||
# Add slashes to the provider name so that it specifically finds the provider
|
||||
# as part of the URL and not a part of another substring
|
||||
provider = '/' + provider + '/'
|
||||
for x in info['providers']:
|
||||
if x['link'].find(provider) > -1:
|
||||
return x['name']
|
||||
return None
|
||||
|
||||
def get_id_of_provider_name(self, info, provider):
|
||||
for x in info['providers']:
|
||||
if x['name'] == provider:
|
||||
return os.path.basename(os.path.dirname(x['link']))
|
||||
return None
|
||||
|
||||
def read_provider_info_from_device(self):
|
||||
uri = "https://{0}:{1}/info/system".format(
|
||||
self.provider['server'], self.provider['server_port']
|
||||
)
|
||||
session = iControlRestSession()
|
||||
session.verify = self.provider['validate_certs']
|
||||
|
||||
resp = session.get(uri)
|
||||
try:
|
||||
response = resp.json()
|
||||
except ValueError as ex:
|
||||
raise F5ModuleError(str(ex))
|
||||
|
||||
if 'code' in response and response['code'] == 400:
|
||||
if 'message' in response:
|
||||
raise F5ModuleError(response['message'])
|
||||
else:
|
||||
raise F5ModuleError(resp.content)
|
||||
return response
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue