Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add Associate and Disassociate Scaling Groups with Domain, User Group, and KeyPair mutations (#2473) #2724

Merged
merged 2 commits into from
Aug 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/2473.feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow bulk association and disassociation of scaling groups with domains, user groups, and key pairs.
54 changes: 54 additions & 0 deletions src/ai/backend/manager/api/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -1163,27 +1163,45 @@
modify_scaling_group(name: String!, props: ModifyScalingGroupInput!): ModifyScalingGroup
delete_scaling_group(name: String!): DeleteScalingGroup
associate_scaling_group_with_domain(domain: String!, scaling_group: String!): AssociateScalingGroupWithDomain

"""Added in 24.03.9"""
associate_scaling_groups_with_domain(domain: String!, scaling_groups: [String]!): AssociateScalingGroupsWithDomain
associate_scaling_group_with_user_group(scaling_group: String!, user_group: UUID!): AssociateScalingGroupWithUserGroup

"""Added in 24.03.9"""
associate_scaling_groups_with_user_group(scaling_groups: [String]!, user_group: UUID!): AssociateScalingGroupsWithUserGroup
associate_scaling_group_with_keypair(access_key: String!, scaling_group: String!): AssociateScalingGroupWithKeyPair

"""Added in 24.03.9"""
associate_scaling_groups_with_keypair(access_key: String!, scaling_groups: [String]!): AssociateScalingGroupsWithKeyPair
disassociate_scaling_group_with_domain(domain: String!, scaling_group: String!): DisassociateScalingGroupWithDomain

"""Added in 24.03.9"""
disassociate_scaling_groups_with_domain(domain: String!, scaling_groups: [String]!): DisassociateScalingGroupsWithDomain
disassociate_scaling_group_with_user_group(scaling_group: String!, user_group: UUID!): DisassociateScalingGroupWithUserGroup

"""Added in 24.03.9"""
disassociate_scaling_groups_with_user_group(scaling_groups: [String]!, user_group: UUID!): DisassociateScalingGroupsWithUserGroup

Check notice on line 1184 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'associate_scaling_groups_with_domain' was added to object type 'Mutations'

Field 'associate_scaling_groups_with_domain' was added to object type 'Mutations'
disassociate_scaling_group_with_keypair(access_key: String!, scaling_group: String!): DisassociateScalingGroupWithKeyPair

"""Added in 24.03.9"""
disassociate_scaling_groups_with_keypair(access_key: String!, scaling_groups: [String]!): DisassociateScalingGroupsWithKeyPair

Check notice on line 1188 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'associate_scaling_groups_with_user_group' was added to object type 'Mutations'

Field 'associate_scaling_groups_with_user_group' was added to object type 'Mutations'
disassociate_all_scaling_groups_with_domain(domain: String!): DisassociateAllScalingGroupsWithDomain
disassociate_all_scaling_groups_with_group(user_group: UUID!): DisassociateAllScalingGroupsWithGroup
set_quota_scope(props: QuotaScopeInput!, quota_scope_id: String!, storage_host_name: String!): SetQuotaScope
unset_quota_scope(quota_scope_id: String!, storage_host_name: String!): UnsetQuotaScope

Check notice on line 1192 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'associate_scaling_groups_with_keypair' was added to object type 'Mutations'

Field 'associate_scaling_groups_with_keypair' was added to object type 'Mutations'
create_container_registry(hostname: String!, props: CreateContainerRegistryInput!): CreateContainerRegistry
modify_container_registry(hostname: String!, props: ModifyContainerRegistryInput!): ModifyContainerRegistry
delete_container_registry(hostname: String!): DeleteContainerRegistry
modify_endpoint(endpoint_id: UUID!, props: ModifyEndpointInput!): ModifyEndpoint

Check notice on line 1196 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'disassociate_scaling_groups_with_domain' was added to object type 'Mutations'

Field 'disassociate_scaling_groups_with_domain' was added to object type 'Mutations'
}

type ModifyAgent {
ok: Boolean

Check notice on line 1200 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'disassociate_scaling_groups_with_user_group' was added to object type 'Mutations'

Field 'disassociate_scaling_groups_with_user_group' was added to object type 'Mutations'
msg: String
}

input ModifyAgentInput {

Check notice on line 1204 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Field 'disassociate_scaling_groups_with_keypair' was added to object type 'Mutations'

Field 'disassociate_scaling_groups_with_keypair' was added to object type 'Mutations'
schedulable: Boolean
scaling_group: String
}
Expand Down Expand Up @@ -1731,32 +1749,68 @@
msg: String
}

"""Added in 24.03.9."""
type AssociateScalingGroupsWithDomain {
ok: Boolean
msg: String
}

type AssociateScalingGroupWithUserGroup {
ok: Boolean
msg: String
}

