diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7d22dae..32d5481 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,19 +1,47 @@
-# Список изменений в версии 7.1.0
+# Список изменений в версии 7.2.0
## Добавлено
+### Модуль decort_k8s
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-628 | Добавлен параметр `lb_sysctl` для установки параметров конфигурации sysctl балансировщика нагрузки. |
+| BANS-701 | Модуль теперь позволяет задать параметр `master_chipset` для существующего кластера, если значение параметра соответствует чипсету master-узлов. |
+
+### Модуль decort_osimage
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-308 | Добавлена возможность удаления виртуальных образов. |
+
+### Модуль decort_lb
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-627 | Добавлен параметр `sysctl`. |
+
### Модуль decort_kvmvm
| Идентификатор
задачи | Описание |
| --- | --- |
-| BANS-650 | Добавлена возможность откатить ВМ к состоянию снимка с помощью нового параметра `rollback_to`. Добавлено возвращаемое значение `snapshots`. |
-| BANS-675 | Для параметра `chipset` добавлено значение по умолчанию `i440fx` при создании ВМ. |
-| BANS-692 | Добавлен параметр `preferred_cpu_cores` и возвращаемое значение `preferred_cpu_cores`. |
-| BANS-694 | Добавлена проверка параметра `hp_backed` при подключении ВМ к `DPDK` сети . |
+| BANS-651 | Добавлен параметр `get_console_url` для получения ссылки на консоль ВМ. |
+| BANS-652 | Добавлены параметры `disks`, `boot.disk_id` и `boot.disk_size` для управления дисками ВМ. |
+| BANS-629 | Добавлен параметр `clone_from` для создания ВМ путём клонирования другой ВМ. |
+
+### Модуль decort_rg
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-424 | Добавлена возможность изменения описания ресурсной группы, а также добавлено возвращаемое значение `description`. |
## Удалено
+### Модуль decort_disk
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-657 | Удалён параметр `type`. |
-## Исправлено
### Модуль decort_kvmvm
| Идентификатор
задачи | Описание |
| --- | --- |
-| BANS-679 | Модуль завершал свою работу ошибкой проверки входных параметров при указании целевого состояния `state: absent` и имени ВМ, которой уже не существует. |
-| BANS-707 | При попытке для остановленной ВМ задать новые значения для параметров `chipset`, `cpu_pin`, `hp_backed` или `numa_affinity`, модуль требовал задать для параметра `state` значение, соответствующее остановленной ВМ. |
+| BANS-652 | Удален параметр `data_disks` в связи с изменением логики (см. параметр `disks`). Удален параметр `boot_disk` в связи с переименованием в `boot.disk_size`. |
+
+## Исправлено
+### Модуль decort_k8s
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BANS-661 | При создании кластера модуль возвращал информацию только о первой группе worker-узлов. |
diff --git a/README.md b/README.md
index 4dc2082..8629229 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
| Версия платформы | Версия модулей Ansible |
|:----------------:|:--------------------------:|
-| 4.2.0 | 7.0.x, 7.1.x |
+| 4.2.0 | 7.0.x, 7.1.x, 7.2.x |
| 4.1.0 | 6.0.x, 6.1.x |
| 4.0.0 | 5.6.x, 5.5.x, 5.4.x, 5.3.x |
| 3.8.8, 3.8.9 | 5.2.6 |
diff --git a/library/decort_disk.py b/library/decort_disk.py
index 775dea1..3f1bc07 100644
--- a/library/decort_disk.py
+++ b/library/decort_disk.py
@@ -73,7 +73,6 @@ class decort_disk(DecortController):
name = self.amodule.params['name'],
description=self.amodule.params['description'],
size=self.amodule.params['size'],
- type=self.amodule.params['type'],
iops=self.amodule.params['iops'],
sep_id=self.amodule.params['sep_id'],
pool=self.amodule.params['pool'],
@@ -83,7 +82,7 @@ class decort_disk(DecortController):
self.disk_limitIO(disk_id=self.disk_id,
limits=self.amodule.params['limitIO'])
#set share status
- if self.amodule.params['shareable'] and self.amodule.params['type'] == "D":
+ if self.amodule.params['shareable']:
self.disk_share(self.disk_id,self.amodule.params['shareable'])
return
@@ -114,8 +113,7 @@ class decort_disk(DecortController):
self.disk_limitIO(self.disk_id,self.amodule.params['limitIO'])
#share check/update
#raise Exception(self.amodule.params['shareable'])
- if self.amodule.params['shareable'] != self.disk_info['shareable'] and \
- self.amodule.params['type'] == "D":
+ if self.amodule.params['shareable'] != self.disk_info['shareable']:
self.disk_share(self.disk_id,self.amodule.params['shareable'])
return
@@ -220,15 +218,6 @@ class decort_disk(DecortController):
size=dict(
type='int',
),
- type=dict(
- type='str',
- default='D',
- choices=[
- 'B',
- 'D',
- 'T',
- ],
- ),
iops=dict(
type='int',
default=2000,
diff --git a/library/decort_k8s.py b/library/decort_k8s.py
index b4cd6e6..ec3b0b7 100644
--- a/library/decort_k8s.py
+++ b/library/decort_k8s.py
@@ -82,6 +82,20 @@ class decort_k8s(DecortController):
self.acc_id = self.k8s_info['accountId']
# check workers and groups for add or remove?
+ aparam_sysctl = arg_amodule.params['lb_sysctl']
+ if aparam_sysctl is not None:
+ _, lb_info = self._lb_get_by_id(lb_id=self.k8s_info['lbId'])
+ sysctl_with_str_values = {
+ k: str(v) for k, v in aparam_sysctl.items()
+ }
+ if sysctl_with_str_values != lb_info['sysctlParams']:
+ self.message(
+ 'Check for parameter "lb_sysctl" failed: '
+ 'cannot change lb_sysctl for an existing cluster '
+ 'load balancer.'
+ )
+ self.exit(fail=True)
+
if not self.k8s_id:
validated_k8ci_id = self.k8s_k8ci_find(arg_amodule.params['k8ci_id'])
if not validated_k8ci_id:
@@ -96,6 +110,17 @@ class decort_k8s(DecortController):
self.result['msg'] = "At least one worker group must be present"
self.amodule.fail_json(**self.result)
+ if (
+ arg_amodule.params['lb_sysctl'] is not None
+ and not arg_amodule.params['with_lb']
+ ):
+ self.message(
+ 'Check for parameter "lb_sysctl" failed: '
+ '"lb_sysctl" can only be set if the parameter "with_lb" '
+ 'is set to True.'
+ )
+ self.exit(fail=True)
+
return
def package_facts(self,check_mode=False):
@@ -129,6 +154,7 @@ class decort_k8s(DecortController):
ret_dict['account_id'] = self.acc_id
ret_dict['k8s_Masters'] = self.k8s_info['k8sGroups']['masters']
ret_dict['k8s_Workers'] = self.k8s_info['k8sGroups']['workers']
+ ret_dict['lb_id'] = self.k8s_info['lbId']
return ret_dict
@@ -200,6 +226,7 @@ class decort_k8s(DecortController):
self.amodule.params['description'],
self.amodule.params['extnet_only'],
master_chipset,
+ lb_sysctl=self.amodule.params['lb_sysctl'],
)
if not k8s_id:
@@ -216,10 +243,12 @@ class decort_k8s(DecortController):
if self.k8s_id:
self.k8s_should_exist = True
- self.k8s_workers_modify(
- arg_k8swg=self.k8s_info,
- arg_modwg=target_wgs,
- )
+ if len(target_wgs) > 1:
+ self.k8s_workers_modify(
+ arg_k8swg=self.k8s_info,
+ arg_modwg=target_wgs,
+ )
+ self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id)
return
def destroy(self):
@@ -230,11 +259,21 @@ class decort_k8s(DecortController):
def action(self, disared_state, started=True, preupdate: bool = False):
if self.amodule.params['master_chipset'] is not None:
- self.result['msg'] = (
- '"master_chipset" parameter must not be specified '
- 'when modifying an existing K8s cluster.'
- )
- self.exit(fail=True)
+ for master_node in self.k8s_info['k8sGroups']['masters'][
+ 'detailedInfo'
+ ]:
+ _, master_node_info, _ = self._compute_get_by_id(
+ comp_id=master_node['id']
+ )
+ if (
+ master_node_info['chipset']
+ != self.amodule.params['master_chipset']
+ ):
+ self.result['msg'] = (
+ '"master_chipset" cannot be changed '
+ 'for existing K8s cluster.'
+ )
+ self.exit(fail=True)
if preupdate:
# K8s info updating
@@ -434,6 +473,9 @@ class decort_k8s(DecortController):
type='str',
choices=['Q35', 'i440fx'],
),
+ lb_sysctl=dict(
+ type='dict',
+ ),
),
supports_check_mode=True,
required_one_of=[
diff --git a/library/decort_kvmvm.py b/library/decort_kvmvm.py
index 844710e..771c8b0 100644
--- a/library/decort_kvmvm.py
+++ b/library/decort_kvmvm.py
@@ -37,15 +37,62 @@ class decort_kvmvm(DecortController):
validated_rg_id = 0
validated_rg_facts = None
+ self.vm_to_clone_id = 0
+ self.vm_to_clone_info = None
+
+ if arg_amodule.params['clone_from'] is not None:
+ self.vm_to_clone_id, self.vm_to_clone_info, _ = (
+ self._compute_get_by_id(
+ comp_id=self.aparams['clone_from']['id'],
+ )
+ )
+ if not self.vm_to_clone_id:
+ self.message(
+ f'Check for parameter "clone_from.id" failed: '
+ f'VM ID {self.aparams["clone_from"]["id"]} does not exist.'
+ )
+ self.exit(fail=True)
+ elif self.vm_to_clone_info['status'] in ('DESTROYED', 'DELETED'):
+ self.message(
+ f'Check for parameter "clone_from.id" failed: '
+ f'VM ID {self.aparams["clone_from"]["id"]} is in '
+ f'{self.vm_to_clone_info["status"]} state and '
+ f'cannot be cloned.'
+ )
+ self.exit(fail=True)
+
+ clone_id, clone_dict, _ = self.compute_find(
+ comp_name=self.aparams['name'],
+ rg_id=self.vm_to_clone_info['rgId'],
+ )
+ self.check_amodule_args_for_clone(
+ clone_id=clone_id,
+ clone_dict=clone_dict,
+ )
+ self.check_amodule_args_for_change()
+
+ if not clone_id:
+ clone_id = self.clone()
+
+ self.comp_id, self.comp_info, self.rg_id = self._compute_get_by_id(
+ comp_id=clone_id,
+ need_custom_fields=True,
+ need_console_url=self.aparams['get_console_url'],
+ )
+
+ return
+
+ comp_id = arg_amodule.params['id']
+
# Analyze Compute name & ID, RG name & ID and build arguments to compute_find accordingly.
- if arg_amodule.params['name'] == "" and arg_amodule.params['id'] == 0:
+ if arg_amodule.params['name'] == "" and comp_id == 0:
self.result['failed'] = True
self.result['changed'] = False
self.result['msg'] = "Cannot manage Compute when its ID is 0 and name is empty."
self.fail_json(**self.result)
# fail the module - exit
- if not arg_amodule.params['id']: # manage Compute by name -> need RG identity
+ if not comp_id: # manage Compute by name -> need RG identity
if not arg_amodule.params['rg_id']: # RG ID is not set -> locate RG by name -> need account ID
validated_acc_id, _ = self.account_find(arg_amodule.params['account_name'],
arg_amodule.params['account_id'])
@@ -78,18 +125,21 @@ class decort_kvmvm(DecortController):
# because this Compute does not exist or something goes wrong in the upstream API
# We call compute_find with check_state=False as we also consider the case when a Compute
# specified by account / RG / compute name never existed and will be created for the first time.
- self.comp_id, self.comp_info, self.rg_id = self.compute_find(comp_id=arg_amodule.params['id'],
+ self.comp_id, self.comp_info, self.rg_id = self.compute_find(comp_id=comp_id,
comp_name=arg_amodule.params['name'],
rg_id=validated_rg_id,
check_state=False,
- need_custom_fields=True)
+ need_custom_fields=True,
+ need_console_url=self.aparams['get_console_url'])
if self.comp_id:
self.comp_should_exist = True
self.acc_id = self.comp_info['accountId']
+ self.check_amodule_args_for_change()
else:
if self.amodule.params['state'] != 'absent':
self.check_amodule_args_for_create()
+
return
def check_amodule_args(self):
@@ -215,7 +265,11 @@ class decort_kvmvm(DecortController):
# each of the following calls will abort if argument is missing
self.check_amodule_argument('cpu')
self.check_amodule_argument('ram')
- validated_bdisk_size = self.amodule.params['boot_disk'] or 0
+ validated_bdisk_size = 0
+ if self.amodule.params['boot'] is not None:
+ validated_bdisk_size = self.amodule.params['boot'].get(
+ 'disk_size', 0
+ )
image_id, image_facts = None, None
if self.aparam_image:
@@ -295,7 +349,7 @@ class decort_kvmvm(DecortController):
self.comp_id = self.kvmvm_provision(rg_id=self.rg_id,
comp_name=self.amodule.params['name'],
cpu=self.amodule.params['cpu'], ram=self.amodule.params['ram'],
- boot_disk=validated_bdisk_size,
+ boot_disk_size=validated_bdisk_size,
image_id=image_id,
description=self.amodule.params['description'],
userdata=cloud_init_params,
@@ -340,10 +394,10 @@ class decort_kvmvm(DecortController):
new_networks=self.amodule.params['networks'],
)
# Next manage data disks
- if self.amodule.params['data_disks'] is not None:
- self.compute_data_disks(
+ if self.amodule.params['disks'] is not None:
+ self.compute_disks(
comp_dict=self.comp_info,
- new_data_disks=self.amodule.params['data_disks'],
+ aparam_disks=self.amodule.params['disks'],
)
self.compute_affinity(self.comp_info,
@@ -372,6 +426,7 @@ class decort_kvmvm(DecortController):
_, self.comp_info, _ = self.compute_find(
comp_id=self.comp_id,
need_custom_fields=True,
+ need_console_url=self.amodule.params['get_console_url'],
)
if self.compute_update_args:
@@ -404,6 +459,7 @@ class decort_kvmvm(DecortController):
_, self.comp_info, _ = self.compute_find(
comp_id=self.comp_id,
need_custom_fields=True,
+ need_console_url=self.amodule.params['get_console_url'],
)
self.modify()
self.comp_should_exist = True
@@ -435,12 +491,27 @@ class decort_kvmvm(DecortController):
order_changing=self.aparams['network_order_changing'],
)
- boot_disk_new_size = self.amodule.params['boot_disk']
- if boot_disk_new_size:
- self.compute_bootdisk_size(self.comp_info, boot_disk_new_size)
+ if self.amodule.params['disks'] is not None:
+ self.compute_disks(
+ comp_dict=self.comp_info,
+ aparam_disks=self.amodule.params['disks'],
+ )
- if self.amodule.params['data_disks'] is not None:
- self.compute_data_disks(self.comp_info, self.amodule.params['data_disks'])
+ aparam_boot = self.amodule.params['boot']
+ if aparam_boot is not None:
+ aparam_disk_id = aparam_boot['disk_id']
+ if aparam_disk_id is not None:
+ for disk in self.comp_info['disks']:
+ if disk['id'] == aparam_disk_id and disk['type'] != 'B':
+ self.compute_boot_disk(
+ comp_id=self.comp_info['id'],
+ boot_disk=aparam_disk_id,
+ )
+ break
+
+ boot_disk_new_size = aparam_boot['disk_size']
+ if boot_disk_new_size:
+ self.compute_bootdisk_size(self.comp_info, boot_disk_new_size)
self.compute_resize(self.comp_info,
self.amodule.params['cpu'], self.amodule.params['ram'],
@@ -530,6 +601,8 @@ class decort_kvmvm(DecortController):
vnc_password="",
snapshots=[],
preferred_cpu_cores=[],
+ clones=[],
+ clone_reference=0,
)
if check_mode or self.comp_info is None:
@@ -600,6 +673,12 @@ class decort_kvmvm(DecortController):
ret_dict['preferred_cpu_cores'] = self.comp_info['preferredCpu']
+ if self.amodule.params['get_console_url']:
+ ret_dict['console_url'] = self.comp_info['console_url']
+
+ ret_dict['clones'] = self.comp_info['clones']
+ ret_dict['clone_reference'] = self.comp_info['cloneReference']
+
return ret_dict
def check_amodule_args_for_create(self):
@@ -641,11 +720,12 @@ class decort_kvmvm(DecortController):
if (
self.aparams['sep_id'] is not None
- and self.aparams['boot_disk'] is None
+ and self.aparams['boot'] is None
+ and self.aparams['boot']['disk_size'] is None
):
self.message(
'Check for parameter "sep_id" failed: '
- '"image_id" or "image_name" or "boot_disk" '
+ '"image_id" or "image_name" or "boot.disk_size" '
'must be specified to set sep_id.'
)
self.exit(fail=True)
@@ -680,8 +760,16 @@ class decort_kvmvm(DecortController):
description=dict(
type='str',
),
- boot_disk=dict(
- type='int',
+ boot=dict(
+ type='dict',
+ options=dict(
+ disk_id=dict(
+ type='int',
+ ),
+ disk_size=dict(
+ type='int',
+ ),
+ ),
),
sep_id=dict(
type='int',
@@ -696,8 +784,24 @@ class decort_kvmvm(DecortController):
cpu=dict(
type='int',
),
- data_disks=dict( # list of integer disk IDs
- type='list',
+ disks=dict(
+ type='dict',
+ options=dict(
+ mode=dict(
+ type='str',
+ choices=[
+ 'update',
+ 'detach',
+ 'delete',
+ 'match',
+ ],
+ default='update',
+ ),
+ ids=dict(
+ type='list',
+ elements='int',
+ ),
+ ),
),
id=dict(
type='int',
@@ -836,40 +940,135 @@ class decort_kvmvm(DecortController):
type='list',
elements='int',
),
+ get_console_url=dict(
+ type='bool',
+ default=False,
+ ),
+ clone_from=dict(
+ type='dict',
+ options=dict(
+ id=dict(
+ type='int',
+ required=True,
+ ),
+ force=dict(
+ type='bool',
+ default=False,
+ ),
+ snapshot=dict(
+ type='dict',
+ options=dict(
+ name=dict(
+ type='str',
+ ),
+ timestamp=dict(
+ type='int',
+ ),
+ datetime=dict(
+ type='str',
+ ),
+ ),
+ mutually_exclusive=[
+ ('name', 'timestamp', 'datetime'),
+ ],
+ ),
+ ),
+ ),
),
supports_check_mode=True,
required_one_of=[
('id', 'name'),
],
+ required_by={
+ 'clone_from': 'name',
+ },
)
def check_amodule_args_for_change(self):
check_errors = False
- new_boot_disk_size = self.amodule.params['boot_disk']
- if new_boot_disk_size is not None:
- for disk in self.comp_info['disks']:
- if disk['type'] == 'B':
- boot_disk_size = disk['sizeMax']
- break
- else:
- check_errors = True
- self.message(
- f'Can\'t set boot disk size for Compute '
- f'{self.comp_info["id"]}, because it doesn\'t have a '
- f'boot disk.'
- )
+ comp_info = self.vm_to_clone_info or self.comp_info
+ comp_id = comp_info['id']
+
+ aparam_boot = self.amodule.params['boot']
+ if aparam_boot is not None:
+ new_boot_disk_size = aparam_boot['disk_size']
+ if new_boot_disk_size is not None:
+ boot_disk_size = 0
+ for disk in self.comp_info['disks']:
+ if disk['type'] == 'B':
+ boot_disk_size = disk['sizeMax']
+ break
+ else:
+ if aparam_boot is None or aparam_boot['disk_id'] is None:
+ check_errors = True
+ self.message(
+ f'Can\'t set boot disk size for Compute '
+ f'{comp_id}, because it doesn\'t '
+ f'have a boot disk.'
+ )
+
+ if new_boot_disk_size < boot_disk_size:
+ check_errors = True
+ self.message(
+ f'New boot disk size {new_boot_disk_size} is less'
+ f' than current {boot_disk_size} for Compute ID '
+ f'{comp_id}'
+ )
- if new_boot_disk_size < boot_disk_size:
- check_errors = True
- self.message(
- f'New boot disk size {new_boot_disk_size} is less than '
- f'current {boot_disk_size} for Compute ID '
- f'{self.comp_info["id"]}'
- )
+ aparam_disks = self.amodule.params['disks']
+ aparam_boot_disk_id = aparam_boot['disk_id']
+ comp_disk_ids = [disk['id'] for disk in self.comp_info['disks']]
+ if aparam_disks is None:
+ if (
+ aparam_boot_disk_id is not None
+ and aparam_boot_disk_id not in comp_disk_ids
+ ):
+ check_errors = True
+ self.message(
+ f'Check for parameter "boot.disk_id" failed: '
+ f'disk {aparam_boot_disk_id} is not attached to '
+ f'Compute ID {self.comp_id}.'
+ )
+ else:
+ match aparam_disks['mode']:
+ case 'update':
+ if (
+ aparam_boot_disk_id not in comp_disk_ids
+ and aparam_boot_disk_id not in aparam_disks['ids']
+ ):
+ check_errors = True
+ self.message(
+ f'Check for parameter "boot.disk_id" failed: '
+ f'disk {aparam_boot_disk_id} is not attached '
+ f'to Compute ID {self.comp_id}.'
+ )
+ case 'match':
+ if aparam_boot_disk_id not in aparam_disks['ids']:
+ check_errors = True
+ self.message(
+ f'Check for parameter "boot.disk_id" failed: '
+ f'disk {aparam_boot_disk_id} is not in '
+ f'disks.ids'
+ )
+ case 'detach' | 'delete':
+ if aparam_boot_disk_id in aparam_disks['ids']:
+ check_errors = True
+ self.message(
+ f'Check for parameter "boot.disk_id" failed: '
+ f'disk {aparam_boot_disk_id} cannot be '
+ f'detached or deleted to set as boot disk.'
+ )
+ elif aparam_boot_disk_id not in comp_disk_ids:
+ check_errors = True
+ self.message(
+ f'Check for parameter "boot.disk_id" failed: '
+ f'disk {aparam_boot_disk_id} is not attached '
+ f'to Compute ID {self.comp_id}.'
+ )
if (
- not self.comp_info['imageId']
+ not comp_info['imageId']
and self.amodule.params['state'] in ('poweredon', 'paused')
):
check_errors = True
@@ -880,7 +1079,7 @@ class decort_kvmvm(DecortController):
is_vm_stopped_or_will_be_stopped = (
(
- self.comp_info['techStatus'] == 'STOPPED'
+ comp_info['techStatus'] == 'STOPPED'
and (
self.amodule.params['state'] is None
or self.amodule.params['state'] in (
@@ -889,7 +1088,7 @@ class decort_kvmvm(DecortController):
)
)
or (
- self.comp_info['techStatus'] != 'STOPPED'
+ comp_info['techStatus'] != 'STOPPED'
and self.amodule.params['state'] in (
'halted', 'poweredoff',
)
@@ -905,7 +1104,7 @@ class decort_kvmvm(DecortController):
)
vm_snapshot_labels = [
- snapshot['label'] for snapshot in self.comp_info['snapSets']
+ snapshot['label'] for snapshot in comp_info['snapSets']
]
if self.amodule.params['rollback_to'] not in vm_snapshot_labels:
check_errors = True
@@ -913,7 +1112,7 @@ class decort_kvmvm(DecortController):
f'Check for parameter "rollback_to" failed: '
f'snapshot with label '
f'{self.amodule.params["rollback_to"]} does not exist '
- f'for VM ID{self.comp_info["id"]}.'
+ f'for VM ID {comp_id}.'
)
params_to_check = {
@@ -925,7 +1124,7 @@ class decort_kvmvm(DecortController):
for param_name, comp_field_name in params_to_check.items():
if (
self.aparams[param_name] is not None
- and self.comp_info[comp_field_name] != self.aparams[param_name]
+ and comp_info[comp_field_name] != self.aparams[param_name]
and not is_vm_stopped_or_will_be_stopped
):
check_errors = True
@@ -944,7 +1143,7 @@ class decort_kvmvm(DecortController):
if (
self.aparam_networks_has_dpdk
- and not self.comp_info['hpBacked']
+ and not comp_info['hpBacked']
and not self.aparams['hp_backed']
):
check_errors = True
@@ -954,9 +1153,149 @@ class decort_kvmvm(DecortController):
'to a DPDK network.'
)
+ is_vm_started_or_will_be_started = (
+ (
+ comp_info['techStatus'] == 'STARTED'
+ and (
+ self.amodule.params['state'] is None
+ or self.amodule.params['state'] in (
+ 'poweredon', 'present',
+ )
+ )
+ )
+ or (
+ comp_info['techStatus'] != 'STARTED'
+ and self.amodule.params['state'] == 'poweredon'
+ )
+ )
+
+ if self.amodule.params['get_console_url']:
+ if not is_vm_started_or_will_be_started:
+ check_errors = True
+ self.message(
+ 'Check for parameter "get_console_url" failed: '
+ 'VM must be started to get console url.'
+ )
+
+ aparam_disks = self.aparams['disks']
+ if aparam_disks is not None:
+ if self.comp_info['snapSets']:
+ match aparam_disks['mode']:
+ case 'detach' | 'delete':
+ check_errors = True
+ self.message(
+ f'Check for parameter "disks" failed: '
+ f'cannot {aparam_disks["mode"]} disks for '
+ f'Compute ID {self.comp_id} while snapshots '
+ f'exist in compute.'
+ )
+ case 'match':
+ comp_disk_ids = {
+ disk['id'] for disk in self.comp_info['disks']
+ }
+ disks = set(aparam_disks['ids'])
+ disks_to_detach = comp_disk_ids - disks
+ if disks_to_detach:
+ check_errors = True
+ self.message(
+ f'Check for parameter "disks" failed: '
+ f'disks {disks_to_detach} cannot be detached '
+ f'from Compute ID {self.comp_id} while '
+ f'snapshots exist in compute.'
+ )
+
+ if check_errors:
+ self.exit(fail=True)
+
+ def check_amodule_args_for_clone(self, clone_id: int, clone_dict: dict):
+ check_errors = False
+ aparam_clone_from = self.aparams['clone_from']
+
+ if (
+ clone_id
+ and clone_dict['cloneReference'] != self.vm_to_clone_id
+ ):
+ check_errors = True
+ self.message(
+ 'Check for parameter "name" failed: '
+ f'VM with name {self.aparams["name"]} '
+ f'already exists.'
+ )
+ if (
+ self.vm_to_clone_info['techStatus'] == 'STARTED'
+ and not aparam_clone_from['force']
+ ):
+ check_errors = True
+ self.message(
+ 'Check for parameter "clone_from.force" failed: '
+ 'VM must be stopped or parameter "force" must be True '
+ 'to clone it.'
+ )
+
+ aparam_snapshot = aparam_clone_from['snapshot']
+ snapshot_timestamps = [
+ snapshot['timestamp']
+ for snapshot in self.vm_to_clone_info['snapSets']
+ ]
+ if aparam_snapshot is not None:
+ if (
+ aparam_snapshot['name'] is not None
+ and aparam_snapshot['name'] not in (
+ snapshot['label']
+ for snapshot in self.vm_to_clone_info['snapSets']
+ )
+ ):
+ check_errors = True
+ self.message(
+ 'Check for parameter "clone_from.snapshot.name" '
+ 'failed: snapshot with name '
+ f'{aparam_snapshot["name"]} does not exist for VM ID '
+ f'{self.vm_to_clone_id}.'
+ )
+ if (
+ aparam_snapshot['timestamp'] is not None
+ and aparam_snapshot['timestamp'] not in snapshot_timestamps
+ ):
+ check_errors = True
+ self.message(
+ 'Check for parameter "clone_from.snapshot.timestamp" '
+ 'failed: snapshot with timestamp '
+ f'{aparam_snapshot["timestamp"]} does not exist for '
+ f'VM ID {self.vm_to_clone_id}.'
+ )
+ if aparam_snapshot['datetime'] is not None:
+ timestamp_from_dt_str = self.dt_str_to_sec(
+ dt_str=aparam_snapshot['datetime']
+ )
+ if timestamp_from_dt_str not in snapshot_timestamps:
+ check_errors = True
+ self.message(
+ 'Check for parameter "clone_from.snapshot.datetime" '
+ 'failed: snapshot with datetime '
+ f'{aparam_snapshot["datetime"]} does not exist for '
+ f'VM ID {self.vm_to_clone_id}.'
+ )
+
if check_errors:
self.exit(fail=True)
+ def clone(self):
+ clone_from_snapshot = self.aparams['clone_from']['snapshot']
+ snapshot_timestamp, snapshot_name, snapshot_datetime = None, None, None
+ if clone_from_snapshot:
+ snapshot_timestamp = clone_from_snapshot['timestamp']
+ snapshot_name = clone_from_snapshot['name']
+ snapshot_datetime = clone_from_snapshot['datetime']
+ clone_id = self.compute_clone(
+ compute_id=self.vm_to_clone_id,
+ name=self.aparams['name'],
+ force=self.aparams['clone_from']['force'],
+ snapshot_timestamp=snapshot_timestamp,
+ snapshot_name=snapshot_name,
+ snapshot_datetime=snapshot_datetime,
+ )
+ return clone_id
+
# Workflow digest:
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when creating DECSController
# 2) check if the VM with the specified id or rg_name:name exists
@@ -976,8 +1315,6 @@ def main():
amodule = subj.amodule
if subj.comp_id:
- subj.check_amodule_args_for_change()
-
if subj.comp_info['status'] in ("DISABLED", "MIGRATING", "DELETING", "DESTROYING", "ERROR", "REDEPLOYING"):
# cannot do anything on the existing Compute in the listed states
subj.error() # was subj.nop()
@@ -1001,6 +1338,7 @@ def main():
_, subj.comp_info, _ = subj.compute_find(
comp_id=subj.comp_id,
need_custom_fields=True,
+ need_console_url=amodule.params['get_console_url'],
)
subj.modify()
elif amodule.params['state'] == 'absent':
@@ -1041,6 +1379,7 @@ def main():
_, subj.comp_info, _ = subj.compute_find(
comp_id=subj.comp_id,
need_custom_fields=True,
+ need_console_url=amodule.params['get_console_url'],
)
#
# We no longer need to re-read RG facts, as all network info is now available inside
diff --git a/library/decort_lb.py b/library/decort_lb.py
index f114820..f8c9233 100644
--- a/library/decort_lb.py
+++ b/library/decort_lb.py
@@ -103,20 +103,17 @@ class decort_lb(DecortController):
self.rg_id,self.vins_id,
self.amodule.params['ext_net_id'],
self.amodule.params['ha_lb'],
- self.amodule.params['description'])
+ self.amodule.params['description'],
+ sysctl=self.amodule.params['sysctl'],)
if self.lb_id and (self.amodule.params['backends'] or
self.amodule.params['frontends']):
self.lb_id, self.lb_facts = self.lb_find(0,self.amodule.params['lb_name'],self.rg_id)
self.lb_update(
- self.lb_facts['primaryNode'],
- self.lb_facts['frontendHAIP'],
- self.lb_facts['backendHAIP'],
- self.lb_facts['backends'],
- self.lb_facts['frontends'],
- self.amodule.params['backends'],
- self.amodule.params['servers'],
- self.amodule.params['frontends']
- )
+ lb_facts=self.lb_facts,
+ aparam_backends=self.amodule.params['backends'],
+ aparam_frontends=self.amodule.params['frontends'],
+ aparam_servers=self.amodule.params['servers'],
+ )
return
def action(self,d_state='',restore=False):
@@ -127,14 +124,11 @@ class decort_lb(DecortController):
_, self.lb_facts = self._lb_get_by_id(lb_id=self.lb_id)
self.lb_update(
- self.lb_facts['primaryNode'],
- self.lb_facts['frontendHAIP'],
- self.lb_facts['backendHAIP'],
- self.lb_facts['backends'],
- self.lb_facts['frontends'],
- self.amodule.params['backends'],
- self.amodule.params['servers'],
- self.amodule.params['frontends'],
+ lb_facts=self.lb_facts,
+ aparam_backends=self.amodule.params['backends'],
+ aparam_frontends=self.amodule.params['frontends'],
+ aparam_servers=self.amodule.params['servers'],
+ aparam_sysctl=self.aparams['sysctl'],
)
if d_state != '':
@@ -196,6 +190,7 @@ class decort_lb(DecortController):
ret_dict = dict(id=0,
name="none",
state="CHECK_MODE",
+ sysctl={},
)
if arg_check_mode:
@@ -216,6 +211,7 @@ class decort_lb(DecortController):
if self.amodule.params['state']!="absent":
ret_dict['backends'] = self.lb_facts['backends']
ret_dict['frontends'] = self.lb_facts['frontends']
+ ret_dict['sysctl'] = self.lb_facts['sysctlParams']
return ret_dict
@property
@@ -292,6 +288,9 @@ class decort_lb(DecortController):
type='bool',
default=False,
),
+ sysctl=dict(
+ type='dict',
+ ),
),
supports_check_mode=True,
required_one_of=[
diff --git a/library/decort_osimage.py b/library/decort_osimage.py
index 2b1a67f..1928f89 100644
--- a/library/decort_osimage.py
+++ b/library/decort_osimage.py
@@ -279,9 +279,8 @@ def main():
amodule.exit_json(**decon.result)
if decon.validated_virt_image_id > 0 and amodule.params['state'] == "absent":
- decon.result['msg'] = ("Osimage module cannot delete virtual images.")
- decon.result['failed'] = True
- amodule.exit_json(**decon.result)
+ amodule.image_id_delete = decon.validated_virt_image_id
+ decort_osimage.decort_image_delete(decon, amodule)
elif amodule.params['image_name'] or amodule.params['image_id']:
image_id, image_facts = decort_osimage.decort_image_find(decon, amodule)
diff --git a/library/decort_rg.py b/library/decort_rg.py
index a961e0d..aa68016 100644
--- a/library/decort_rg.py
+++ b/library/decort_rg.py
@@ -121,6 +121,7 @@ class decort_rg(DecortController):
arg_res_types=self.amodule.params['resType'],
arg_newname=self.amodule.params['rename'],
arg_sep_pools=self.amodule.params['sep_pools'],
+ arg_desc=self.amodule.params['description'],
)
self.rg_should_exist = True
return
@@ -235,6 +236,7 @@ class decort_rg(DecortController):
ret_dict['ViNS'] = self.rg_facts['vins']
ret_dict['computes'] = self.rg_facts['vms']
ret_dict['uniqPools'] = self.rg_facts['uniqPools']
+ ret_dict['description'] = self.rg_facts['desc']
return ret_dict
@@ -362,6 +364,7 @@ def main():
or amodule.params['resType']
or amodule.params['rename'] != ""
or amodule.params['sep_pools'] is not None
+ or amodule.params['description'] is not None
):
decon.update()
if amodule.params['access']:
diff --git a/module_utils/decort_utils.py b/module_utils/decort_utils.py
index f025dc1..51a4735 100644
--- a/module_utils/decort_utils.py
+++ b/module_utils/decort_utils.py
@@ -1130,81 +1130,77 @@ class DecortController(object):
break
return
- def compute_data_disks(self, comp_dict, new_data_disks):
- """Manage attachment of data disks to the Compute instance.
-
- @param (dict) comp_dict: dictionary with Compute facts, that identifies the Compute instance
- to manage data disks for.
- @param (list of int) new_data_disks: list of integer IDs for the disks that must be attached to
- this Compute instance. If some disk IDs appear in this list, but are not present in comp_dict,
- these disks will be attached. Vice versa, if some disks appear in comp_dict but are not present
- in data_disks, such disks will be detached.
-
- Note:
- 1) you cannot control boot disk attachment, so including this Compute's boot disk ID
- into data_disk list will have no effect (as well as not listing it there).
- 2) this function may modify data_disks by removing from it an ID that corresponds to
- this Compute's boot disk (if found).
- 3) In view of #2, upstream code may need to reread compute facts (com_dict) so that it
- contains updated information about attached disks.
- """
-
- self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "compute_data_disks")
-
- if self.amodule.check_mode:
- self.result['failed'] = False
- self.result['msg'] = ("compute_data_disks() in check mode: managing data disks on Compute "
- "ID {} was requested.").format(comp_dict['id'])
- return
-
- bdisk_id = 0
- current_list = []
- detach_list = []
- attach_list = []
-
- # 'data_disks' argument for decort_kvmvm module expects list of integer disk IDs.
- # However, if the value for disk ID comes via Jinja templating like this:
- # data_disks:
- # - "{{ my_disk.facts.id }}" <= will come as string, which is WRONG!!!
- # - 4571 <= no Jinja templae, will come as int - OK
- #
- # then all values when entering this method will be of type string. We need to
- # explicitly cast int type on all of them.
- if new_data_disks is not None:
- for idx, repair in enumerate(new_data_disks):
- new_data_disks[idx] = int(repair)
- else:
- new_data_disks = []
-
- for disk in comp_dict['disks']:
- if disk['type'] == 'B':
- bdisk_id = disk['id']
- if bdisk_id in new_data_disks:
- # If boot disk ID is listed in data_disks - remove it
- new_data_disks.remove(bdisk_id)
- elif disk['type'] == 'D':
- # build manipulation sets for 'D' type disks only
- current_list.append(disk['id'])
- if disk['id'] not in new_data_disks:
- detach_list.append(disk['id'])
-
- attach_list = [did for did in new_data_disks if did not in current_list]
-
- for did in detach_list:
- api_params = dict(computeId=comp_dict['id'], diskId=did)
- self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/diskDetach", api_params)
- # On success the above call will return here. On error it will abort execution by calling fail_json.
- self.result['changed'] = True
+ @waypoint
+ @checkmode
+ def compute_disks(self, comp_dict: dict, aparam_disks: dict):
+ disks = set(aparam_disks['ids'])
+ mode = aparam_disks['mode']
+
+ comp_disks = {disk['id'] for disk in comp_dict['disks']}
+ disks_to_attach = set()
+ disks_to_detach = set()
+ disks_to_delete = set()
+ match mode:
+ case 'update':
+ disks_to_attach = disks - comp_disks
+ case 'detach':
+ disks_to_detach = disks & comp_disks
+ case 'delete':
+ disks_to_delete = disks & comp_disks
+ case 'match':
+ disks_to_attach = disks - comp_disks
+ disks_to_detach = comp_disks - disks
+
+ for disk_id in disks_to_attach:
+ api_params = {
+ 'computeId': comp_dict['id'],
+ 'diskId': disk_id,
+ 'diskType': 'D',
+ }
+ self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/diskAttach',
+ arg_params=api_params,
+ )
+ self.set_changed()
- for did in attach_list:
- api_params = dict(computeId=comp_dict['id'], diskId=did)
- self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/diskAttach", api_params)
- # On success the above call will return here. On error it will abort execution by calling fail_json.
- self.result['changed'] = True
+ for disk_id in disks_to_detach:
+ api_params = {
+ 'computeId': comp_dict['id'],
+ 'diskId': disk_id,
+ }
+ self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/diskDetach',
+ arg_params=api_params,
+ )
+ self.set_changed()
- self.result['failed'] = False
+ for disk_id in disks_to_delete:
+ api_params = {
+ 'computeId': comp_dict['id'],
+ 'diskId': disk_id,
+ }
+ self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/diskDel',
+ arg_params=api_params,
+ )
+ self.set_changed()
- return
+ @waypoint
+ @checkmode
+ def compute_boot_disk(self, comp_id: int, boot_disk: int):
+ api_params = {
+ 'computeId': comp_id,
+ 'diskId': boot_disk,
+ }
+ self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/bootDiskSet',
+ arg_params=api_params,
+ )
+ self.set_changed()
def compute_delete(self, comp_id, permanently=False,detach=True):
"""Delete a Compute instance identified by its ID. It is assumed that the Compute with the specified
@@ -1233,7 +1229,12 @@ class DecortController(object):
return
- def _compute_get_by_id(self, comp_id, need_custom_fields: bool = False):
+ def _compute_get_by_id(
+ self,
+ comp_id,
+ need_custom_fields: bool = False,
+ need_console_url: bool = False,
+ ):
"""Helper function that locates compute instance by ID and returns Compute facts.
@param (int) comp_id: ID of the Compute instance to find and return facts for.
@@ -1266,16 +1267,23 @@ class DecortController(object):
)
ret_comp_dict['custom_fields'] = custom_fields
+ if need_console_url and ret_comp_dict['techStatus'] == 'STARTED':
+ console_url = self.compute_get_console_url(
+ compute_id=ret_comp_id,
+ )
+ ret_comp_dict['console_url'] = console_url
+
else:
self.result['warning'] = ("compute_get_by_id(): failed to get Compute by ID {}. HTTP code {}, "
"response {}.").format(comp_id, api_resp.status_code, api_resp.reason)
return ret_comp_id, ret_comp_dict, ret_rg_id
- def compute_find(self, comp_id,
+ def compute_find(self, comp_id: int = 0,
comp_name="", rg_id=0,
check_state=True,
- need_custom_fields: bool = False):
+ need_custom_fields: bool = False,
+ need_console_url: bool = False):
"""Tries to find Compute instance according to the specified parameters. On success returns non-zero
Compute ID and a dictionary with Compute details, or 0 for ID and None for the dictionary on failure.
@@ -1312,6 +1320,7 @@ class DecortController(object):
self._compute_get_by_id(
comp_id=comp_id,
need_custom_fields=need_custom_fields,
+ need_console_url=need_console_url,
)
)
if not ret_comp_id:
@@ -1352,6 +1361,7 @@ class DecortController(object):
_, ret_comp_dict, _ = self._compute_get_by_id(
comp_id=ret_comp_id,
need_custom_fields=need_custom_fields,
+ need_console_url=need_console_url,
)
break
@@ -1436,7 +1446,7 @@ class DecortController(object):
def kvmvm_provision(self, rg_id,
comp_name,
cpu, ram,
- boot_disk,
+ boot_disk_size,
image_id,
chipset: Literal['Q35', 'i440fx'] = 'i440fx',
description="",
@@ -1478,12 +1488,12 @@ class DecortController(object):
'name': comp_name,
'cpu': cpu,
'ram': ram,
- 'bootDisk': boot_disk,
+ 'bootDisk': boot_disk_size,
'sepId': sep_id,
'pool': pool_name,
'interfaces': '[]', # we create VM without any network connections
'chipset': chipset,
- 'withoutBootDisk': not boot_disk,
+ 'withoutBootDisk': not boot_disk_size,
'preferredCpu': preferred_cpu_cores,
}
if description:
@@ -2096,6 +2106,48 @@ class DecortController(object):
)
self.set_changed()
+ @waypoint
+ @checkmode
+ def compute_clone(
+ self,
+ compute_id: int,
+ name: str,
+ snapshot_timestamp: int | None = None,
+ snapshot_name: str | None = None,
+ snapshot_datetime: str | None = None,
+ force: bool = False,
+ ):
+ _snapshot_timestamp = snapshot_timestamp
+ if snapshot_datetime:
+ _snapshot_timestamp = self.dt_str_to_sec(dt_str=snapshot_datetime)
+
+ api_params = {
+ 'computeId': compute_id,
+ 'name': name,
+ 'force': force,
+ 'snapshotName': snapshot_name,
+ 'snapshotTimestamp': _snapshot_timestamp,
+ }
+
+ api_resp = self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/clone',
+ arg_params=api_params,
+ )
+ self.set_changed()
+ return int(api_resp.content)
+
+ @waypoint
+ def compute_get_console_url(self, compute_id: int):
+ api_response = self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/compute/getConsoleUrl',
+ arg_params={
+ 'computeId': compute_id,
+ },
+ )
+ return api_response.text
+
###################################
# OS image manipulation methods
###################################
@@ -2616,7 +2668,7 @@ class DecortController(object):
# TODO: this method will not work in its current implementation. Update it for new .../rg/update specs.
- def rg_update(self, arg_rg_dict, arg_quotas, arg_res_types, arg_newname, arg_sep_pools):
+ def rg_update(self, arg_rg_dict, arg_quotas, arg_res_types, arg_newname, arg_sep_pools, arg_desc: str | None = None):
"""Manage quotas for an existing RG.
@param arg_rg_dict: dictionary with RG facts as returned by rg_find(...) method or .../rg/get API
@@ -2697,6 +2749,10 @@ class DecortController(object):
api_params['clearUniqPools'] = True
update_required = True
+ if arg_desc is not None and arg_desc != arg_rg_dict['desc']:
+ api_params['desc'] = arg_desc
+ update_required = True
+
if update_required:
self.decort_api_call(requests.post, "/restmachine/cloudapi/rg/update", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
@@ -4518,7 +4574,7 @@ class DecortController(object):
return 0, None
- def disk_create(self, accountId, name, description, size, type, iops, sep_id, pool):
+ def disk_create(self, accountId, name, description, size, iops, sep_id, pool):
"""Provision Disk according to the specified arguments.
Note that disks created by this method will be of type 'D' (data disks).
If critical error occurs the embedded call to API function will abort further execution
@@ -4542,7 +4598,6 @@ class DecortController(object):
name=name,
description=description,
size=size,
- type=type,
iops=iops,
sep_id=sep_id,
pool=pool )
@@ -5140,6 +5195,7 @@ class DecortController(object):
description,
extnet_only,
master_chipset: Literal['Q35', 'i440fx'] = 'i440fx',
+ lb_sysctl: dict | None = None,
):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "k8s_provision")
@@ -5185,6 +5241,9 @@ class DecortController(object):
userData=json.dumps(default_worker['ci_user_data']),
extnetOnly=extnet_only,
chipset=master_chipset,
+ lbSysctlParams=lb_sysctl and json.dumps(
+ {k: str(v) for k, v in lb_sysctl.items()}
+ ),
)
upload_files = None
@@ -5903,7 +5962,7 @@ class DecortController(object):
self.amodule.fail_json(**self.result)
return 0, None
- def lb_provision(self,lb_name,rg_id,vins_id,ext_net_id,ha_status,description,start=True):
+ def lb_provision(self,lb_name,rg_id,vins_id,ext_net_id,ha_status,description,start=True, sysctl: dict | None = None):
"""Provision LB according to the specified arguments.
If critical error occurs the embedded call to API function will abort further execution of
the script and relay error to Ansible.
@@ -5932,7 +5991,10 @@ class DecortController(object):
vinsId=vins_id,
highlyAvailable=ha_status,
start=start,
- desc=description
+ desc=description,
+ sysctlParams=sysctl and json.dumps(
+ {k: str(v) for k, v in sysctl.items()}
+ ),
)
api_resp = self.decort_api_call(requests.post, api_url, api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
@@ -6259,8 +6321,15 @@ class DecortController(object):
api_resp = self.decort_api_call(requests.post, api_url, api_params)
self.result['changed'] = True
- def lb_update(self,prime,front_ha_ip,back_ha_ip,lb_backends=[],lb_frontends=[],mod_backends=[],mod_servers=[],mod_frontends=[]):
-
+ def lb_update(
+ self,
+ lb_facts: dict,
+ aparam_backends: list | None,
+ aparam_frontends: list | None,
+ aparam_servers: list | None,
+ aparam_sysctl: dict | None,
+ ):
+
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "lb_update")
if self.amodule.check_mode:
@@ -6271,11 +6340,13 @@ class DecortController(object):
self.result['msg'] = result_msg
return
- if mod_backends is None:
+ lb_backends = lb_facts['backends']
+ lb_frontends = lb_facts['frontends']
+ if aparam_backends is None:
upd_back_list = [back['name'] for back in lb_backends]
else:
#lists from module and cloud
- mod_backs_list = [back['name'] for back in mod_backends]
+ mod_backs_list = [back['name'] for back in aparam_backends]
lb_backs_list = [back['name'] for back in lb_backends]
#ADD\DEL\UPDATE LISTS OF BACKENDS
del_list_backs = set(lb_backs_list).difference(mod_backs_list)
@@ -6294,21 +6365,21 @@ class DecortController(object):
if add_back_list:
self._lb_create_backends(
add_back_list,
- mod_backends,
- mod_servers
+ aparam_backends,
+ aparam_servers
)
if upd_back_list:
- if mod_backends is not None or mod_servers is not None:
+ if aparam_backends is not None or aparam_servers is not None:
self._lb_update_backends(
upd_back_list,
lb_backends,
- mod_backends,
- mod_servers,
+ aparam_backends,
+ aparam_servers,
)
- if mod_frontends is not None:
- mod_front_list = [front['name'] for front in mod_frontends]
+ if aparam_frontends is not None:
+ mod_front_list = [front['name'] for front in aparam_frontends]
lb_front_list = [front['name'] for front in lb_frontends]
del_list_fronts = set(lb_front_list).difference(mod_front_list)
@@ -6318,6 +6389,8 @@ class DecortController(object):
if del_list_fronts:
self._lb_delete_fronts(del_list_fronts)
+ front_ha_ip = lb_facts['frontendHAIP']
+ back_ha_ip = lb_facts['backendHAIP']
#set bind_ip
if front_ha_ip != "":
bind_ip = front_ha_ip
@@ -6326,16 +6399,25 @@ class DecortController(object):
bind_ip = back_ha_ip
if front_ha_ip == "" and back_ha_ip == "":
+ prime = lb_facts['primaryNode']
if prime["frontendIp"] != "":
bind_ip = prime["frontendIp"]
else:
bind_ip = prime["backendIp"]
if add_list_fronts:
- self._lb_add_fronts(add_list_fronts,mod_frontends,bind_ip)
+ self._lb_add_fronts(add_list_fronts,aparam_frontends,bind_ip)
if upd_front_list:
- self._lb_update_fronts(upd_front_list,lb_frontends,mod_frontends,bind_ip)
-
+ self._lb_update_fronts(upd_front_list,lb_frontends,aparam_frontends,bind_ip)
+
+ if aparam_sysctl is not None:
+ sysctl_with_str_values = {k: str(v) for k, v in aparam_sysctl.items()}
+ if sysctl_with_str_values != lb_facts['sysctlParams']:
+ self.lb_update_sysctl(
+ lb_id=lb_facts['id'],
+ sysctl=aparam_sysctl,
+ )
+
return
def _lb_delete_backends(self,back_list,lb_fronts):
@@ -6556,6 +6638,22 @@ class DecortController(object):
return
+ @waypoint
+ @checkmode
+ def lb_update_sysctl(self, lb_id: int, sysctl: dict):
+ sysctl_with_str_values = json.dumps(
+ {k: str(v) for k, v in sysctl.items()}
+ )
+ self.decort_api_call(
+ arg_req_function=requests.post,
+ arg_api_name='/restmachine/cloudapi/lb/updateSysctlParams',
+ arg_params={
+ 'lbId': lb_id,
+ 'sysctlParams': sysctl_with_str_values,
+ },
+ )
+ self.set_changed()
+
@waypoint
@checkmode
def snapshot_create(self, compute_id: int, label: str):
diff --git a/wiki/7.2.0/Home.md b/wiki/7.2.0/Home.md
new file mode 100644
index 0000000..866c022
--- /dev/null
+++ b/wiki/7.2.0/Home.md
@@ -0,0 +1,25 @@
+1. [Введение](./введение.md)
+ - [Введение](./введение.md#введение)
+ - [Системные требования](./введение.md#системные-требования)
+ - [Подготовка к работе](./введение.md#подготовка-к-работе)
+ - [Авторизация](./введение.md#авторизация)
+ - [Общие параметры модулей для авторизации](./введение.md#общие-параметры-модулей-для-авторизации)
+ - [Пример авторизации с помощью DECS3O](./введение.md#пример-авторизации-с-помощью-decs3o)
+ - [Пример авторизации с помощью BVS](./введение.md#пример-авторизации-с-помощью-bvs)
+ - [Пример авторизации с помощью JSON Web Token](./введение.md#пример-авторизации-с-помощью-json-web-token)
+2. Ansible модули DECORT:
+ - [Модуль decort_kvmvm](./модуль-decort_kvmvm.md) - управление виртуальными машинами
+ - [Модуль decort_osimage](./модуль-decort_osimage.md) - управление образами
+ - [Модуль decort_disk](./модуль-decort_disk.md) - управление дисками
+ - [Модуль decort_pfw](./модуль-decort_pfw.md) - управление правилами переадресации портов
+ - [Модуль decort_rg](./модуль-decort_rg.md) - управление ресурсными группами
+ - [Модуль decort_vins](./модуль-decort_vins.md) - управление внутренними сетями
+ - [Модуль decort_jwt](./модуль-decort_jwt.md) - получение авторизационного токена
+ - [Модуль decort_bservice](./модуль-decort_bservice.md) - управление базовыми службами
+ - [Модуль decort_group](./модуль-decort_group.md)- управление группами базовой службы
+ - [Модуль decort_k8s](./модуль-decort_k8s.md) - управление кластерами Kubernetes
+ - [Модуль decort_lb](./модуль-decort_lb.md) - управление балансировщиками нагрузки
+ - [Модуль decort_account_info](./модуль-decort_account_info.md) - получение информации об аккаунте
+ - [Модуль decort_account](./модуль-decort_account.md) - управление аккаунтами
+ - [Модуль decort_user_info](./модуль-decort_user_info.md) - получение информации о пользователе
+ - [Модуль decort_snapshot](./модуль-decort_snapshot.md) - управление снимками виртуальной машины
diff --git a/wiki/7.2.0/введение.md b/wiki/7.2.0/введение.md
new file mode 100644
index 0000000..261da07
--- /dev/null
+++ b/wiki/7.2.0/введение.md
@@ -0,0 +1,250 @@
+# Модули Ansible для управления облачными ресурсами в платформе DECORT
+## Введение
+
+Настоящая документация содержит руководство пользователя по библиотеке модулей decort для Ansible. С помощью этих модулей Вы сможете управлять созданием и конфигурированием облачных ресурсов в платформе DECORT (Digital Energy Cloud Orchestration Technology).
+
+По каждому модулю есть своя документация, в которой вы можете найти список доступных действий, подробную информацию о входных параметрах и возвращаемых данных, а также примеры использования.
+
+## Системные требования
+Убедитесь, что Ваша система соответствует требованиям для работы модуля DECORT.
+Системные требования для работы модуля:
+- Ansible 10.6.0
+- Python 3.10.12
+- PyJWT 2.10.1 Python module
+- requests 2.32.3 Python module
+- DynamiX Enterprise 4.2.0
+
+## Подготовка к работе
+
+Для начала работы необходимо, чтобы Ansible было известно местоположение файлов модулей. Для этого необходимо:
+- либо разместить директории **library** и **module_utils** в одной директории с плейбуками
+- либо в рабочей директории, из которой будет запускаться Ansible, разместить файл **ansible.cfg**, в котором задать пути к файлам модулей, например:
+```
+[defaults]
+library=./library
+module_utils=./module_utils
+```
+
+## Авторизация
+
+### Общие параметры модулей для авторизации
+
+
Параметр | +Тип | +Описание | +|||||
---|---|---|---|---|---|---|---|
+ app_id + | ++ (str) + | +
+ Идентификатор приложения, использующийся для получения токена в режимах
+ authenticator: bvs или authenticator: decs3o .
+ Данный параметр является обязательным для указанных режимов. Если
+ параметр не задан в playbook, модуль будет использовать значение
+ переменной окружения DECORT_APP_ID .
+ |
+ |||||
+ app_secret + | ++ (str) + | +
+ Секретный ключ приложения, использующийся для получения токена в режимах
+ authenticator: bvs или authenticator: decs3o .
+ Данный параметр является обязательным для указанных режимов.
+ Так как он содержит секретную информацию, то его не рекомендуется
+ задавать непосредственно в playbook. Если параметр не задан в playbook,
+ то модуль будет использовать значение переменной окружения
+ DECORT_APP_SECRET .
+ |
+ |||||
+ authenticator + | +
+ (str)
+ Значения: + bvs
+ decs3o
+ oauth2
+ jwt
+ Default: decs3o
+ |
+
+ Режим аутентификации для получения токена.
+ Значение oauth2 является устаревшим и равнозначным
+ decs3o .
+ |
+ |||||
+ controller_url + | ++ (str) + | ++ URL контроллера, соответствующего экземпляру облачной платформы + DECORT. Данный параметр является обязательным. + | +|||||
+ domain + | ++ (str) + | +
+ Домен BVS, использующийся для получения токена в режиме
+ authenticator: bvs . Данный параметр является
+ обязательным для указанного режима. Если параметр не задан в playbook,
+ модуль будет использовать значение переменной окружения
+ DECORT_DOMAIN .
+ |
+ |||||
+ jwt + | ++ (str) + | +
+ JSON Web Token (JWT), который будет использоваться для подключения
+ к контроллеру облачной платформы DECORT в режиме
+ authenticator: jwt . Данный параметр является
+ обязательным для указанного режима. Так как он содержит
+ потенциально секретную информацию, а сам JWT, как правило,
+ имеет ограниченное время жизни, то его не рекомендуется задавать
+ непосредственно в playbook. Если этот параметр не определен в
+ playbook, то модуль будет использовать значение переменной
+ окружения DECORT_JWT .
+ |
+ |||||
+ oauth2_url + | ++ (str) + | +
+ URL авторизационного сервера, работающего по протоколу Oauth2,
+ который должен использоваться в режимах
+ authenticator: bvs
+ или authenticator: decs3o . Данный параметр является
+ обязательным для указанных режимов. Если параметр не задан в
+ playbook, модуль будет использовать значение переменной
+ окружения DECORT_OAUTH2_URL .
+ |
+ |||||
+ password + | ++ (str) + | +
+ Пароль пользователя, который должен использоваться в режиме
+ authenticator: bvs . Данный параметр является
+ обязательным для указанного режима. Так как он содержит секретную
+ информацию, то его не рекомендуется задавать непосредственно
+ в playbook. Если параметр не задан в playbook, модуль будет
+ использовать значение переменной окружения
+ DECORT_PASSWORD .
+ |
+ |||||
+ username + | ++ (str) + | +
+ Логин пользователя, который должен использоваться в режиме
+ authenticator: bvs . Данный параметр является
+ обязательным для указанного режима. Если параметр не задан в playbook,
+ модуль будет использовать значение переменной окружения
+ DECORT_USERNAME .
+ |
+ |||||
+ verify_ssl + | +
+ (bool)
+ Default: true
+ |
+ + Позволяет отключить проверку SSL сертификатов при выполнении API + вызовов в адрес контроллера облачной инфраструктуры, например, + при работе с изолированной облачной инфраструктурой, использующей + самоподписанные сертификаты. Применяйте данный параметр с + осторожностью, предпочтительно в защищенных средах. + | +
Параметр | +Тип | +Описание | +|||||
---|---|---|---|---|---|---|---|
+ + access_emails + + | ++ (bool) + | ++ Выключение/включение отправки пользователям на эл. почту уведомлений о предоставлении доступа к ресурсам. + | +|||||
+ + acl + + | ++ (dict) + | ++ Целевые права доступа. + | +|||||
+ | + mode + | +
+ (str)
+ Значения: + match
+ revoke
+ update
+ Default: update
+ |
+
+ Режим изменения прав доступа для указанных пользователей.
+ match - привести в соответствие для указанных
+ пользователей, удалить предоставленные для других.
+ revoke - отозвать для указанных пользователей,
+ если предоставлены.
+ update - привести в соответствие для указанных
+ пользователей, оставить без изменения предоставленные для
+ других.
+ |
+ ||||
+ | + users + | ++ (list) + | +
+ Список словарей, описывающих права доступа пользователей.
+ Обязательный параметр. + |
+ ||||
+ | + | + rights + | +
+ (str)
+ Значения: + R
+ RCX
+ ARCXDU
+ Default: R
+ |
+
+ Права доступа.
+ При mode: revoke не используется.
+ При mode: match и mode: update
+ права ARCXDU считаются соответствующими
+ правам CXDRAU .
+ |
+ |||
+ | + | + id + | ++ (str) + | +
+ Идентификатор пользователя.
+ Обязательный параметр. + |
+ |||
+ id + | ++ (int) + | +
+ Идентификатор целевого аккаунта.
+ Обязательный параметр, если не задан параметр + name .
+ |
+ |||||
+ + name + + | ++ (str) + | +
+ Имя целевого аккаунта.
+ Может быть альтернативой параметру id ,
+ за исключением случая, когда необходимо получить
+ информацию о безвозвратно удалённом объекте.
+ Если задан совместно с параметром id ,
+ то используется для переименования (целевое имя).
+ |
+ |||||
+ + quotas + + | ++ (dict) + | ++ Целевые квоты. + | +|||||
+ | + cpu + | ++ (int) + | +
+ Количество виртуальных процессоров.
+ -1 - удалить квоту.
+ |
+ ||||
+ | + disks_size + | ++ (int) + | +
+ Объём дисков в ГБ.
+ -1 - удалить квоту.
+ |
+ ||||
+ | + ext_traffic + | ++ (int) + | +
+ Объём трафика внешних сетей.
+ -1 - удалить квоту.
+ |
+ ||||
+ | + gpu + | ++ (int) + | +
+ Количество графических процессоров.
+ -1 - удалить квоту.
+ |
+ ||||
+ | + public_ip + | ++ (int) + | +
+ Количество внешних IP-адресов.
+ -1 - удалить квоту.
+ |
+ ||||
+ | + ram + | ++ (int) + | +
+ Объём оперативной памяти в МБ.
+ -1 - удалить квоту.
+ |
+ ||||
+ + sep_pools + + | ++ (list) + | ++ Список словарей, описывающих доступные пулы СХД. + | +|||||
+ | + sep_id + | ++ (int) + | ++ Идентификатор системы хранения данных. + | +||||
+ | + pool_names + | ++ (list) + | ++ Список названий пулов системы хранения данных. + | +||||
+ + state + + | +
+ (str)
+ Значения: + absent
+ absent_permanently
+ confirmed
+ disabled
+ present
+ Default: present
+ |
+
+ Целевое состояние.
+ absent - удалён в корзину, безвозвратно удалён
+ или не существует. Если существует и не удалён, то будет удалён
+ в корзину.
+ absent_permanently - безвозвратно удалён или
+ не существует. Если существует и не удалён или удалён в корзину,
+ то будет безвозвратно удалён.
+ При значениях absent и absent_permanently
+ использование других параметров модуля, вызывающих изменение объекта,
+ не допускается.
+ confirmed - включён. Если выключен, то будет включён.
+ Если удалён в корзину, то будет восстановлен из корзины.
+ disabled - выключен. Если включён, то будет выключен.
+ Если удалён в корзину, то будет восстановлен из корзины и выключен.
+ present - существует и не удалён. Если удалён в
+ корзину, то будет восстановлен из корзины.
+ |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ acl + | ++ list + | ++ Список словарей, описывающих доступы пользователей. + | +|||||
+ | + canBeDeleted + | ++ bool + | ++ Может ли быть удалён. + | +||||
+ | + right + | ++ str + | ++ Права. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + type + | ++ str + | ++ Тип. + | +||||
+ | + userGroupId + | ++ str + | ++ Идентификатор пользователя или группы пользователей. + | +||||
+ company + | ++ str + | ++ Название компании. + | +|||||
+ companyurl + | ++ str + | ++ URL компании. + | +|||||
+ computeFeatures + | ++ list + | ++ Список дополнительных возможностей гипервизора, доступных ВМ. + | +|||||
+ computes_amount + | ++ dict + | ++ Количество ВМ по состоянию. + | +|||||
+ | + started + | ++ int + | ++ Количество запущенных ВМ. + | +||||
+ | + stopped + | ++ int + | ++ Количество остановленных ВМ. + | +||||
+ cpu_allocation_parameter + | ++ str + | ++ Режим выделения ЦП. + | +|||||
+ cpu_allocation_ratio + | ++ str + | ++ Коэффициент для режима выделения ЦП. + | +|||||
+ createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +|||||
+ createdTime + | ++ int + | ++ Unix-время создания. + | +|||||
+ createdTime_readable + | ++ str + | ++ Дата и время создания. + | +|||||
+ deactivationTime + | ++ int + | ++ Unix-время выключения. + | +|||||
+ deactivationTime_readable + | ++ str + | ++ Дата и время выключения. + | +|||||
+ deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +|||||
+ deletedTime + | ++ int + | ++ Unix-время удаления. + | +|||||
+ deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +|||||
+ displayname + | ++ str + | ++ Отображаемое имя. + | +|||||
+ id + | ++ int + | ++ Идентификатор. + | +|||||
+ name + | ++ str + | ++ Имя. + | +|||||
+ resourceLimits + | ++ dict + | ++ Квоты на ресурсы. + | +|||||
+ | + CU_C + | ++ int + | ++ Количество виртуальных процессоров. + | +||||
+ | + CU_D + | ++ int + | ++ Объём диска в ГБ. + | +||||
+ | + CU_DM + | ++ int + | ++ Объём дисков в ГБ. + | +||||
+ | + CU_I + | ++ int + | ++ Количество внешних IP-адресов. + | +||||
+ | + CU_M + | ++ float + | ++ Объём оперативной памяти в МБ. + | +||||
+ | + CU_NP + | ++ int + | ++ Объём трафика внешних сетей. + | +||||
+ | + gpu_units + | ++ int + | ++ Количество графических процессоров. + | +||||
+ sendAccessEmails + | ++ bool + | ++ Отправка пользователям на эл. почту уведомлений о предоставлении доступа. + | +|||||
+ status + | ++ str + | ++ Статус. + | +|||||
+ uniqPools + | ++ list + | ++ Список доступных пулов СХД. + | +|||||
+ updatedTime + | ++ int + | ++ Unix-время обновления. + | +|||||
+ updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +|||||
+ vins + | ++ list + | ++ Список идентификаторов внутренних сетей на уровне аккаунта. + | +|||||
+ vinses_amount + | ++ int + | ++ Количество внутренних сетей. + | +
Параметр | +Тип | +Описание | +|||||
---|---|---|---|---|---|---|---|
+ + audits + + | +
+ (bool)
+ Default: false
+ |
+ + Получить информацию об аудитах. + | +|||||
+ + computes + + | ++ (dict) + | +
+ Получить информацию о виртуальных машинах, к которым имеет доступ пользователь,
+ с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + ext_net_id + | ++ (int) + | ++ По идентификатору внешней сети. + | +|||
+ | + | + ext_net_name + | ++ (str) + | ++ По имени внешней сети. + | +|||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + ip + | ++ (str) + | ++ По IP-адресу. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + rg_id + | ++ (int) + | ++ По идентификатору ресурсной группы. + | +|||
+ | + | + rg_name + | ++ (str) + | ++ По имени ресурсной группы. + | +|||
+ | + | + tech_status + | +
+ (str)
+ Значения: + BACKUP_RUNNING
+ BACKUP_STOPPED
+ DOWN
+ MIGRATING
+ PAUSED
+ PAUSING
+ SCHEDULED
+ STARTED
+ STARTING
+ STOPPED
+ STOPPING
+ |
+ + По техническому статусу. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + cpus
+ createdBy
+ createdTime
+ deletedBy
+ deletedTime
+ id
+ name
+ ram
+ registered
+ rgId
+ rgName
+ status
+ techStatus
+ totalDisksSize
+ updatedBy
+ updatedTime
+ userManaged
+ vinsConnected
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+ |||
+ + disks + + | ++ (dict) + | +
+ Получить информацию о неподключённых дисках, к которым имеет доступ пользователь,
+ с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + size + | ++ (int) + | ++ По объёму. + | +|||
+ | + | + type + | +
+ (str)
+ Значения: + B
+ D
+ |
+ + По типу. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + id
+ name
+ pool
+ sepId
+ shareable
+ sizeMax
+ type
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+ |||
+ + flip_groups + + | ++ (dict) + | +
+ Получить информацию о группах с плавающим IP-адресом, к которым имеет
+ доступ пользователь, с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + ext_net_id + | ++ (int) + | ++ По идентификатору внешней сети. + | +|||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + ip + | ++ (str) + | ++ По IP-адресу. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + vins_id + | ++ (int) + | ++ По идентификатору внутренней сети. + | +|||
+ | + | + vins_name + | ++ (str) + | ++ По имени внутренней сети. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ id + | ++ (int) + | +
+ Идентификатор целевого аккаунта.
+ Обязательный параметр, если не задан параметр + name .
+ |
+ |||||
+ + images + + | ++ (dict) + | +
+ Получить информацию об образах, которые доступны к использованию
+ в аккаунте, с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + type + | +
+ (str)
+ Значения: + cdrom
+ linux
+ other
+ virtual
+ windows
+ |
+ + По типу. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + UNCPath
+ desc
+ id
+ name
+ public
+ size
+ status
+ type
+ username
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+ |||
+ name + | ++ (str) + | +
+ Имя целевого аккаунта.
+ Может быть альтернативой параметру id ,
+ за исключением случая, когда необходимо получить
+ информацию о безвозвратно удалённом объекте.
+ |
+ |||||
+ + resource_groups + + | ++ (dict) + | +
+ Получить информацию о ресурсных группах, к которым имеет доступ пользователь,
+ с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + status + | +
+ (str)
+ Значения: + CREATED
+ DELETED
+ DELETING
+ DESTROYED
+ DESTROYING
+ DISABLED
+ DISABLING
+ ENABLED
+ ENABLING
+ MODELED
+ RESTORING
+ |
+ + По статусу. + | +|||
+ | + | + vins_id + | ++ (int) + | ++ По идентификатору внутренней сети. + | +|||
+ | + | + vm_id + | ++ (int) + | ++ По идентификатору виртуальной машины. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + createdBy
+ createdTime
+ deletedBy
+ deletedTime
+ id
+ milestones
+ name
+ status
+ updatedBy
+ updatedTime
+ vinses
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+ |||
+ + resource_consumption + + | +
+ (bool)
+ Default: false
+ |
+ + Получить информацию об используемых и зарезервированных ресурсах. + | +|||||
+ + vinses + + | ++ (dict) + | +
+ Получить информацию о внутренних сетях, к которым имеет доступ пользователь,
+ с учётом заданных параметров вывода.
+ Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + ext_ip + | ++ (str) + | ++ По внешнему IP-адресу. + | +|||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + rg_id + | ++ (int) + | ++ По идентификатору ресурсной группы. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + computes
+ createdBy
+ createdTime
+ deletedBy
+ deletedTime
+ externalIP
+ extnetId
+ freeIPs
+ id
+ name
+ network
+ priVnfDevId
+ rgId
+ rgName
+ status
+ updatedBy
+ updatedTime
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ acl + | ++ list + | ++ Список словарей, описывающих доступы пользователей. + | +|||||
+ | + canBeDeleted + | ++ bool + | ++ Может ли быть удалён. + | +||||
+ | + right + | ++ str + | ++ Права. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + type + | ++ str + | ++ Тип. + | +||||
+ | + userGroupId + | ++ str + | ++ Идентификатор пользователя или группы пользователей. + | +||||
+ company + | ++ str + | ++ Название компании. + | +|||||
+ companyurl + | ++ str + | ++ URL компании. + | +|||||
+ computeFeatures + | ++ list + | ++ Список дополнительных возможностей гипервизора, доступных ВМ. + | +|||||
+ computes_amount + | ++ dict + | ++ Количество ВМ по состоянию. + | +|||||
+ | + started + | ++ int + | ++ Количество запущенных ВМ. + | +||||
+ | + stopped + | ++ int + | ++ Количество остановленных ВМ. + | +||||
+ cpu_allocation_parameter + | ++ str + | ++ Режим выделения ЦП. + | +|||||
+ cpu_allocation_ratio + | ++ str + | ++ Коэффициент для режима выделения ЦП. + | +|||||
+ createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +|||||
+ createdTime + | ++ int + | ++ Unix-время создания. + | +|||||
+ createdTime_readable + | ++ str + | ++ Дата и время создания. + | +|||||
+ deactivationTime + | ++ int + | ++ Unix-время выключения. + | +|||||
+ deactivationTime_readable + | ++ str + | ++ Дата и время выключения. + | +|||||
+ deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +|||||
+ deletedTime + | ++ int + | ++ Unix-время удаления. + | +|||||
+ deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +|||||
+ displayname + | ++ str + | ++ Отображаемое имя. + | +|||||
+ id + | ++ int + | ++ Идентификатор. + | +|||||
+ name + | ++ str + | ++ Имя. + | +|||||
+ resourceLimits + | ++ dict + | ++ Квоты на ресурсы. + | +|||||
+ | + CU_C + | ++ int + | ++ Количество виртуальных процессоров. + | +||||
+ | + CU_D + | ++ int + | ++ Объём диска в ГБ. + | +||||
+ | + CU_DM + | ++ int + | ++ Объём дисков в ГБ. + | +||||
+ | + CU_I + | ++ int + | ++ Количество внешних IP-адресов. + | +||||
+ | + CU_M + | ++ float + | ++ Объём оперативной памяти в МБ. + | +||||
+ | + CU_NP + | ++ int + | ++ Объём трафика внешних сетей. + | +||||
+ | + gpu_units + | ++ int + | ++ Количество графических процессоров. + | +||||
+ sendAccessEmails + | ++ bool + | ++ Отправка пользователям на эл. почту уведомлений о предоставлении доступа. + | +|||||
+ status + | ++ str + | ++ Статус. + | +|||||
+ uniqPools + | ++ list + | ++ Список доступных пулов СХД. + | +|||||
+ updatedTime + | ++ int + | ++ Unix-время обновления. + | +|||||
+ updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +|||||
+ vins + | ++ list + | ++ Список идентификаторов внутренних сетей на уровне аккаунта. + | +|||||
+ vinses_amount + | ++ int + | ++ Количество внутренних сетей. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ + resource_consumed + + | ++ dict + | ++ Используемые ресурсы. + | +|||||
+ | + cpu + | ++ int + | ++ Количество виртуальных процессоров. + | +||||
+ | + disksize + | ++ int + | ++ Объём дисков в ГБ. + | +||||
+ | + extips + | ++ int + | ++ Количество внешних IP-адресов. + | +||||
+ | + exttraffic + | ++ int + | ++ Объём трафика внешних сетей. + | +||||
+ | + gpu + | ++ int + | ++ Количество графических процессоров. + | +||||
+ | + ram + | ++ int + | ++ Объём оперативной памяти в МБ. + | +||||
+ | + seps + | ++ dict + | ++ Объём дисков по пулам СХД. + | +||||
+ | + | + (идентификатор СХД) + | ++ dict + | ++ Пулы СХД. + | +|||
+ | + | + | + (название пула) + | ++ dict + | ++ Словарь пула СХД. + | +||
+ | + | + | + | + disksize + | ++ int + | ++ Объём дисков в ГБ. + | +|
+ resource_reserved + | ++ dict + | +
+ Зарезервированные ресурсы.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ resource_groups + | ++ list + | ++ Список словарей, описывающих ресурсные группы. + | +|||||
+ | + Computes + | ++ dict + | ++ Количество ВМ по состоянию. + | +||||
+ | + | + Started + | ++ int + | ++ Количество запущенных ВМ. + | +|||
+ | + | + Stopped + | ++ int + | ++ Количество остановленных ВМ. + | +|||
+ | + Resources + | ++ dict + | ++ Используемые и зарезервированные ресурсы. + | +||||
+ | + | + Consumed + | ++ dict + | +
+ Используемые ресурсы.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+ |||
+ | + | + Limits + | ++ dict + | ++ Квоты на ресурсы. + | +|||
+ | + | + | + cpu + | ++ int + | ++ Количество виртуальных процессоров. + | +||
+ | + | + | + disksize + | ++ int + | ++ Объём дисков в ГБ. + | +||
+ | + | + | + disksizemax + | ++ int + | ++ Объём диска в ГБ. + | +||
+ | + | + | + extips + | ++ int + | ++ Количество внешних IP-адресов. + | +||
+ | + | + | + exttraffic + | ++ int + | ++ Объём трафика внешних сетей. + | +||
+ | + | + | + gpu + | ++ int + | ++ Количество графических процессоров. + | +||
+ | + | + | + ram + | ++ float + | ++ Объём оперативной памяти в МБ. + | +||
+ | + | + Reserved + | ++ dict + | +
+ Зарезервированные ресурсы.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+ |||
+ | + createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +||||
+ | + createdTime + | ++ int + | ++ Unix-время создания. + | +||||
+ | + createdTime_readable + | ++ str + | ++ Дата и время создания. + | +||||
+ | + deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +||||
+ | + deletedTime + | ++ int + | ++ Unix-время удаления. + | +||||
+ | + deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + milestones + | ++ int + | ++ Количество событий. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + updatedBy + | ++ str + | ++ Идентификатор пользователя, который обновил. + | +||||
+ | + updatedTime + | ++ int + | ++ Unix-время обновления. + | +||||
+ | + updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +||||
+ | + vinses + | ++ int + | ++ Количество внутренних сетей. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ computes + | ++ list + | ++ Список словарей, описывающих виртуальные машины. + | +|||||
+ | + accountId + | ++ int + | ++ Идентификатор аккаунта. + | +||||
+ | + accountName + | ++ str + | ++ Имя аккаунта. + | +||||
+ | + cpus + | ++ int + | ++ Количество виртуальных процессоров. + | +||||
+ | + createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +||||
+ | + createdTime + | ++ int + | ++ Unix-время создания. + | +||||
+ | + createdTime_readable + | ++ str + | ++ Дата и время создания. + | +||||
+ | + deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +||||
+ | + deletedTime + | ++ int + | ++ Unix-время удаления. + | +||||
+ | + deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + ram + | ++ int + | ++ Объём оперативной памяти в МБ. + | +||||
+ | + registered + | ++ bool + | ++ Зарегистрирована ли ВМ как используемая. + | +||||
+ | + rgId + | ++ int + | ++ Идентификатор ресурсной группы. + | +||||
+ | + rgName + | ++ str + | ++ Имя ресурсной группы. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + techStatus + | ++ str + | ++ Технический статус. + | +||||
+ | + totalDisksSize + | ++ int + | ++ Общий объём дисков. + | +||||
+ | + updatedBy + | ++ str + | ++ Идентификатор пользователя, который обновил. + | +||||
+ | + updatedTime + | ++ int + | ++ Unix-время обновления. + | +||||
+ | + updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +||||
+ | + vinsConnected + | ++ int + | ++ Количество подключенных внутренних сетей. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ vinses + | ++ list + | ++ Список словарей, описывающих внутренние сети. + | +|||||
+ | + accountId + | ++ int + | ++ Идентификатор аккаунта. + | +||||
+ | + accountName + | ++ str + | ++ Имя аккаунта. + | +||||
+ | + computes + | ++ int + | ++ Количество виртуальных машин. + | +||||
+ | + createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +||||
+ | + createdTime + | ++ int + | ++ Unix-время создания. + | +||||
+ | + createdTime_readable + | ++ str + | ++ Дата и время создания. + | +||||
+ | + deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +||||
+ | + deletedTime + | ++ int + | ++ Unix-время удаления. + | +||||
+ | + deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +||||
+ | + externalIP + | ++ str + | ++ Внешний IP-адрес. + | +||||
+ | + extnetId + | ++ int + | ++ Идентификатор внешней сети. + | +||||
+ | + freeIPs + | ++ int + | ++ Количество свободных IP-адресов. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + network + | ++ str + | ++ Адрес сети. + | +||||
+ | + priVnfDevId + | ++ int + | ++ Идентификатор виртуального маршрутизатора. + | +||||
+ | + rgId + | ++ int + | ++ Идентификатор ресурсной группы. + | +||||
+ | + rgName + | ++ str + | ++ Имя ресурсной группы. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + updatedBy + | ++ str + | ++ Идентификатор пользователя, который обновил. + | +||||
+ | + updatedTime + | ++ int + | ++ Unix-время обновления. + | +||||
+ | + updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ disks + | ++ list + | ++ Список словарей, описывающих диски. + | +|||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + pool + | ++ str + | ++ Пул СХД. + | +||||
+ | + sepId + | ++ int + | ++ Идентификатор СХД. + | +||||
+ | + shareable + | ++ bool + | ++ Общий доступ. + | +||||
+ | + sizeMax + | ++ int + | ++ Объём. + | +||||
+ | + type + | ++ str + | ++ Тип. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ images + | ++ list + | ++ Список словарей, описывающих образы. + | +|||||
+ | + UNCPath + | ++ str + | ++ Путь к файлу. + | +||||
+ | + desc + | ++ str + | ++ Описание. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + public + | ++ bool + | ++ Общий доступ. + | +||||
+ | + size + | ++ int + | ++ Размер в ГБ. + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + type + | ++ str + | ++ Тип. + | +||||
+ | + username + | ++ str + | ++ Имя пользователя. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ flip_groups + | ++ list + | ++ Список словарей, описывающих группы с плавающим IP-адресом. + | +|||||
+ | + clientType + | ++ str + | ++ Тип клиентов. + | +||||
+ | + connType + | ++ str + | ++ Тип соединения. + | +||||
+ | + createdBy + | ++ str + | ++ Идентификатор пользователя, который создал. + | +||||
+ | + createdTime + | ++ int + | ++ Unix-время создания. + | +||||
+ | + createdTime_readable + | ++ str + | ++ Дата и время создания. + | +||||
+ | + deletedBy + | ++ str + | ++ Идентификатор пользователя, который удалил. + | +||||
+ | + deletedTime + | ++ int + | ++ Unix-время удаления. + | +||||
+ | + deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +||||
+ | + desc + | ++ str + | ++ Описание. + | +||||
+ | + gid + | ++ int + | ++ Идентификатор ЦОД. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + ip + | ++ str + | ++ IP-адрес. + | +||||
+ | + milestones + | ++ int + | ++ Количество событий. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + netId + | ++ int + | ++ Идентификатор сети. + | +||||
+ | + netType + | ++ str + | ++ Тип сети. + | +||||
+ | + netmask + | ++ int + | ++ Маска подсети (длина префикса). + | +||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + updatedBy + | ++ str + | ++ Идентификатор пользователя, который обновил. + | +||||
+ | + updatedTime + | ++ int + | ++ Unix-время обновления. + | +||||
+ | + updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ audits + | ++ list + | ++ Список словарей, описывающих аудиты. + | +|||||
+ | + call + | ++ str + | ++ Метод API. + | +||||
+ | + responsetime + | ++ float + | ++ Время отклика в секундах. + | +||||
+ | + statuscode + | ++ int + | ++ Код ответа. + | +||||
+ | + timestamp + | ++ float + | ++ Unix-время. + | +||||
+ | + timestamp_readable + | ++ str + | ++ Дата и время. + | +||||
+ | + user + | ++ str + | ++ Идентификатор пользователя. + | +
Параметр | +Тип | +Описание | +||
---|---|---|---|---|
+ account_id + | ++ (int) + | ++ Идентификатор аккаунта. + | +||
+ account_name + | ++ (str) + | +
+ Имя аккаунта.
+ Может быть альтернативой параметру account_id .
+ |
+ ||
+ description + | +
+ (str)
+ Default: Managed by Ansible module decort_lb
+ |
+ + Описание балансировщика. + | +||
+ backends + | ++ (list) + | ++ Список словарей, описывающих конфигурации backend. + | +||
+ | + algorithm + | +
+ (str)
+ Значения: + leastconn
+ roundrobin
+ static-rr
+ Default: roundrobin
+ |
+ + Используемый алгоритм. + | +|
+ | + + default_settings + + | ++ (dict) + | ++ Cловарь, описывающий параметры по умолчанию для backend-серверов. + | +|
+ | + | + downinter + | +
+ (int)
+ Default: 1000
+ |
+ + Интервал в миллисекундах между двумя последовательными проверками + доступности сервера, который считается недоступным. + | +
+ | + | + fall + | +
+ (int)
+ Default: 2
+ |
+ + Количество последовательных неудачных проверок доступности, после + которых сервер, ранее считавшийся доступным, начинает считаться + недоступным и временно исключается из схемы балансировки. + | +
+ | + | + inter + | +
+ (int)
+ Default: 5000
+ |
+ + Интервал в миллисекундах между двумя последовательными проверками + доступности сервера, который считается доступным. + | +
+ | + | + maxconn + | +
+ (int)
+ Default: 250
+ |
+ + Лимит одновременных подключений к серверу. При достижении этого лимита + сервер временно исключается из схемы балансировки. + | +
+ | + | + maxqueue + | +
+ (int)
+ Default: 256
+ |
+ + Лимит соединений, ожидающих в очереди. Когда этот предел будет + достигнут, все последующие подключения будут перенаправлены + на другие серверы. + | +
+ | + | + rise + | +
+ (int)
+ Default: 2
+ |
+ + Количество проверок, которые должен пройти сервер, считавшийся + недоступным, чтобы начать считаться доступным и снова быть + включенным в схему балансировки. + | +
+ | + | + slowstart + | +
+ (int)
+ Default: 60000
+ |
+ + Интервал в миллисекундах с момента когда сервер начинает считаться + доступным, по истечении которого количество фактически разрешенных + подключений к этому серверу будет возвращено до 100% от + установленного лимита. + | +
+ | + | + weight + | +
+ (int)
+ Default: 100
+ |
+ + Вес сервера для использования в алгоритмах балансировки. + | +
+ | + name + | ++ (str) + | ++ Название backend. Обязательный параметр. + | +|
+ ext_net_id + | ++ (int) + | +
+ Идентификатор внешней сети.
+ Может быть не задан, если задан vins_id -
+ в таком случае балансировщик будет подключён только к
+ внутренней сети.
+ |
+ ||
+ + frontends + + | ++ (list) + | ++ Список словарей, описывающих конфигурации frontend. + | +||
+ | + backend + | ++ (str) + | ++ Название используемого backend. Обязательный параметр. + | +|
+ | + bindings + | ++ (list) + | ++ Список словарей, описывающих конфигурации binding. + | +|
+ | + | + address + | ++ (str) + | +
+ IP-адрес.
+ Если не задан, то будет использоваться основной IP-адрес + балансировщика во внешней сети или, если подключена только + внутренняя сеть, основной IP-адрес балансировщика во внутренней сети. + |
+
+ | + | + name + | ++ (str) + | ++ Название. Обязательный параметр. + | +
+ | + | + port + | +
+ (int)
+ Значения: + 1 -65535
+ |
+ + Порт. Обязательный параметр. + | +
+ ha_lb + | +
+ bool
+ Default: false
+ |
+ + Использовать схему высокой доступности для создаваемого балансировщика. + | +||
+ lb_id + | ++ (int) + | ++ Идентификатор балансировщика нагрузки. + | +||
+ lb_name + | ++ (str) + | ++ Имя балансировщика. + | +||
+ permanently + | +
+ (bool)
+ Default: false
+ |
+ + Если выполняется удаление, то выполнить безвозвратное удаление + (минуя корзину). + | +||
+ rg_id + | ++ (int) + | ++ Идентификатор ресурсной группы. + | +||
+ rg_name + | ++ (str) + | +
+ Имя ресурсной группы.
+ В комбинации с заданным аккаунтов может быть альтернативой + параметру rg_id
+ |
+ ||
+ servers + | ++ (list) + | ++ Список словарей, описывающих конфигурации backend-серверов. + | +||
+ | + address + | ++ (str) + | ++ IP-адрес. Обязательный параметр. + | +|
+ | + backends + | ++ (list) + | +
+ Список словарей, описывающих параметры backend-сервера для разных
+ конфигураций backend.
+ Обязательный параметр. + |
+ |
+ | + | + check + | +
+ (str)
+ Значения: + enabled
+ disabled
+ Default: enabled
+ |
+ + Проверка доступности сервера. + | +
+ | + | + name + | ++ (str) + | ++ Название конфигурации backend. Обязательный параметр. + | +
+ | + | + port + | +
+ (int)
+ Значения: + 1 -65535
+ |
+ + Порт. Обязательный параметр. + | +
+ | + | + server_settings + | ++ (dict) + | +
+ Словарь, описывающий параметры backend-сервера.
+ Ключи данного словаря аналогичны ключам словаря + + default_settings + . + |
+
+ | + name + | ++ (str) + | ++ Название. Обязательный параметр. + | +|
+ state + | +
+ (str)
+ Значения: + present
+ absent
+ enabled
+ disabled
+ restart
+ Default: present
+ |
+
+ Целевое состояние балансировщика нагрузки.
+ Выполнение с state=restart позволяет выполнить
+ перезапуск балансировщика, соответственно, всегда возвращает
+ changed: true .
+ Значения present и enabled равнозначны
+ и соответствуют включённому и запущенному балансировщику.
+ |
+ ||
+ sysctl + | ++ (dict) + | ++ Словарь, описывающий параметры конфигурации sysctl. + | +||
+ vins_id + | ++ (int) + | +
+ Идентификатор внутренней сети.
+ Может быть не задан, если задан ext_net_id -
+ в таком случае балансировщик будет подключён только к
+ внешней сети.
+ |
+ ||
+ vins_name + | ++ (str) + | +
+ Имя внутренней сети.
+ В комбинации с заданной РГ может быть альтернативой для + параметра vins_id .
+ |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||
---|---|---|---|---|---|
+ backends + | ++ list + | ++ Список словарей, описывающих конфигурации backend. + | +|||
+ | + algorithm + | ++ str + | ++ Используемый алгоритм. + | +||
+ | + name + | ++ str + | ++ Название конфигурации backend. + | +||
+ | + serverDefaultSettings + | ++ dict + | +
+ Cловарь, описывающий параметры по умолчанию для backend-серверов.
+ Ключи данного словаря аналогичны ключам словаря + + default_settings + . + |
+ ||
+ | + servers + | ++ list + | ++ Список словарей, описывающих конфигурации backend-серверов. + | +||
+ | + | + address + | ++ str + | ++ IP-адрес. + | +|
+ | + | + check + | ++ str + | ++ Проверка доступности сервера. + | +|
+ | + | + name + | ++ str + | ++ Название. + | +|
+ | + | + port + | ++ int + | ++ Порт. + | +|
+ | + | + serverSettings + | ++ dict + | +
+ Cловарь, описывающий параметры backend-сервера.
+ Ключи данного словаря аналогичны ключам словаря + + default_settings + . + |
+ |
+ frontends + | ++ list + | +
+ Список словарей, описывающих конфигурации frontend.
+ Ключи данного словаря аналогичны ключам словарей списка + + frontends + . + |
+ |||
+ gid + | ++ int + | ++ Идентификатор физического кластера (Grid ID). + | +|||
+ id + | ++ int + | ++ Идентификатор балансировщика. + | +|||
+ name + | ++ str + | ++ Имя балансировщика. + | +|||
+ rg_id + | ++ int + | ++ Идентификатор ресурсной группы. + | +|||
+ state + | ++ str + | ++ Статус балансировщика. + | +|||
+ sysctl + | ++ dict + | ++ Параметры конфигурации sysctl. + | +
Параметр | +Тип | +Описание | +|||||
---|---|---|---|---|---|---|---|
+ + label + + | ++ (str) + | +
+ Метка снимка виртуальной машины. Если метка не указана при создании, она будет сгенерирована автоматически на основе даты и времени - vm_name_2024-12-10_16-40-52 .
+ |
+ |||||
+ + state + + | +
+ (str)
+ Значения: + absent
+ present
+ |
+
+ Целевое состояние.
+ absent - снимок удален.
+ present - снимок существует.
+ |
+ |||||
+ + usage + + | +
+ (bool)
+ Default: false
+ |
+ + Получить информацию о реальном размере снимка виртуальной машины. + | +|||||
+ + vm_id + + | ++ (int) + | +
+ Идентификатор виртуальной машины.
+ Обязательный параметр. + |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ disks + | ++ list + | ++ Диски + | +|||||
+ guid + | ++ str + | ++ Идентификатор снимка + | +|||||
+ label + | ++ str + | ++ Метка снимка + | +|||||
+ timestamp + | ++ int + | ++ Временная метка создания снимка + | +|||||
+ vm_id + | ++ int + | ++ Идентификатор виртуальной машины + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ stored + | ++ float + | ++ Размер снимка + | +
Параметр | +Тип | +Описание | +|||||
---|---|---|---|---|---|---|---|
+ + accounts + + | ++ (dict) + | +
+ Получить информацию об аккаунтах, к которым имеет доступ пользователь,
+ с учётом заданных параметров вывода.
+ Чтобы получить информацию без указания параметров вывода, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + deleted + | +
+ (bool)
+ Default: false
+ |
+
+ false - вывод только неудалённых объектов.
+ true - вывод только удалённых в корзину объектов.
+ |
+ ||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + rights + | +
+ (str)
+ Значения: + R
+ RCX
+ ARCXDU
+ CXDRAU
+ |
+ + По предоставленным правам доступа. + | +|||
+ | + | + id + | ++ (int) + | ++ По идентификатору. + | +|||
+ | + | + name + | ++ (str) + | ++ По имени. + | +|||
+ | + | + status + | +
+ (str)
+ Значения: + CONFIRMED
+ DELETED
+ DESTROYED
+ DESTROYING
+ DISABLED
+ |
+ + По статусу. + | +|||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | ++ (int) + | +
+ Размер страниц.
+ Обязательный параметр. + |
+ |||
+ | + resource_consumption + | +
+ (bool)
+ Default: false
+ |
+ + Получить информацию об используемых и зарезервированных ресурсах. + | +||||
+ | + sorting + | ++ (dict) + | ++ Сортировка. + | +||||
+ | + | + asc + | +
+ (bool)
+ Default: true
+ |
+
+ Сортировать по возрастанию.
+ true - по возрастанию.
+ false - по убыванию.
+ |
+ |||
+ | + | + field + | +
+ (str)
+ Значения: + createdTime
+ deletedTime
+ id
+ name
+ status
+ updatedTime
+ |
+
+ Название поля, по которому сортировать.
+ Обязательный параметр. + |
+ |||
+ + api_methods + + | +
+ (bool)
+ Default: false
+ |
+ + Получить методы API, к которым имеет доступ пользователь. + | +|||||
+ + audits + + | ++ (dict) + | +
+ Получить информацию об аудитах пользователя, с учётом
+ заданных параметров вывода.
+ Чтобы получить информацию с параметрами вывода по умолчанию, + необходимо задать пустой словарь {} .
+ |
+ |||||
+ | + filter + | ++ (dict) + | ++ Фильтр. + | +||||
+ | + | + api_method + | ++ (str) + | ++ По методу API. + | +|||
+ | + | + status_code + | ++ (dict) + | ++ По коду ответа HTTP. + | +|||
+ | + | + | + min + | ++ (int) + | ++ По минимальному коду ответа HTTP. + | +||
+ | + | + | + max + | ++ (int) + | ++ По максимальному коду ответа HTTP. + | +||
+ | + | + time + | ++ (dict) + | ++ По временному периоду. + | +|||
+ | + | + | + start + | ++ (dict) + | ++ Начало периода. + | +||
+ | + | + | + | + unix + | ++ (int) + | ++ Unix-время. + | +|
+ | + | + | + | + date_time + | ++ (str) + | +
+ Дата и время в формате ггггммддччммсс .
+ Альтернатива параметру unix .
+ Допустимо использовать любой разделитель между + группами цифр для повышения читаемости. Например, + гггг-мм-дд чч:мм:сс .
+ |
+ |
+ | + | + | + end + | ++ (dict) + | +
+ Конец периода.
+ Структура словаря аналогична параметру + start .
+ |
+ ||
+ | + pagination + | ++ (dict) + | ++ Постраничный вывод. + | +||||
+ | + | + number + | +
+ (int)
+ Default: 1
+ |
+ + Номер страницы. + | +|||
+ | + | + size + | +
+ (int)
+ Default: 50
+ |
+ + Размер страниц. + | +|||
+ + objects_search + + | ++ (str) + | ++ Получить информацию о доступных пользователю объектах, + найденных по строчному значению данного параметра. + | +|||||
+ + resource_consumption + + | +
+ (bool)
+ Default: false
+ |
+ + Получить информацию об используемых и зарезервированных ресурсах, + к которым имеет доступ пользователь. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ admin + | ++ bool + | ++ Наличие административных прав. + | +|||||
+ data + | ++ dict + | ++ Дополнительные данные. + | +|||||
+ emailaddresses + | ++ list + | ++ Адреса эл. почты. + | +|||||
+ name + | ++ str + | ++ Имя/идентификатор. + | +|||||
+ roles + | ++ list + | ++ Группы доступа. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ + resource_consumed + + | ++ dict + | ++ Используемые ресурсы. + | +|||||
+ | + cpu + | ++ int + | ++ Количество виртуальных процессоров. + | +||||
+ | + disksize + | ++ int + | ++ Объём дисков в ГБ. + | +||||
+ | + extips + | ++ int + | ++ Количество внешних IP-адресов. + | +||||
+ | + exttraffic + | ++ int + | ++ Объём трафика внешних сетей. + | +||||
+ | + gpu + | ++ int + | ++ Количество графических процессоров. + | +||||
+ | + ram + | ++ int + | ++ Объём оперативной памяти в МБ. + | +||||
+ | + seps + | ++ dict + | ++ Объём дисков по пулам СХД. + | +||||
+ | + | + (идентификатор СХД) + | ++ dict + | ++ Пулы СХД. + | +|||
+ | + | + | + (название пула) + | ++ dict + | ++ Словарь пула СХД. + | +||
+ | + | + | + | + disksize + | ++ int + | ++ Объём дисков в ГБ. + | +|
+ resource_reserved + | ++ dict + | +
+ Зарезервированные ресурсы.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ accounts + | ++ list + | ++ Список словарей, описывающих аккаунты. + | +|||||
+ | + acl + | ++ list + | ++ Список словарей, описывающих доступы пользователей. + | +||||
+ | + | + right + | ++ str + | ++ Права доступа. + | +|||
+ | + | + status + | ++ str + | ++ Статус. + | +|||
+ | + | + type + | ++ str + | ++ Тип. + | +|||
+ | + | + userGroupId + | ++ str + | ++ Идентификатор пользователя или группы пользователей. + | +|||
+ | + computeFeatures + | ++ list + | ++ Список дополнительных возможностей гипервизора, доступных ВМ. + | +||||
+ | + createdTime + | ++ int + | ++ Unix-время создания. + | +||||
+ | + createdTime_readable + | ++ str + | ++ Дата и время создания. + | +||||
+ | + deletedTime + | ++ int + | ++ Unix-время удаления. + | +||||
+ | + deletedTime_readable + | ++ str + | ++ Дата и время удаления. + | +||||
+ | + id + | ++ int + | ++ Идентификатор. + | +||||
+ | + name + | ++ str + | ++ Имя. + | +||||
+ | + resource_consumed + | ++ list + | +
+ Используемые ресурсы.
+ Только если + accounts.resource_consumption: true
+ и только для неудалённых объектов.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+ ||||
+ | + resource_reserved + | ++ list + | +
+ Зарезервированные ресурсы.
+ Только если + accounts.resource_consumption: true
+ и только для неудалённых объектов.
+ Структура словаря аналогична словарю + + resource_consumed + . + |
+ ||||
+ | + status + | ++ str + | ++ Статус. + | +||||
+ | + updatedTime + | ++ int + | ++ Unix-время обновления. + | +||||
+ | + updatedTime_readable + | ++ str + | ++ Дата и время обновления. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ audits + | ++ list + | ++ Список словарей, описывающих аудиты. + | +|||||
+ | + Call + | ++ str + | ++ Метод API. + | +||||
+ | + Guid + | ++ str + | ++ Уникальный идентификатор аудита. + | +||||
+ | + Response Time + | ++ float + | ++ Время отклика в секундах. + | +||||
+ | + Status Code + | ++ int + | ++ Код ответа HTTP. + | +||||
+ | + Time + | ++ float + | ++ Unix-время. + | +||||
+ | + Time_readable + | ++ str + | ++ Дата и время. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ api_methods + | ++ list + | ++ Список словарей, описывающих доступные методы API. + | +|||||
+ | + (название группы методов API) + | ++ dict + | ++ Доступные методы группы. + | +||||
+ | + | + (название подгруппы методов API) + | ++ list + | ++ Методы подгруппы. + | +|||
+ | + | + ALL + | ++ bool + | ++ Доступ ко всем методам группы. + | +
+ Ключ + | +
+ Тип
+ данных + |
+ + Описание + | +|||||
---|---|---|---|---|---|---|---|
+ objects_search + | ++ list + | ++ Список словарей, описывающих найденные объекты. + | +