Skip to content

Commit 5fc3ae0

Browse files
authored
Merge branch 'master' into pr-osparc-fix-metric-raising-errors
2 parents a2c926c + c0df260 commit 5fc3ae0

File tree

80 files changed

+1872
-697
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1872
-697
lines changed

api/specs/web-server/_projects_nodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
ServiceResourcesDict,
2222
)
2323
from models_library.generics import Envelope
24+
from models_library.groups import GroupID
2425
from models_library.projects import ProjectID
2526
from models_library.projects_nodes_io import NodeID
26-
from models_library.users import GroupID
2727
from simcore_service_webserver._meta import API_VTAG
2828
from simcore_service_webserver.projects._crud_handlers import ProjectPathParams
2929
from simcore_service_webserver.projects._nodes_handlers import (

api/specs/web-server/_wallets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
WalletPaymentInitiated,
2828
)
2929
from models_library.generics import Envelope
30+
from models_library.groups import GroupID
3031
from models_library.rest_pagination import Page, PageQueryParameters
31-
from models_library.users import GroupID
3232
from models_library.wallets import WalletID
3333
from simcore_service_webserver._meta import API_VTAG
3434
from simcore_service_webserver.wallets._groups_api import WalletGroupGet

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ async def launch_instances(
181181
)
182182
instance_ids = [i["InstanceId"] for i in instances["Instances"]]
183183
_logger.info(
184-
"New instances launched: %s, waiting for them to start now...",
184+
"%s New instances launched: %s, waiting for them to start now...",
185+
len(instance_ids),
185186
instance_ids,
186187
)
187188

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import enum
2+
3+
4+
class GroupType(enum.Enum):
5+
"""
6+
standard: standard group, e.g. any group that is not a primary group or special group such as the everyone group
7+
primary: primary group, e.g. the primary group is the user own defined group that typically only contain the user (same as in linux)
8+
everyone: the only group for all users
9+
"""
10+
11+
STANDARD = "standard"
12+
PRIMARY = "primary"
13+
EVERYONE = "everyone"

packages/models-library/src/models_library/api_schemas_catalog/service_access_rights.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from pydantic import BaseModel
22

3+
from ..groups import GroupID
34
from ..services import ServiceKey, ServiceVersion
4-
from ..users import GroupID
55

66

77
class ServiceAccessRightsGet(BaseModel):

packages/models-library/src/models_library/api_schemas_catalog/services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from ..boot_options import BootOptions
88
from ..emails import LowerCaseEmailStr
9+
from ..groups import GroupID
910
from ..services_access import ServiceAccessRights, ServiceGroupAccessRightsV2
1011
from ..services_authoring import Author
1112
from ..services_enums import ServiceType
@@ -18,7 +19,6 @@
1819
)
1920
from ..services_resources import ServiceResourcesDict
2021
from ..services_types import ServiceKey, ServiceVersion
21-
from ..users import GroupID
2222
from ..utils.change_case import snake_to_camel
2323

2424

packages/models-library/src/models_library/api_schemas_webserver/folders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from models_library.basic_types import IDStr
55
from models_library.folders import FolderID
6+
from models_library.groups import GroupID
67
from models_library.projects_access import AccessRights
7-
from models_library.users import GroupID
88
from models_library.utils.common_validators import null_or_none_str_to_none_validator
99
from pydantic import ConfigDict, PositiveInt, field_validator
1010

packages/models-library/src/models_library/api_schemas_webserver/folders_v2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from ..access_rights import AccessRights
77
from ..basic_types import IDStr
88
from ..folders import FolderID
9-
from ..users import GroupID
9+
from ..groups import GroupID
1010
from ..utils.common_validators import null_or_none_str_to_none_validator
1111
from ..workspaces import WorkspaceID
1212
from ._base import InputSchema, OutputSchema

packages/models-library/src/models_library/api_schemas_webserver/socketio.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from ..basic_types import IDStr
2-
from ..users import GroupID, UserID
2+
from ..groups import GroupID
3+
from ..users import UserID
34

45

56
class SocketIORoomStr(IDStr):

packages/models-library/src/models_library/api_schemas_webserver/wallets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pydantic import ConfigDict, Field, HttpUrl, ValidationInfo, field_validator
66

77
from ..basic_types import AmountDecimal, IDStr, NonNegativeDecimal
8-
from ..users import GroupID
8+
from ..groups import GroupID
99
from ..wallets import WalletID, WalletStatus
1010
from ._base import InputSchema, OutputSchema
1111

packages/models-library/src/models_library/api_schemas_webserver/workspaces.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import NamedTuple
33

44
from models_library.basic_types import IDStr
5-
from models_library.users import GroupID
5+
from models_library.groups import GroupID
66
from models_library.workspaces import WorkspaceID
77
from pydantic import ConfigDict, PositiveInt
88

