diff --git a/CHANGELOG.md b/CHANGELOG.md
index 647739d..e370e96 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,7 @@
| Идентификатор
задачи | Описание |
| --- | --- |
-| BANS-462
BANS-472
BANS-475
BANS-476 | Добавлен новый модуль **decort_account_info**, который позволяет получить следующую информацию об аккаунте:
• основная информация
• используемые и зарезервированные ресурсы
• ресурсные группы
• виртуальные машины |
+| BANS-462
BANS-472
BANS-475
BANS-476
BANS-477 | Добавлен новый модуль **decort_account_info**, который позволяет получить следующую информацию об аккаунте:
• основная информация
• используемые и зарезервированные ресурсы
• ресурсные группы
• виртуальные машины
• внутренние сети |
## Исправления
diff --git a/library/decort_account_info.py b/library/decort_account_info.py
index a63a6e5..78cc0fb 100644
--- a/library/decort_account_info.py
+++ b/library/decort_account_info.py
@@ -34,6 +34,7 @@ class DecortAccountInfo(DecortController):
computes_params=self.mapped_computes_params,
resource_consumption=amodule.params['resource_consumption'],
resource_groups_params=self.mapped_rg_params,
+ vinses_params=self.mapped_vinses_params,
fail_if_not_found=True
)
@@ -199,6 +200,56 @@ class DecortAccountInfo(DecortController):
type='bool',
default=True
),
+ vinses=dict(
+ type='dict',
+ options=dict(
+ filter=dict(
+ type='dict',
+ options=dict(
+ ext_ip=dict(
+ type='int',
+ ),
+ id=dict(
+ type='int',
+ ),
+ name=dict(
+ type='str'
+ ),
+ rg_id=dict(
+ type='int',
+ ),
+ ),
+ ),
+ 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_VINS_LIST,
+ required=True,
+ ),
+ ),
+ ),
+ ),
+ ),
),
mutually_exclusive=[
('id', 'name')
@@ -275,6 +326,31 @@ class DecortAccountInfo(DecortController):
return mapped_params
+ @property
+ def mapped_vinses_params(self) -> None | dict:
+ input_params = self.amodule.params['vinses']
+ if not input_params:
+ return input_params
+
+ mapped_params = {}
+ if input_params['filter']:
+ mapped_params['vins_id'] = input_params['filter']['id']
+ mapped_params['vins_name'] = input_params['filter']['name']
+ mapped_params['ext_ip'] = input_params['filter']['ext_ip']
+ mapped_params['rg_id'] = input_params['filter']['rg_id']
+ if input_params['pagination']:
+ mapped_params['page_number'] =\
+ input_params['pagination']['number']
+ mapped_params['page_size'] =\
+ input_params['pagination']['size']
+ if input_params['sorting']:
+ mapped_params['sort_by_asc'] =\
+ input_params['sorting']['asc']
+ mapped_params['sort_by_field'] =\
+ input_params['sorting']['field']
+
+ return mapped_params
+
def exit(self):
self.result['facts'] = self.facts
self.amodule.exit_json(**self.result)
diff --git a/module_utils/decort_utils.py b/module_utils/decort_utils.py
index 15845cc..f15714f 100644
--- a/module_utils/decort_utils.py
+++ b/module_utils/decort_utils.py
@@ -77,6 +77,26 @@ class DecortController(object):
'vinses',
]
+ FIELDS_FOR_SORTING_ACCOUNT_VINS_LIST = [
+ 'computes',
+ 'createdBy',
+ 'createdTime',
+ 'deletedBy',
+ 'deletedTime',
+ 'externalIP',
+ 'extnetId',
+ 'freeIPs',
+ 'id',
+ 'name',
+ 'network',
+ 'priVnfDevId',
+ 'rgId',
+ 'rgName',
+ 'status',
+ 'updatedBy',
+ 'updatedTime',
+ ]
+
COMPUTE_TECH_STATUSES = [
'BACKUP_RUNNING',
'BACKUP_STOPPED',
@@ -2008,6 +2028,7 @@ class DecortController(object):
resource_consumption=False,
resource_groups_params: None | dict = None,
computes_params: None | dict = None,
+ vinses_params: None | dict = None,
fail_if_not_found=False):
"""
Find account specified by account ID or name and return
@@ -2036,6 +2057,12 @@ class DecortController(object):
and `**computes_params`. Result of the call will
be added to account info dict (key `computes`).
+ @param (None | dict) vinses_params: If dict is
+ specified, then the method `account_vinses`
+ will be called passing founded account ID
+ and `**vinses_params`. Result of the call will
+ be added to account info dict (key `vinses`).
+
@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.
@@ -2091,6 +2118,7 @@ class DecortController(object):
return 0, None
account_details['computes_amount'] = account_details.pop('computes')
+ account_details['vinses_amount'] = account_details.pop('vinses')
account_details['createdTime_readable'] = self.sec_to_dt_str(
account_details['createdTime']
@@ -2129,6 +2157,12 @@ class DecortController(object):
**computes_params
)
+ if vinses_params is not None:
+ account_details['vinses'] = self.account_vinses(
+ account_id=account_details['id'],
+ **vinses_params
+ )
+
return account_details['id'], account_details
@waypoint
@@ -2277,6 +2311,57 @@ class DecortController(object):
return computes
+ @waypoint
+ def account_vinses(
+ self,
+ account_id: int,
+ ext_ip: None | str = None,
+ page_number: int = 1,
+ page_size: None | int = None,
+ rg_id: None | int = None,
+ sort_by_asc=True,
+ sort_by_field: None | str = None,
+ vins_id: None | int = None,
+ vins_name: None | str = None,
+ ) -> list[dict]:
+ sort_by = None
+ if sort_by_field:
+ if not sort_by_field in self.FIELDS_FOR_SORTING_ACCOUNT_VINS_LIST:
+ self.result['msg'] = (
+ f'{sort_by_field} is not valid field for sorting'
+ f' account vins 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,
+ 'extIp': ext_ip,
+ 'name': vins_name,
+ 'page': page_number if page_size else None,
+ 'rgId': rg_id,
+ 'size': page_size,
+ 'sortBy': sort_by,
+ 'vinsId': vins_id,
+ }
+
+ api_resp = self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/account/listVins',
+ arg_params=api_params,
+ )
+
+ vinses = api_resp.json()['data']
+
+ for v in vinses:
+ v['createdTime_readable'] = self.sec_to_dt_str(v['createdTime'])
+ v['deletedTime_readable'] = self.sec_to_dt_str(v['deletedTime'])
+ v['updatedTime_readable'] = self.sec_to_dt_str(v['updatedTime'])
+
+ return vinses
+
###################################
# GPU resource manipulation methods
###################################