From 77da31e8c739cbc7183eb14ca3b45a34d1ec0ee1 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 08:56:48 +0200 Subject: [PATCH 1/2] align map load test with ui workflow --- .../functions/function_map_load_test.py | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/tests/performance/locustfiles/functions/function_map_load_test.py b/tests/performance/locustfiles/functions/function_map_load_test.py index 6f556d36ea6b..12f1463373d7 100644 --- a/tests/performance/locustfiles/functions/function_map_load_test.py +++ b/tests/performance/locustfiles/functions/function_map_load_test.py @@ -9,6 +9,7 @@ import random from datetime import timedelta from typing import Final +from urllib.parse import urlencode from uuid import UUID import jsf @@ -101,13 +102,33 @@ def map_function(self) -> None: retry=retry_if_exception_type(ValueError), ): with attempt: - job_status_response = self.authenticated_get( - f"/v0/function_job_collections/{job_collection_uuid}/status", - name="/v0/function_job_collections/[job_collection_uuid]/status", + # list all jobs in the collection with status + query_params = dict( + include_status=True, function_job_collection_id=job_collection_uuid ) - job_status_response.raise_for_status() - all_job_statuses = job_status_response.json().get("status") - assert isinstance(all_job_statuses, list) + next_page_url = "/v0/function_jobs?" + urlencode(query_params) + all_job_statuses = [] + while next_page_url is not None: + response = self.authenticated_get( + next_page_url, + name="/v0/function_jobs", + ) + response.raise_for_status() + items = response.json().get("items", []) + statuses = [item.get("status", {}) for item in items] + all_job_statuses.extend( + [status.get("status", None) for status in statuses if status] + ) + assert not any( + status is None for status in all_job_statuses + ), f"Test misconfiguration: Function job collection ({job_collection_uuid=}) listed {statuses=} with missing status" + links = response.json().get("links", {}) + assert isinstance(links, dict) + next_page_url = links.get("next", None) + assert ( + len(all_job_statuses) == n_jobs + ), f"Expected {n_jobs} jobs, got {len(all_job_statuses)} for {job_collection_uuid=}" + if any(status != "SUCCESS" for status in all_job_statuses): raise ValueError( f"Function job ({job_collection_uuid=}) for function ({function_uuid=}) returned {all_job_statuses=}" From 39244db8ef2a66074216598073dcc6a5dc16199b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:00:45 +0200 Subject: [PATCH 2/2] small cleanup --- .../locustfiles/functions/function_map_load_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/performance/locustfiles/functions/function_map_load_test.py b/tests/performance/locustfiles/functions/function_map_load_test.py index 12f1463373d7..aa069fa9bd3a 100644 --- a/tests/performance/locustfiles/functions/function_map_load_test.py +++ b/tests/performance/locustfiles/functions/function_map_load_test.py @@ -95,6 +95,9 @@ def map_function(self) -> None: job_collection_uuid = response.json().get("uid") # wait for the job to complete + query_params = dict( + include_status=True, function_job_collection_id=job_collection_uuid + ) for attempt in Retrying( stop=stop_after_delay(max_delay=max_poll_time), wait=wait_exponential(multiplier=1, min=1, max=10), @@ -103,9 +106,6 @@ def map_function(self) -> None: ): with attempt: # list all jobs in the collection with status - query_params = dict( - include_status=True, function_job_collection_id=job_collection_uuid - ) next_page_url = "/v0/function_jobs?" + urlencode(query_params) all_job_statuses = [] while next_page_url is not None: