|
1 | 1 | import json |
2 | 2 | import random |
| 3 | +from datetime import timedelta |
3 | 4 | from pathlib import Path |
4 | 5 | from tempfile import TemporaryDirectory |
| 6 | +from urllib.parse import quote |
5 | 7 | from uuid import UUID |
6 | 8 |
|
7 | 9 | from locust import HttpUser, task |
8 | 10 | from pydantic import BaseModel, Field |
9 | 11 | from pydantic_settings import BaseSettings, SettingsConfigDict |
10 | 12 | from requests.auth import HTTPBasicAuth |
| 13 | +from tenacity import retry, retry_if_exception_type, stop_after_delay, wait_exponential |
11 | 14 | from urllib3 import PoolManager, Retry |
12 | 15 |
|
13 | 16 | # Perform the following setup in order to run this load test: |
@@ -93,6 +96,7 @@ def __init__(self, *args, **kwargs): |
93 | 96 | self._input_json_uuid = None |
94 | 97 | self._script_uuid = None |
95 | 98 | self._run_uid = None |
| 99 | + self._solver_job_uid = None |
96 | 100 |
|
97 | 101 | super().__init__(*args, **kwargs) |
98 | 102 |
|
@@ -156,17 +160,33 @@ def run_function(self): |
156 | 160 | response.raise_for_status() |
157 | 161 | self._run_uid = response.json().get("uid") |
158 | 162 | assert self._run_uid is not None |
| 163 | + self._solver_job_uid = response.json().get("solver_job_id") |
| 164 | + assert self._solver_job_uid is not None |
159 | 165 |
|
160 | | - is_done = False |
161 | | - while not is_done: |
162 | | - response = self.client.get( |
163 | | - f"/v0/function_jobs/{self._run_uid}/status", |
164 | | - auth=self._auth, |
165 | | - name="/v0/function_jobs/[function_run_uid]/status", |
166 | | - ) |
167 | | - response.raise_for_status() |
168 | | - status = response.json().get("status") |
169 | | - is_done = status in ["DONE", "FAILED"] |
| 166 | + self.wait_until_done() |
| 167 | + |
| 168 | + response = self.client.get( |
| 169 | + f"/v0/solvers/{quote(_SOLVER_KEY, safe='')}/releases/{_SOLVER_VERSION}/jobs/{self._solver_job_uid}/outputs", |
| 170 | + auth=self._auth, |
| 171 | + name="/v0/solvers/[solver_key]/releases/[solver_version]/jobs/[solver_job_id]/outputs", |
| 172 | + ) |
| 173 | + response.raise_for_status() |
| 174 | + |
| 175 | + @retry( |
| 176 | + stop=stop_after_delay(timedelta(minutes=10)), |
| 177 | + wait=wait_exponential(multiplier=1, min=1, max=10), |
| 178 | + retry=retry_if_exception_type(AssertionError), |
| 179 | + reraise=False, |
| 180 | + ) |
| 181 | + def wait_until_done(self): |
| 182 | + response = self.client.get( |
| 183 | + f"/v0/function_jobs/{self._run_uid}/status", |
| 184 | + auth=self._auth, |
| 185 | + name="/v0/function_jobs/[function_run_uid]/status", |
| 186 | + ) |
| 187 | + response.raise_for_status() |
| 188 | + status = response.json().get("status") |
| 189 | + assert status in ["DONE", "FAILED"] |
170 | 190 |
|
171 | 191 | def upload_file(self, file: Path) -> UUID: |
172 | 192 | assert file.is_file() |
|
0 commit comments