From b73a57dd0dd2f75f9ad3dc7c71e088f5f7c19bab Mon Sep 17 00:00:00 2001 From: Dmitriy Smirnov Date: Mon, 22 Jul 2024 13:35:59 +0300 Subject: [PATCH] Implement functionality of the API method `cloudapi/account/listDisks` --- CHANGELOG.md | 2 +- library/decort_account_info.py | 88 +++++++++++++++++++++++++++++++++- module_utils/decort_utils.py | 75 +++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e370e96..a540acb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ | Идентификатор
задачи | Описание | | --- | --- | -| BANS-462
BANS-472
BANS-475
BANS-476
BANS-477 | Добавлен новый модуль **decort_account_info**, который позволяет получить следующую информацию об аккаунте:
• основная информация
• используемые и зарезервированные ресурсы
• ресурсные группы
• виртуальные машины
• внутренние сети | +| BANS-462
BANS-472
BANS-475
BANS-476
BANS-477
BANS-478 | Добавлен новый модуль **decort_account_info**, который позволяет получить следующую информацию об аккаунте:
• основная информация
• используемые и зарезервированные ресурсы
• ресурсные группы
• виртуальные машины
• внутренние сети
• диски | ## Исправления diff --git a/library/decort_account_info.py b/library/decort_account_info.py index e49159f..da2460e 100644 --- a/library/decort_account_info.py +++ b/library/decort_account_info.py @@ -32,11 +32,12 @@ class DecortAccountInfo(DecortController): account_name=amodule.params['name'], account_id=amodule.params['id'], computes_args=self.mapped_computes_args, + disks_args=self.mapped_disks_args, resource_consumption=amodule.params['resource_consumption'], resource_groups_args=self.mapped_rg_args, vinses_args=self.mapped_vinses_args, - fail_if_not_found=True - ) + fail_if_not_found=True, + ) @property def amodule_init_args(self) -> dict: @@ -123,6 +124,57 @@ class DecortAccountInfo(DecortController): type='str', required=True ), + disks=dict( + type='dict', + options=dict( + filter=dict( + type='dict', + options=dict( + id=dict( + type='int', + ), + name=dict( + type='str', + ), + size=dict( + type='int', + ), + type=dict( + type='str', + choices=['B', 'D'], + ), + ), + ), + pagination=dict( + type='dict', + options=dict( + number=dict( + type='int', + default=1, + ), + size=dict( + type='int', + required=True, + ), + ), + ), + sorting=dict( + type='dict', + options=dict( + asc=dict( + type='bool', + default=True, + ), + field=dict( + type='str', + choices=\ + self.FIELDS_FOR_SORTING_ACCOUNT_DISK_LIST, + required=True, + ), + ), + ), + ), + ), id=dict( type='int', ), @@ -303,6 +355,38 @@ class DecortAccountInfo(DecortController): return mapped_args + @property + def mapped_disks_args(self) -> None | dict: + """ + Map the module argument `disks` to + arguments dictionary for the method + `DecortController.account_disks` + (excluding for `account_id`). + """ + + input_args = self.amodule.params['disks'] + if not input_args: + return input_args + + mapped_args = {} + if input_args['filter']: + mapped_args['disk_id'] = input_args['filter']['id'] + mapped_args['disk_name'] = input_args['filter']['name'] + mapped_args['disk_size'] = input_args['filter']['size'] + mapped_args['disk_type'] = input_args['filter']['type'] + if input_args['pagination']: + mapped_args['page_number'] =\ + input_args['pagination']['number'] + mapped_args['page_size'] =\ + input_args['pagination']['size'] + if input_args['sorting']: + mapped_args['sort_by_asc'] =\ + input_args['sorting']['asc'] + mapped_args['sort_by_field'] =\ + input_args['sorting']['field'] + + return mapped_args + @property def mapped_rg_args(self) -> None | dict: """ diff --git a/module_utils/decort_utils.py b/module_utils/decort_utils.py index a1876e5..ebbab55 100644 --- a/module_utils/decort_utils.py +++ b/module_utils/decort_utils.py @@ -63,6 +63,16 @@ class DecortController(object): 'vinsConnected', ] + FIELDS_FOR_SORTING_ACCOUNT_DISK_LIST = [ + 'id', + 'name', + 'pool', + 'sepId', + 'shareable', + 'sizeMax', + 'type', + ] + FIELDS_FOR_SORTING_ACCOUNT_RG_LIST = [ 'createdBy', 'createdTime', @@ -2045,6 +2055,7 @@ class DecortController(object): account_id=0, account_name: str = '', computes_args: None | dict = None, + disks_args: None | dict = None, fail_if_not_found=False, resource_consumption=False, resource_groups_args: None | dict = None, @@ -2064,6 +2075,12 @@ class DecortController(object): and `**computes_args`. Result of the call will be added to account info dict (key `computes`). + @param (None | dict) disks_args: If dict is + specified, then the method `self.account_disks` + will be called passing founded account ID + and `**disks_args`. Result of the call will + be added to account info dict (key `disks`). + @param (bool) fail_if_not_found: If `True` is specified, then the method `self.amodule.fail_json(**self.result)` will be called if account is not found. @@ -2182,6 +2199,13 @@ class DecortController(object): **vinses_args ) + if disks_args is not None: + account_details['disks'] =\ + self.account_disks( + account_id=account_details['id'], + **disks_args + ) + return account_details['id'], account_details @waypoint @@ -2406,6 +2430,57 @@ class DecortController(object): return vinses + @waypoint + def account_disks( + self, + account_id: int, + disk_id: None | int = None, + disk_name: None | str = None, + disk_size: None | int = None, + disk_type: None | str = None, + page_number: int = 1, + page_size: None | int = None, + sort_by_asc=True, + sort_by_field: None | str = None, + ) -> list[dict]: + """ + Implementation of functionality of the API method + `/cloudapi/account/listDisks`. + """ + + sort_by = None + if sort_by_field: + if not sort_by_field in self.FIELDS_FOR_SORTING_ACCOUNT_DISK_LIST: + self.result['msg'] = ( + f'{sort_by_field} is not valid field for sorting' + f' account disks list.' + ) + self.amodule.fail_json(**self.result) + + sort_by_prefix = '+' if sort_by_asc else '-' + sort_by = f'{sort_by_prefix}{sort_by_field}' + + api_params = { + 'accountId': account_id, + 'diskId': disk_id, + 'diskMaxSize': disk_size, + 'name': disk_name, + 'page': page_number if page_size else None, + 'size': page_size, + 'sortBy': sort_by, + 'type': disk_type, + } + + api_resp = self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/account/listDisks', + arg_params=api_params, + ) + + disks = api_resp.json()['data'] + + return disks + ################################### # GPU resource manipulation methods ###################################