# Dynamix Python SDK
- [Описание](#описание)
- [Системные требования](#системные-требования)
- [Соответствие версий платформы версиям SDK](#соответствие-версий-платформы-версиям-sdk)
- [Зависимости](#зависимости)
- [Установка](#установка)
- [Использование](#использование)
- [Конфигурация](#конфигурация)
- [Функциональный интерфейс](#функциональный-интерфейс)
- [Вызов функции](#вызов-функции)
- [Результат выполнения функции](#результат-выполнения-функции)
- [Соответствие названий](#соответствие-названий)
- [Типы данных SDK](#типы-данных-sdk)
- [Ошибки и исключения (exceptions)](#ошибки-и-исключения-exceptions)
- [Ошибки валидации данных](#ошибки-валидации-данных)
- [Ошибки HTTP](#ошибки-http)
- [Доступный функционал](#доступный-функционал)
- [Способы авторизации](#способы-авторизации)
- [Функции API](#функции-api)
- [Cloudapi](#cloudapi)
- [System](#system)
## Описание
**Dynamix Python SDK** предоставляет удобный интерфейс для интеграции взаимодействия с API **Dynamix Enterprise** в программный код на языке Python.
**Примечание:** проект находится в стадии активной разработки, [доступный функционал](#доступный-функционал) будет расширяться с каждой новой версией.
## Системные требования
### Соответствие версий платформы версиям SDK
| Версия платформы | Версия SDK |
| --- | --- |
| 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.
Авторизация с JWT
```python
from dynamix_sdk import Dynamix
JWT = '...'
dx = Dynamix(
url='https://...',
auth=JWT,
)
```
Авторизация через DECS3O
```python
from dynamix_sdk import Dynamix, DECS3OAuth
dx = Dynamix(
url='https://...',
auth=DECS3OAuth(
url='https://...',
client_id='...',
client_secret='...',
),
)
```
Авторизация через BVS
```python
from dynamix_sdk import Dynamix, BVSAuth
dx = Dynamix(
url='https://...',
auth=BVSAuth(
url='https://...',
domain='...',
client_id='...',
client_secret='...',
username='...',
password='...',
),
)
```
Настройка повторных попыток при 503
По умолчанию 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, # интервал в секундах между повторными попытками
)
```
Отключение проверки сертификата SSL
**Важно:** отключение проверки сертификата 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
)
```
### Функциональный интерфейс
Функциональный интерфейс предоставляет функции, соответствующие функциям API платформы.
#### Вызов функции
Выбор функции, передача параметров и сохранение результата

Передача вложенных параметров
```python
from dynamix_sdk import Dynamix, types
dx = Dynamix(...)
data_disk_1 = types.DiskAPIParamsNM(name='data_disk_1', size=10)
# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(
rg_id=123,
name='new_vm',
cpu=1,
ram=1024,
image_id=456,
data_disks=[data_disk_1],
)
```
Передача параметров перечисляемого типа (enum)
```python
from dynamix_sdk import Dynamix, types
dx = Dynamix(...)
# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(
rg_id=123,
name='new_vm',
cpu=1,
ram=1024,
image_id=456,
chipset=types.Chipset.Q35, # enum
numa_affinity=types.NumaAffinity.none, # enum
)
```
#### Результат выполнения функции
Тип данных, возвращаемый функцией API SDK зависит от типа данных, возвращаемого соответствующей функцией API платформы.
Если функция API платформы возвращает структуру данных в виде набора пар ключ/значение (с заранее известными ключами), то функция API SDK возвращает модель Pydantic, которая описывает эту структуру.
Модель
```python
import pydantic
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/get
get_result = dx.api.cloudapi.compute.get(compute_id=1)
print(type(get_result)) #
print(isinstance(get_result, pydantic.BaseModel)) # True
```
Обращение к полю модели
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/get
vm_name = dx.api.cloudapi.compute.get(compute_id=1).name
```
Вложенные структуры данных также представлены в виде моделей Pydantic:
Вложенная модель
```python
import pydantic
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/get
vm_disk1 = dx.api.cloudapi.compute.get(compute_id=1).disks[0]
print(type(vm_disk1)) #
print(isinstance(vm_disk1, pydantic.BaseModel)) # True
```
Обращение к полю вложенной модели
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/get
vm_disk1_id = dx.api.cloudapi.compute.get(compute_id=1).disks[0].id
```
Некоторые поля моделей автоматически генерируются на основе полученных данных от API платформы.
Например, при наличии в модели поля, содержащего временную метку (timestamp), для удобства генерируется поле, содержащее дату и время в виде `datetime`.
Генерируемое поле
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/get
get_result = dx.api.cloudapi.compute.get(compute_id=1)
# Поле, возвращаемое платформой
print(type(get_result.created_timestamp)) #
# Генерируемое поле
print(type(get_result.created_datetime)) #
```
Если функция API платформы возвращает примитивный тип данных (строка, число), то функция API SDK возвращает экземпляр класса, наследуемый от класса этого типа данных.
Класс, наследуемый от примитивного типа данных
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/kvmx86/create
new_vm_id = dx.api.cloudapi.kvmx86.create(...)
print(type(new_vm_id)) #
print(isinstance(new_vm_id, int)) # True
```
Исключением является булев тип данных. Так как наследование от класса `bool` в Python недопустимо, функция API SDK возвращает экземпляр класса, который обладает функциональностью для использования в булевых выражениях (реализован метод `__bool__`), но само булево значение хранится в атрибуте `value`:
Класс с булевым значением
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/delete
delete_result = dx.api.cloudapi.compute.delete(compute_id=1)
print(type(delete_result)) #
print(type(delete_result.value)) #
```
Использование в булевом выражении:
```python
from dynamix_sdk import Dynamix
dx = Dynamix(...)
# /cloudapi/compute/delete
if dx.api.cloudapi.compute.delete(compute_id=1):
print('The VM has been deleted.')
```
Все объекты, возвращаемые функциями API SDK, обладают общими специальными атрибутами:
| Атрибут | Описание |
| --- | --- |
| `_api_params` | Модель Pydantic, описывающая параметры, переданные в функцию. |
| `_http_response` | HTTP-ответ API платформы в виде экземпляра класса `requests.Response`. |
#### Соответствие названий
В SDK названия из API платформы приведены к стилю "snake_case", принятому в Python, а в некоторых случаях имеют иные отличия, при этом сохраняя смысл исходного названия в API платформы.
Для соответствия названий в SDK используются таблицы соответствия, с помощью которых можно узнать исходное название в API платформы.
Каждая такая таблица хранится в виде словаря в файле YAML:
- [api/path_mapping.yml](/src/dynamix_sdk/api/path_mapping.yml) - таблица соответствия названий частей маршрута (URL path) к функции API.
Данная таблица содержит только те названия, которые отличаются от названий в API платформы.
- [api/name_mapping.yml](/src/dynamix_sdk/api/name_mapping.yml) - таблица соответствия названий параметров функций и полей возвращаемых данных.
Данная таблица содержит все названия, в том числе и те, которые совпадают с названиями в API платформы.
Кроме общих соответствий, данная таблица также содержит индивидуальные соответствия, которые применяются только к классу модели, указанному в формате `sdk_name__model_class_name`.
### Типы данных SDK
Все типы данных (классы) SDK, которые могут пригодиться при разработке ПО с использованием SDK, доступны через модуль `dynamix_sdk.types`.
### Ошибки и исключения (exceptions)
SDK может вызывать исключения, которые должны быть обработаны в соответствии с требованиями к разрабатываемому вами ПО.
#### Ошибки валидации данных
SDK производит валидацию параметров функций API с помощью библиотеки **Pydantic**.
Поэтому, при ошибке валидации, будет вызвано исключение `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**.
Поэтому, при ошибке HTTP-подключения, будет вызвано соответствующее исключение библиотеки **Requests**.
Для проверки соответствует ли код ответа успешному выполнению запроса, SDK вызывает метод `requests.Response.raise_for_status()`, поэтому при неуспешном HTTP-запросе также будет вызвано исключение библиотеки **Requests**.
**Примечание:** если код ответа 503, то SDK предпримет несколько повторных попыток. Подробнее в разделе [Конфигурация](#конфигурация).
Обработка ошибок HTTP
```python
from requests.exceptions import RequestException, HTTPError
from dynamix_sdk import Dynamix
dx = Dynamix(...)
vm_id = 1
try:
get_result = dx.api.cloudapi.compute.get(compute_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)
```
Подробную информацию об исключениях библиотеки **Requests** можно получить в [соответствующем разделе официальной документации Requests](https://requests.readthedocs.io/en/latest/user/quickstart/#errors-and-exceptions).
## Доступный функционал
### Способы авторизации
- с JWT
- через DECS3O
- через BVS
Подробнее в разделе [Конфигурация](#конфигурация).
### Функции API
#### Cloudapi
account
- /cloudapi/account/addUser
- /cloudapi/account/deleteUser
- /cloudapi/account/disable
- /cloudapi/account/enable
- /cloudapi/account/updateUser
compute
- /cloudapi/compute/delete
- /cloudapi/compute/get
- /cloudapi/compute/list
- /cloudapi/compute/update
kvmx86
- /cloudapi/kvmx86/create
rg
- /cloudapi/rg/create
- /cloudapi/rg/get
- /cloudapi/rg/list
user
- /cloudapi/user/get
#### System
usermanager
- /system/usermanager/whoami