packages/models-library/src/models_library/clusters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pydantic import AnyUrl, BaseModel, ConfigDict, Field, HttpUrl, field_validator
66
from pydantic.types import NonNegativeInt
77

8-
from .users import GroupID
8+
from .groups import GroupID
99
from .utils.common_validators import create_enums_pre_validator
1010
from .utils.enums import StrAutoEnum
1111

packages/models-library/src/models_library/folders.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
)
1313

1414
from .access_rights import AccessRights
15-
from .users import GroupID, UserID
15+
from .groups import GroupID
16+
from .users import UserID
1617
from .utils.enums import StrAutoEnum
1718
from .workspaces import WorkspaceID
1819

packages/models-library/src/models_library/groups.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,27 @@
1-
import enum
21
from typing import Annotated, Final, NamedTuple, TypeAlias
32

43
from common_library.basic_types import DEFAULT_FACTORY
4+
from common_library.groups_enums import GroupType as GroupType
55
from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator
66
from pydantic.types import PositiveInt
77
from typing_extensions import TypedDict
88

99
from .basic_types import IDStr
10-
from .users import GroupID, UserID
10+
from .users import UserID
1111
from .utils.common_validators import create_enums_pre_validator
1212

1313
EVERYONE_GROUP_ID: Final[int] = 1
1414

15+
GroupID: TypeAlias = PositiveInt
1516

16-
__all__: tuple[str, ...] = ("GroupID",)
17-
18-
19-
class GroupTypeInModel(str, enum.Enum):
20-
"""
21-
standard: standard group, e.g. any group that is not a primary group or special group such as the everyone group
22-
primary: primary group, e.g. the primary group is the user own defined group that typically only contain the user (same as in linux)
23-
everyone: the only group for all users
24-
"""
25-
26-
STANDARD = "standard"
27-
PRIMARY = "primary"
28-
EVERYONE = "everyone"
17+
__all__: tuple[str, ...] = ("GroupType",)
2918

3019

3120
class Group(BaseModel):
3221
gid: PositiveInt
3322
name: str
3423
description: str
35-
group_type: Annotated[GroupTypeInModel, Field(alias="type")]
24+
group_type: Annotated[GroupType, Field(alias="type")]
3625
thumbnail: str | None
3726

3827
inclusion_rules: Annotated[
@@ -43,7 +32,7 @@ class Group(BaseModel):
4332
] = DEFAULT_FACTORY
4433

4534
_from_equivalent_enums = field_validator("group_type", mode="before")(
46-
create_enums_pre_validator(GroupTypeInModel)
35+
create_enums_pre_validator(GroupType)
4736
)
4837

4938
model_config = ConfigDict(populate_by_name=True)

packages/models-library/src/models_library/services_access.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import BaseModel, ConfigDict, Field
66

7-
from .users import GroupID
7+
from .groups import GroupID
88
from .utils.change_case import snake_to_camel
99

1010

packages/models-library/src/models_library/users.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
UserID: TypeAlias = PositiveInt
77
UserNameID: TypeAlias = IDStr
8-
GroupID: TypeAlias = PositiveInt
98

109

1110
FirstNameStr: TypeAlias = Annotated[

packages/models-library/src/models_library/workspaces.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
)
1313

1414
from .access_rights import AccessRights
15-
from .users import GroupID, UserID
15+
from .groups import GroupID
16+
from .users import UserID
1617
from .utils.enums import StrAutoEnum
1718

1819
WorkspaceID: TypeAlias = PositiveInt

packages/models-library/tests/test_api_schemas_webserver_socketio.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import pytest
44
from faker import Faker
55
from models_library.api_schemas_webserver.socketio import SocketIORoomStr
6-
from models_library.users import GroupID, UserID
6+
from models_library.groups import GroupID
7+
from models_library.users import UserID
78

89

910
@pytest.fixture

packages/notifications-library/tests/with_db/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
import pytest
1212
import sqlalchemy as sa
1313
from models_library.basic_types import IDStr
14+
from models_library.groups import GroupID
1415
from models_library.products import ProductName
15-
from models_library.users import GroupID, UserID
16+
from models_library.users import UserID
1617
from notifications_library._templates import get_default_named_templates
1718
from pydantic import validate_call
1819
from simcore_postgres_database.models.jinja2_templates import jinja2_templates

packages/postgres-database/requirements/prod.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
--requirement _base.txt
99
--requirement _migration.txt
1010

11+
simcore-common-library @ ../common-library/
1112
simcore-postgres-database @ .

