1313import vws_web_tools
1414from dotenv import load_dotenv
1515from selenium .common .exceptions import TimeoutException
16+ from tenacity import (
17+ retry ,
18+ retry_if_exception_type ,
19+ stop_after_attempt ,
20+ wait_exponential ,
21+ )
1622
1723if TYPE_CHECKING :
1824 from selenium .webdriver .remote .webdriver import WebDriver
1925 from vws_web_tools import DatabaseDict , VuMarkDatabaseDict
2026
2127
28+ RETRY_ON_TIMEOUT = retry (
29+ retry = retry_if_exception_type (exception_types = TimeoutException ),
30+ stop = stop_after_attempt (max_attempt_number = 3 ),
31+ wait = wait_exponential (multiplier = 2 , min = 5 , max = 30 ),
32+ reraise = True ,
33+ )
34+
35+
2236def _create_and_get_database_details (
2337 driver : "WebDriver" ,
2438 email_address : str ,
2539 password : str ,
2640 license_name : str ,
2741 database_name : str ,
28- ) -> "DatabaseDict | None " :
42+ ) -> "DatabaseDict" :
2943 """Create a cloud database and get its details.
3044
31- Returns database details or None if a timeout occurs .
45+ Returns database details.
3246 """
3347 vws_web_tools .log_in (
3448 driver = driver ,
3549 email_address = email_address ,
3650 password = password ,
3751 )
3852 vws_web_tools .wait_for_logged_in (driver = driver )
39- try :
40- vws_web_tools .create_license (driver = driver , license_name = license_name )
41- except TimeoutException :
42- sys .stderr .write ("Timed out waiting for license creation\n " )
43- return None
53+ vws_web_tools .create_license (driver = driver , license_name = license_name )
4454
4555 vws_web_tools .create_cloud_database (
4656 driver = driver ,
4757 database_name = database_name ,
4858 license_name = license_name ,
4959 )
5060
51- try :
52- return vws_web_tools .get_database_details (
53- driver = driver ,
54- database_name = database_name ,
55- )
56- except TimeoutException :
57- sys .stderr .write ("Timed out waiting for database to be created\n " )
58- return None
61+ return RETRY_ON_TIMEOUT (vws_web_tools .get_database_details )(
62+ driver = driver ,
63+ database_name = database_name ,
64+ )
5965
6066
6167def _create_and_get_vumark_details (
6268 driver : "WebDriver" ,
6369 vumark_database_name : str ,
64- ) -> "VuMarkDatabaseDict | None " :
70+ ) -> "VuMarkDatabaseDict" :
6571 """Create a VuMark database and get its details.
6672
67- Returns VuMark database details or None if a timeout occurs .
73+ Returns VuMark database details.
6874 """
69- try :
70- vws_web_tools .create_vumark_database (
71- driver = driver ,
72- database_name = vumark_database_name ,
73- )
74- except TimeoutException :
75- sys .stderr .write ("Timed out waiting for VuMark database creation\n " )
76- return None
77-
78- try :
79- return vws_web_tools .get_vumark_database_details (
80- driver = driver ,
81- database_name = vumark_database_name ,
82- )
83- except TimeoutException :
84- sys .stderr .write (
85- "Timed out waiting for VuMark database to be created\n "
86- )
87- return None
75+ vws_web_tools .create_vumark_database (
76+ driver = driver ,
77+ database_name = vumark_database_name ,
78+ )
79+
80+ return RETRY_ON_TIMEOUT (vws_web_tools .get_vumark_database_details )(
81+ driver = driver ,
82+ database_name = vumark_database_name ,
83+ )
8884
8985
9086def _generate_secrets_file_content (
@@ -145,16 +141,22 @@ def main() -> None:
145141 format = "%Y-%m-%d-%H-%M-%S" ,
146142 )
147143 vumark_database_name = f"my-vumark-database-{ time } "
148- vws_web_tools .log_in (
149- driver = vumark_driver ,
150- email_address = email_address ,
151- password = password ,
152- )
153- vws_web_tools .wait_for_logged_in (driver = vumark_driver )
154- shared_vumark_details = _create_and_get_vumark_details (
155- driver = vumark_driver ,
156- vumark_database_name = vumark_database_name ,
157- )
144+ try :
145+ vws_web_tools .log_in (
146+ driver = vumark_driver ,
147+ email_address = email_address ,
148+ password = password ,
149+ )
150+ vws_web_tools .wait_for_logged_in (driver = vumark_driver )
151+ shared_vumark_details = _create_and_get_vumark_details (
152+ driver = vumark_driver ,
153+ vumark_database_name = vumark_database_name ,
154+ )
155+ except TimeoutException :
156+ sys .stderr .write (
157+ "Timed out waiting for shared VuMark setup/details after "
158+ "retries\n "
159+ )
158160 vumark_driver .quit ()
159161
160162 driver : WebDriver | None = None
@@ -169,14 +171,18 @@ def main() -> None:
169171 license_name = f"my-license-{ time } "
170172 database_name = f"my-database-{ time } "
171173
172- database_details = _create_and_get_database_details (
173- driver = driver ,
174- email_address = email_address ,
175- password = password ,
176- license_name = license_name ,
177- database_name = database_name ,
178- )
179- if database_details is None :
174+ try :
175+ database_details = _create_and_get_database_details (
176+ driver = driver ,
177+ email_address = email_address ,
178+ password = password ,
179+ license_name = license_name ,
180+ database_name = database_name ,
181+ )
182+ except TimeoutException :
183+ sys .stderr .write (
184+ "Timed out waiting for database setup/details after retries\n "
185+ )
180186 driver .quit ()
181187 driver = None
182188 continue
0 commit comments