diff --git a/admin/create_secrets_files.py b/admin/create_secrets_files.py index 5e6cc43c5..48a86c636 100644 --- a/admin/create_secrets_files.py +++ b/admin/create_secrets_files.py @@ -13,22 +13,36 @@ import vws_web_tools from dotenv import load_dotenv from selenium.common.exceptions import TimeoutException +from tenacity import ( + retry, + retry_if_exception_type, + stop_after_attempt, + wait_exponential, +) if TYPE_CHECKING: from selenium.webdriver.remote.webdriver import WebDriver from vws_web_tools import DatabaseDict, VuMarkDatabaseDict +RETRY_ON_TIMEOUT = retry( + retry=retry_if_exception_type(exception_types=TimeoutException), + stop=stop_after_attempt(max_attempt_number=3), + wait=wait_exponential(multiplier=2, min=5, max=30), + reraise=True, +) + + def _create_and_get_database_details( driver: "WebDriver", email_address: str, password: str, license_name: str, database_name: str, -) -> "DatabaseDict | None": +) -> "DatabaseDict": """Create a cloud database and get its details. - Returns database details or None if a timeout occurs. + Returns database details. """ vws_web_tools.log_in( driver=driver, @@ -36,11 +50,7 @@ def _create_and_get_database_details( password=password, ) vws_web_tools.wait_for_logged_in(driver=driver) - try: - vws_web_tools.create_license(driver=driver, license_name=license_name) - except TimeoutException: - sys.stderr.write("Timed out waiting for license creation\n") - return None + vws_web_tools.create_license(driver=driver, license_name=license_name) vws_web_tools.create_cloud_database( driver=driver, @@ -48,43 +58,29 @@ def _create_and_get_database_details( license_name=license_name, ) - try: - return vws_web_tools.get_database_details( - driver=driver, - database_name=database_name, - ) - except TimeoutException: - sys.stderr.write("Timed out waiting for database to be created\n") - return None + return RETRY_ON_TIMEOUT(vws_web_tools.get_database_details)( + driver=driver, + database_name=database_name, + ) def _create_and_get_vumark_details( driver: "WebDriver", vumark_database_name: str, -) -> "VuMarkDatabaseDict | None": +) -> "VuMarkDatabaseDict": """Create a VuMark database and get its details. - Returns VuMark database details or None if a timeout occurs. + Returns VuMark database details. """ - try: - vws_web_tools.create_vumark_database( - driver=driver, - database_name=vumark_database_name, - ) - except TimeoutException: - sys.stderr.write("Timed out waiting for VuMark database creation\n") - return None - - try: - return vws_web_tools.get_vumark_database_details( - driver=driver, - database_name=vumark_database_name, - ) - except TimeoutException: - sys.stderr.write( - "Timed out waiting for VuMark database to be created\n" - ) - return None + vws_web_tools.create_vumark_database( + driver=driver, + database_name=vumark_database_name, + ) + + return RETRY_ON_TIMEOUT(vws_web_tools.get_vumark_database_details)( + driver=driver, + database_name=vumark_database_name, + ) def _generate_secrets_file_content( @@ -147,23 +143,31 @@ def main() -> None: database_name = f"my-database-{time}" vumark_database_name = f"my-vumark-database-{time}" - database_details = _create_and_get_database_details( - driver=driver, - email_address=email_address, - password=password, - license_name=license_name, - database_name=database_name, - ) - if database_details is None: + try: + database_details = _create_and_get_database_details( + driver=driver, + email_address=email_address, + password=password, + license_name=license_name, + database_name=database_name, + ) + except TimeoutException: + sys.stderr.write( + "Timed out waiting for database setup/details after retries\n" + ) driver.quit() driver = None continue - vumark_details = _create_and_get_vumark_details( - driver=driver, - vumark_database_name=vumark_database_name, - ) - if vumark_details is None: + try: + vumark_details = _create_and_get_vumark_details( + driver=driver, + vumark_database_name=vumark_database_name, + ) + except TimeoutException: + sys.stderr.write( + "Timed out waiting for VuMark setup/details after retries\n" + ) driver.quit() driver = None continue