packages/postgres-database/src/simcore_postgres_database/models/groups.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,16 @@
44
- Groups have a ID, name and a list of users that belong to the group
55
"""
66

7-
import enum
87

98
import sqlalchemy as sa
9+
from common_library.groups_enums import GroupType
1010
from sqlalchemy.dialects.postgresql import JSONB
1111
from sqlalchemy.sql import func
1212

1313
from ._common import RefActions
1414
from .base import metadata
1515

16-
17-
class GroupType(enum.Enum):
18-
"""
19-
standard: standard group, e.g. any group that is not a primary group or special group such as the everyone group
20-
primary: primary group, e.g. the primary group is the user own defined group that typically only contain the user (same as in linux)
21-
everyone: the only group for all users
22-
"""
23-
24-
STANDARD = "standard"
25-
PRIMARY = "primary"
26-
EVERYONE = "everyone"
27-
16+
__all__: tuple[str, ...] = ("GroupType",)
2817

2918
groups = sa.Table(
3019
"groups",
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from collections.abc import Callable
2+
3+
import arrow
4+
from aws_library.ec2 import EC2InstanceData
5+
from models_library.generated_models.docker_rest_api import (
6+
Availability,
7+
Node,
8+
NodeState,
9+
)
10+
from pytest_mock import MockType
11+
from simcore_service_autoscaling.models import AssociatedInstance, Cluster
12+
from simcore_service_autoscaling.utils.utils_docker import (
13+
_OSPARC_NODE_TERMINATION_PROCESS_LABEL_KEY,
14+
_OSPARC_SERVICE_READY_LABEL_KEY,
15+
_OSPARC_SERVICES_READY_DATETIME_LABEL_KEY,
16+
)
17+
18+
19+
def assert_cluster_state(
20+
spied_cluster_analysis: MockType, *, expected_calls: int, expected_num_machines: int
21+
) -> Cluster:
22+
assert spied_cluster_analysis.call_count == expected_calls
23+
24+
assert isinstance(spied_cluster_analysis.spy_return, Cluster)
25+
assert (
26+
spied_cluster_analysis.spy_return.total_number_of_machines()
27+
== expected_num_machines
28+
)
29+
print("current cluster state:", spied_cluster_analysis.spy_return)
30+
cluster = spied_cluster_analysis.spy_return
31+
spied_cluster_analysis.reset_mock()
32+
return cluster
33+
34+
35+
def create_fake_association(
36+
create_fake_node: Callable[..., Node],
37+
drained_machine_id: str | None,
38+
terminating_machine_id: str | None,
39+
):
40+
fake_node_to_instance_map = {}
41+
42+
async def _fake_node_creator(
43+
_nodes: list[Node], ec2_instances: list[EC2InstanceData]
44+
) -> tuple[list[AssociatedInstance], list[EC2InstanceData]]:
45+
def _create_fake_node_with_labels(instance: EC2InstanceData) -> Node:
46+
if instance not in fake_node_to_instance_map:
47+
fake_node = create_fake_node()
48+
assert fake_node.spec
49+
fake_node.spec.availability = Availability.active
50+
assert fake_node.status
51+
fake_node.status.state = NodeState.ready
52+
assert fake_node.spec.labels
53+
fake_node.spec.labels |= {
54+
_OSPARC_SERVICES_READY_DATETIME_LABEL_KEY: arrow.utcnow().isoformat(),
55+
_OSPARC_SERVICE_READY_LABEL_KEY: (
56+
"true" if instance.id != drained_machine_id else "false"
57+
),
58+
}
59+
if instance.id == terminating_machine_id:
60+
fake_node.spec.labels |= {
61+
_OSPARC_NODE_TERMINATION_PROCESS_LABEL_KEY: arrow.utcnow().isoformat()
62+
}
63+
fake_node_to_instance_map[instance] = fake_node
64+
return fake_node_to_instance_map[instance]
65+
66+
associated_instances = [
67+
AssociatedInstance(node=_create_fake_node_with_labels(i), ec2_instance=i)
68+
for i in ec2_instances
69+
]
70+
71+
return associated_instances, []
72+
73+
return _fake_node_creator

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_workspaces.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import sqlalchemy as sa
22
from aiohttp import web
3-
from models_library.users import GroupID
3+
from models_library.groups import GroupID
44
from models_library.workspaces import WorkspaceID
55
from simcore_postgres_database.models.workspaces_access_rights import (
66
workspaces_access_rights,

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/auth/api_keys.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ async def create_api_key(
2626
product_name=product_name,
2727
api_key=api_key,
2828
)
29-
assert isinstance(result, ApiKeyGet)
29+
assert isinstance(result, ApiKeyGet) # nosec
3030
return result
3131

3232

@@ -45,7 +45,7 @@ async def get_api_key(
4545
product_name=product_name,
4646
api_key_id=api_key_id,
4747
)
48-
assert isinstance(result, ApiKeyGet)
48+
assert isinstance(result, ApiKeyGet) # nosec
4949
return result
5050

5151

@@ -63,4 +63,4 @@ async def delete_api_key(
6363
product_name=product_name,
6464
api_key_id=api_key_id,
6565
)
66-
assert result is None
66+
assert result is None # nosec

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/licenses/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)