# Dynamix Python SDK

- [Описание](#описание)
- [Системные требования](#системные-требования)
  - [Соответствие версий платформы версиям SDK](#соответствие-версий-платформы-версиям-sdk)
  - [Зависимости](#зависимости)
- [Установка](#установка)
- [Использование](#использование)
  - [Конфигурация](#конфигурация)
  - [Функциональный интерфейс](#функциональный-интерфейс)
    - [Вызов функции](#вызов-функции)
    - [Результат выполнения функции](#результат-выполнения-функции)
    - [Соответствие названий](#соответствие-названий)
  - [Типы данных SDK](#типы-данных-sdk)
  - [Ошибки и исключения (exceptions)](#ошибки-и-исключения-exceptions)
    - [Ошибки валидации данных](#ошибки-валидации-данных)
    - [Ошибки HTTP](#ошибки-http)
    - [Ошибка несовместимости c API](#ошибка-несовместимости-с-api)
- [Доступная функциональность](#доступная-функциональность)
  - [Способы авторизации](#способы-авторизации)
  - [Функции API](#функции-api)
    - [Cloudapi](#cloudapi)
    - [Cloudbroker](#cloudbroker)
    - [System](#system)

## Описание

**Dynamix Python SDK** предоставляет удобный интерфейс для интеграции взаимодействия с API **Dynamix Enterprise** в программный код на языке Python.

**Примечание:** проект находится в стадии активной разработки, [доступная функциональность](#доступная-функциональность) будет расширяться с каждой новой версией.

## Системные требования

### Соответствие версий платформы версиям SDK

| Версия платформы | Версия SDK |
| --- | --- |
| 4.6.0 | 1.5.x |
| 4.5.0 | 1.4.x |
| 4.4.0 | 1.3.x |
| 4.4.0 build 963 | 1.2.x |
| 4.3.0 | 1.1.x |
| 4.2.0 | 1.0.x |

### Зависимости

Зависимости указаны в конфигурационном файле проекта [pyproject.toml](/pyproject.toml):
  - версия Python: раздел `[project]`, ключ `requires-python`
  - библиотеки: раздел `[project]`, ключ `dependencies`

**Важно:** использование более поздних версий Python и/или библиотек допустимо, но работоспособность не гарантируется, так как зависит от обратной совместимости с указанными версиями.

## Установка

Установка с помощью системы управления пакетами Python (pip), где `version` - тег с номером версии SDK (см. доступные теги в репозитории):
```sh
pip install git+https://repository.basistech.ru/BASIS/dynamix-python-sdk.git@version
```

Посмотреть версию установленного пакета:
```sh
pip show dynamix-sdk
```

## Использование

### Конфигурация

Для работы с SDK необходимо создать экземпляр класса **Dynamix**, конструктор которого принимает на вход параметры конфигурации SDK.

<details><summary>Авторизация с JWT</summary>

```python
from dynamix_sdk import Dynamix


JWT = '...'

dx = Dynamix(
    url='https://...',
    auth=JWT,
)
```

</details>

<details><summary>Авторизация через DECS3O</summary>

```python
from dynamix_sdk import Dynamix, DECS3OAuth


dx = Dynamix(
    url='https://...',
    auth=DECS3OAuth(
        url='https://...',
        client_id='...',
        client_secret='...',
    ),
)
```

</details>

<details><summary>Авторизация через BVS</summary>

```python
from dynamix_sdk import Dynamix, BVSAuth


dx = Dynamix(
    url='https://...',
    auth=BVSAuth(
        url='https://...',
        domain='...',
        client_id='...',
        client_secret='...',
        username='...',
        password='...',
    ),
)
```

</details>

<details><summary>Задание декораторов для всех вызываемых функций</summary>

```python
from dynamix_sdk import Dynamix


Dynamix(
    ...,
    f_decorators=[decorator_1, decorator_2],
)
```

Декораторы будут применяться к вызываемым функциям SDK в обратном порядке, то есть сначала будет применяться декоратор <code>decorator_2</code>, а потом <code>decorator_1</code>.

**Важно:** декораторы должны соответствовать аннотации параметра, то есть оставлять без изменений параметры и тип возвращаемого значения функции, иначе применение декораторов приведёт к некорректной работе SDK.

</details>

<details><summary>Настройка повторных попыток при 503</summary>

По умолчанию SDK при получении кода ответа 503 производит 10 повторных попыток с интервалом 5 секунд. Данное поведение можно скорректировать:

```python
from dynamix_sdk import Dynamix, DECS3OAuth, BVSAuth

# Для HTTP-запросов к Dynamix
Dynamix(
    ...,
    http503_attempts = 10,  # количество повторных попыток при 503
    http503_attempts_interval = 5,  # интервал в секундах между повторными попытками
)

# Для HTTP-запросов к DECS3O
DECS3OAuth(
    ...,
    http503_attempts = 10,  # количество повторных попыток при 503
    http503_attempts_interval = 5,  # интервал в секундах между повторными попытками
)

# Для HTTP-запросов к BVS
BVSAuth(
    ...,
    http503_attempts = 10,  # количество повторных попыток при 503
    http503_attempts_interval = 5,  # интервал в секундах между повторными попытками
)

```

</details>

<details><summary>Отключение проверки сертификата SSL</summary>

**Важно:** отключение проверки сертификата SSL даёт возможность произвести атаку типа MitM, поэтому пользоваться данной возможостью допустимо только в защищённой среде.

```python
import urllib3

from dynamix_sdk import Dynamix, DECS3OAuth, BVSAuth


urllib3.disable_warnings()  # отключение вывода предупреждений безопасности SSL


# Для HTTP-запросов к Dynamix
Dynamix(
    ...,
    verify_ssl=False, # отключение проверки сертификата SSL
)

# Для HTTP-запросов к DECS3O
DECS3OAuth(
    ...,
    verify_ssl=False,  # отключение проверки сертификата SSL
)

# Для HTTP-запросов к BVS
BVSAuth(
    ...,
    verify_ssl=False,  # отключение проверки сертификата SSL
)

```

</details>

<details><summary>Игнорирование проверки совместимости с API</summary>

**Важно:** игнорирование проверки совместимости с API может вызвать непредвиденные ошибки в работе SDK, поэтому использование данной возможности допустимо только принимая на себя всю ответственность за возможные последствия.

При игнорирование выводится только сообщение с предупреждением о несовместимости.

```python
from dynamix_sdk import Dynamix


Dynamix(
    ...,
    ignore_api_compatibility=True,
)
```

</details>

### Функциональный интерфейс

Функциональный интерфейс предоставляет функции, соответствующие функциям API платформы.

#### Вызов функции

<details><summary>Выбор функции, передача параметров и сохранение результата</summary>

![](/demo/select_api_function_and_passing_params_and_save_result.gif)

Предусмотрена возможность использования сокращённого названия для некоторых часто используемых атрибутов:

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/kvmx86/create
dx.api.ca.kvmx86.create(...)  # ca = cloudapi

# /cloudbroker/account/create
dx.api.cb.account.create(...)  # cb = cloudbroker

# /system/usermanager/whoami
dx.api.sys.usermanager.whoami(...)  # sys = system
```

</details>

<details><summary>Передача вложенных параметров </summary>

```python
from dynamix_sdk import Dynamix, types as sdk_types


dx = Dynamix(...)

data_disk_1 = sdk_types.DiskAPIParamsNM(name='data_disk_1', size_gb=10)

# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(
    rg_id=123,
    name='new_vm',
    cpu_count=1,
    ram_size_mb=1024,
    image_id=456,
    data_disks=[data_disk_1],
)
```

</details>

<details><summary>Передача параметров перечисляемого типа (enum) </summary>

```python
from dynamix_sdk import Dynamix, types as sdk_types


dx = Dynamix(...)

# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(
    rg_id=123,
    name='new_vm',
    cpu_count=1,
    ram_size_mb=1024,
    image_id=456,
    chipset=sdk_types.Chipset.Q35, # enum
    numa_affinity=sdk_types.NumaAffinity.NONE,  # enum
)

```

</details>

#### Результат выполнения функции

Тип данных, возвращаемый функцией API SDK зависит от типа данных, возвращаемого соответствующей функцией API платформы.

Если функция API платформы возвращает структуру данных в виде набора пар ключ/значение (с заранее известными ключами), то функция API SDK возвращает модель Pydantic, которая описывает эту структуру.

<details><summary>Модель</summary>

```python
import pydantic
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/get
get_result = dx.api.cloudapi.compute.get(vm_id=1)

print(type(get_result))  # <class '....CloudapiComputeGetResultModel'>

print(isinstance(get_result, pydantic.BaseModel))  # True

```

</details>

<details><summary>Обращение к полю модели</summary>

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/get
vm_name = dx.api.cloudapi.compute.get(vm_id=1).name

```

</details>

Вложенные структуры данных также представлены в виде моделей Pydantic:

<details><summary>Вложенная модель</summary>

```python
import pydantic
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/get
vm_disk1 = dx.api.cloudapi.compute.get(vm_id=1).disks[0]

print(type(vm_disk1))  # <class '....DiskAPIResultNM'>

print(isinstance(vm_disk1, pydantic.BaseModel))  # True

```

</details>

<details><summary>Обращение к полю вложенной модели</summary>

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/get
vm_disk1_id = dx.api.cloudapi.compute.get(vm_id=1).disks[0].id

```

</details>

Некоторые поля моделей автоматически генерируются на основе полученных данных от API платформы.<br>
Например, при наличии в модели поля, содержащего временную метку (timestamp), для удобства генерируется поле, содержащее дату и время в виде `datetime`.

<details><summary>Генерируемое поле</summary>

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/get
get_result = dx.api.cloudapi.compute.get(vm_id=1)

# Поле, возвращаемое платформой
print(type(get_result.created_timestamp))  # <class 'int'>

# Генерируемое поле
print(type(get_result.created_datetime))  # <class 'datetime.datetime'>

```

</details>

Если функция API платформы возвращает примитивный тип данных (строка, число), то функция API SDK возвращает экземпляр класса, наследуемый от класса этого типа данных.

<details><summary>Класс, наследуемый от примитивного типа данных</summary>

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(...)

print(type(new_vm_id))  # <class '....CloudapiKvmx86CreateResultInt'>

print(isinstance(new_vm_id, int))  # True

```

</details>

Исключением является булев тип данных. Так как наследование от класса `bool` в Python недопустимо, функция API SDK возвращает экземпляр класса, который обладает функциональностью для использования в булевых выражениях (реализован метод `__bool__`), но само булево значение хранится в атрибуте `value`:

<details><summary>Класс с булевым значением</summary>

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/delete
delete_result = dx.api.cloudapi.compute.delete(vm_id=1)

print(type(delete_result))  # <class '....CloudapiComputeDeleteResultBool'>
print(type(delete_result.value))  # <class 'bool'>

```

Использование в булевом выражении:

```python
from dynamix_sdk import Dynamix


dx = Dynamix(...)

# /cloudapi/compute/delete
if dx.api.cloudapi.compute.delete(vm_id=1):
    print('The VM has been deleted.')

```

</details>

Все объекты, возвращаемые функциями API SDK, обладают общими специальными атрибутами:

| Атрибут | Описание |
| --- | --- |
| `_api_params` | Модель Pydantic, описывающая параметры, переданные в функцию. |
| `_http_response` | HTTP-ответ API платформы в виде экземпляра класса `requests.Response`. |

#### Соответствие названий

В SDK названия из API платформы приведены к стилю "snake_case", принятому в Python, а в некоторых случаях имеют иные отличия, при этом сохраняя смысл исходного названия в API платформы.

Для соответствия названий в SDK используются таблицы соответствия, с помощью которых можно узнать исходное название в API платформы.
<br>Каждая такая таблица хранится в виде словаря в файле YAML:
- [api/path_mapping.yml](/src/dynamix_sdk/api/path_mapping.yml) - таблица соответствия названий частей маршрута (URL path) к функции API.
<br>Данная таблица содержит только те названия, которые отличаются от названий в API платформы.

- [api/name_mapping.yml](/src/dynamix_sdk/api/name_mapping.yml) - таблица соответствия названий параметров функций и полей возвращаемых данных.
<br>Данная таблица содержит все названия, в том числе и те, которые совпадают с названиями в API платформы.
<br>Кроме общих соответствий, данная таблица также содержит индивидуальные соответствия, которые применяются только к классу модели, указанному в формате `sdk_name__model_class_name`.

### Типы данных SDK

Все типы данных (классы) SDK, которые могут пригодиться при разработке ПО с использованием SDK, доступны через модуль `dynamix_sdk.types`.

### Ошибки и исключения (exceptions)

SDK может вызывать исключения, которые должны быть обработаны в соответствии с требованиями к разрабатываемому вами ПО.

#### Ошибки валидации данных

SDK производит валидацию параметров функций API с помощью библиотеки **Pydantic**.<br>
Поэтому, при ошибке валидации, будет вызвано исключение `pydantic.ValidationError`.

Таким же образом валидируются данные HTTP-ответов API платформы. Причиной ошибки валидации данных HTTP-ответа API платформы может быть:
1. Несоответствие версии SDK и версии платформы.
1. Программная ошибка, допущенная при разработке SDK или платформы. Получить подтверждение наличия такой ошибки, а также ускорить её устранение, можно сообщив о ней.

Получить подробную информацию об исключении `pydantic.ValidationError` можно [в соответствующем разделе официальной документации Pydantic](https://docs.pydantic.dev/latest/errors/errors/) (ссылка ведёт на документацию для последней версии, поэтому важно выбрать версию, соответствующую используемой в SDK).

#### Ошибки HTTP

SDK для выполнения HTTP-запросов использует библиотеку **Requests**.<br>
Поэтому, при ошибке HTTP-подключения, будет вызвано соответствующее исключение библиотеки **Requests**.

Для проверки соответствует ли код ответа успешному выполнению запроса, SDK вызывает метод `requests.Response.raise_for_status()`, поэтому при неуспешном HTTP-запросе также будет вызвано исключение библиотеки **Requests**.

**Примечание:** если код ответа 503, то SDK предпримет несколько повторных попыток. Подробнее в разделе [Конфигурация](#конфигурация).

<details><summary>Обработка ошибок HTTP</summary>

```python
from requests.exceptions import RequestException, HTTPError
from dynamix_sdk import Dynamix

try:
    dx = Dynamix(...) # происходит HTTP-запрос для проверки совместимости с API
except HTTPError as e:
    resp = e.response
    print(f'{e}: {resp.text}')
except RequestException as e:
    print(e)

vm_id = 1

try:
    get_result = dx.api.cloudapi.compute.get(vm_id=vm_id)
except HTTPError as e:
    resp = e.response
    if resp.status_code == 404:
        print(f'The VM ID={vm_id} not found.')
    else:
        print(f'{e}: {resp.text}')
except RequestException as e:
    print(e)

```

</details>

Подробную информацию об исключениях библиотеки **Requests** можно получить в [соответствующем разделе официальной документации Requests](https://requests.readthedocs.io/en/latest/user/quickstart/#errors-and-exceptions).

<details><summary>Использование исключения SDK</summary>

Для возможности получать дополнительную информацию о функциях SDK при ошибках HTTP-запросов, в SDK есть возможность оборачивать все исключения <code>requests.exceptions.RequestException</code> в исключение <code>dynamix_sdk.exceptions.RequestException</code>:

```python
class RequestException(Exception):
    orig_exception: requests.exceptions.RequestException
    func_name: str
    func_kwargs: None | dict = None
    status_code: None | int = None
```

Чтобы включить использование исключения <code>dynamix_sdk.exceptions.RequestException</code>, необходимо передать в конструкторы классов <code>Dynamix</code>, <code>DECS3OAuth</code>, <code>BVSAuth</code> параметр <code>wrap_request_exceptions=True</code>
</details>

#### Ошибка несовместимости с API
При создании экземпляра класса `Dynamix`, SDK производит проверку совместимости с API.
При несовместимости будет вызвано исключение `exceptions.IncompatibleAPIError`.

## Доступная функциональность

### Способы авторизации

- с JWT
- через DECS3O
- через BVS

Подробнее в разделе [Конфигурация](#конфигурация).

### Функции API

#### Cloudapi

<details><summary>account</summary>

- /cloudapi/account/addUser
- /cloudapi/account/delete
- /cloudapi/account/deleteUser
- /cloudapi/account/disable
- /cloudapi/account/enable
- /cloudapi/account/get
- /cloudapi/account/getResourceConsumption
- /cloudapi/account/list
- /cloudapi/account/listDeleted
- /cloudapi/account/restore
- /cloudapi/account/update
- /cloudapi/account/updateUser

</details>

<details><summary>audit</summary>

- /cloudapi/audit/get
- /cloudapi/audit/list

</details>

<details><summary>bservice</summary>

- /cloudapi/bservice/create
- /cloudapi/bservice/delete
- /cloudapi/bservice/disable
- /cloudapi/bservice/enable
- /cloudapi/bservice/get
- /cloudapi/bservice/groupAdd
- /cloudapi/bservice/groupComputeRemove
- /cloudapi/bservice/groupGet
- /cloudapi/bservice/groupParentAdd
- /cloudapi/bservice/groupParentRemove
- /cloudapi/bservice/groupRemove
- /cloudapi/bservice/groupStart
- /cloudapi/bservice/groupStop
- /cloudapi/bservice/groupUpdate
- /cloudapi/bservice/groupUpdateExtnet
- /cloudapi/bservice/groupUpdateVins
- /cloudapi/bservice/list
- /cloudapi/bservice/listDeleted
- /cloudapi/bservice/migrateToZone
- /cloudapi/bservice/restore
- /cloudapi/bservice/snapshotCreate
- /cloudapi/bservice/snapshotDelete
- /cloudapi/bservice/snapshotList
- /cloudapi/bservice/snapshotRollback
- /cloudapi/bservice/start
- /cloudapi/bservice/stop

</details>

<details><summary>compute</summary>

- /cloudapi/compute/abort_shared_snapshot_merge
- /cloudapi/compute/affinityLabelRemove
- /cloudapi/compute/affinityLabelSet
- /cloudapi/compute/affinityRelations
- /cloudapi/compute/affinityRuleAdd
- /cloudapi/compute/affinityRuleRemove
- /cloudapi/compute/affinityRulesClear
- /cloudapi/compute/antiAffinityRuleAdd
- /cloudapi/compute/antiAffinityRuleRemove
- /cloudapi/compute/antiAffinityRulesClear
- /cloudapi/compute/attachGpu
- /cloudapi/compute/attachPciDevice
- /cloudapi/compute/bootDiskSet
- /cloudapi/compute/cdEject
- /cloudapi/compute/cdInsert
- /cloudapi/compute/changeMac
- /cloudapi/compute/change_mtu
- /cloudapi/compute/change_security_groups
- /cloudapi/compute/changeIp
- /cloudapi/compute/changeLinkState
- /cloudapi/compute/clone
- /cloudapi/compute/createTemplate
- /cloudapi/compute/delete
- /cloudapi/compute/deleteCustomFields
- /cloudapi/compute/detachGpu
- /cloudapi/compute/detachPciDevice
- /cloudapi/compute/disable
- /cloudapi/compute/diskAdd
- /cloudapi/compute/diskAttach
- /cloudapi/compute/diskDel
- /cloudapi/compute/diskDetach
- /cloudapi/compute/diskMigrate
- /cloudapi/compute/diskSwitchToReplication
- /cloudapi/compute/enable
- /cloudapi/compute/get
- /cloudapi/compute/getConsoleUrl
- /cloudapi/compute/guest_agent_disable
- /cloudapi/compute/guest_agent_enable
- /cloudapi/compute/guest_agent_execute
- /cloudapi/compute/guest_agent_feature_update
- /cloudapi/compute/list
- /cloudapi/compute/listDeleted
- /cloudapi/compute/migrateToZone
- /cloudapi/compute/moveToRg
- /cloudapi/compute/netAttach
- /cloudapi/compute/netDetach
- /cloudapi/compute/pause
- /cloudapi/compute/pfwAdd
- /cloudapi/compute/pfwDel
- /cloudapi/compute/pfwList
- /cloudapi/compute/pin_to_node
- /cloudapi/compute/powerCycle
- /cloudapi/compute/reboot
- /cloudapi/compute/redeploy
- /cloudapi/compute/reset
- /cloudapi/compute/resize
- /cloudapi/compute/restore
- /cloudapi/compute/resume
- /cloudapi/compute/setCustomFields
- /cloudapi/compute/snapshotCreate
- /cloudapi/compute/snapshotList
- /cloudapi/compute/snapshotRollback
- /cloudapi/compute/start
- /cloudapi/compute/stop
- /cloudapi/compute/tagAdd
- /cloudapi/compute/tagRemove
- /cloudapi/compute/unpin_from_node
- /cloudapi/compute/update
- /cloudapi/compute/userGrant
- /cloudapi/compute/userList
- /cloudapi/compute/userRevoke
- /cloudapi/compute/userUpdate

</details>

<details><summary>disks</summary>

- /cloudapi/disks/change_disk_storage_policy
- /cloudapi/disks/create
- /cloudapi/disks/delete
- /cloudapi/disks/deleteDisks
- /cloudapi/disks/get
- /cloudapi/disks/limitIO
- /cloudapi/disks/list
- /cloudapi/disks/listDeleted
- /cloudapi/disks/listUnattached
- /cloudapi/disks/rename
- /cloudapi/disks/resize2
- /cloudapi/disks/restore
- /cloudapi/disks/share
- /cloudapi/disks/snapshotDelete
- /cloudapi/disks/snapshotRollback
- /cloudapi/disks/unshare

</details>

<details><summary>dpdknet</summary>

- /cloudapi/dpdknet/get
- /cloudapi/dpdknet/list

</details>

<details><summary>extnet</summary>

- /cloudapi/extnet/get
- /cloudapi/extnet/getDefault
- /cloudapi/extnet/list

</details>

<details><summary>flipgroup</summary>

- /cloudapi/flipgroup/computeAdd
- /cloudapi/flipgroup/computeRemove
- /cloudapi/flipgroup/create
- /cloudapi/flipgroup/delete
- /cloudapi/flipgroup/edit
- /cloudapi/flipgroup/get
- /cloudapi/flipgroup/list

</details>

<details><summary>image</summary>

- /cloudapi/image/change_storage_policy
- /cloudapi/image/create
- /cloudapi/image/createVirtual
- /cloudapi/image/delete
- /cloudapi/image/get
- /cloudapi/image/link
- /cloudapi/image/list
- /cloudapi/image/rename

</details>

<details><summary>k8ci</summary>

- /cloudapi/k8ci/get
- /cloudapi/k8ci/list
- /cloudapi/k8ci/listDeleted

</details>

<details><summary>k8s</summary>

- /cloudapi/k8s/create
- /cloudapi/k8s/delete
- /cloudapi/k8s/deleteMasterFromGroup
- /cloudapi/k8s/deleteWorkerFromGroup
- /cloudapi/k8s/disable
- /cloudapi/k8s/enable
- /cloudapi/k8s/get
- /cloudapi/k8s/getConfig
- /cloudapi/k8s/getNodeAnnotations
- /cloudapi/k8s/getNodeLabels
- /cloudapi/k8s/getNodeTaints
- /cloudapi/k8s/list
- /cloudapi/k8s/listDeleted
- /cloudapi/k8s/migrateToZone
- /cloudapi/k8s/restore
- /cloudapi/k8s/start
- /cloudapi/k8s/stop
- /cloudapi/k8s/update
- /cloudapi/k8s/updateWorkerNodesMetaData
- /cloudapi/k8s/workerReset
- /cloudapi/k8s/workerRestart
- /cloudapi/k8s/workersGroupAdd
- /cloudapi/k8s/workersGroupDelete
- /cloudapi/k8s/workersGroupGetByName

</details>

<details><summary>kvmx86</summary>

- /cloudapi/kvmx86/create
- /cloudapi/kvmx86/createBlank

</details>

<details><summary>lb</summary>

- /cloudapi/lb/backendCreate
- /cloudapi/lb/backendDelete
- /cloudapi/lb/backendServerAdd
- /cloudapi/lb/backendServerDelete
- /cloudapi/lb/backendServerUpdate
- /cloudapi/lb/backendUpdate
- /cloudapi/lb/configReset
- /cloudapi/lb/create
- /cloudapi/lb/delete
- /cloudapi/lb/disable
- /cloudapi/lb/enable
- /cloudapi/lb/frontendBind
- /cloudapi/lb/frontendBindDelete
- /cloudapi/lb/frontendBindingUpdate
- /cloudapi/lb/frontendCreate
- /cloudapi/lb/frontendDelete
- /cloudapi/lb/get
- /cloudapi/lb/list
- /cloudapi/lb/listDeleted
- /cloudapi/lb/makeHighlyAvailable
- /cloudapi/lb/migrateToZone
- /cloudapi/lb/restart
- /cloudapi/lb/restore
- /cloudapi/lb/start
- /cloudapi/lb/stop
- /cloudapi/lb/update
- /cloudapi/lb/updateSysctlParams

</details>

<details><summary>locations</summary>

- /cloudapi/locations/getUrl
- /cloudapi/locations/list

</details>

<details><summary>pcidevice</summary>

- /cloudapi/pcidevice/list

</details>

<details><summary>rg</summary>

- /cloudapi/rg/accessGrant
- /cloudapi/rg/accessRevoke
- /cloudapi/rg/add_storage_policy
- /cloudapi/rg/create
- /cloudapi/rg/del_storage_policy
- /cloudapi/rg/delete
- /cloudapi/rg/disable
- /cloudapi/rg/enable
- /cloudapi/rg/get
- /cloudapi/rg/getResourceConsumption
- /cloudapi/rg/list
- /cloudapi/rg/listDeleted
- /cloudapi/rg/removeDefNet
- /cloudapi/rg/restore
- /cloudapi/rg/setDefNet
- /cloudapi/rg/update

</details>

<details><summary>security_group</summary>

- /cloudapi/security_group/get
- /cloudapi/security_group/create
- /cloudapi/security_group/create_rule
- /cloudapi/security_group/delete
- /cloudapi/security_group/delete_rule
- /cloudapi/security_group/list
- /cloudapi/security_group/update

</details>

<details><summary>sep</summary>

- /cloudapi/sep/listAvailableSepAndPools

</details>

<details><summary>storage_policy</summary>

- /cloudapi/storage_policy/get
- /cloudapi/storage_policy/list

</details>

<details><summary>tasks</summary>

- /cloudapi/tasks/get
- /cloudapi/tasks/list

</details>

<details><summary>trunk</summary>

- /cloudapi/trunk/get
- /cloudapi/trunk/list

</details>

<details><summary>user</summary>

- /cloudapi/user/apiList
- /cloudapi/user/brief
- /cloudapi/user/get
- /cloudapi/user/getResourceConsumption
- /cloudapi/user/setData

</details>

<details><summary>vfpool</summary>

- /cloudapi/vfpool/get
- /cloudapi/vfpool/list

</details>

<details><summary>vgpu</summary>

- /cloudapi/vgpu/list

</details>

<details><summary>vins</summary>

- /cloudapi/vins/createInAccount
- /cloudapi/vins/createInRG
- /cloudapi/vins/delete
- /cloudapi/vins/disable
- /cloudapi/vins/dnsApply
- /cloudapi/vins/enable
- /cloudapi/vins/extNetConnect
- /cloudapi/vins/extNetDisconnect
- /cloudapi/vins/extNetList
- /cloudapi/vins/get
- /cloudapi/vins/ipList
- /cloudapi/vins/ipRelease
- /cloudapi/vins/ipReserve
- /cloudapi/vins/list
- /cloudapi/vins/listDeleted
- /cloudapi/vins/migrateToZone
- /cloudapi/vins/natRuleAdd
- /cloudapi/vins/natRuleDel
- /cloudapi/vins/natRuleList
- /cloudapi/vins/restore
- /cloudapi/vins/staticRouteAdd
- /cloudapi/vins/staticRouteDel
- /cloudapi/vins/staticRouteList
- /cloudapi/vins/vnfdevRedeploy
- /cloudapi/vins/vnfdevRestart

</details>

<details><summary>zone</summary>

- /cloudapi/zone/get
- /cloudapi/zone/list

</details>

#### Cloudbroker

<details><summary>account</summary>

- /cloudbroker/account/add_storage_policy
- /cloudbroker/account/addUser
- /cloudbroker/account/addZone
- /cloudbroker/account/create
- /cloudbroker/account/del_storage_policy
- /cloudbroker/account/delete
- /cloudbroker/account/deleteAccounts
- /cloudbroker/account/deleteUser
- /cloudbroker/account/disable
- /cloudbroker/account/disableAccounts
- /cloudbroker/account/enable
- /cloudbroker/account/enableAccounts
- /cloudbroker/account/get
- /cloudbroker/account/getResourceConsumption
- /cloudbroker/account/list
- /cloudbroker/account/listDeleted
- /cloudbroker/account/removeZone
- /cloudbroker/account/restore
- /cloudbroker/account/setCpuAllocationParameter
- /cloudbroker/account/setCpuAllocationRatio
- /cloudbroker/account/update
- /cloudbroker/account/updateComputeFeatures
- /cloudbroker/account/updateResourceTypes
- /cloudbroker/account/updateUser

</details>

<details><summary>audit</summary>

- /cloudbroker/audit/list

</details>

<details><summary>compute</summary>

- /cloudbroker/compute/change_read_only
- /cloudbroker/compute/change_security_groups
- /cloudbroker/compute/clone
- /cloudbroker/compute/migrate_storage_list
- /cloudbroker/compute/start_migration_in
- /cloudbroker/compute/start_migration_out
- /cloudbroker/compute/stop_migration_in
- /cloudbroker/compute/stop_migration_out

</details>

<details><summary>disks</summary>

- /cloudbroker/disks/migrate
- /cloudbroker/disks/migrate_abort
- /cloudbroker/disks/migrate_status

</details>

<details><summary>image</summary>

- /cloudbroker/image/change_storage_policy

</details>

<details><summary>node</summary>

- /cloudbroker/node/add_ssh_identity
- /cloudbroker/node/get_ssh_identity
- /cloudbroker/node/update_description

</details>

<details><summary>rg</summary>

- /cloudbroker/rg/add_storage_policy
- /cloudbroker/rg/del_storage_policy

</details>

<details><summary>security_group</summary>

- /cloudbroker/security_group/create
- /cloudbroker/security_group/create_rule
- /cloudbroker/security_group/delete
- /cloudbroker/security_group/delete_rule
- /cloudbroker/security_group/get
- /cloudbroker/security_group/list
- /cloudbroker/security_group/update

</details>

<details><summary>storage_policy</summary>

- /cloudbroker/storage_policy/add_pool
- /cloudbroker/storage_policy/create
- /cloudbroker/storage_policy/delete
- /cloudbroker/storage_policy/delete_pool
- /cloudbroker/storage_policy/disable
- /cloudbroker/storage_policy/enable
- /cloudbroker/storage_policy/get
- /cloudbroker/storage_policy/list
- /cloudbroker/storage_policy/update

</details>

<details><summary>user</summary>

- /cloudbroker/user/block
- /cloudbroker/user/create
- /cloudbroker/user/get
- /cloudbroker/user/list
- /cloudbroker/user/unblock

</details>

<details><summary>vins</summary>

- /cloudbroker/vins/update

</details>

<details><summary>vnfdev</summary>

- /cloudbroker/vnfdev/migrate_abort

</details>

#### System

<details><summary>info</summary>

- /system/info/version

</details>

<details><summary>usermanager</summary>

- /system/usermanager/whoami

</details>