"""Added in 24.03.9."""
type AssociateScalingGroupsWithUserGroup {
ok: Boolean
msg: String
}

type AssociateScalingGroupWithKeyPair {

Check notice on line 1769 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'AssociateScalingGroupsWithDomain' was added

Type 'AssociateScalingGroupsWithDomain' was added
ok: Boolean
msg: String
}

"""Added in 24.03.9."""
type AssociateScalingGroupsWithKeyPair {
ok: Boolean
msg: String
}

type DisassociateScalingGroupWithDomain {

Check notice on line 1780 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'AssociateScalingGroupsWithUserGroup' was added

Type 'AssociateScalingGroupsWithUserGroup' was added
ok: Boolean
msg: String
}

"""Added in 24.03.9."""
type DisassociateScalingGroupsWithDomain {
ok: Boolean
msg: String
}

type DisassociateScalingGroupWithUserGroup {

Check notice on line 1791 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'AssociateScalingGroupsWithKeyPair' was added

Type 'AssociateScalingGroupsWithKeyPair' was added
ok: Boolean
msg: String
}

"""Added in 24.03.9."""
type DisassociateScalingGroupsWithUserGroup {
ok: Boolean
msg: String
}

type DisassociateScalingGroupWithKeyPair {

Check notice on line 1802 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'DisassociateScalingGroupsWithDomain' was added

Type 'DisassociateScalingGroupsWithDomain' was added
ok: Boolean
msg: String
}

"""Added in 24.03.9."""
type DisassociateScalingGroupsWithKeyPair {
ok: Boolean
msg: String
}

type DisassociateAllScalingGroupsWithDomain {

Check notice on line 1813 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'DisassociateScalingGroupsWithUserGroup' was added

Type 'DisassociateScalingGroupsWithUserGroup' was added
ok: Boolean
msg: String
}
Expand All @@ -1767,7 +1821,7 @@
}

type SetQuotaScope {
quota_scope: QuotaScope

Check notice on line 1824 in src/ai/backend/manager/api/schema.graphql

View workflow job for this annotation

GitHub Actions / GraphQL Inspector

Type 'DisassociateScalingGroupsWithKeyPair' was added

Type 'DisassociateScalingGroupsWithKeyPair' was added
}

