Skip to content

Commit 839648e

Browse files
ciyermohammad-alisafaee
authored andcommitted
minor: switch from usage_available_percentage to usage_limit_total (#1268)
1 parent 73303f9 commit 839648e

6 files changed

Lines changed: 31 additions & 33 deletions

File tree

components/renku_data_services/crc/api.spec.yaml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,8 +1231,8 @@ components:
12311231
$ref: "#/components/schemas/NodeAffinityList"
12321232
usage_available:
12331233
$ref: "#/components/schemas/UsageAvailable"
1234-
usage_available_percentage:
1235-
$ref: "#/components/schemas/UsageAvailablePercentage"
1234+
usage_limit_total:
1235+
$ref: "#/components/schemas/UsageLimitTotal"
12361236
required: ["cpu", "memory", "gpu", "max_storage", "name", "id", "default", "default_storage"]
12371237
example:
12381238
name: "resource class"
@@ -1707,13 +1707,12 @@ components:
17071707
description: Amount of a resource available (in hours)
17081708
example: 3.141
17091709
minimum: 0
1710-
UsageAvailablePercentage:
1710+
UsageLimitTotal:
17111711
type: number
1712-
format: float
1713-
description: Percentage of available resources based on quota
1714-
example: 75.5
1712+
format: double
1713+
description: Total number of a resources hours available to the user
1714+
example: 10
17151715
minimum: 0
1716-
maximum: 100
17171716
default: null
17181717
ResourceUsage:
17191718
type: number

components/renku_data_services/crc/apispec.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2026-03-30T15:58:30+00:00
3+
# timestamp: 2026-04-21T07:48:24+00:00
44

55
from __future__ import annotations
66

@@ -805,12 +805,11 @@ class ResourceClassWithIdFiltered(BaseAPISpec):
805805
examples=[3.141],
806806
ge=0.0,
807807
)
808-
usage_available_percentage: Optional[float] = Field(
808+
usage_limit_total: Optional[float] = Field(
809809
None,
810-
description="Percentage of available resources based on quota",
811-
examples=[75.5],
810+
description="Total number of a resources hours available to the user",
811+
examples=[10],
812812
ge=0.0,
813-
le=100.0,
814813
)
815814

816815

components/renku_data_services/crc/core.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -653,18 +653,17 @@ async def calculate_available_usage(
653653
if available_quota <= 0:
654654
return None, None
655655

656-
resource_usage = resource_usage or 0
657-
remaining_quota = available_quota - resource_usage
658-
659-
if remaining_quota <= 0:
660-
return 0.0, 0.0
661-
662656
resource_class_cost = await resource_requests_repo.find_resource_class_costs(resource_pool_id, resource_class_id)
663-
664657
if not resource_class_cost or resource_class_cost.cost.value == 0:
665658
# NOTE: No cost is defined, so we cannot calculate remaining hours
666659
return None, None
667660

661+
total_hours = available_quota / resource_class_cost.cost.value
662+
resource_usage = resource_usage or 0
663+
remaining_quota = available_quota - resource_usage
664+
665+
if remaining_quota <= 0:
666+
return 0.0, total_hours
667+
668668
remaining_hours = remaining_quota / resource_class_cost.cost.value
669-
remaining_percentage = (remaining_quota / available_quota) * 100.0
670-
return remaining_hours, remaining_percentage
669+
return remaining_hours, total_hours

components/renku_data_services/crc/db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,13 @@ async def filter_resource_pools(
315315
if self.resource_requests_repo:
316316
updated_classes = []
317317
for resource_class in rp_model.classes:
318-
usage_available, usage_available_percentage = await calculate_available_usage(
318+
usage_available, usage_limit_total = await calculate_available_usage(
319319
self.resource_requests_repo, rp.id, resource_class.id, resource_usage
320320
)
321321
updated_class = replace(
322322
resource_class,
323323
usage_available=usage_available,
324-
usage_available_percentage=usage_available_percentage,
324+
usage_limit_total=usage_limit_total,
325325
)
326326
updated_classes.append(updated_class)
327327

components/renku_data_services/crc/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class ResourceClass(ResourcesCompareMixin):
111111
tolerations: list[str] = field(default_factory=list)
112112
quota: str | None = None
113113
usage_available: float | None = None
114-
usage_available_percentage: float | None = None
114+
usage_limit_total: float | None = None
115115

116116

117117
@dataclass(frozen=True, eq=True, kw_only=True)

test/bases/renku_data_services/data_api/test_resource_pools.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,7 +1724,8 @@ async def test_resource_pools_quota_with_partial_usage(
17241724

17251725
# usage_available should be 3 hours which is 75 percent of the total 4 hours available
17261726
assert resource_class["usage_available"] == 3.0
1727-
assert resource_class["usage_available_percentage"] == 75.0
1727+
# usage_limit_total should be 4 hours (200 credits total limit / 50 credits per hour)
1728+
assert resource_class["usage_limit_total"] == 4.0
17281729

17291730

17301731
@pytest.mark.asyncio
@@ -1794,8 +1795,8 @@ async def test_resource_pools_quota_with_no_usage(
17941795

17951796
# usage_available should be full quota: 200/50 = 4.0 hours
17961797
assert resource_class["usage_available"] == 4.0
1797-
# usage_available_percentage should be 100%
1798-
assert resource_class["usage_available_percentage"] == 100.0
1798+
# usage_limit_total should be 4 hours (200 credits total limit / 50 credits per hour)
1799+
assert resource_class["usage_limit_total"] == 4.0
17991800

18001801

18011802
@pytest.mark.asyncio
@@ -1877,8 +1878,8 @@ async def test_resource_pools_quota_exceeded(
18771878

18781879
# usage_available should be 0 (quota exceeded)
18791880
assert resource_class["usage_available"] == 0.0
1880-
# usage_available_percentage should be 0%
1881-
assert resource_class["usage_available_percentage"] == 0.0
1881+
# usage_limit_total should be 2.0 hours (50 credits/hour * 2 hours = 100 credits limit)
1882+
assert resource_class["usage_limit_total"] == 2.0
18821883

18831884

18841885
@pytest.mark.asyncio
@@ -1952,8 +1953,8 @@ async def test_resource_pools_quota_with_no_limits(
19521953

19531954
# usage_available should not exist in the response since it's None
19541955
assert "usage_available" not in resource_class
1955-
# usage_available_percentage should not exist in the response since it's None
1956-
assert "usage_available_percentage" not in resource_class
1956+
# usage_limit_total should not exist in the response since it's None
1957+
assert "usage_limit_total" not in resource_class
19571958

19581959

19591960
@pytest.mark.asyncio
@@ -2031,5 +2032,5 @@ async def test_resource_pools_quota_with_no_costs(
20312032

20322033
# usage_available should not exist in the response since it's None
20332034
assert "usage_available" not in resource_class
2034-
# usage_available_percentage should not exist in the response since it's None
2035-
assert "usage_available_percentage" not in resource_class
2035+
# usage_limit_total should not exist in the response since it's None
2036+
assert "usage_limit_total" not in resource_class

0 commit comments

Comments
 (0)