|
13 | 13 | import vws_web_tools |
14 | 14 | from dotenv import load_dotenv |
15 | 15 | from selenium.common.exceptions import TimeoutException |
| 16 | +from tenacity import ( |
| 17 | + retry, |
| 18 | + retry_if_exception_type, |
| 19 | + stop_after_attempt, |
| 20 | + wait_exponential, |
| 21 | +) |
16 | 22 |
|
17 | 23 | if TYPE_CHECKING: |
18 | 24 | from selenium.webdriver.remote.webdriver import WebDriver |
19 | 25 | from vws_web_tools import DatabaseDict, VuMarkDatabaseDict |
20 | 26 |
|
21 | 27 |
|
| 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 | + |
22 | 36 | def _create_and_get_database_details( |
23 | 37 | driver: "WebDriver", |
24 | 38 | email_address: str, |
25 | 39 | password: str, |
26 | 40 | license_name: str, |
27 | 41 | database_name: str, |
28 | | -) -> "DatabaseDict | None": |
| 42 | +) -> "DatabaseDict": |
29 | 43 | """Create a cloud database and get its details. |
30 | 44 |
|
31 | | - Returns database details or None if a timeout occurs. |
| 45 | + Returns database details. |
32 | 46 | """ |
33 | 47 | vws_web_tools.log_in( |
34 | 48 | driver=driver, |
35 | 49 | email_address=email_address, |
36 | 50 | password=password, |
37 | 51 | ) |
38 | 52 | 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) |
44 | 54 |
|
45 | 55 | vws_web_tools.create_cloud_database( |
46 | 56 | driver=driver, |
47 | 57 | database_name=database_name, |
48 | 58 | license_name=license_name, |
49 | 59 | ) |
50 | 60 |
|
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 | + ) |
59 | 65 |
|
60 | 66 |
|
61 | 67 | def _create_and_get_vumark_details( |
62 | 68 | driver: "WebDriver", |
63 | 69 | vumark_database_name: str, |
64 | | -) -> "VuMarkDatabaseDict | None": |
| 70 | +) -> "VuMarkDatabaseDict": |
65 | 71 | """Create a VuMark database and get its details. |
66 | 72 |
|
67 | | - Returns VuMark database details or None if a timeout occurs. |
| 73 | + Returns VuMark database details. |
68 | 74 | """ |
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 | + ) |
88 | 84 |
|
89 | 85 |
|
90 | 86 | def _generate_secrets_file_content( |
@@ -147,23 +143,31 @@ def main() -> None: |
147 | 143 | database_name = f"my-database-{time}" |
148 | 144 | vumark_database_name = f"my-vumark-database-{time}" |
149 | 145 |
|
150 | | - database_details = _create_and_get_database_details( |
151 | | - driver=driver, |
152 | | - email_address=email_address, |
153 | | - password=password, |
154 | | - license_name=license_name, |
155 | | - database_name=database_name, |
156 | | - ) |
157 | | - if database_details is None: |
| 146 | + try: |
| 147 | + database_details = _create_and_get_database_details( |
| 148 | + driver=driver, |
| 149 | + email_address=email_address, |
| 150 | + password=password, |
| 151 | + license_name=license_name, |
| 152 | + database_name=database_name, |
| 153 | + ) |
| 154 | + except TimeoutException: |
| 155 | + sys.stderr.write( |
| 156 | + "Timed out waiting for database setup/details after retries\n" |
| 157 | + ) |
158 | 158 | driver.quit() |
159 | 159 | driver = None |
160 | 160 | continue |
161 | 161 |
|
162 | | - vumark_details = _create_and_get_vumark_details( |
163 | | - driver=driver, |
164 | | - vumark_database_name=vumark_database_name, |
165 | | - ) |
166 | | - if vumark_details is None: |
| 162 | + try: |
| 163 | + vumark_details = _create_and_get_vumark_details( |
| 164 | + driver=driver, |
| 165 | + vumark_database_name=vumark_database_name, |
| 166 | + ) |
| 167 | + except TimeoutException: |
| 168 | + sys.stderr.write( |
| 169 | + "Timed out waiting for VuMark setup/details after retries\n" |
| 170 | + ) |
167 | 171 | driver.quit() |
168 | 172 | driver = None |
169 | 173 | continue |
|
0 commit comments