{
"worldcerealcropextent1": {
"process_id": "worldcereal_crop_extent",
"namespace": "https://raw.githubusercontent.com/WorldCereal/worldcereal-classification/refs/tags/worldcereal_crop_extent_v3.0.1/scripts/udp/worldcereal_crop_extent.json",
"arguments": {
"spatial_extent": {
"west": 664200,
"east": 664400,
"south": 5611334,
"north": 5611534,
"crs": "EPSG:32631",
"srs": "EPSG:32631"
},
"temporal_extent": [
"2020-11-01",
"2021-10-31"
],
"orbit_state": "DESCENDING",
"season_ids": [
"tc-s1"
],
"season_windows": {
"tc-s1": [
"2020-12-01",
"2021-07-31"
]
}
},
"result": true
}
}
scenario = openEOBenchmarkScenario(id='worldcereal_crop_extent', type='openeo', description='WorldCereal crop extent benchmark', ...season_ids': ['tc-s1'], 'season_windows': {'tc-s1': ['2020-12-01', '2021-07-31']}}, 'result': True}}, job_options=None)
tmp_path = PosixPath('/home/runner/work/apex_algorithms/apex_algorithms/qa/benchmarks/tmp_path_root/test_run_benchmark_worldcereal0')
track_metric = <function track_metric.<locals>.track at 0x7f5655b1dbc0>
track_phase = <apex_algorithm_qa_tools.pytest.pytest_track_metrics._PhaseTracker object at 0x7f5655b2ab10>
upload_assets_on_fail = <apex_algorithm_qa_tools.pytest.pytest_upload_assets.upload_assets_on_fail.<locals>._Collector object at 0x7f5655b2a240>
request = <FixtureRequest for <Function test_run_benchmark[worldcereal_crop_extent]>>
@pytest.mark.parametrize(
"scenario",
[
# Use scenario id as parameterization id to give nicer test names.
pytest.param(uc, id=uc.id)
for uc in get_benchmark_scenarios()
],
)
def test_run_benchmark(
scenario: BenchmarkScenario,
tmp_path: Path,
track_metric,
track_phase,
upload_assets_on_fail,
request,
):
track_metric("scenario_id", scenario.id)
track_metric("scenario_type", scenario.type)
with track_phase(phase="connect"):
runner = create_benchmark_runner(
request=request,
scenario=scenario,
)
report_path = None
if request.config.getoption("--upload-benchmark-report"):
report_data = {
"scenario_id": scenario.id,
"scenario_type": scenario.type,
"scenario_description": scenario.description,
"scenario_source": str(scenario.source) if scenario.source else None,
"reference_data": scenario.reference_data,
"reference_options": scenario.reference_options,
}
# Add scenario type-specific fields if they exist
if hasattr(scenario, 'backend'):
report_data["scenario_backend"] = scenario.backend
if hasattr(scenario, 'process_id'):
report_data["process_id"] = scenario.process_id
elif hasattr(scenario, 'application'):
report_data["application"] = scenario.application
if hasattr(scenario, 'endpoint'):
report_data["endpoint"] = scenario.endpoint
report_path = tmp_path / "benchmark_report.json"
report_path.write_text(json.dumps(report_data, indent=2))
upload_assets_on_fail(report_path)
def _on_phase_exception(phase: str, exc: Exception):
if report_path is not None:
report = json.loads(report_path.read_text())
report["test_failed"] = True
report["test_failed_phase"] = phase
report["test_error_message"] = str(exc)
report_path.write_text(json.dumps(report, indent=2))
cwd_report_dir = Path("benchmark_reports")
cwd_report_dir.mkdir(exist_ok=True)
(cwd_report_dir / f"{scenario.id}_benchmark_report.json").write_text(json.dumps(report, indent=2))
report_url = upload_assets_on_fail.get_url(report_path)
if report_url:
exc.add_note(f"Benchmark report: {report_url}")
track_phase.on_exception = _on_phase_exception
artifacts = None
with track_phase(phase="create-job"):
runner.create_job()
with track_phase(phase="run-job"):
max_minutes = request.config.getoption("--maximum-job-time-in-minutes")
> runner.run_job(max_minutes=max_minutes)
tests/test_benchmarks.py:98:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/apex_algorithm_qa_tools/benchmarks/runners/openeo.py:44: in run_job
run_openeo_job(job=self._job, max_minutes=max_minutes)
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/apex_algorithm_qa_tools/benchmarks/openeo.py:115: in run_openeo_job
job.start_and_wait()
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/job.py:349: in start_and_wait
job_info = self.describe()
^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/job.py:106: in describe
return self.connection.get(f"/jobs/{self.job_id}", expected_status=200).json()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:204: in get
return self.request("get", path=path, params=params, stream=stream, auth=auth, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/connection.py:787: in request
return _request()
^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/connection.py:780: in _request
return super(Connection, self).request(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:141: in request
self._raise_api_error(resp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Connection to 'https://openeofed.dataspace.copernicus.eu/openeo/1.2/' with OidcBearerAuth>
response = <Response [500]>
def _raise_api_error(self, response: requests.Response):
"""Convert API error response to Python exception"""
status_code = response.status_code
try:
info = response.json()
except Exception:
info = None
# Valid JSON object with "code" and "message" fields indicates a proper openEO API error.
if isinstance(info, dict):
error_code = info.get("code")
error_message = info.get("message")
if error_code and isinstance(error_code, str) and error_message and isinstance(error_message, str):
> raise OpenEoApiError(
http_status_code=status_code,
code=error_code,
message=error_message,
id=info.get("id"),
url=info.get("url"),
)
E openeo.rest.OpenEoApiError: [500] Internal: Server error: OpenEoApiPlainError('[502] Bad Gateway') (ref: r-26081813291046e2a3ff77dce056a504)
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:163: OpenEoApiError
----------------------------- Captured stdout call -----------------------------
0:00:00 Job 'cdse-j-260818132652480e991c3a4658db6e28': send 'start'
0:00:04 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:09 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:16 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:24 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:34 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:46 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:01:02 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:01:22 Job 'cdse-j-260818132652480e991c3a4658db6e28': running (progress N/A)
0:01:46 Job 'cdse-j-260818132652480e991c3a4658db6e28': running (progress N/A)
------------------------------ Captured log call -------------------------------
INFO apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:70 Connecting to 'openeofed.dataspace.copernicus.eu'
INFO openeo.config:config.py:193 Loaded openEO client config from sources: []
INFO apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:82 Checking for auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSE' to drive auth against backend='openeofed.dataspace.copernicus.eu'.
INFO apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:86 Extracted provider_id='CDSE' client_id='openeo-apex-benchmarks-service-account' from auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSE'
INFO openeo.rest.connection:connection.py:315 Found OIDC providers: ['CDSE']
INFO openeo.rest.auth.oidc:oidc.py:410 Doing 'client_credentials' token request 'https://identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token' with post data fields ['grant_type', 'client_id', 'client_secret', 'scope'] (client_id 'openeo-apex-benchmarks-service-account')
INFO openeo.rest.connection:connection.py:414 Obtained tokens: ['token_type', 'access_token', 'expires_in', 'id_token', 'scope']
Benchmark scenario ID:
worldcereal_crop_extentBenchmark scenario definition: https://github.com/ESA-APEx/apex_algorithms/blob/99e2ddec7101e2bbeabc192985a4f017f4ec5faf/algorithm_catalog/vito/worldcereal_crop_extent/benchmark_scenarios/worldcereal_crop_extent.json
openEO backend: openeofed.dataspace.copernicus.eu
GitHub Actions workflow run: https://github.com/ESA-APEx/apex_algorithms/actions/runs/32142313136
Workflow artifacts: https://github.com/ESA-APEx/apex_algorithms/actions/runs/32142313136#artifacts
Test start: 2026-08-18 13:26:32.892970+00:00
Test duration: 0:02:38.219253
Test outcome: ❌ failed
Last successful test phase: create-job
Failure in test phase: run-job
Contact Information
Process Graph
{ "worldcerealcropextent1": { "process_id": "worldcereal_crop_extent", "namespace": "https://raw.githubusercontent.com/WorldCereal/worldcereal-classification/refs/tags/worldcereal_crop_extent_v3.0.1/scripts/udp/worldcereal_crop_extent.json", "arguments": { "spatial_extent": { "west": 664200, "east": 664400, "south": 5611334, "north": 5611534, "crs": "EPSG:32631", "srs": "EPSG:32631" }, "temporal_extent": [ "2020-11-01", "2021-10-31" ], "orbit_state": "DESCENDING", "season_ids": [ "tc-s1" ], "season_windows": { "tc-s1": [ "2020-12-01", "2021-07-31" ] } }, "result": true } }Error Logs