From 3cedaa0ea0577be7c7596e70724467eb8b62a1cb Mon Sep 17 00:00:00 2001 From: Lenka Segura Date: Apr 17 2023 09:13:03 +0000 Subject: Handle rate limiting and retry once --- diff --git a/Makefile b/Makefile index 9cf8d01..7694769 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # To re-generate a bundle for another specific version without changing the standard setup, you can: # - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) # - use environment variables to overwrite this value (e.g export VERSION=0.0.2) -VERSION ?= 0.0.56 +VERSION ?= 0.0.57 # CHANNELS define the bundle channels used in the bundle. # Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") diff --git a/roles/fas2discourseconfig/library/fas2discourse_retrieve_discourse_groups.py b/roles/fas2discourseconfig/library/fas2discourse_retrieve_discourse_groups.py index 7860699..7deee3d 100644 --- a/roles/fas2discourseconfig/library/fas2discourse_retrieve_discourse_groups.py +++ b/roles/fas2discourseconfig/library/fas2discourse_retrieve_discourse_groups.py @@ -6,12 +6,15 @@ import json import requests +from requests_ratelimiter import LimiterSession from ansible.module_utils.basic import AnsibleModule from requests_kerberos import HTTPKerberosAuth __metaclass__ = type +session = LimiterSession(per_second=5) + DOCUMENTATION = r""" --- module: fas2discourse_retrieve_discourse_groups @@ -56,7 +59,7 @@ msg: description: The output message that the module generates. type: str returned: always - sample: 'Successfully retrieved groups from Dicourse.' + sample: 'Successfully retrieved groups from Discourse.' """ @@ -65,18 +68,26 @@ msg: def get_groups(discourse_host, discourse_api): headers = {"Api-Key": "%s" % (discourse_api), "Api-Username": "system"} url = f"{discourse_host}/groups.json" - response = requests.get(url, headers=headers) - if response.ok: - return response.json() - + for i in range(0, 2): + try: + response = session.get(url, headers=headers) + if response.ok: + return response.json() + response.raise_for_status() + except requests.HTTPError: + continue def get_group_members(group, discourse_api, discourse_host): headers = {"Api-Key": "%s" % (discourse_api), "Api-Username": "system"} url = f"{discourse_host}/groups/{group}/members.json" - response = requests.get(url, headers=headers) - if response.ok: - return response.json() - + for i in range(0, 2): + try: + response = session.get(url, headers=headers) + if response.ok: + return response.json() + response.raise_for_status() + except requests.HTTPError: + continue def run_module(): # define available arguments/parameters a user can pass to the module diff --git a/roles/fas2discourseconfig/library/fas2discourse_sync_group_membership.py b/roles/fas2discourseconfig/library/fas2discourse_sync_group_membership.py index b7b4cae..afcbc9b 100644 --- a/roles/fas2discourseconfig/library/fas2discourse_sync_group_membership.py +++ b/roles/fas2discourseconfig/library/fas2discourse_sync_group_membership.py @@ -4,14 +4,14 @@ # GNU General Public License v3.0+ (see COPYING or # https://www.gnu.org/licenses/gpl-3.0.txt) -import json -import requests - from ansible.module_utils.basic import AnsibleModule -from requests_kerberos import HTTPKerberosAuth +from requests_ratelimiter import LimiterSession +import requests __metaclass__ = type +session = LimiterSession(per_second=5) + DOCUMENTATION = r""" --- module: fas2discourse_sync_group_membership @@ -133,10 +133,14 @@ def add_membership_to_groups(discourse_host, discourse_api, group): # print(data) # print(url) # print(headers) - response = requests.put(url, json=data, headers=headers) - if response.ok: - return response.json() - + for i in range(0, 2): + try: + response = session.put(url, json=data, headers=headers) + if response.ok: + return response.json() + response.raise_for_status() + except requests.HTTPError: + continue def delete_membership_from_groups(discourse_host, discourse_api, group): group_id = group["groupid"] @@ -153,9 +157,14 @@ def delete_membership_from_groups(discourse_host, discourse_api, group): # print(data) # print(url) # print(headers) - response = requests.delete(url, json=data, headers=headers) - if response.ok: - return response.json() + for i in range(0, 2): + try: + response = session.delete(url, json=data, headers=headers) + if response.ok: + return response.json() + response.raise_for_status() + except requests.HTTPError: + continue def synchronise_group_membership_with_discourse(