Skip to content

Scenario Failure: WorldAgriCommodities #244

@github-actions

Description

@github-actions

Benchmark scenario ID: WorldAgriCommodities
Benchmark scenario definition: https://github.com/ESA-APEx/apex_algorithms/blob/7683afd3a7b7e0cd87265482517ae34990f86180/algorithm_catalog/wur/worldagrocommodities/benchmark_scenarios/wac_inference.json
openEO backend: openeo.dataspace.copernicus.eu

GitHub Actions workflow run: https://github.com/ESA-APEx/apex_algorithms/actions/runs/17645409914
Workflow artifacts: https://github.com/ESA-APEx/apex_algorithms/actions/runs/17645409914#artifacts

Test start: 2025-09-11 13:03:53.123167+00:00
Test duration: 0:00:03.989656
Test outcome: ❌ failed

Last successful test phase: connect
Failure in test phase: create-job

Contact Information

Name Organization Contact
Hans Vanrompay VITO Contact via VITO (VITO Website)

Process Graph

{
  "parcel_delineation1": {
    "process_id": "wac_inference",
    "namespace": "https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/96dfa13ba74ccbfb3432c6ebd38c42e704526e79/algorithm_catalog/wur/worldagrocommodities/records/wac_inference.json",
    "arguments": {
      "spatial_extent": {
        "west": 716200,
        "south": 605530,
        "east": 722380,
        "north": 612410,
        "crs": "EPSG:32630"
      },
      "temporal_extent": [
        "2023-06-01",
        "2023-09-01"
      ]
    },
    "result": true
  }
}

Error Logs

scenario = BenchmarkScenario(id='WorldAgriCommodities', description='openEO pipeline for agricultural feature extraction and mode...rk/apex_algorithms/apex_algorithms/algorithm_catalog/wur/worldagrocommodities/benchmark_scenarios/wac_inference.json'))
connection_factory = <function connection_factory.<locals>.get_connection at 0x7f3a9ed67240>
tmp_path = PosixPath('/home/runner/work/apex_algorithms/apex_algorithms/qa/benchmarks/tmp_path_root/test_run_benchmark_WorldAgriCo0')
track_metric = <function track_metric.<locals>.track at 0x7f3a9ed67560>
track_phase = <function track_phase.<locals>.track at 0x7f3a9ed67380>
upload_assets_on_fail = <function upload_assets_on_fail.<locals>.collect at 0x7f3a9ed67600>
request = <FixtureRequest for <Function test_run_benchmark[WorldAgriCommodities]>>

    @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,
        connection_factory,
        tmp_path: Path,
        track_metric,
        track_phase,
        upload_assets_on_fail,
        request,
    ):
        track_metric("scenario_id", scenario.id)

        with track_phase(phase="connect"):
            # Check if a backend override has been provided via cli options.
            override_backend = request.config.getoption("--override-backend")
            backend_filter = request.config.getoption("--backend-filter")
            if backend_filter and not re.match(backend_filter, scenario.backend):
                # TODO apply filter during scenario retrieval, but seems to be hard to retrieve cli param
                pytest.skip(
                    f"skipping scenario {scenario.id} because backend {scenario.backend} does not match filter {backend_filter!r}"
                )
            backend = scenario.backend
            if override_backend:
                _log.info(f"Overriding backend URL with {override_backend!r}")
                backend = override_backend

            connection: openeo.Connection = connection_factory(url=backend)

        with track_phase(phase="create-job"):
            # TODO #14 scenario option to use synchronous instead of batch job mode?
>           job = connection.create_job(
                process_graph=scenario.process_graph,
                title=f"APEx benchmark {scenario.id}",
                additional=scenario.job_options,
            )

tests/test_benchmarks.py:59:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/connection.py:1815: in create_job
    response = self.post("/jobs", json=pg_with_metadata, expected_status=HTTP_201_CREATED)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:232: in post
    return self.request("post", path=path, json=json, allow_redirects=False, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/connection.py:687: in request
    return _request()
           ^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/connection.py:680: in _request
    return super(Connection, self).request(
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:141: in request
    self._raise_api_error(resp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Connection to 'https://openeo.dataspace.copernicus.eu/openeo/1.2/' with OidcBearerAuth>
response = <Response [400]>

    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: [400] ProcessNotFound: No valid process definition for 'wac_inference' found at 'https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/96dfa13ba74ccbfb3432c6ebd38c42e704526e79/algorithm_catalog/wur/worldagrocommodities/records/wac_inference.json'. (ref: r-250911130356474092eb3ebb1b918ebd)

/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:163: OpenEoApiError
------------------------------ Captured log call -------------------------------
INFO     conftest:conftest.py:131 Connecting to 'openeo.dataspace.copernicus.eu'
INFO     openeo.config:config.py:193 Loaded openEO client config from sources: []
INFO     conftest:conftest.py:144 Checking for auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSEFED' to drive auth against url='openeo.dataspace.copernicus.eu'.
INFO     conftest:conftest.py:148 Extracted provider_id='CDSE' client_id='openeo-apex-benchmarks-service-account' from auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSEFED'
INFO     openeo.rest.connection:connection.py:255 Found OIDC providers: ['CDSE']
INFO     openeo.rest.auth.oidc:oidc.py:404 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:352 Obtained tokens: ['access_token', 'id_token']

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions