Skip to content

Commit df302d9

Browse files
authored
Merge pull request #230 from ecmwf-projects/COPDS-2173-validity-check
Check request validity
2 parents 1787d68 + 9b5ad0d commit df302d9

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

cads_processing_api_service/clients.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ def post_process_execution(
240240
adaptor = adaptors.instantiate_adaptor(adaptor_properties=adaptor_properties)
241241
try:
242242
request_inputs = adaptor.normalise_request(request_body.get("inputs", {}))
243+
_ = adaptor.check_validity(request_inputs)
243244
except cads_adaptors.exceptions.InvalidRequest as exc:
244245
raise exceptions.InvalidRequest(detail=str(exc)) from exc
245246
if dataset.api_enforce_constraints:

cads_processing_api_service/costing.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from typing import Any
1919

2020
import cads_adaptors
21+
import cads_adaptors.exceptions
2122
import cads_catalogue
2223
import fastapi
2324

@@ -34,6 +35,7 @@ class RequestOrigin(str, enum.Enum):
3435
def estimate_cost(
3536
process_id: str = fastapi.Path(...),
3637
request_origin: RequestOrigin = fastapi.Query("api"),
38+
mandatory_inputs: bool = fastapi.Query(False),
3739
execution_content: models.Execute = fastapi.Body(...),
3840
) -> models.RequestCost:
3941
"""
@@ -61,15 +63,51 @@ def estimate_cost(
6163
resource_id=process_id, table=table, session=catalogue_session
6264
)
6365
adaptor_properties = adaptors.get_adaptor_properties(dataset)
66+
request_is_valid = check_request_validity(
67+
request=request,
68+
mandatory_inputs=mandatory_inputs,
69+
adaptor_properties=adaptor_properties,
70+
)
6471
costing_info = costing.compute_costing(
6572
request.get("inputs", {}), adaptor_properties, request_origin
6673
)
6774
cost = costing.compute_highest_cost_limit_ratio(costing_info)
6875
if costing_info.cost_bar_steps:
6976
cost.cost_bar_steps = costing_info.cost_bar_steps
77+
costing_info.request_is_valid = request_is_valid
7078
return cost
7179

7280

81+
def check_request_validity(
82+
request: dict[str, Any], mandatory_inputs: bool, adaptor_properties: dict[str, Any]
83+
) -> bool:
84+
"""
85+
Check if the request is valid.
86+
87+
Parameters
88+
----------
89+
request : dict[str, Any]
90+
Request to be processed.
91+
mandatory_inputs : bool
92+
Whether mandatory inputs have been provided.
93+
adaptor_properties : dict[str, Any]
94+
Adaptor properties.
95+
96+
Returns
97+
-------
98+
bool
99+
Whether the request is valid.
100+
"""
101+
if not mandatory_inputs:
102+
return False
103+
try:
104+
adaptor = adaptors.instantiate_adaptor(adaptor_properties=adaptor_properties)
105+
_ = adaptor.check_validity(request.get("inputs", {}))
106+
return True
107+
except cads_adaptors.exceptions.InvalidRequest:
108+
return False
109+
110+
73111
def compute_highest_cost_limit_ratio(
74112
costing_info: models.CostingInfo,
75113
) -> models.RequestCost:

cads_processing_api_service/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class CostingInfo(pydantic.BaseModel):
8080
costs: dict[str, float] = {}
8181
limits: dict[str, float] = {}
8282
cost_bar_steps: list[int] | None = None
83+
request_is_valid: bool = True
8384

8485

8586
class RequestCost(pydantic.BaseModel):

0 commit comments

Comments
 (0)