diff --git a/changelogs/fragments/10941-use-f-strings-keycloak.yml b/changelogs/fragments/10941-use-f-strings-keycloak.yml new file mode 100644 index 0000000000..504a6dd611 --- /dev/null +++ b/changelogs/fragments/10941-use-f-strings-keycloak.yml @@ -0,0 +1,2 @@ +minor_changes: + - keycloak module utils plugin - use f-strings for string templating (https://github.com/ansible-collections/community.general/pull/10941). diff --git a/plugins/module_utils/identity/keycloak/keycloak.py b/plugins/module_utils/identity/keycloak/keycloak.py index ad07f27b1b..a54a911c20 100644 --- a/plugins/module_utils/identity/keycloak/keycloak.py +++ b/plugins/module_utils/identity/keycloak/keycloak.py @@ -176,7 +176,7 @@ def _token_request(module_params, payload): """ base_url = module_params.get('auth_keycloak_url') if not base_url.lower().startswith(('http', 'https')): - raise KeycloakError("auth_url '%s' should either start with 'http' or 'https'." % base_url) + raise KeycloakError(f"auth_url '{base_url}' should either start with 'http' or 'https'.") auth_realm = module_params.get('auth_realm') auth_url = URL_TOKEN.format(url=base_url, realm=auth_realm) http_agent = module_params.get('http_agent') @@ -191,14 +191,12 @@ def _token_request(module_params, payload): return r['access_token'] except ValueError as e: raise KeycloakError( - 'API returned invalid JSON when trying to obtain access token from %s: %s' - % (auth_url, str(e))) + f'API returned invalid JSON when trying to obtain access token from {auth_url}: {e}') except KeyError: raise KeycloakError( - 'API did not include access_token field in response from %s' % auth_url) + f'API did not include access_token field in response from {auth_url}') except Exception as e: - raise KeycloakError('Could not obtain access token from %s: %s' - % (auth_url, str(e)), authError=e) + raise KeycloakError(f'Could not obtain access token from {auth_url}: {e}', authError=e) def _request_token_using_credentials(module_params): @@ -288,7 +286,7 @@ def get_token(module_params): token = _request_token_using_credentials(module_params) return { - 'Authorization': 'Bearer ' + token, + 'Authorization': f"Bearer {token}", 'Content-Type': 'application/json' } @@ -397,7 +395,7 @@ class KeycloakAPI(object): if refresh_token is not None: try: token = _request_token_using_refresh_token(self.module.params) - self.restheaders['Authorization'] = 'Bearer ' + token + self.restheaders['Authorization'] = f"Bearer {token}" r = make_request_catching_401() except KeycloakError as e: @@ -411,7 +409,7 @@ class KeycloakAPI(object): auth_password = self.module.params.get('auth_password') if auth_username is not None and auth_password is not None: token = _request_token_using_credentials(self.module.params) - self.restheaders['Authorization'] = 'Bearer ' + token + self.restheaders['Authorization'] = f"Bearer {token}" r = make_request_catching_401() @@ -422,7 +420,7 @@ class KeycloakAPI(object): if auth_client_id is not None and auth_client_secret is not None: try: token = _request_token_using_client_credentials(self.module.params) - self.restheaders['Authorization'] = 'Bearer ' + token + self.restheaders['Authorization'] = f"Bearer {token}" r = make_request_catching_401() except KeycloakError as e: @@ -461,13 +459,13 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.fail_request(e, msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain realm {realm}: {e}', exception=traceback.format_exc()) except Exception as e: - self.module.fail_json(msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) def get_realm_keys_metadata_by_id(self, realm='master'): @@ -490,13 +488,13 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.fail_request(e, msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain realm {realm}: {e}', exception=traceback.format_exc()) except Exception as e: - self.module.fail_json(msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) # The Keycloak API expects the realm name (like `master`) not the ID when fetching the realm data. @@ -516,13 +514,13 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.fail_request(e, msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain realm {realm}: {e}', exception=traceback.format_exc()) except Exception as e: - self.module.fail_json(msg='Could not obtain realm %s: %s' % (realm, str(e)), + self.module.fail_json(msg=f'Could not obtain realm {realm}: {e}', exception=traceback.format_exc()) def update_realm(self, realmrep, realm="master"): @@ -536,7 +534,7 @@ class KeycloakAPI(object): try: return self._request(realm_url, method='PUT', data=json.dumps(realmrep)) except Exception as e: - self.fail_request(e, msg='Could not update realm %s: %s' % (realm, str(e)), + self.fail_request(e, msg=f'Could not update realm {realm}: {e}', exception=traceback.format_exc()) def create_realm(self, realmrep): @@ -549,7 +547,7 @@ class KeycloakAPI(object): try: return self._request(realm_url, method='POST', data=json.dumps(realmrep)) except Exception as e: - self.fail_request(e, msg='Could not create realm %s: %s' % (realmrep['id'], str(e)), + self.fail_request(e, msg=f"Could not create realm {realmrep['id']}: {e}", exception=traceback.format_exc()) def delete_realm(self, realm="master"): @@ -563,7 +561,7 @@ class KeycloakAPI(object): try: return self._request(realm_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete realm %s: %s' % (realm, str(e)), + self.fail_request(e, msg=f'Could not delete realm {realm}: {e}', exception=traceback.format_exc()) def get_clients(self, realm='master', filter=None): @@ -575,16 +573,14 @@ class KeycloakAPI(object): """ clientlist_url = URL_CLIENTS.format(url=self.baseurl, realm=realm) if filter is not None: - clientlist_url += '?clientId=%s' % filter + clientlist_url += f'?clientId={filter}' try: return self._request_and_deserialize(clientlist_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of clients for realm %s: %s' - % (realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of clients for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of clients for realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of clients for realm {realm}: {e}') def get_client_by_clientid(self, client_id, realm='master'): """ Get client representation by clientId @@ -614,14 +610,11 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain client %s for realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain client {id} for realm {realm}: {e}') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain client %s for realm %s: %s' - % (id, realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain client {id} for realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not obtain client %s for realm %s: %s' - % (id, realm, str(e))) + self.module.fail_json(msg=f'Could not obtain client {id} for realm {realm}: {e}') def get_client_id(self, client_id, realm='master'): """ Obtain id of client by client_id @@ -648,8 +641,7 @@ class KeycloakAPI(object): try: return self._request(client_url, method='PUT', data=json.dumps(clientrep)) except Exception as e: - self.fail_request(e, msg='Could not update client %s in realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not update client {id} in realm {realm}: {e}') def create_client(self, clientrep, realm="master"): """ Create a client in keycloak @@ -662,8 +654,7 @@ class KeycloakAPI(object): try: return self._request(client_url, method='POST', data=json.dumps(clientrep)) except Exception as e: - self.fail_request(e, msg='Could not create client %s in realm %s: %s' - % (clientrep['clientId'], realm, str(e))) + self.fail_request(e, msg=f"Could not create client {clientrep['clientId']} in realm {realm}: {e}") def delete_client(self, id, realm="master"): """ Delete a client from Keycloak @@ -677,8 +668,7 @@ class KeycloakAPI(object): try: return self._request(client_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete client %s in realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete client {id} in realm {realm}: {e}') def get_client_roles_by_id(self, cid, realm="master"): """ Fetch the roles of the a client on the Keycloak server. @@ -691,8 +681,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(client_roles_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch rolemappings for client %s in realm %s: %s" - % (cid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch rolemappings for client {cid} in realm {realm}: {e}") def get_client_role_id_by_name(self, cid, name, realm="master"): """ Get the role ID of a client. @@ -724,8 +713,7 @@ class KeycloakAPI(object): if rid == role['id']: return role except Exception as e: - self.fail_request(e, msg="Could not fetch rolemappings for client %s in group %s, realm %s: %s" - % (cid, gid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch rolemappings for client {cid} in group {gid}, realm {realm}: {e}") return None def get_client_group_available_rolemappings(self, gid, cid, realm="master"): @@ -740,8 +728,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(available_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch available rolemappings for client %s in group %s, realm %s: %s" - % (cid, gid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch available rolemappings for client {cid} in group {gid}, realm {realm}: {e}") def get_client_group_composite_rolemappings(self, gid, cid, realm="master"): """ Fetch the composite role of a client in a specified group on the Keycloak server. @@ -755,8 +742,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(composite_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch available rolemappings for client %s in group %s, realm %s: %s" - % (cid, gid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch available rolemappings for client {cid} in group {gid}, realm {realm}: {e}") def get_role_by_id(self, rid, realm="master"): """ Fetch a role by its id on the Keycloak server. @@ -769,8 +755,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(client_roles_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch role for id %s in realm %s: %s" - % (rid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch role for id {rid} in realm {realm}: {e}") def get_client_roles_by_id_composite_rolemappings(self, rid, cid, realm="master"): """ Fetch a role by its id on the Keycloak server. @@ -784,8 +769,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(client_roles_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch role for id %s and cid %s in realm %s: %s" - % (rid, cid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch role for id {rid} and cid {cid} in realm {realm}: {e}") def add_client_roles_by_id_composite_rolemapping(self, rid, roles_rep, realm="master"): """ Assign roles to composite role @@ -799,8 +783,7 @@ class KeycloakAPI(object): try: self._request(available_rolemappings_url, method="POST", data=json.dumps(roles_rep)) except Exception as e: - self.fail_request(e, msg="Could not assign roles to composite role %s and realm %s: %s" - % (rid, realm, str(e))) + self.fail_request(e, msg=f"Could not assign roles to composite role {rid} and realm {realm}: {e}") def add_group_realm_rolemapping(self, gid, role_rep, realm="master"): """ Add the specified realm role to specified group on the Keycloak server. @@ -814,8 +797,7 @@ class KeycloakAPI(object): try: self._request(url, method="POST", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could add realm role mappings for group %s, realm %s: %s" - % (gid, realm, str(e))) + self.fail_request(e, msg=f"Could add realm role mappings for group {gid}, realm {realm}: {e}") def delete_group_realm_rolemapping(self, gid, role_rep, realm="master"): """ Delete the specified realm role from the specified group on the Keycloak server. @@ -829,8 +811,7 @@ class KeycloakAPI(object): try: self._request(url, method="DELETE", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not delete realm role mappings for group %s, realm %s: %s" - % (gid, realm, str(e))) + self.fail_request(e, msg=f"Could not delete realm role mappings for group {gid}, realm {realm}: {e}") def add_group_rolemapping(self, gid, cid, role_rep, realm="master"): """ Fetch the composite role of a client in a specified group on the Keycloak server. @@ -845,8 +826,7 @@ class KeycloakAPI(object): try: self._request(available_rolemappings_url, method="POST", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not fetch available rolemappings for client %s in group %s, realm %s: %s" - % (cid, gid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch available rolemappings for client {cid} in group {gid}, realm {realm}: {e}") def delete_group_rolemapping(self, gid, cid, role_rep, realm="master"): """ Delete the rolemapping of a client in a specified group on the Keycloak server. @@ -861,8 +841,7 @@ class KeycloakAPI(object): try: self._request(available_rolemappings_url, method="DELETE", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not delete available rolemappings for client %s in group %s, realm %s: %s" - % (cid, gid, realm, str(e))) + self.fail_request(e, msg=f"Could not delete available rolemappings for client {cid} in group {gid}, realm {realm}: {e}") def get_client_user_rolemapping_by_id(self, uid, cid, rid, realm='master'): """ Obtain client representation by id @@ -880,8 +859,7 @@ class KeycloakAPI(object): if rid == role['id']: return role except Exception as e: - self.fail_request(e, msg="Could not fetch rolemappings for client %s and user %s, realm %s: %s" - % (cid, uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch rolemappings for client {cid} and user {uid}, realm {realm}: {e}") return None def get_client_user_available_rolemappings(self, uid, cid, realm="master"): @@ -896,8 +874,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(available_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch effective rolemappings for client %s and user %s, realm %s: %s" - % (cid, uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch effective rolemappings for client {cid} and user {uid}, realm {realm}: {e}") def get_client_user_composite_rolemappings(self, uid, cid, realm="master"): """ Fetch the composite role of a client for a specified user on the Keycloak server. @@ -911,8 +888,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(composite_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch available rolemappings for user %s of realm %s: %s" - % (uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch available rolemappings for user {uid} of realm {realm}: {e}") def get_realm_user_rolemapping_by_id(self, uid, rid, realm='master'): """ Obtain role representation by id @@ -929,8 +905,7 @@ class KeycloakAPI(object): if rid == role['id']: return role except Exception as e: - self.fail_request(e, msg="Could not fetch rolemappings for user %s, realm %s: %s" - % (uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch rolemappings for user {uid}, realm {realm}: {e}") return None def get_realm_user_available_rolemappings(self, uid, realm="master"): @@ -944,8 +919,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(available_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch available rolemappings for user %s of realm %s: %s" - % (uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch available rolemappings for user {uid} of realm {realm}: {e}") def get_realm_user_composite_rolemappings(self, uid, realm="master"): """ Fetch the composite role of a realm for a specified user on the Keycloak server. @@ -958,8 +932,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(composite_rolemappings_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch effective rolemappings for user %s, realm %s: %s" - % (uid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch effective rolemappings for user {uid}, realm {realm}: {e}") def get_user_by_username(self, username, realm="master"): """ Fetch a keycloak user within a realm based on its username. @@ -969,7 +942,7 @@ class KeycloakAPI(object): :param realm: Realm in which the user resides; default 'master' """ users_url = URL_USERS.format(url=self.baseurl, realm=realm) - users_url += '?username=%s&exact=true' % username + users_url += f'?username={username}&exact=true' try: userrep = None users = self._request_and_deserialize(users_url, method='GET') @@ -980,11 +953,9 @@ class KeycloakAPI(object): return userrep except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain the user for realm %s and username %s: %s' - % (realm, username, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain the user for realm {realm} and username {username}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain the user for realm %s and username %s: %s' - % (realm, username, str(e))) + self.fail_request(e, msg=f'Could not obtain the user for realm {realm} and username {username}: {e}') def get_service_account_user_by_client_id(self, client_id, realm="master"): """ Fetch a keycloak service account user within a realm based on its client_id. @@ -999,11 +970,11 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(service_account_user_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain the service-account-user for realm %s and client_id %s: %s' - % (realm, client_id, str(e))) + self.module.fail_json( + msg=f'API returned incorrect JSON when trying to obtain the service-account-user for realm {realm} and client_id {client_id}: {e}' + ) except Exception as e: - self.fail_request(e, msg='Could not obtain the service-account-user for realm %s and client_id %s: %s' - % (realm, client_id, str(e))) + self.fail_request(e, msg=f'Could not obtain the service-account-user for realm {realm} and client_id {client_id}: {e}') def add_user_rolemapping(self, uid, cid, role_rep, realm="master"): """ Assign a realm or client role to a specified user on the Keycloak server. @@ -1019,15 +990,13 @@ class KeycloakAPI(object): try: self._request(user_realm_rolemappings_url, method="POST", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not map roles to userId %s for realm %s and roles %s: %s" - % (uid, realm, json.dumps(role_rep), str(e))) + self.fail_request(e, msg=f"Could not map roles to userId {uid} for realm {realm} and roles {json.dumps(role_rep)}: {e}") else: user_client_rolemappings_url = URL_CLIENT_USER_ROLEMAPPINGS.format(url=self.baseurl, realm=realm, id=uid, client=cid) try: self._request(user_client_rolemappings_url, method="POST", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not map roles to userId %s for client %s, realm %s and roles %s: %s" - % (cid, uid, realm, json.dumps(role_rep), str(e))) + self.fail_request(e, msg=f"Could not map roles to userId {cid} for client {uid}, realm {realm} and roles {json.dumps(role_rep)}: {e}") def delete_user_rolemapping(self, uid, cid, role_rep, realm="master"): """ Delete the rolemapping of a client in a specified user on the Keycloak server. @@ -1043,15 +1012,13 @@ class KeycloakAPI(object): try: self._request(user_realm_rolemappings_url, method="DELETE", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not remove roles %s from userId %s, realm %s: %s" - % (json.dumps(role_rep), uid, realm, str(e))) + self.fail_request(e, msg=f"Could not remove roles {json.dumps(role_rep)} from userId {uid}, realm {realm}: {e}") else: user_client_rolemappings_url = URL_CLIENT_USER_ROLEMAPPINGS.format(url=self.baseurl, realm=realm, id=uid, client=cid) try: self._request(user_client_rolemappings_url, method="DELETE", data=json.dumps(role_rep)) except Exception as e: - self.fail_request(e, msg="Could not remove roles %s for client %s from userId %s, realm %s: %s" - % (json.dumps(role_rep), cid, uid, realm, str(e))) + self.fail_request(e, msg=f"Could not remove roles {json.dumps(role_rep)} for client {cid} from userId {uid}, realm {realm}: {e}") def get_client_templates(self, realm='master'): """ Obtains client template representations for client templates in a realm @@ -1064,11 +1031,9 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of client templates for realm %s: %s' - % (realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of client templates for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of client templates for realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of client templates for realm {realm}: {e}') def get_client_template_by_id(self, id, realm='master'): """ Obtain client template representation by id @@ -1082,11 +1047,9 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain client templates %s for realm %s: %s' - % (id, realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain client templates {id} for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain client template %s for realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain client template {id} for realm {realm}: {e}') def get_client_template_by_name(self, name, realm='master'): """ Obtain client template representation by name @@ -1127,8 +1090,7 @@ class KeycloakAPI(object): try: return self._request(url, method='PUT', data=json.dumps(clienttrep)) except Exception as e: - self.fail_request(e, msg='Could not update client template %s in realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not update client template {id} in realm {realm}: {e}') def create_client_template(self, clienttrep, realm="master"): """ Create a client in keycloak @@ -1141,8 +1103,7 @@ class KeycloakAPI(object): try: return self._request(url, method='POST', data=json.dumps(clienttrep)) except Exception as e: - self.fail_request(e, msg='Could not create client template %s in realm %s: %s' - % (clienttrep['clientId'], realm, str(e))) + self.fail_request(e, msg=f"Could not create client template {clienttrep['clientId']} in realm {realm}: {e}") def delete_client_template(self, id, realm="master"): """ Delete a client template from Keycloak @@ -1156,8 +1117,7 @@ class KeycloakAPI(object): try: return self._request(url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete client template %s in realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete client template {id} in realm {realm}: {e}') def get_clientscopes(self, realm="master"): """ Fetch the name and ID of all clientscopes on the Keycloak server. @@ -1172,8 +1132,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(clientscopes_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch list of clientscopes in realm %s: %s" - % (realm, str(e))) + self.fail_request(e, msg=f"Could not fetch list of clientscopes in realm {realm}: {e}") def get_clientscope_by_clientscopeid(self, cid, realm="master"): """ Fetch a keycloak clientscope from the provided realm using the clientscope's unique ID. @@ -1192,11 +1151,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg="Could not fetch clientscope %s in realm %s: %s" - % (cid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch clientscope {cid} in realm {realm}: {e}") except Exception as e: - self.module.fail_json(msg="Could not clientscope group %s in realm %s: %s" - % (cid, realm, str(e))) + self.module.fail_json(msg=f"Could not clientscope group {cid} in realm {realm}: {e}") def get_clientscope_by_name(self, name, realm="master"): """ Fetch a keycloak clientscope within a realm based on its name. @@ -1219,8 +1176,7 @@ class KeycloakAPI(object): return None except Exception as e: - self.module.fail_json(msg="Could not fetch clientscope %s in realm %s: %s" - % (name, realm, str(e))) + self.module.fail_json(msg=f"Could not fetch clientscope {name} in realm {realm}: {e}") def create_clientscope(self, clientscoperep, realm="master"): """ Create a Keycloak clientscope. @@ -1232,8 +1188,7 @@ class KeycloakAPI(object): try: return self._request(clientscopes_url, method='POST', data=json.dumps(clientscoperep)) except Exception as e: - self.fail_request(e, msg="Could not create clientscope %s in realm %s: %s" - % (clientscoperep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create clientscope {clientscoperep['name']} in realm {realm}: {e}") def update_clientscope(self, clientscoperep, realm="master"): """ Update an existing clientscope. @@ -1247,8 +1202,7 @@ class KeycloakAPI(object): return self._request(clientscope_url, method='PUT', data=json.dumps(clientscoperep)) except Exception as e: - self.fail_request(e, msg='Could not update clientscope %s in realm %s: %s' - % (clientscoperep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not update clientscope {clientscoperep['name']} in realm {realm}: {e}") def delete_clientscope(self, name=None, cid=None, realm="master"): """ Delete a clientscope. One of name or cid must be provided. @@ -1284,7 +1238,7 @@ class KeycloakAPI(object): return self._request(clientscope_url, method='DELETE') except Exception as e: - self.fail_request(e, msg="Unable to delete clientscope %s: %s" % (cid, str(e))) + self.fail_request(e, msg=f"Unable to delete clientscope {cid}: {e}") def get_clientscope_protocolmappers(self, cid, realm="master"): """ Fetch the name and ID of all clientscopes on the Keycloak server. @@ -1300,8 +1254,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(protocolmappers_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch list of protocolmappers in realm %s: %s" - % (realm, str(e))) + self.fail_request(e, msg=f"Could not fetch list of protocolmappers in realm {realm}: {e}") def get_clientscope_protocolmapper_by_protocolmapperid(self, pid, cid, realm="master"): """ Fetch a keycloak clientscope from the provided realm using the clientscope's unique ID. @@ -1322,11 +1275,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg="Could not fetch protocolmapper %s in realm %s: %s" - % (pid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch protocolmapper {pid} in realm {realm}: {e}") except Exception as e: - self.module.fail_json(msg="Could not fetch protocolmapper %s in realm %s: %s" - % (cid, realm, str(e))) + self.module.fail_json(msg=f"Could not fetch protocolmapper {cid} in realm {realm}: {e}") def get_clientscope_protocolmapper_by_name(self, cid, name, realm="master"): """ Fetch a keycloak clientscope within a realm based on its name. @@ -1350,8 +1301,7 @@ class KeycloakAPI(object): return None except Exception as e: - self.module.fail_json(msg="Could not fetch protocolmapper %s in realm %s: %s" - % (name, realm, str(e))) + self.module.fail_json(msg=f"Could not fetch protocolmapper {name} in realm {realm}: {e}") def create_clientscope_protocolmapper(self, cid, mapper_rep, realm="master"): """ Create a Keycloak clientscope protocolmapper. @@ -1364,8 +1314,7 @@ class KeycloakAPI(object): try: return self._request(protocolmappers_url, method='POST', data=json.dumps(mapper_rep)) except Exception as e: - self.fail_request(e, msg="Could not create protocolmapper %s in realm %s: %s" - % (mapper_rep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create protocolmapper {mapper_rep['name']} in realm {realm}: {e}") def update_clientscope_protocolmappers(self, cid, mapper_rep, realm="master"): """ Update an existing clientscope. @@ -1380,8 +1329,7 @@ class KeycloakAPI(object): return self._request(protocolmapper_url, method='PUT', data=json.dumps(mapper_rep)) except Exception as e: - self.fail_request(e, msg='Could not update protocolmappers for clientscope %s in realm %s: %s' - % (mapper_rep, realm, str(e))) + self.fail_request(e, msg=f'Could not update protocolmappers for clientscope {mapper_rep} in realm {realm}: {e}') def get_default_clientscopes(self, realm, client_id=None): """Fetch the name and ID of all clientscopes on the Keycloak server. @@ -1426,14 +1374,14 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(clientscopes_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch list of %s clientscopes in realm %s: %s" % (scope_type, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch list of {scope_type} clientscopes in realm {realm}: {e}") else: cid = self.get_client_id(client_id=client_id, realm=realm) clientscopes_url = url_template.format(url=self.baseurl, realm=realm, cid=cid) try: return self._request_and_deserialize(clientscopes_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch list of %s clientscopes in client %s: %s" % (scope_type, client_id, clientscopes_url)) + self.fail_request(e, msg=f"Could not fetch list of {scope_type} clientscopes in client {client_id}: {clientscopes_url}") def _decide_url_type_clientscope(self, client_id=None, scope_type="default"): """Decides which url to use. @@ -1502,8 +1450,8 @@ class KeycloakAPI(object): return self._request(clientscope_type_url, method=method) except Exception as e: - place = 'realm' if client_id is None else 'client ' + client_id - self.fail_request(e, msg="Unable to %s %s clientscope %s @ %s : %s" % (action, scope_type, id, place, str(e))) + place = 'realm' if client_id is None else f"client {client_id}" + self.fail_request(e, msg=f"Unable to {action} {scope_type} clientscope {id} @ {place} : {e}") def create_clientsecret(self, id, realm="master"): """ Generate a new client secret by id @@ -1521,11 +1469,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain clientsecret of client %s for realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain clientsecret of client {id} for realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not obtain clientsecret of client %s for realm %s: %s' - % (id, realm, str(e))) + self.module.fail_json(msg=f'Could not obtain clientsecret of client {id} for realm {realm}: {e}') def get_clientsecret(self, id, realm="master"): """ Obtain client secret by id @@ -1543,11 +1489,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not obtain clientsecret of client %s for realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain clientsecret of client {id} for realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not obtain clientsecret of client %s for realm %s: %s' - % (id, realm, str(e))) + self.module.fail_json(msg=f'Could not obtain clientsecret of client {id} for realm {realm}: {e}') def get_groups(self, realm="master"): """ Fetch the name and ID of all groups on the Keycloak server. @@ -1561,8 +1505,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(groups_url, method="GET") except Exception as e: - self.fail_request(e, msg="Could not fetch list of groups in realm %s: %s" - % (realm, str(e))) + self.fail_request(e, msg=f"Could not fetch list of groups in realm {realm}: {e}") def get_group_by_groupid(self, gid, realm="master"): """ Fetch a keycloak group from the provided realm using the group's unique ID. @@ -1580,11 +1523,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg="Could not fetch group %s in realm %s: %s" - % (gid, realm, str(e))) + self.fail_request(e, msg=f"Could not fetch group {gid} in realm {realm}: {e}") except Exception as e: - self.module.fail_json(msg="Could not fetch group %s in realm %s: %s" - % (gid, realm, str(e))) + self.module.fail_json(msg=f"Could not fetch group {gid} in realm {realm}: {e}") def get_subgroups(self, parent, realm="master"): if 'subGroupCount' in parent: @@ -1594,7 +1535,7 @@ class KeycloakAPI(object): if parent['subGroupCount'] == 0: group_children = [] else: - group_children_url = URL_GROUP_CHILDREN.format(url=self.baseurl, realm=realm, groupid=parent['id']) + "?max=" + str(parent['subGroupCount']) + group_children_url = f"{URL_GROUP_CHILDREN.format(url=self.baseurl, realm=realm, groupid=parent['id'])}?max={parent['subGroupCount']}" group_children = self._request_and_deserialize(group_children_url, method="GET") subgroups = group_children else: @@ -1631,8 +1572,7 @@ class KeycloakAPI(object): return None except Exception as e: - self.module.fail_json(msg="Could not fetch group %s in realm %s: %s" - % (name, realm, str(e))) + self.module.fail_json(msg=f"Could not fetch group {name} in realm {realm}: {e}") def _get_normed_group_parent(self, parent): """ Converts parent dict information into a more easy to use form. @@ -1740,8 +1680,7 @@ class KeycloakAPI(object): try: return self._request(groups_url, method='POST', data=json.dumps(grouprep)) except Exception as e: - self.fail_request(e, msg="Could not create group %s in realm %s: %s" - % (grouprep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create group {grouprep['name']} in realm {realm}: {e}") def create_subgroup(self, parents, grouprep, realm="master"): """ Create a Keycloak subgroup. @@ -1757,18 +1696,17 @@ class KeycloakAPI(object): if not parent_id: raise Exception( "Could not determine subgroup parent ID for given" - " parent chain {0}. Assure that all parents exist" + f" parent chain {parents}. Assure that all parents exist" " already and the list is complete and properly" " ordered, starts with an ID or starts at the" - " top level".format(parents) + " top level" ) parent_id = parent_id["id"] url = URL_GROUP_CHILDREN.format(url=self.baseurl, realm=realm, groupid=parent_id) return self._request(url, method='POST', data=json.dumps(grouprep)) except Exception as e: - self.fail_request(e, msg="Could not create subgroup %s for parent group %s in realm %s: %s" - % (grouprep['name'], parent_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create subgroup {grouprep['name']} for parent group {parent_id} in realm {realm}: {e}") def update_group(self, grouprep, realm="master"): """ Update an existing group. @@ -1781,8 +1719,7 @@ class KeycloakAPI(object): try: return self._request(group_url, method='PUT', data=json.dumps(grouprep)) except Exception as e: - self.fail_request(e, msg='Could not update group %s in realm %s: %s' - % (grouprep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not update group {grouprep['name']} in realm {realm}: {e}") def delete_group(self, name=None, groupid=None, realm="master"): """ Delete a group. One of name or groupid must be provided. @@ -1817,7 +1754,7 @@ class KeycloakAPI(object): try: return self._request(group_url, method='DELETE') except Exception as e: - self.fail_request(e, msg="Unable to delete group %s: %s" % (groupid, str(e))) + self.fail_request(e, msg=f"Unable to delete group {groupid}: {e}") def get_realm_roles(self, realm='master'): """ Obtains role representations for roles in a realm @@ -1829,11 +1766,9 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(rolelist_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of roles for realm %s: %s' - % (realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of roles for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of roles for realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of roles for realm {realm}: {e}') def get_realm_role(self, name, realm='master'): """ Fetch a keycloak role from the provided realm using the role's name. @@ -1849,11 +1784,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not fetch role %s in realm %s: %s' - % (name, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch role {name} in realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not fetch role %s in realm %s: %s' - % (name, realm, str(e))) + self.module.fail_json(msg=f'Could not fetch role {name} in realm {realm}: {e}') def create_realm_role(self, rolerep, realm='master'): """ Create a Keycloak realm role. @@ -1868,8 +1801,7 @@ class KeycloakAPI(object): rolerep["composites"] = keycloak_compatible_composites return self._request(roles_url, method='POST', data=json.dumps(rolerep)) except Exception as e: - self.fail_request(e, msg='Could not create role %s in realm %s: %s' - % (rolerep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create role {rolerep['name']} in realm {realm}: {e}") def update_realm_role(self, rolerep, realm='master'): """ Update an existing realm role. @@ -1888,8 +1820,7 @@ class KeycloakAPI(object): self.update_role_composites(rolerep=rolerep, composites=composites, realm=realm) return role_response except Exception as e: - self.fail_request(e, msg='Could not update role %s in realm %s: %s' - % (rolerep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not update role {rolerep['name']} in realm {realm}: {e}") def get_role_composites(self, rolerep, clientid=None, realm='master'): composite_url = '' @@ -1903,8 +1834,7 @@ class KeycloakAPI(object): # Get existing composites return self._request_and_deserialize(composite_url, method='GET') except Exception as e: - self.fail_request(e, msg='Could not get role %s composites in realm %s: %s' - % (rolerep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not get role {rolerep['name']} composites in realm {realm}: {e}") def create_role_composites(self, rolerep, composites, clientid=None, realm='master'): composite_url = '' @@ -1919,8 +1849,7 @@ class KeycloakAPI(object): # create new composites return self._request(composite_url, method='POST', data=json.dumps(composites)) except Exception as e: - self.fail_request(e, msg='Could not create role %s composites in realm %s: %s' - % (rolerep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create role {rolerep['name']} composites in realm {realm}: {e}") def delete_role_composites(self, rolerep, composites, clientid=None, realm='master'): composite_url = '' @@ -1935,8 +1864,7 @@ class KeycloakAPI(object): # create new composites return self._request(composite_url, method='DELETE', data=json.dumps(composites)) except Exception as e: - self.fail_request(e, msg='Could not create role %s composites in realm %s: %s' - % (rolerep['name'], realm, str(e))) + self.fail_request(e, msg=f"Could not create role {rolerep['name']} composites in realm {realm}: {e}") def update_role_composites(self, rolerep, composites, clientid=None, realm='master'): # Get existing composites @@ -1998,8 +1926,7 @@ class KeycloakAPI(object): try: return self._request(role_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Unable to delete role %s in realm %s: %s' - % (name, realm, str(e))) + self.fail_request(e, msg=f'Unable to delete role {name} in realm {realm}: {e}') def get_client_roles(self, clientid, realm='master'): """ Obtains role representations for client roles in a specific client @@ -2010,17 +1937,14 @@ class KeycloakAPI(object): """ cid = self.get_client_id(clientid, realm=realm) if cid is None: - self.module.fail_json(msg='Could not find client %s in realm %s' - % (clientid, realm)) + self.module.fail_json(msg=f'Could not find client {clientid} in realm {realm}') rolelist_url = URL_CLIENT_ROLES.format(url=self.baseurl, realm=realm, id=cid) try: return self._request_and_deserialize(rolelist_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of roles for client %s in realm %s: %s' - % (clientid, realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of roles for client {clientid} in realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of roles for client %s in realm %s: %s' - % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of roles for client {clientid} in realm {realm}: {e}') def get_client_role(self, name, clientid, realm='master'): """ Fetch a keycloak client role from the provided realm using the role's name. @@ -2033,8 +1957,7 @@ class KeycloakAPI(object): """ cid = self.get_client_id(clientid, realm=realm) if cid is None: - self.module.fail_json(msg='Could not find client %s in realm %s' - % (clientid, realm)) + self.module.fail_json(msg=f'Could not find client {clientid} in realm {realm}') role_url = URL_CLIENT_ROLE.format(url=self.baseurl, realm=realm, id=cid, name=quote(name, safe='')) try: return self._request_and_deserialize(role_url, method="GET") @@ -2042,11 +1965,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not fetch role %s in client %s of realm %s: %s' - % (name, clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch role {name} in client {clientid} of realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not fetch role %s for client %s in realm %s: %s' - % (name, clientid, realm, str(e))) + self.module.fail_json(msg=f'Could not fetch role {name} for client {clientid} in realm {realm}: {e}') def create_client_role(self, rolerep, clientid, realm='master'): """ Create a Keycloak client role. @@ -2058,8 +1979,7 @@ class KeycloakAPI(object): """ cid = self.get_client_id(clientid, realm=realm) if cid is None: - self.module.fail_json(msg='Could not find client %s in realm %s' - % (clientid, realm)) + self.module.fail_json(msg=f'Could not find client {clientid} in realm {realm}') roles_url = URL_CLIENT_ROLES.format(url=self.baseurl, realm=realm, id=cid) try: if "composites" in rolerep: @@ -2067,8 +1987,7 @@ class KeycloakAPI(object): rolerep["composites"] = keycloak_compatible_composites return self._request(roles_url, method='POST', data=json.dumps(rolerep)) except Exception as e: - self.fail_request(e, msg='Could not create role %s for client %s in realm %s: %s' - % (rolerep['name'], clientid, realm, str(e))) + self.fail_request(e, msg=f"Could not create role {rolerep['name']} for client {clientid} in realm {realm}: {e}") def convert_role_composites(self, composites): keycloak_compatible_composites = { @@ -2095,8 +2014,7 @@ class KeycloakAPI(object): """ cid = self.get_client_id(clientid, realm=realm) if cid is None: - self.module.fail_json(msg='Could not find client %s in realm %s' - % (clientid, realm)) + self.module.fail_json(msg=f'Could not find client {clientid} in realm {realm}') role_url = URL_CLIENT_ROLE.format(url=self.baseurl, realm=realm, id=cid, name=quote(rolerep['name'], safe='')) try: composites = None @@ -2108,8 +2026,7 @@ class KeycloakAPI(object): self.update_role_composites(rolerep=rolerep, clientid=clientid, composites=composites, realm=realm) return update_role_response except Exception as e: - self.fail_request(e, msg='Could not update role %s for client %s in realm %s: %s' - % (rolerep['name'], clientid, realm, str(e))) + self.fail_request(e, msg=f"Could not update role {rolerep['name']} for client {clientid} in realm {realm}: {e}") def delete_client_role(self, name, clientid, realm="master"): """ Delete a role. One of name or roleid must be provided. @@ -2120,14 +2037,12 @@ class KeycloakAPI(object): """ cid = self.get_client_id(clientid, realm=realm) if cid is None: - self.module.fail_json(msg='Could not find client %s in realm %s' - % (clientid, realm)) + self.module.fail_json(msg=f'Could not find client {clientid} in realm {realm}') role_url = URL_CLIENT_ROLE.format(url=self.baseurl, realm=realm, id=cid, name=quote(name, safe='')) try: return self._request(role_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Unable to delete role %s for client %s in realm %s: %s' - % (name, clientid, realm, str(e))) + self.fail_request(e, msg=f'Unable to delete role {name} for client {clientid} in realm {realm}: {e}') def get_authentication_flow_by_alias(self, alias, realm='master'): """ @@ -2146,7 +2061,7 @@ class KeycloakAPI(object): break return authentication_flow except Exception as e: - self.fail_request(e, msg="Unable get authentication flow %s: %s" % (alias, str(e))) + self.fail_request(e, msg=f"Unable get authentication flow {alias}: {e}") def delete_authentication_flow_by_id(self, id, realm='master'): """ @@ -2160,8 +2075,7 @@ class KeycloakAPI(object): try: return self._request(flow_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete authentication flow %s in realm %s: %s' - % (id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete authentication flow {id} in realm {realm}: {e}') def copy_auth_flow(self, config, realm='master'): """ @@ -2191,8 +2105,7 @@ class KeycloakAPI(object): return flow return None except Exception as e: - self.fail_request(e, msg='Could not copy authentication flow %s in realm %s: %s' - % (config["alias"], realm, str(e))) + self.fail_request(e, msg=f"Could not copy authentication flow {config['alias']} in realm {realm}: {e}") def create_empty_auth_flow(self, config, realm='master'): """ @@ -2225,8 +2138,7 @@ class KeycloakAPI(object): return flow return None except Exception as e: - self.fail_request(e, msg='Could not create empty authentication flow %s in realm %s: %s' - % (config["alias"], realm, str(e))) + self.fail_request(e, msg=f"Could not create empty authentication flow {config['alias']} in realm {realm}: {e}") def update_authentication_executions(self, flowAlias, updatedExec, realm='master'): """ Update authentication executions @@ -2244,10 +2156,9 @@ class KeycloakAPI(object): method='PUT', data=json.dumps(updatedExec)) except HTTPError as e: - self.fail_request(e, msg="Unable to update execution '%s': %s: %s %s" - % (flowAlias, repr(e), ";".join([e.url, e.msg, str(e.code), str(e.hdrs)]), str(updatedExec))) + self.fail_request(e, msg=f"Unable to update execution '{flowAlias}': {e!r}: {e.url};{e.msg};{e.code};{e.hdrs} {updatedExec}") except Exception as e: - self.module.fail_json(msg="Unable to update executions %s: %s" % (updatedExec, str(e))) + self.module.fail_json(msg=f"Unable to update executions {updatedExec}: {e}") def add_authenticationConfig_to_execution(self, executionId, authenticationConfig, realm='master'): """ Add autenticatorConfig to the execution @@ -2265,7 +2176,7 @@ class KeycloakAPI(object): method='POST', data=json.dumps(authenticationConfig)) except Exception as e: - self.fail_request(e, msg="Unable to add authenticationConfig %s: %s" % (executionId, str(e))) + self.fail_request(e, msg=f"Unable to add authenticationConfig {executionId}: {e}") def delete_authentication_config(self, configId, realm='master'): """ Delete authenticator config @@ -2282,7 +2193,7 @@ class KeycloakAPI(object): id=configId), method='DELETE') except Exception as e: - self.fail_request(e, msg="Unable to delete authentication config %s: %s" % (configId, str(e))) + self.fail_request(e, msg=f"Unable to delete authentication config {configId}: {e}") def create_subflow(self, subflowName, flowAlias, realm='master', flowType='basic-flow'): """ Create new sublow on the flow @@ -2304,7 +2215,7 @@ class KeycloakAPI(object): method='POST', data=json.dumps(newSubFlow)) except Exception as e: - self.fail_request(e, msg="Unable to create new subflow %s: %s" % (subflowName, str(e))) + self.fail_request(e, msg=f"Unable to create new subflow {subflowName}: {e}") def create_execution(self, execution, flowAlias, realm='master'): """ Create new execution on the flow @@ -2325,10 +2236,11 @@ class KeycloakAPI(object): method='POST', data=json.dumps(newExec)) except HTTPError as e: - self.fail_request(e, msg="Unable to create new execution '%s' %s: %s: %s %s" - % (flowAlias, execution["providerId"], repr(e), ";".join([e.url, e.msg, str(e.code), str(e.hdrs)]), str(newExec))) + self.fail_request( + e, msg=f"Unable to create new execution '{flowAlias}' {execution['providerId']}: {e!r}: {e.url};{e.msg};{e.code};{e.hdrs} {newExec}" + ) except Exception as e: - self.module.fail_json(msg="Unable to create new execution '%s' %s: %s" % (flowAlias, execution["providerId"], repr(e))) + self.module.fail_json(msg=f"Unable to create new execution '{flowAlias}' {execution['providerId']}: {e}") def change_execution_priority(self, executionId, diff, realm='master'): """ Raise or lower execution priority of diff time @@ -2356,7 +2268,7 @@ class KeycloakAPI(object): id=executionId), method='POST') except Exception as e: - self.fail_request(e, msg="Unable to change execution priority %s: %s" % (executionId, str(e))) + self.fail_request(e, msg=f"Unable to change execution priority {executionId}: {e}") def get_executions_representation(self, config, realm='master'): """ @@ -2387,8 +2299,7 @@ class KeycloakAPI(object): execution["authenticationConfig"] = execConfig return executions except Exception as e: - self.fail_request(e, msg='Could not get executions for authentication flow %s in realm %s: %s' - % (config["alias"], realm, str(e))) + self.fail_request(e, msg=f"Could not get executions for authentication flow {config['alias']} in realm {realm}: {e}") def get_required_actions(self, realm='master'): """ @@ -2437,8 +2348,7 @@ class KeycloakAPI(object): except Exception as e: self.fail_request( e, - msg='Unable to register required action %s in realm %s: %s' - % (rep["name"], realm, str(e)) + msg=f"Unable to register required action {rep['name']} in realm {realm}: {e}" ) def update_required_action(self, alias, rep, realm='master'): @@ -2463,8 +2373,7 @@ class KeycloakAPI(object): except Exception as e: self.fail_request( e, - msg='Unable to update required action %s in realm %s: %s' - % (alias, realm, str(e)) + msg=f'Unable to update required action {alias} in realm {realm}: {e}' ) def delete_required_action(self, alias, realm='master'): @@ -2487,8 +2396,7 @@ class KeycloakAPI(object): except Exception as e: self.fail_request( e, - msg='Unable to delete required action %s in realm %s: %s' - % (alias, realm, str(e)) + msg=f'Unable to delete required action {alias} in realm {realm}: {e}' ) def get_identity_providers(self, realm='master'): @@ -2500,11 +2408,9 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(idps_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of identity providers for realm %s: %s' - % (realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of identity providers for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of identity providers for realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of identity providers for realm {realm}: {e}') def get_identity_provider(self, alias, realm='master'): """ Fetch identity provider representation from a realm using the idp's alias. @@ -2519,11 +2425,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not fetch identity provider %s in realm %s: %s' - % (alias, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch identity provider {alias} in realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not fetch identity provider %s in realm %s: %s' - % (alias, realm, str(e))) + self.module.fail_json(msg=f'Could not fetch identity provider {alias} in realm {realm}: {e}') def create_identity_provider(self, idprep, realm='master'): """ Create an identity provider. @@ -2535,8 +2439,7 @@ class KeycloakAPI(object): try: return self._request(idps_url, method='POST', data=json.dumps(idprep)) except Exception as e: - self.fail_request(e, msg='Could not create identity provider %s in realm %s: %s' - % (idprep['alias'], realm, str(e))) + self.fail_request(e, msg=f"Could not create identity provider {idprep['alias']} in realm {realm}: {e}") def update_identity_provider(self, idprep, realm='master'): """ Update an existing identity provider. @@ -2548,8 +2451,7 @@ class KeycloakAPI(object): try: return self._request(idp_url, method='PUT', data=json.dumps(idprep)) except Exception as e: - self.fail_request(e, msg='Could not update identity provider %s in realm %s: %s' - % (idprep['alias'], realm, str(e))) + self.fail_request(e, msg=f"Could not update identity provider {idprep['alias']} in realm {realm}: {e}") def delete_identity_provider(self, alias, realm='master'): """ Delete an identity provider. @@ -2560,8 +2462,7 @@ class KeycloakAPI(object): try: return self._request(idp_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Unable to delete identity provider %s in realm %s: %s' - % (alias, realm, str(e))) + self.fail_request(e, msg=f'Unable to delete identity provider {alias} in realm {realm}: {e}') def get_identity_provider_mappers(self, alias, realm='master'): """ Fetch representations for identity provider mappers @@ -2573,11 +2474,11 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(mappers_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of identity provider mappers for idp %s in realm %s: %s' - % (alias, realm, str(e))) + self.module.fail_json( + msg=f'API returned incorrect JSON when trying to obtain list of identity provider mappers for idp {alias} in realm {realm}: {e}' + ) except Exception as e: - self.fail_request(e, msg='Could not obtain list of identity provider mappers for idp %s in realm %s: %s' - % (alias, realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of identity provider mappers for idp {alias} in realm {realm}: {e}') def fetch_idp_endpoints_import_config_url(self, fromUrl, providerId='oidc', realm='master'): """ Import an identity provider configuration through Keycloak server from a well-known URL. @@ -2594,7 +2495,7 @@ class KeycloakAPI(object): idps_url = URL_IDENTITY_PROVIDER_IMPORT.format(url=self.baseurl, realm=realm) return self._request_and_deserialize(idps_url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not import the IdP config in realm %s: %s' % (realm, str(e))) + self.fail_request(e, msg=f'Could not import the IdP config in realm {realm}: {e}') def get_identity_provider_mapper(self, mid, alias, realm='master'): """ Fetch identity provider representation from a realm using the idp's alias. @@ -2610,11 +2511,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not fetch mapper %s for identity provider %s in realm %s: %s' - % (mid, alias, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch mapper {mid} for identity provider {alias} in realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not fetch mapper %s for identity provider %s in realm %s: %s' - % (mid, alias, realm, str(e))) + self.module.fail_json(msg=f'Could not fetch mapper {mid} for identity provider {alias} in realm {realm}: {e}') def create_identity_provider_mapper(self, mapper, alias, realm='master'): """ Create an identity provider mapper. @@ -2627,8 +2526,7 @@ class KeycloakAPI(object): try: return self._request(mappers_url, method='POST', data=json.dumps(mapper)) except Exception as e: - self.fail_request(e, msg='Could not create identity provider mapper %s for idp %s in realm %s: %s' - % (mapper['name'], alias, realm, str(e))) + self.fail_request(e, msg=f"Could not create identity provider mapper {mapper['name']} for idp {alias} in realm {realm}: {e}") def update_identity_provider_mapper(self, mapper, alias, realm='master'): """ Update an existing identity provider. @@ -2641,8 +2539,7 @@ class KeycloakAPI(object): try: return self._request(mapper_url, method='PUT', data=json.dumps(mapper)) except Exception as e: - self.fail_request(e, msg='Could not update mapper %s for identity provider %s in realm %s: %s' - % (mapper['id'], alias, realm, str(e))) + self.fail_request(e, msg=f"Could not update mapper {mapper['id']} for identity provider {alias} in realm {realm}: {e}") def delete_identity_provider_mapper(self, mid, alias, realm='master'): """ Delete an identity provider. @@ -2654,8 +2551,7 @@ class KeycloakAPI(object): try: return self._request(mapper_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Unable to delete mapper %s for identity provider %s in realm %s: %s' - % (mid, alias, realm, str(e))) + self.fail_request(e, msg=f'Unable to delete mapper {mid} for identity provider {alias} in realm {realm}: {e}') def get_components(self, filter=None, realm='master'): """ Fetch representations for components in a realm @@ -2665,16 +2561,14 @@ class KeycloakAPI(object): """ comps_url = URL_COMPONENTS.format(url=self.baseurl, realm=realm) if filter is not None: - comps_url += '?%s' % filter + comps_url += f'?{filter}' try: return self._request_and_deserialize(comps_url, method='GET') except ValueError as e: - self.module.fail_json(msg='API returned incorrect JSON when trying to obtain list of components for realm %s: %s' - % (realm, str(e))) + self.module.fail_json(msg=f'API returned incorrect JSON when trying to obtain list of components for realm {realm}: {e}') except Exception as e: - self.fail_request(e, msg='Could not obtain list of components for realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not obtain list of components for realm {realm}: {e}') def get_component(self, cid, realm='master'): """ Fetch component representation from a realm using its cid. @@ -2689,11 +2583,9 @@ class KeycloakAPI(object): if e.code == 404: return None else: - self.fail_request(e, msg='Could not fetch component %s in realm %s: %s' - % (cid, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch component {cid} in realm {realm}: {e}') except Exception as e: - self.module.fail_json(msg='Could not fetch component %s in realm %s: %s' - % (cid, realm, str(e))) + self.module.fail_json(msg=f'Could not fetch component {cid} in realm {realm}: {e}') def create_component(self, comprep, realm='master'): """ Create an component. @@ -2706,12 +2598,10 @@ class KeycloakAPI(object): resp = self._request(comps_url, method='POST', data=json.dumps(comprep)) comp_url = resp.getheader('Location') if comp_url is None: - self.module.fail_json(msg='Could not create component in realm %s: %s' - % (realm, 'unexpected response')) + self.module.fail_json(msg=f'Could not create component in realm {realm}: unexpected response') return self._request_and_deserialize(comp_url, method="GET") except Exception as e: - self.fail_request(e, msg='Could not create component in realm %s: %s' - % (realm, str(e))) + self.fail_request(e, msg=f'Could not create component in realm {realm}: {e}') def update_component(self, comprep, realm='master'): """ Update an existing component. @@ -2726,8 +2616,7 @@ class KeycloakAPI(object): try: return self._request(comp_url, method='PUT', data=json.dumps(comprep)) except Exception as e: - self.fail_request(e, msg='Could not update component %s in realm %s: %s' - % (cid, realm, str(e))) + self.fail_request(e, msg=f'Could not update component {cid} in realm {realm}: {e}') def delete_component(self, cid, realm='master'): """ Delete an component. @@ -2738,12 +2627,11 @@ class KeycloakAPI(object): try: return self._request(comp_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Unable to delete component %s in realm %s: %s' - % (cid, realm, str(e))) + self.fail_request(e, msg=f'Unable to delete component {cid} in realm {realm}: {e}') def get_authz_authorization_scope_by_name(self, name, client_id, realm): url = URL_AUTHZ_AUTHORIZATION_SCOPES.format(url=self.baseurl, client_id=client_id, realm=realm) - search_url = "%s/search?name=%s" % (url, quote(name, safe='')) + search_url = f"{url}/search?name={quote(name, safe='')}" try: return self._request_and_deserialize(search_url, method='GET') @@ -2757,7 +2645,7 @@ class KeycloakAPI(object): try: return self._request(url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not create authorization scope %s for client %s in realm %s: %s' % (payload['name'], client_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create authorization scope {payload['name']} for client {client_id} in realm {realm}: {e}") def update_authz_authorization_scope(self, payload, id, client_id, realm): """Update an authorization scope for a Keycloak client""" @@ -2766,7 +2654,7 @@ class KeycloakAPI(object): try: return self._request(url, method='PUT', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not create update scope %s for client %s in realm %s: %s' % (payload['name'], client_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create update scope {payload['name']} for client {client_id} in realm {realm}: {e}") def remove_authz_authorization_scope(self, id, client_id, realm): """Remove an authorization scope from a Keycloak client""" @@ -2775,7 +2663,7 @@ class KeycloakAPI(object): try: return self._request(url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete scope %s for client %s in realm %s: %s' % (id, client_id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete scope {id} for client {client_id} in realm {realm}: {e}') def get_user_by_id(self, user_id, realm='master'): """ @@ -2795,8 +2683,7 @@ class KeycloakAPI(object): method='GET')) return userrep except Exception as e: - self.fail_request(e, msg='Could not get user %s in realm %s: %s' - % (user_id, realm, str(e))) + self.fail_request(e, msg=f'Could not get user {user_id} in realm {realm}: {e}') def create_user(self, userrep, realm='master'): """ @@ -2820,8 +2707,7 @@ class KeycloakAPI(object): realm=realm) return created_user except Exception as e: - self.fail_request(e, msg='Could not create user %s in realm %s: %s' - % (userrep['username'], realm, str(e))) + self.fail_request(e, msg=f"Could not create user {userrep['username']} in realm {realm}: {e}") def convert_user_attributes_to_keycloak_dict(self, attributes): keycloak_user_attributes_dict = {} @@ -2863,8 +2749,7 @@ class KeycloakAPI(object): realm=realm) return updated_user except Exception as e: - self.fail_request(e, msg='Could not update user %s in realm %s: %s' - % (userrep['username'], realm, str(e))) + self.fail_request(e, msg=f"Could not update user {userrep['username']} in realm {realm}: {e}") def delete_user(self, user_id, realm='master'): """ @@ -2882,8 +2767,7 @@ class KeycloakAPI(object): user_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete user %s in realm %s: %s' - % (user_id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete user {user_id} in realm {realm}: {e}') def get_user_groups(self, user_id, realm='master'): """ @@ -2906,8 +2790,7 @@ class KeycloakAPI(object): user_groups_url = URL_USER_GROUPS.format(url=self.baseurl, realm=realm, id=user_id) return self._request_and_deserialize(user_groups_url, method='GET') except Exception as e: - self.fail_request(e, msg='Could not get groups for user %s in realm %s: %s' - % (user_id, realm, str(e))) + self.fail_request(e, msg=f'Could not get groups for user {user_id} in realm {realm}: {e}') def add_user_in_group(self, user_id, group_id, realm='master'): """DEPRECATED: Call add_user_to_group(...) instead. This method is scheduled for removal in community.general 13.0.0.""" @@ -2931,8 +2814,7 @@ class KeycloakAPI(object): user_group_url, method='PUT') except Exception as e: - self.fail_request(e, msg='Could not add user %s to group %s in realm %s: %s' - % (user_id, group_id, realm, str(e))) + self.fail_request(e, msg=f'Could not add user {user_id} to group {group_id} in realm {realm}: {e}') def remove_user_from_group(self, user_id, group_id, realm='master'): """ @@ -2952,8 +2834,7 @@ class KeycloakAPI(object): user_group_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not remove user %s from group %s in realm %s: %s' - % (user_id, group_id, realm, str(e))) + self.fail_request(e, msg=f'Could not remove user {user_id} from group {group_id} in realm {realm}: {e}') def update_user_groups_membership(self, userrep, groups, realm='master'): """ @@ -2990,8 +2871,7 @@ class KeycloakAPI(object): return True except Exception as e: - self.module.fail_json(msg='Could not update group membership for user %s in realm %s: %s' - % (userrep['username'], realm, e)) + self.module.fail_json(msg=f"Could not update group membership for user {userrep['username']} in realm {realm}: {e}") def extract_groups_to_add_to_and_remove_from_user(self, groups): groups_to_add = [] @@ -3013,7 +2893,7 @@ class KeycloakAPI(object): This adds support for finding top level groups by name and subgroups by path. """ groups = self.get_groups(realm=realm) - path = target if target.startswith('/') else '/' + target + path = target if target.startswith('/') else f"/{target}" for segment in path.split('/'): if not segment: continue @@ -3046,17 +2926,17 @@ class KeycloakAPI(object): try: return self._request(url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not create permission %s for client %s in realm %s: %s' % (payload['name'], client_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create permission {payload['name']} for client {client_id} in realm {realm}: {e}") def remove_authz_custom_policy(self, policy_id, client_id, realm): """Remove a custom policy from a Keycloak client""" url = URL_AUTHZ_CUSTOM_POLICIES.format(url=self.baseurl, client_id=client_id, realm=realm) - delete_url = "%s/%s" % (url, policy_id) + delete_url = f"{url}/{policy_id}" try: return self._request(delete_url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete custom policy %s for client %s in realm %s: %s' % (id, client_id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete custom policy {id} for client {client_id} in realm {realm}: {e}') def get_authz_permission_by_name(self, name, client_id, realm): """Get authorization permission by name""" @@ -3075,7 +2955,7 @@ class KeycloakAPI(object): try: return self._request(url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not create permission %s for client %s in realm %s: %s' % (payload['name'], client_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create permission {payload['name']} for client {client_id} in realm {realm}: {e}") def remove_authz_permission(self, id, client_id, realm): """Create an authorization permission for a Keycloak client""" @@ -3084,7 +2964,7 @@ class KeycloakAPI(object): try: return self._request(url, method='DELETE') except Exception as e: - self.fail_request(e, msg='Could not delete permission %s for client %s in realm %s: %s' % (id, client_id, realm, str(e))) + self.fail_request(e, msg=f'Could not delete permission {id} for client {client_id} in realm {realm}: {e}') def update_authz_permission(self, payload, permission_type, id, client_id, realm): """Update a permission for a Keycloak client""" @@ -3093,7 +2973,7 @@ class KeycloakAPI(object): try: return self._request(url, method='PUT', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not create update permission %s for client %s in realm %s: %s' % (payload['name'], client_id, realm, str(e))) + self.fail_request(e, msg=f"Could not create update permission {payload['name']} for client {client_id} in realm {realm}: {e}") def get_authz_resource_by_name(self, name, client_id, realm): """Get authorization resource by name""" @@ -3126,7 +3006,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(client_role_scope_url, method='GET') except Exception as e: - self.fail_request(e, msg='Could not fetch roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch roles scope for client {clientid} in realm {realm}: {e}') def update_client_role_scope_from_client(self, payload, clientid, clientscopeid, realm="master"): """ Update and fetch the roles associated with the client's scope on the Keycloak server. @@ -3141,7 +3021,7 @@ class KeycloakAPI(object): self._request(client_role_scope_url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not update roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not update roles scope for client {clientid} in realm {realm}: {e}') return self.get_client_role_scope_from_client(clientid, clientscopeid, realm) @@ -3158,7 +3038,7 @@ class KeycloakAPI(object): self._request(client_role_scope_url, method='DELETE', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not delete roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not delete roles scope for client {clientid} in realm {realm}: {e}') return self.get_client_role_scope_from_client(clientid, clientscopeid, realm) @@ -3172,7 +3052,7 @@ class KeycloakAPI(object): try: return self._request_and_deserialize(client_role_scope_url, method='GET') except Exception as e: - self.fail_request(e, msg='Could not fetch roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not fetch roles scope for client {clientid} in realm {realm}: {e}') def update_client_role_scope_from_realm(self, payload, clientid, realm="master"): """ Update and fetch the realm roles from the client's scope on the Keycloak server. @@ -3186,7 +3066,7 @@ class KeycloakAPI(object): self._request(client_role_scope_url, method='POST', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not update roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not update roles scope for client {clientid} in realm {realm}: {e}') return self.get_client_role_scope_from_realm(clientid, realm) @@ -3202,7 +3082,7 @@ class KeycloakAPI(object): self._request(client_role_scope_url, method='DELETE', data=json.dumps(payload)) except Exception as e: - self.fail_request(e, msg='Could not delete roles scope for client %s in realm %s: %s' % (clientid, realm, str(e))) + self.fail_request(e, msg=f'Could not delete roles scope for client {clientid} in realm {realm}: {e}') return self.get_client_role_scope_from_realm(clientid, realm) @@ -3219,7 +3099,7 @@ class KeycloakAPI(object): """ try: if isinstance(e, HTTPError): - msg = "%s: %s" % (msg, to_native(e.read())) + msg = f"{msg}: {to_native(e.read())}" except Exception: pass self.module.fail_json(msg, **kwargs)