Skip to content

Commit ccf2aff

Browse files
authored
Merge pull request #241 from ecmwf-projects/COPDS-2397-costing-request-invalid
Update costing response
2 parents 8829abe + f2b4db2 commit ccf2aff

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

cads_processing_api_service/costing.py

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,49 +68,62 @@ def estimate_cost(
6868
portals=portals,
6969
)
7070
adaptor_properties = adaptors.get_adaptor_properties(dataset)
71-
request_is_valid = check_request_validity(
72-
request=request,
73-
mandatory_inputs=mandatory_inputs,
74-
adaptor_properties=adaptor_properties,
75-
)
7671
costing_info = compute_costing(
7772
request.get("inputs", {}), adaptor_properties, request_origin
7873
)
7974
cost = compute_highest_cost_limit_ratio(costing_info)
8075
if costing_info.cost_bar_steps:
8176
cost.cost_bar_steps = costing_info.cost_bar_steps
82-
costing_info.request_is_valid = request_is_valid
77+
try:
78+
check_request_validity(
79+
request=request,
80+
request_origin=request_origin,
81+
mandatory_inputs=mandatory_inputs,
82+
adaptor_properties=adaptor_properties,
83+
)
84+
except exceptions.InvalidRequest as exc:
85+
cost.request_is_valid = False
86+
cost.invalid_reason = exc.detail
8387
return cost
8488

8589

8690
def check_request_validity(
87-
request: dict[str, Any], mandatory_inputs: bool, adaptor_properties: dict[str, Any]
88-
) -> bool:
91+
request: dict[str, Any],
92+
request_origin: RequestOrigin,
93+
mandatory_inputs: bool,
94+
adaptor_properties: dict[str, Any],
95+
) -> None:
8996
"""
9097
Check if the request is valid.
9198
9299
Parameters
93100
----------
94101
request : dict[str, Any]
95102
Request to be processed.
103+
request_origin : RequestOrigin
104+
Origin of the request.
96105
mandatory_inputs : bool
97106
Whether mandatory inputs have been provided.
98107
adaptor_properties : dict[str, Any]
99108
Adaptor properties.
100109
101110
Returns
102111
-------
103-
bool
104-
Whether the request is valid.
112+
None
113+
114+
Raises
115+
------
116+
exceptions.InvalidRequest
117+
If the request is invalid.
105118
"""
106-
if not mandatory_inputs:
107-
return False
119+
if not mandatory_inputs and request_origin == RequestOrigin.ui:
120+
raise exceptions.InvalidRequest("missing mandatory inputs")
108121
try:
109122
adaptor = adaptors.instantiate_adaptor(adaptor_properties=adaptor_properties)
110123
_ = adaptor.check_validity(request.get("inputs", {}))
111-
return True
112-
except cads_adaptors.exceptions.InvalidRequest:
113-
return False
124+
return
125+
except cads_adaptors.exceptions.InvalidRequest as exc:
126+
raise exceptions.InvalidRequest(str(exc))
114127

115128

116129
def compute_highest_cost_limit_ratio(
@@ -173,7 +186,9 @@ def compute_costing(
173186
)
174187
costing_config: dict[str, Any] = adaptor_properties["config"].get("costing", {})
175188
limits: dict[str, Any] = costing_config.get("max_costs", {})
176-
cost_bar_steps = costing_config.get("cost_bar_steps", None)
189+
cost_bar_steps = (
190+
costing_config.get("cost_bar_steps", None) if request_origin == "ui" else None
191+
)
177192
costing_info = models.CostingInfo(
178193
costs=costs, limits=limits, cost_bar_steps=cost_bar_steps
179194
)

cads_processing_api_service/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ async def lifespan(application: fastapi.FastAPI) -> AsyncGenerator[Any, None]:
8686
costing.estimate_cost,
8787
description="Estimate costs of the submitted process execution.",
8888
methods=["POST"],
89+
response_model_exclude_unset=True,
8990
)
9091
app.router.add_api_route(
9192
"/processes/{process_id}/api-request",

cads_processing_api_service/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,15 @@ class CostingInfo(pydantic.BaseModel):
8181
costs: dict[str, float] = {}
8282
limits: dict[str, float] = {}
8383
cost_bar_steps: list[int] | None = None
84-
request_is_valid: bool = True
8584

8685

8786
class RequestCost(pydantic.BaseModel):
8887
id: str | None = None
8988
cost: float = 0.0
9089
limit: float = 1.0
9190
cost_bar_steps: list[int] | None = None
91+
request_is_valid: bool = True
92+
invalid_reason: str | None = None
9293

9394

9495
class Execute(ogc_api_processes_fastapi.models.Execute):

0 commit comments

Comments
 (0)