From 200878841d7c89b57524ec51f1af333fcf998731 Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 16:30:04 +0900 Subject: [PATCH 1/8] fix: restore removed deprecated resource policy fields --- src/ai/backend/manager/models/resource_policy.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index e0fc17d13d..3335ca3efb 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -143,6 +143,10 @@ class KeyPairResourcePolicy(graphene.ObjectType): idle_timeout = BigInt() allowed_vfolder_hosts = graphene.JSONString() + max_vfolder_count = graphene.Int(deprecation_reason="Deprecated since 23.09.4") + max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.4") + max_quota_scope_size = BigInt(deprecation_reason="Deprecated since 23.09.4") + @classmethod def from_row( cls, @@ -161,6 +165,9 @@ def from_row( max_containers_per_session=row["max_containers_per_session"], idle_timeout=row["idle_timeout"], allowed_vfolder_hosts=row["allowed_vfolder_hosts"].to_json(), + max_vfolder_count=0, + max_vfolder_size=0, + max_quota_scope_size=0, ) @classmethod From e15c0e4a7fc522ae07f79b30fc60ed9cf9a79e79 Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 16:42:49 +0900 Subject: [PATCH 2/8] remove dummy values --- src/ai/backend/manager/models/resource_policy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index 3335ca3efb..7b0c6268a1 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -165,9 +165,6 @@ def from_row( max_containers_per_session=row["max_containers_per_session"], idle_timeout=row["idle_timeout"], allowed_vfolder_hosts=row["allowed_vfolder_hosts"].to_json(), - max_vfolder_count=0, - max_vfolder_size=0, - max_quota_scope_size=0, ) @classmethod From 6ef662de0bb6e6ccec66a40876e013cd0b7ec5fa Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 16:43:45 +0900 Subject: [PATCH 3/8] restore dummy values --- src/ai/backend/manager/models/resource_policy.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index 7b0c6268a1..3335ca3efb 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -165,6 +165,9 @@ def from_row( max_containers_per_session=row["max_containers_per_session"], idle_timeout=row["idle_timeout"], allowed_vfolder_hosts=row["allowed_vfolder_hosts"].to_json(), + max_vfolder_count=0, + max_vfolder_size=0, + max_quota_scope_size=0, ) @classmethod From c8e87f80bf9c2dca9a6bbd2da3e057d4095c9bd8 Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 16:50:23 +0900 Subject: [PATCH 4/8] restore deprecated fields in Input obj --- src/ai/backend/manager/models/resource_policy.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index 3335ca3efb..f70fd5e068 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -165,9 +165,6 @@ def from_row( max_containers_per_session=row["max_containers_per_session"], idle_timeout=row["idle_timeout"], allowed_vfolder_hosts=row["allowed_vfolder_hosts"].to_json(), - max_vfolder_count=0, - max_vfolder_size=0, - max_quota_scope_size=0, ) @classmethod @@ -297,6 +294,9 @@ class CreateKeyPairResourcePolicyInput(graphene.InputObjectType): max_containers_per_session = graphene.Int(required=True) idle_timeout = BigInt(required=True) allowed_vfolder_hosts = graphene.JSONString(required=False) + max_vfolder_count = graphene.Int(required=False, deprecation_reason="Deprecated since 23.09.4") + max_vfolder_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") + max_quota_scope_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") class ModifyKeyPairResourcePolicyInput(graphene.InputObjectType): @@ -307,6 +307,9 @@ class ModifyKeyPairResourcePolicyInput(graphene.InputObjectType): max_containers_per_session = graphene.Int(required=False) idle_timeout = BigInt(required=False) allowed_vfolder_hosts = graphene.JSONString(required=False) + max_vfolder_count = graphene.Int(required=False, deprecation_reason="Deprecated since 23.09.4") + max_vfolder_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") + max_quota_scope_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") class CreateKeyPairResourcePolicy(graphene.Mutation): From c7636aa197406e006c05b7e5b4ef5946e6f98a4b Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 18:22:37 +0900 Subject: [PATCH 5/8] add description to added fields --- .../backend/manager/models/resource_policy.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index f70fd5e068..1646fa60cd 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -417,9 +417,9 @@ class UserResourcePolicy(graphene.ObjectType): id = graphene.ID(required=True) name = graphene.String(required=True) created_at = GQLDateTime(required=True) - max_vfolder_count = graphene.Int() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.1") - max_quota_scope_size = BigInt() + max_quota_scope_size = BigInt(description="Added since 24.03.1") @classmethod def from_row( @@ -434,7 +434,6 @@ def from_row( name=row.name, created_at=row.created_at, max_vfolder_count=row.max_vfolder_count, - max_vfolder_size=row.max_quota_scope_size, # aliased field max_quota_scope_size=row.max_quota_scope_size, ) @@ -492,13 +491,13 @@ async def batch_load_by_user( class CreateUserResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int() - max_quota_scope_size = BigInt() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") + max_quota_scope_size = BigInt(description="Added since 24.03.1") class ModifyUserResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int() - max_quota_scope_size = BigInt() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") + max_quota_scope_size = BigInt(description="Added since 24.03.1") class CreateUserResourcePolicy(graphene.Mutation): @@ -595,9 +594,9 @@ class ProjectResourcePolicy(graphene.ObjectType): id = graphene.ID(required=True) name = graphene.String(required=True) created_at = GQLDateTime(required=True) - max_vfolder_count = graphene.Int() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.1") - max_quota_scope_size = BigInt() + max_quota_scope_size = BigInt(description="Added since 24.03.1") @classmethod def from_row( @@ -670,13 +669,13 @@ async def batch_load_by_project( class CreateProjectResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int() - max_quota_scope_size = BigInt() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") + max_quota_scope_size = BigInt(description="Added since 24.03.1") class ModifyProjectResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int() - max_quota_scope_size = BigInt() + max_vfolder_count = graphene.Int(description="Added since 24.03.1") + max_quota_scope_size = BigInt(description="Added since 24.03.1") class CreateProjectResourcePolicy(graphene.Mutation): From 44c282a69818cbcee350ee77c0a481fdad8bce25 Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Tue, 31 Oct 2023 18:30:26 +0900 Subject: [PATCH 6/8] add news fragment --- changes/1677.fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/1677.fix.md diff --git a/changes/1677.fix.md b/changes/1677.fix.md new file mode 100644 index 0000000000..ae35e4f73f --- /dev/null +++ b/changes/1677.fix.md @@ -0,0 +1 @@ +Restore removed graphene fields of resource policies and set them deprecated. From 436488245460757b266dc14cf50f67b46c9f121b Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Wed, 1 Nov 2023 14:09:53 +0900 Subject: [PATCH 7/8] add detail descriptions and refactor --- .../backend/manager/models/resource_policy.py | 75 +++++++++++++------ src/ai/backend/manager/models/utils.py | 11 +++ 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/src/ai/backend/manager/models/resource_policy.py b/src/ai/backend/manager/models/resource_policy.py index 1646fa60cd..93433bb6e6 100644 --- a/src/ai/backend/manager/models/resource_policy.py +++ b/src/ai/backend/manager/models/resource_policy.py @@ -28,6 +28,7 @@ ) from .keypair import keypairs from .user import UserRole +from .utils import deprecation_reason_msg, description_msg if TYPE_CHECKING: from .gql import GraphQueryContext @@ -57,6 +58,34 @@ ) +def user_max_vfolder_count(required: bool = False): + return graphene.Int( + required=required, + description=description_msg("24.03.1", "Limitation of the number of user vfolders."), + ) + + +def user_max_quota_scope_size(required: bool = False): + return BigInt( + required=required, + description=description_msg("24.03.1", "Limitation of the quota size of user vfolders."), + ) + + +def project_max_vfolder_count(required: bool = False): + return graphene.Int( + required=required, + description=description_msg("24.03.1", "Limitation of the number of project vfolders."), + ) + + +def project_max_quota_scope_size(required: bool = False): + return BigInt( + required=required, + description=description_msg("24.03.1", "Limitation of the quota size of project vfolders."), + ) + + keypair_resource_policies = sa.Table( "keypair_resource_policies", mapper_registry.metadata, @@ -143,9 +172,9 @@ class KeyPairResourcePolicy(graphene.ObjectType): idle_timeout = BigInt() allowed_vfolder_hosts = graphene.JSONString() - max_vfolder_count = graphene.Int(deprecation_reason="Deprecated since 23.09.4") - max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.4") - max_quota_scope_size = BigInt(deprecation_reason="Deprecated since 23.09.4") + max_vfolder_count = graphene.Int(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_vfolder_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_quota_scope_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) @classmethod def from_row( @@ -294,9 +323,9 @@ class CreateKeyPairResourcePolicyInput(graphene.InputObjectType): max_containers_per_session = graphene.Int(required=True) idle_timeout = BigInt(required=True) allowed_vfolder_hosts = graphene.JSONString(required=False) - max_vfolder_count = graphene.Int(required=False, deprecation_reason="Deprecated since 23.09.4") - max_vfolder_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") - max_quota_scope_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") + max_vfolder_count = graphene.Int(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_vfolder_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_quota_scope_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) class ModifyKeyPairResourcePolicyInput(graphene.InputObjectType): @@ -307,9 +336,9 @@ class ModifyKeyPairResourcePolicyInput(graphene.InputObjectType): max_containers_per_session = graphene.Int(required=False) idle_timeout = BigInt(required=False) allowed_vfolder_hosts = graphene.JSONString(required=False) - max_vfolder_count = graphene.Int(required=False, deprecation_reason="Deprecated since 23.09.4") - max_vfolder_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") - max_quota_scope_size = BigInt(required=False, deprecation_reason="Deprecated since 23.09.4") + max_vfolder_count = graphene.Int(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_vfolder_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) + max_quota_scope_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.4")) class CreateKeyPairResourcePolicy(graphene.Mutation): @@ -417,9 +446,9 @@ class UserResourcePolicy(graphene.ObjectType): id = graphene.ID(required=True) name = graphene.String(required=True) created_at = GQLDateTime(required=True) - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = user_max_vfolder_count() + max_quota_scope_size = user_max_quota_scope_size() + max_vfolder_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.1")) @classmethod def from_row( @@ -491,13 +520,13 @@ async def batch_load_by_user( class CreateUserResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = user_max_vfolder_count() + max_quota_scope_size = user_max_quota_scope_size() class ModifyUserResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = user_max_vfolder_count() + max_quota_scope_size = user_max_quota_scope_size() class CreateUserResourcePolicy(graphene.Mutation): @@ -594,9 +623,9 @@ class ProjectResourcePolicy(graphene.ObjectType): id = graphene.ID(required=True) name = graphene.String(required=True) created_at = GQLDateTime(required=True) - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_vfolder_size = BigInt(deprecation_reason="Deprecated since 23.09.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = project_max_vfolder_count() + max_quota_scope_size = project_max_quota_scope_size() + max_vfolder_size = BigInt(deprecation_reason=deprecation_reason_msg("23.09.1")) @classmethod def from_row( @@ -669,13 +698,13 @@ async def batch_load_by_project( class CreateProjectResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = project_max_vfolder_count() + max_quota_scope_size = project_max_quota_scope_size() class ModifyProjectResourcePolicyInput(graphene.InputObjectType): - max_vfolder_count = graphene.Int(description="Added since 24.03.1") - max_quota_scope_size = BigInt(description="Added since 24.03.1") + max_vfolder_count = project_max_vfolder_count() + max_quota_scope_size = project_max_quota_scope_size() class CreateProjectResourcePolicy(graphene.Mutation): diff --git a/src/ai/backend/manager/models/utils.py b/src/ai/backend/manager/models/utils.py index f8a1afb65f..84ab83c9be 100644 --- a/src/ai/backend/manager/models/utils.py +++ b/src/ai/backend/manager/models/utils.py @@ -358,3 +358,14 @@ def agg_to_str(column: sa.Column) -> sa.sql.functions.Function: def agg_to_array(column: sa.Column) -> sa.sql.functions.Function: return sa.func.array_agg(psql.aggregate_order_by(column, column.asc())) + + +def description_msg(version: str, detail: str | None = None): + val = f"Added since {version}." + if detail: + val = f"{val} {detail}" + return val + + +def deprecation_reason_msg(version: str): + return f"Deprecated since {version}." From 2be9eba406806c1607dba433661318610e066b03 Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Wed, 1 Nov 2023 17:14:02 +0900 Subject: [PATCH 8/8] add detail msg --- src/ai/backend/manager/models/utils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ai/backend/manager/models/utils.py b/src/ai/backend/manager/models/utils.py index 1fbb08f1ec..f0850699eb 100644 --- a/src/ai/backend/manager/models/utils.py +++ b/src/ai/backend/manager/models/utils.py @@ -364,12 +364,15 @@ def is_db_retry_error(e: Exception) -> bool: return isinstance(e, DBAPIError) and getattr(e.orig, "pgcode", None) == "40001" -def description_msg(version: str, detail: str | None = None): +def description_msg(version: str, detail: str | None = None) -> str: val = f"Added since {version}." if detail: val = f"{val} {detail}" return val -def deprecation_reason_msg(version: str): - return f"Deprecated since {version}." +def deprecation_reason_msg(version: str, detail: str | None = None) -> str: + val = f"Deprecated since {version}." + if detail: + val = f"{val} {detail}" + return val