Source code for ai.backend.client.scaling_group

import json
import textwrap
from typing import Iterable, Mapping, Sequence

from .base import api_function
from .request import Request

__all__ = (
    'ScalingGroup',
)


[docs]class ScalingGroup: ''' Provides getting scaling-group information required for the current user. The scaling-group is an opaque server-side configuration which splits the whole cluster into several partitions, so that server administrators can apply different auto-scaling policies and operation standards to each partition of agent sets. ''' session = None '''The client session instance that this function class is bound to.''' def __init__(self, name: str): self.name = name
[docs] @api_function @classmethod async def list_available(cls, group: str): ''' List available scaling groups for the current user, considering the user, the user's domain, and the designated user group. ''' rqst = Request(cls.session, 'GET', '/scaling-groups', params={'group': group}) async with rqst.fetch() as resp: return await resp.json()
[docs] @api_function @classmethod async def list(cls, fields: Iterable[str] = None) -> Sequence[dict]: ''' List available scaling groups for the current user, considering the user, the user's domain, and the designated user group. ''' if fields is None: fields = ('name', 'description', 'is_active', 'created_at', 'driver', 'driver_opts', 'scheduler', 'scheduler_opts',) query = textwrap.dedent('''\ query($is_active: Boolean) { scaling_groups(is_active: $is_active) { $fields } } ''') query = query.replace('$fields', ' '.join(fields)) variables = {'is_active': None} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables }) async with rqst.fetch() as resp: data = await resp.json() return data['scaling_groups']
[docs] @api_function @classmethod async def detail(cls, name: str, fields: Iterable[str] = None) -> Sequence[dict]: ''' Fetch information of a scaling group by name. :param name: Name of the scaling group. :param fields: Additional per-scaling-group query fields. ''' if fields is None: fields = ('name', 'description', 'is_active', 'created_at', 'driver', 'driver_opts', 'scheduler', 'scheduler_opts',) query = textwrap.dedent('''\ query($name: String) { scaling_group(name: $name) {$fields} } ''') query = query.replace('$fields', ' '.join(fields)) variables = {'name': name} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['scaling_group']
[docs] @api_function @classmethod async def create(cls, name: str, description: str = '', is_active: bool = True, driver: str = None, driver_opts: Mapping[str, str] = None, scheduler: str = None, scheduler_opts: Mapping[str, str] = None, fields: Iterable[str] = None) -> dict: ''' Creates a new scaling group with the given options. ''' if fields is None: fields = ('name',) query = textwrap.dedent('''\ mutation($name: String!, $input: ScalingGroupInput!) { create_scaling_group(name: $name, props: $input) { ok msg scaling_group {$fields} } } ''') query = query.replace('$fields', ' '.join(fields)) variables = { 'name': name, 'input': { 'description': description, 'is_active': is_active, 'driver': driver, 'driver_opts': json.dumps(driver_opts), 'scheduler': scheduler, 'scheduler_opts': json.dumps(scheduler_opts), }, } rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['create_scaling_group']
[docs] @api_function @classmethod async def update(cls, name: str, description: str = '', is_active: bool = True, driver: str = None, driver_opts: Mapping[str, str] = None, scheduler: str = None, scheduler_opts: Mapping[str, str] = None, fields: Iterable[str] = None) -> dict: ''' Update existing scaling group. ''' if fields is None: fields = ('name',) query = textwrap.dedent('''\ mutation($name: String!, $input: ModifyScalingGroupInput!) { modify_scaling_group(name: $name, props: $input) { ok msg } } ''') query = query.replace('$fields', ' '.join(fields)) variables = { 'name': name, 'input': { 'description': description, 'is_active': is_active, 'driver': driver, 'driver_opts': json.dumps(driver_opts), 'scheduler': scheduler, 'scheduler_opts': json.dumps(scheduler_opts), }, } rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['modify_scaling_group']
[docs] @api_function @classmethod async def delete(cls, name: str): ''' Deletes an existing scaling group. ''' query = textwrap.dedent('''\ mutation($name: String!) { delete_scaling_group(name: $name) { ok msg } } ''') variables = {'name': name} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['delete_scaling_group']
[docs] @api_function @classmethod async def associate_domain(cls, scaling_group: str, domain: str): ''' Associate scaling_group with domain. :param scaling_group: The name of a scaling group. :param domain: The name of a domain. ''' query = textwrap.dedent('''\ mutation($scaling_group: String!, $domain: String!) { associate_scaling_group_with_domain( scaling_group: $scaling_group, domain: $domain) { ok msg } } ''') variables = {'scaling_group': scaling_group, 'domain': domain} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['associate_scaling_group_with_domain']
[docs] @api_function @classmethod async def dissociate_domain(cls, scaling_group: str, domain: str): ''' Dissociate scaling_group from domain. :param scaling_group: The name of a scaling group. :param domain: The name of a domain. ''' query = textwrap.dedent('''\ mutation($scaling_group: String!, $domain: String!) { disassociate_scaling_group_with_domain( scaling_group: $scaling_group, domain: $domain) { ok msg } } ''') variables = {'scaling_group': scaling_group, 'domain': domain} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['disassociate_scaling_group_with_domain']
[docs] @api_function @classmethod async def dissociate_all_domain(cls, domain: str): ''' Dissociate all scaling_groups from domain. :param domain: The name of a domain. ''' query = textwrap.dedent('''\ mutation($domain: String!) { disassociate_all_scaling_groups_with_domain(domain: $domain) { ok msg } } ''') variables = {'domain': domain} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['disassociate_all_scaling_groups_with_domain']
[docs] @api_function @classmethod async def associate_group(cls, scaling_group: str, group_id: str): ''' Associate scaling_group with group. :param scaling_group: The name of a scaling group. :param group_id: The ID of a group. ''' query = textwrap.dedent('''\ mutation($scaling_group: String!, $user_group: String!) { associate_scaling_group_with_user_group( scaling_group: $scaling_group, user_group: $user_group) { ok msg } } ''') variables = {'scaling_group': scaling_group, 'user_group': group_id} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['associate_scaling_group_with_user_group']
[docs] @api_function @classmethod async def dissociate_group(cls, scaling_group: str, group_id: str): ''' Dissociate scaling_group from group. :param scaling_group: The name of a scaling group. :param group_id: The ID of a group. ''' query = textwrap.dedent('''\ mutation($scaling_group: String!, $user_group: String!) { disassociate_scaling_group_with_user_group( scaling_group: $scaling_group, user_group: $user_group) { ok msg } } ''') variables = {'scaling_group': scaling_group, 'user_group': group_id} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['disassociate_scaling_group_with_user_group']
[docs] @api_function @classmethod async def dissociate_all_group(cls, group_id: str): ''' Dissociate all scaling_groups from group. :param group_id: The ID of a group. ''' query = textwrap.dedent('''\ mutation($group_id: String!) { disassociate_all_scaling_groups_with_group(user_group: $group_id) { ok msg } } ''') variables = {'group_id': group_id} rqst = Request(cls.session, 'POST', '/admin/graphql') rqst.set_json({ 'query': query, 'variables': variables, }) async with rqst.fetch() as resp: data = await resp.json() return data['disassociate_all_scaling_groups_with_group']