input QuotaScopeInput {
Expand Down
24 changes: 24 additions & 0 deletions src/ai/backend/manager/models/gql.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,19 @@
)
from .routing import Routing, RoutingList
from .scaling_group import (
AssociateScalingGroupsWithDomain,
AssociateScalingGroupsWithKeyPair,
AssociateScalingGroupsWithUserGroup,
AssociateScalingGroupWithDomain,
AssociateScalingGroupWithKeyPair,
AssociateScalingGroupWithUserGroup,
CreateScalingGroup,
DeleteScalingGroup,
DisassociateAllScalingGroupsWithDomain,
DisassociateAllScalingGroupsWithGroup,
DisassociateScalingGroupsWithDomain,
DisassociateScalingGroupsWithKeyPair,
DisassociateScalingGroupsWithUserGroup,
DisassociateScalingGroupWithDomain,
DisassociateScalingGroupWithKeyPair,
DisassociateScalingGroupWithUserGroup,
Expand Down Expand Up @@ -241,11 +247,29 @@ class Mutations(graphene.ObjectType):
modify_scaling_group = ModifyScalingGroup.Field()
delete_scaling_group = DeleteScalingGroup.Field()
associate_scaling_group_with_domain = AssociateScalingGroupWithDomain.Field()
associate_scaling_groups_with_domain = AssociateScalingGroupsWithDomain.Field(
description="Added in 24.03.9"
)
associate_scaling_group_with_user_group = AssociateScalingGroupWithUserGroup.Field()
associate_scaling_groups_with_user_group = AssociateScalingGroupsWithUserGroup.Field(
description="Added in 24.03.9"
)
associate_scaling_group_with_keypair = AssociateScalingGroupWithKeyPair.Field()
associate_scaling_groups_with_keypair = AssociateScalingGroupsWithKeyPair.Field(
description="Added in 24.03.9"
)
disassociate_scaling_group_with_domain = DisassociateScalingGroupWithDomain.Field()
disassociate_scaling_groups_with_domain = DisassociateScalingGroupsWithDomain.Field(
description="Added in 24.03.9"
)
disassociate_scaling_group_with_user_group = DisassociateScalingGroupWithUserGroup.Field()
disassociate_scaling_groups_with_user_group = DisassociateScalingGroupsWithUserGroup.Field(
description="Added in 24.03.9"
)
disassociate_scaling_group_with_keypair = DisassociateScalingGroupWithKeyPair.Field()
disassociate_scaling_groups_with_keypair = DisassociateScalingGroupsWithKeyPair.Field(
description="Added in 24.03.9"
)
disassociate_all_scaling_groups_with_domain = DisassociateAllScalingGroupsWithDomain.Field()
disassociate_all_scaling_groups_with_group = DisassociateAllScalingGroupsWithGroup.Field()

Expand Down
161 changes: 161 additions & 0 deletions src/ai/backend/manager/models/scaling_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,32 @@ async def mutate(
return await simple_db_mutate(cls, info.context, insert_query)


class AssociateScalingGroupsWithDomain(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
domain = graphene.String(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
domain: str,
) -> AssociateScalingGroupsWithDomain:
insert_query = sa.insert(sgroups_for_domains).values([
{"scaling_group": scaling_group, "domain": domain} for scaling_group in scaling_groups
])
return await simple_db_mutate(cls, info.context, insert_query)


class DisassociateScalingGroupWithDomain(graphene.Mutation):
allowed_roles = (UserRole.SUPERADMIN,)

Expand All @@ -652,6 +678,33 @@ async def mutate(
return await simple_db_mutate(cls, info.context, delete_query)


class DisassociateScalingGroupsWithDomain(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
domain = graphene.String(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
domain: str,
) -> DisassociateScalingGroupsWithDomain:
delete_query = sa.delete(sgroups_for_domains).where(
(sgroups_for_domains.c.scaling_group.in_(scaling_groups))
& (sgroups_for_domains.c.domain == domain),
)
return await simple_db_mutate(cls, info.context, delete_query)


class DisassociateAllScalingGroupsWithDomain(graphene.Mutation):
allowed_roles = (UserRole.SUPERADMIN,)

Expand Down Expand Up @@ -697,6 +750,33 @@ async def mutate(
return await simple_db_mutate(cls, info.context, insert_query)


class AssociateScalingGroupsWithUserGroup(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
user_group = graphene.UUID(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
user_group: uuid.UUID,
) -> AssociateScalingGroupsWithUserGroup:
insert_query = sa.insert(sgroups_for_groups).values([
{"scaling_group": scaling_group, "group": user_group}
for scaling_group in scaling_groups
])
return await simple_db_mutate(cls, info.context, insert_query)


class DisassociateScalingGroupWithUserGroup(graphene.Mutation):
allowed_roles = (UserRole.SUPERADMIN,)

Expand All @@ -722,6 +802,33 @@ async def mutate(
return await simple_db_mutate(cls, info.context, delete_query)


class DisassociateScalingGroupsWithUserGroup(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
user_group = graphene.UUID(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
user_group: uuid.UUID,
) -> DisassociateScalingGroupsWithUserGroup:
delete_query = sa.delete(sgroups_for_groups).where(
(sgroups_for_groups.c.scaling_group.in_(scaling_groups))
& (sgroups_for_groups.c.group == user_group),
)
return await simple_db_mutate(cls, info.context, delete_query)


class DisassociateAllScalingGroupsWithGroup(graphene.Mutation):
allowed_roles = (UserRole.SUPERADMIN,)

Expand Down Expand Up @@ -767,6 +874,33 @@ async def mutate(
return await simple_db_mutate(cls, info.context, insert_query)


class AssociateScalingGroupsWithKeyPair(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
access_key = graphene.String(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
access_key: str,
) -> AssociateScalingGroupsWithKeyPair:
insert_query = sa.insert(sgroups_for_keypairs).values([
{"scaling_group": scaling_group, "access_key": access_key}
for scaling_group in scaling_groups
])
return await simple_db_mutate(cls, info.context, insert_query)


class DisassociateScalingGroupWithKeyPair(graphene.Mutation):
allowed_roles = (UserRole.SUPERADMIN,)

Expand All @@ -790,3 +924,30 @@ async def mutate(
& (sgroups_for_keypairs.c.access_key == access_key),
)
return await simple_db_mutate(cls, info.context, delete_query)


class DisassociateScalingGroupsWithKeyPair(graphene.Mutation):
"""Added in 24.03.9."""

allowed_roles = (UserRole.SUPERADMIN,)

class Arguments:
scaling_groups = graphene.List(graphene.String, required=True)
access_key = graphene.String(required=True)

ok = graphene.Boolean()
msg = graphene.String()

@classmethod
async def mutate(
cls,
root,
info: graphene.ResolveInfo,
scaling_groups: Sequence[str],
access_key: str,
) -> DisassociateScalingGroupsWithKeyPair:
delete_query = sa.delete(sgroups_for_keypairs).where(
(sgroups_for_keypairs.c.scaling_group.in_(scaling_groups))
& (sgroups_for_keypairs.c.access_key == access_key),
)
return await simple_db_mutate(cls, info.context, delete_query)
Loading