Skip to content

Commit 9b3ec9f

Browse files
committed
do not define gt it is weird for resources
1 parent 589966c commit 9b3ec9f

File tree

4 files changed

+57
-47
lines changed

4 files changed

+57
-47
lines changed

packages/aws-library/src/aws_library/ec2/_models.py

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,35 +44,31 @@ def create_as_empty(cls) -> "Resources":
4444
return cls(cpus=0, ram=ByteSize(0))
4545

4646
def __ge__(self, other: "Resources") -> bool:
47+
"""operator for >= comparison
48+
if self has greater or equal resources than other, returns True
49+
Note that generic_resources are compared only if they are numeric
50+
Non-numeric generic resources must be equal in both or only defined in self
51+
to be considered greater or equal
52+
"""
53+
4754
if not (self.cpus >= other.cpus and self.ram >= other.ram):
4855
return False
49-
# ensure all numeric generic resources in `other` are satisfied by `self`
50-
for k, v in other.generic_resources.items():
51-
if isinstance(v, int | float):
52-
lhs_val = self.generic_resources.get(k, 0)
53-
if not isinstance(lhs_val, int | float) or lhs_val < v:
56+
57+
keys = set(self.generic_resources) | set(other.generic_resources)
58+
for k in keys:
59+
a = self.generic_resources.get(k)
60+
b = other.generic_resources.get(
61+
k, a
62+
) # NOTE: get from other, default to a so that non-existing keys are considered equal
63+
if isinstance(a, int | float) and isinstance(b, int | float):
64+
if not (a >= b):
5465
return False
55-
continue
56-
# non-numeric must be equal and present
57-
if k not in self.generic_resources or self.generic_resources[k] != v:
66+
elif a != b:
67+
assert isinstance(a, str | None) # nosec
68+
assert isinstance(b, int | float | str | None) # nosec
5869
return False
5970
return True
6071

61-
def __gt__(self, other: "Resources") -> bool:
62-
if self.cpus > other.cpus or self.ram > other.ram:
63-
return True
64-
for k, v in other.generic_resources.items():
65-
lhs_val = self.generic_resources.get(k)
66-
if (
67-
isinstance(v, int | float)
68-
and isinstance(lhs_val, int | float)
69-
and lhs_val > v
70-
):
71-
return True
72-
if not isinstance(v, int | float) and lhs_val is not None and lhs_val != v:
73-
return True
74-
return False
75-
7672
def __add__(self, other: "Resources") -> "Resources":
7773
"""operator for adding two Resources
7874
Note that only numeric generic resources are added

packages/aws-library/tests/test_ec2_models.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,46 +37,57 @@
3737
Resources(cpus=0.1, ram=ByteSize(1)),
3838
False,
3939
),
40-
],
41-
)
42-
def test_resources_ge_operator(
43-
a: Resources, b: Resources, a_greater_or_equal_than_b: bool
44-
):
45-
assert (a >= b) is a_greater_or_equal_than_b
46-
47-
48-
@pytest.mark.parametrize(
49-
"a,b,a_greater_than_b",
50-
[
5140
(
52-
Resources(cpus=0.2, ram=ByteSize(0)),
53-
Resources(cpus=0.1, ram=ByteSize(0)),
41+
Resources(cpus=0.1, ram=ByteSize(0), generic_resources={"GPU": 1}),
42+
Resources(cpus=0.1, ram=ByteSize(1)),
43+
False, # ram is not enough
44+
),
45+
(
46+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 1}),
47+
Resources(cpus=0.1, ram=ByteSize(1)),
5448
True,
5549
),
5650
(
57-
Resources(cpus=0.1, ram=ByteSize(0)),
58-
Resources(cpus=0.1, ram=ByteSize(0)),
51+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 1}),
52+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 1}),
53+
True,
54+
),
55+
(
56+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 1}),
57+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 2}),
5958
False,
6059
),
6160
(
6261
Resources(cpus=0.1, ram=ByteSize(1)),
63-
Resources(cpus=0.1, ram=ByteSize(0)),
62+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 2}),
63+
False,
64+
),
65+
(
66+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": "2"}),
67+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"GPU": 2}),
68+
False,
69+
),
70+
(
71+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"SSE": "yes"}),
72+
Resources(cpus=0.1, ram=ByteSize(1)),
6473
True,
6574
),
6675
(
67-
Resources(cpus=0.05, ram=ByteSize(1)),
68-
Resources(cpus=0.1, ram=ByteSize(0)),
76+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"SSE": "yes"}),
77+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"SSE": "yes"}),
6978
True,
7079
),
7180
(
72-
Resources(cpus=0.1, ram=ByteSize(0)),
7381
Resources(cpus=0.1, ram=ByteSize(1)),
82+
Resources(cpus=0.1, ram=ByteSize(1), generic_resources={"SSE": "yes"}),
7483
False,
7584
),
7685
],
7786
)
78-
def test_resources_gt_operator(a: Resources, b: Resources, a_greater_than_b: bool):
79-
assert (a > b) is a_greater_than_b
87+
def test_resources_ge_operator(
88+
a: Resources, b: Resources, a_greater_or_equal_than_b: bool
89+
):
90+
assert (a >= b) is a_greater_or_equal_than_b
8091

8192

8293
@pytest.mark.parametrize(

services/autoscaling/src/simcore_service_autoscaling/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ def assign_task(self, task, task_resources: Resources) -> None:
2323
def has_resources_for_task(self, task_resources: Resources) -> bool:
2424
return bool(self.available_resources >= task_resources)
2525

26+
def has_assigned_tasks(self) -> bool:
27+
return len(self.assigned_tasks) > 0
28+
2629

2730
@dataclass(frozen=True, kw_only=True, slots=True)
2831
class AssignedTasksToInstanceType(_TaskAssignmentMixin):
@@ -37,9 +40,6 @@ def __post_init__(self) -> None:
3740
if self.available_resources == Resources.create_as_empty():
3841
object.__setattr__(self, "available_resources", self.ec2_instance.resources)
3942

40-
def has_assigned_tasks(self) -> bool:
41-
return bool(self.available_resources < self.ec2_instance.resources)
42-
4343

4444
@dataclass(frozen=True, kw_only=True, slots=True)
4545
class AssociatedInstance(_BaseInstance):

services/autoscaling/src/simcore_service_autoscaling/modules/cluster_scaling/_provider_computational.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ async def list_unrunnable_tasks(self, app: FastAPI) -> list[DaskTask]:
8888

8989
def get_task_required_resources(self, task) -> Resources:
9090
assert self # nosec
91+
# NOTE: a dask worker can take a task if it has a free thread, regardless of its resources
92+
# so we need to be careful when interpreting the resources, adding the thread here will mimick this
93+
9194
return utils.resources_from_dask_task(task)
9295

9396
async def get_task_defined_instance(

0 commit comments

Comments
 (0)