Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0903c452d9 | |||
|
|
cf584c8123 | ||
|
|
1ccc37a104 | ||
|
|
48e2b0f2f9 |
273
README.md
273
README.md
@@ -4,7 +4,11 @@ Dynamix SDK - это библиотека, написанная на языке
|
|||||||
|
|
||||||
## Версии
|
## Версии
|
||||||
|
|
||||||
- Версия 9.0.х Decort-SDK соответствует 4.1.0 версии платформы
|
- Версия 9.0.х Dynamix-SDK соответствует 4.1.0 версии платформы
|
||||||
|
- Версия 10.0.х Dynamix-SDK соответствует 4.2.0 версии платформы
|
||||||
|
- Версия 11.0.х Dynamix-SDK соответствует 4.3.0 версии платформы
|
||||||
|
- Версия 12.0.х Dynamix-SDK соответствует 4.4.0 версии платформы
|
||||||
|
- Версия 12.1.х Dynamix-SDK соответствует 4.4.0 версии платформы
|
||||||
|
|
||||||
## Оглавление
|
## Оглавление
|
||||||
|
|
||||||
@@ -74,7 +78,7 @@ Dynamix SDK - это библиотека, написанная на языке
|
|||||||
Выполните команду в терминале:
|
Выполните команду в терминале:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk/v12
|
||||||
```
|
```
|
||||||
|
|
||||||
## Список API
|
## Список API
|
||||||
@@ -83,6 +87,7 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
|||||||
|
|
||||||
- `cloudapi` - пользовательская группа, которая позволяет воспользоваться всем стардартным функционалом платформы;
|
- `cloudapi` - пользовательская группа, которая позволяет воспользоваться всем стардартным функционалом платформы;
|
||||||
- `cloudbroker` - административная группа, которая позволяет воспользоваться всем стандартным функционалом платформы и расширенными возможностями, включающими в себя управление пользователями, ресурсами, платформами размещения ресурсов и т.д.
|
- `cloudbroker` - административная группа, которая позволяет воспользоваться всем стандартным функционалом платформы и расширенными возможностями, включающими в себя управление пользователями, ресурсами, платформами размещения ресурсов и т.д.
|
||||||
|
- `sdn` - группа для работы с SDN;
|
||||||
|
|
||||||
### Cloudapi
|
### Cloudapi
|
||||||
|
|
||||||
@@ -103,11 +108,17 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
|||||||
- `KVMx86` - создание виртуальной машины x86;
|
- `KVMx86` - создание виртуальной машины x86;
|
||||||
- `LB` - управление балансировщиками нагрузки;
|
- `LB` - управление балансировщиками нагрузки;
|
||||||
- `Locations` - получение информации о grid площадки;
|
- `Locations` - получение информации о grid площадки;
|
||||||
|
- `Prometheus` - получение статистики prometheus;
|
||||||
- `RG` - управление ресурсными группами аккаунта;
|
- `RG` - управление ресурсными группами аккаунта;
|
||||||
|
- `Security group` – управление группами безопасности;
|
||||||
|
- `SEP` - управление storage endpoint (sep);
|
||||||
- `Stack` - получение информации о вычислительных узлах;
|
- `Stack` - получение информации о вычислительных узлах;
|
||||||
|
- `Storage policy` – получение информации о политиках хранения;
|
||||||
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
||||||
|
- `Trunk` - получение информации о транковых портах;
|
||||||
- `VFPool` - управление пулом виртуальных сетевых функций;
|
- `VFPool` - управление пулом виртуальных сетевых функций;
|
||||||
- `VINS` - управление виртуальными изолированными сетями.
|
- `VINS` - управление виртуальными изолированными сетями;
|
||||||
|
- `Zone` - управление зонами.
|
||||||
|
|
||||||
### Cloudbroker
|
### Cloudbroker
|
||||||
|
|
||||||
@@ -118,6 +129,7 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
|||||||
- `Audit` - получение информации о событиях системы;
|
- `Audit` - получение информации о событиях системы;
|
||||||
- `APIAccess` - управление доступом к API и его объектам;
|
- `APIAccess` - управление доступом к API и его объектам;
|
||||||
- `Backup` - управление резервным копированием;
|
- `Backup` - управление резервным копированием;
|
||||||
|
- `BService` - управление группами виртуальных машин (computes);
|
||||||
- `Compute` - управление виртуальными машинами (индивидуально);
|
- `Compute` - управление виртуальными машинами (индивидуально);
|
||||||
- `Disks` - управление виртуальными дисками;
|
- `Disks` - управление виртуальными дисками;
|
||||||
- `DPDK` - управление виртуальными сетями DPDK;
|
- `DPDK` - управление виртуальными сетями DPDK;
|
||||||
@@ -135,13 +147,24 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
|||||||
- `Prometheus` - получение статистики prometheus;
|
- `Prometheus` - получение статистики prometheus;
|
||||||
- `Resmon` - получение статистики resource monitoring;
|
- `Resmon` - получение статистики resource monitoring;
|
||||||
- `RG` - управление ресурсными группами аккаунта;
|
- `RG` - управление ресурсными группами аккаунта;
|
||||||
|
- `Security group` – управление группами безопасности;
|
||||||
- `SEP` - управление storage endpoint (sep);
|
- `SEP` - управление storage endpoint (sep);
|
||||||
- `Stack` - получение информации о вычислительных узлах;
|
- `Stack` - получение информации о вычислительных узлах;
|
||||||
|
- `Storage policy` – управление политиками хранения;
|
||||||
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
||||||
|
- `Trunk` - управление транковыми портами;
|
||||||
- `User` - управление пользователями (индивидуально);
|
- `User` - управление пользователями (индивидуально);
|
||||||
- `VGPU` - управление виртуальными графическими процессорами;
|
- `VGPU` - управление виртуальными графическими процессорами;
|
||||||
- `VFPool` - управление пулом виртуальных сетевых функций;
|
- `VFPool` - управление пулом виртуальных сетевых функций;
|
||||||
- `VINS` - управление виртуальными изолированными сетями.
|
- `VINS` - управление виртуальными изолированными сетями.
|
||||||
|
- `Zone` - управление зонами.
|
||||||
|
|
||||||
|
### SDN
|
||||||
|
|
||||||
|
`SDN` позволяет выполнять запросы к группе пользовательских конечных точек
|
||||||
|
Данная группа ручек позволяет выполнять следующие операции в платформе:
|
||||||
|
|
||||||
|
- `AccessGroup` - управление группами доступа
|
||||||
|
|
||||||
## Работа с библиотекой
|
## Работа с библиотекой
|
||||||
|
|
||||||
@@ -172,7 +195,7 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main(){
|
func main(){
|
||||||
@@ -197,7 +220,7 @@ func main(){
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -213,7 +236,7 @@ func main() {
|
|||||||
"appId": "<APP_ID>",
|
"appId": "<APP_ID>",
|
||||||
"appSecret": "<APP_SECRET>",
|
"appSecret": "<APP_SECRET>",
|
||||||
"ssoUrl": "https://sso.digitalenergy.online",
|
"ssoUrl": "https://sso.digitalenergy.online",
|
||||||
"Url": "https://mr4.digitalenergy.online",
|
"decortUrl": "https://mr4.digitalenergy.online",
|
||||||
"retries": 5,
|
"retries": 5,
|
||||||
"timeout": "5m",
|
"timeout": "5m",
|
||||||
"sslSkipVerify": false
|
"sslSkipVerify": false
|
||||||
@@ -226,7 +249,7 @@ func main() {
|
|||||||
appId: <APP_ID>
|
appId: <APP_ID>
|
||||||
appSecret: <APP_SECRET>
|
appSecret: <APP_SECRET>
|
||||||
ssoUrl: https://sso.digitalenergy.online
|
ssoUrl: https://sso.digitalenergy.online
|
||||||
Url: https://mr4.digitalenergy.online
|
decortUrl: https://mr4.digitalenergy.online
|
||||||
retries: 5
|
retries: 5
|
||||||
timeout: 5m
|
timeout: 5m
|
||||||
sslSkipVerify: false
|
sslSkipVerify: false
|
||||||
@@ -234,7 +257,7 @@ sslSkipVerify: false
|
|||||||
|
|
||||||
### Создание клиента
|
### Создание клиента
|
||||||
|
|
||||||
Создание клиента происходит с помощью функции-строителя `New` из основного пакета `dynamix-sdk`, для избежания проблем с именами, пакету можно присвоить алиас ``. Функция принимает конфигурацию, возвращает структуру `Client`, с помощью которой можно взаимодействовать с платформой.
|
Создание клиента происходит с помощью функции-строителя `New` из основного пакета `decort-sdk`, для избежания проблем с именами, пакету можно присвоить алиас `decort`. Функция принимает конфигурацию, возвращает структуру `DecortClient`, с помощью которой можно взаимодействовать с платформой.
|
||||||
|
|
||||||
### Пример
|
### Пример
|
||||||
|
|
||||||
@@ -242,8 +265,8 @@ sslSkipVerify: false
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -252,14 +275,14 @@ func main() {
|
|||||||
AppID: "<APPID>",
|
AppID: "<APPID>",
|
||||||
AppSecret: "<APPSECRET>",
|
AppSecret: "<APPSECRET>",
|
||||||
SSOURL: "https://sso.digitalenergy.online",
|
SSOURL: "https://sso.digitalenergy.online",
|
||||||
URL: "https://mr4.digitalenergy.online",
|
DecortURL: "https://mr4.digitalenergy.online",
|
||||||
Retries: 5,
|
Retries: 5,
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg.SetTimeout(5 * time.Minute)
|
cfg.SetTimeout(5 * time.Minute)
|
||||||
|
|
||||||
// Создание клиента
|
// Создание клиента
|
||||||
client := .New(cfg)
|
client := decort.New(cfg)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -269,6 +292,7 @@ func main() {
|
|||||||
|
|
||||||
- `pkg/cloudapi` - для `cloudapi`
|
- `pkg/cloudapi` - для `cloudapi`
|
||||||
- `pkg/cloudbroker` - для `cloudbroker`
|
- `pkg/cloudbroker` - для `cloudbroker`
|
||||||
|
- `pkg/sdn` - для `sdn`
|
||||||
|
|
||||||
В каждом пакете находятся пакеты групп API:
|
В каждом пакете находятся пакеты групп API:
|
||||||
|
|
||||||
@@ -287,16 +311,23 @@ func main() {
|
|||||||
- `pkg/cloudapi/kvmx86` - для `KVMX86`
|
- `pkg/cloudapi/kvmx86` - для `KVMX86`
|
||||||
- `pkg/cloudapi/lb` - для `LB`
|
- `pkg/cloudapi/lb` - для `LB`
|
||||||
- `pkg/cloudapi/locations` - для `Locations`
|
- `pkg/cloudapi/locations` - для `Locations`
|
||||||
|
- `pkg/cloudapi/prometheus` - для `Prometheus`
|
||||||
- `pkg/cloudapi/rg` - для `RG`
|
- `pkg/cloudapi/rg` - для `RG`
|
||||||
|
- `pkg/cloudapi/secgroup` - для `Security group`
|
||||||
|
- `pkg/cloudapi/sep` - для `SEP`
|
||||||
- `pkg/cloudapi/stack` - для `Stack`
|
- `pkg/cloudapi/stack` - для `Stack`
|
||||||
|
- `pkg/cloudapi/stpolicy` - для `Storage policy`
|
||||||
- `pkg/cloudapi/tasks` - для `Tasks`
|
- `pkg/cloudapi/tasks` - для `Tasks`
|
||||||
|
- `pkg/cloudapi/trunk` - для `Trunk`
|
||||||
- `pkg/cloudapi/vfpool` - для `VFPool`
|
- `pkg/cloudapi/vfpool` - для `VFPool`
|
||||||
- `pkg/cloudapi/vins` - для `VINS`
|
- `pkg/cloudapi/vins` - для `VINS`
|
||||||
|
- `pkg/cloudapi/zone` - для `Zone`
|
||||||
- **cloudbroker**:
|
- **cloudbroker**:
|
||||||
- `pkg/cloudbroker/account` - для `Account`
|
- `pkg/cloudbroker/account` - для `Account`
|
||||||
- `pkg/cloudbroker/audit` - для `Audit`
|
- `pkg/cloudbroker/audit` - для `Audit`
|
||||||
- `pkg/cloudbroker/apiaccess` - для `APIAccess`
|
- `pkg/cloudbroker/apiaccess` - для `APIAccess`
|
||||||
- `pkg/cloudbroker/backup` - для `Backup`
|
- `pkg/cloudbroker/backup` - для `Backup`
|
||||||
|
- `pkg/cloudbroker/bservice` - для `Basic Service`
|
||||||
- `pkg/cloudbroker/compute` - для `Compute`
|
- `pkg/cloudbroker/compute` - для `Compute`
|
||||||
- `pkg/cloudbroker/disks` - для `Disks`
|
- `pkg/cloudbroker/disks` - для `Disks`
|
||||||
- `pkg/cloudbroker/dpdknet` - для `DPDK`
|
- `pkg/cloudbroker/dpdknet` - для `DPDK`
|
||||||
@@ -314,13 +345,19 @@ func main() {
|
|||||||
- `pkg/cloudbroker/prometheus` - для `Prometheus`
|
- `pkg/cloudbroker/prometheus` - для `Prometheus`
|
||||||
- `pkg/cloudbroker/resmon` - для `Resmon`
|
- `pkg/cloudbroker/resmon` - для `Resmon`
|
||||||
- `pkg/cloudbroker/rg` - для `RG`
|
- `pkg/cloudbroker/rg` - для `RG`
|
||||||
|
- `pkg/cloudbroker/secgroup` - для `Security group`
|
||||||
- `pkg/cloudbroker/sep` - для `SEP`
|
- `pkg/cloudbroker/sep` - для `SEP`
|
||||||
- `pkg/cloudbroker/stack` - для `Stack`
|
- `pkg/cloudbroker/stack` - для `Stack`
|
||||||
|
- `pkg/cloudbroker/stpolicy` - для `Storage policy`
|
||||||
- `pkg/cloudbroker/tasks` - для `Tasks`
|
- `pkg/cloudbroker/tasks` - для `Tasks`
|
||||||
|
- `pkg/cloudbroker/trunk` - для `Trunk`
|
||||||
- `pkg/cloudbroker/user` - для `User`
|
- `pkg/cloudbroker/user` - для `User`
|
||||||
- `pkg/cloudbroker/vgpu` - для `VGPU`
|
- `pkg/cloudbroker/vgpu` - для `VGPU`
|
||||||
- `pkg/cloudbroker/vfpool` - для `VFPool`
|
- `pkg/cloudbroker/vfpool` - для `VFPool`
|
||||||
- `pkg/cloudbroker/vins` - для `VINS`
|
- `pkg/cloudbroker/vins` - для `VINS`
|
||||||
|
- `pkg/cloudbroker/zone` - для `Zone`
|
||||||
|
- **sdn**:
|
||||||
|
- `pkg/sdn/access_groups` - для `AccessGroups`
|
||||||
|
|
||||||
Все поля структуры имеют описание, в которых содержится:
|
Все поля структуры имеют описание, в которых содержится:
|
||||||
|
|
||||||
@@ -420,9 +457,9 @@ type CreateRequest struct {
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudapi/kvmx86"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/kvmx86"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -431,7 +468,7 @@ func main() {
|
|||||||
AppID: "<APPID>",
|
AppID: "<APPID>",
|
||||||
AppSecret: "<APPSECRET>",
|
AppSecret: "<APPSECRET>",
|
||||||
SSOURL: "https://sso.digitalenergy.online",
|
SSOURL: "https://sso.digitalenergy.online",
|
||||||
URL: "https://mr4.digitalenergy.online",
|
DecortURL: "https://mr4.digitalenergy.online",
|
||||||
Retries: 5,
|
Retries: 5,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,7 +491,7 @@ func main() {
|
|||||||
|
|
||||||
Чтобы выполнить запрос, необходимо:
|
Чтобы выполнить запрос, необходимо:
|
||||||
|
|
||||||
1. Вызвать у клиента метод, отвечаеющий за определение группы API для взаимодействия, это может быть `.CloudAPI()`, либо `.CloudBroker()`. Данные методы возвращаеют соответствующие структуры, с помощью которых можно совершать запросы.
|
1. Вызвать у клиента метод, отвечающий за определение группы API для взаимодействия, это может быть `.CloudAPI()`, `.CloudBroker()` или `.SDN()`. Данные методы возвращают соответствующие структуры, с помощью которых можно совершать запросы.
|
||||||
2. Вызвать у возвращенной структуры метод, определяющий группу ручек для взаимодействия.
|
2. Вызвать у возвращенной структуры метод, определяющий группу ручек для взаимодействия.
|
||||||
|
|
||||||
Доступные методы для `.CloudAPI()`:
|
Доступные методы для `.CloudAPI()`:
|
||||||
@@ -473,12 +510,17 @@ func main() {
|
|||||||
- `.KVMx86()` - для работы с `KVMX86`
|
- `.KVMx86()` - для работы с `KVMX86`
|
||||||
- `.LB()` - для работы с `LB`
|
- `.LB()` - для работы с `LB`
|
||||||
- `.Locations()` - для работы с `Locations`
|
- `.Locations()` - для работы с `Locations`
|
||||||
|
- `.Prometheus()` - для работы с `Prometheus`
|
||||||
- `.RG()` - для работы с `RG`
|
- `.RG()` - для работы с `RG`
|
||||||
- `.Resmon()` - для работы с `Resmon`
|
- `.SecurityGroup()` - для работы с `Security Group`
|
||||||
|
- `.SEP()` - для работы с `SEP`
|
||||||
- `.Stack()` - для работы с `Stack`
|
- `.Stack()` - для работы с `Stack`
|
||||||
|
- `.StPolicy()` - для работы с `Storage Policy`
|
||||||
- `.Tasks()` - для работы с `Tasks`
|
- `.Tasks()` - для работы с `Tasks`
|
||||||
|
- `.Trunk()` - для работы с `Trunk`
|
||||||
- `.VFPool()` - для работы с `VFPool`
|
- `.VFPool()` - для работы с `VFPool`
|
||||||
- `.VINS()` - для работы с `VINS`
|
- `.VINS()` - для работы с `VINS`
|
||||||
|
- `.Zone()` - для работы с `Zone`
|
||||||
|
|
||||||
Доступные методы для `.CloudBroker()`:
|
Доступные методы для `.CloudBroker()`:
|
||||||
|
|
||||||
@@ -486,6 +528,7 @@ func main() {
|
|||||||
- `.Audit()` - для работы с `Audit`
|
- `.Audit()` - для работы с `Audit`
|
||||||
- `.APIAccess()` - для работы с `APIAccess`
|
- `.APIAccess()` - для работы с `APIAccess`
|
||||||
- `.Backup()` - для работы с `Backup`
|
- `.Backup()` - для работы с `Backup`
|
||||||
|
- `.BService()` - для работы с `BService`
|
||||||
- `.Compute()` - для работы с `Compute`
|
- `.Compute()` - для работы с `Compute`
|
||||||
- `.Disks()` - для работы с `Disks`
|
- `.Disks()` - для работы с `Disks`
|
||||||
- `.DPDKNet()` - для работы с `DPDK`
|
- `.DPDKNet()` - для работы с `DPDK`
|
||||||
@@ -503,13 +546,21 @@ func main() {
|
|||||||
- `.Prometheus()` - для работы с `Prometheus`
|
- `.Prometheus()` - для работы с `Prometheus`
|
||||||
- `.Resmon()` - для работы с `Resmon`
|
- `.Resmon()` - для работы с `Resmon`
|
||||||
- `.RG()` - для работы с `RG`
|
- `.RG()` - для работы с `RG`
|
||||||
|
- `.SecurityGroup()` - для работы с `Security Group`
|
||||||
- `.SEP()` - для работы с `SEP`
|
- `.SEP()` - для работы с `SEP`
|
||||||
- `.Stack()` - для работы с `Stack`
|
- `.Stack()` - для работы с `Stack`
|
||||||
|
- `.StPolicy()` - для работы с `Storage Policy`
|
||||||
- `.Tasks()` - для работы с `Tasks`
|
- `.Tasks()` - для работы с `Tasks`
|
||||||
|
- `.Trunk()` - для работы с `Trunk`
|
||||||
- `.User()` - для работы с `User`
|
- `.User()` - для работы с `User`
|
||||||
- `.VGPU()` - для работы с `VGPU`
|
- `.VGPU()` - для работы с `VGPU`
|
||||||
- `.VFPool()` - для работы с `VFPool`
|
- `.VFPool()` - для работы с `VFPool`
|
||||||
- `.VINS()` - для работы с `VINS`
|
- `.VINS()` - для работы с `VINS`
|
||||||
|
- `.Zone()` - для работы с `Zone`
|
||||||
|
|
||||||
|
Доступные методы для `.SDN()`:
|
||||||
|
|
||||||
|
- `.AccessGroup()` - для работы с `AccessGroup`
|
||||||
|
|
||||||
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
|
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
|
||||||
|
|
||||||
@@ -535,9 +586,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudapi/kvmx86"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/kvmx86"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -585,9 +636,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudapi/account"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/account"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -765,9 +816,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudbroker/compute"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker/compute"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -823,9 +874,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudapi/bservice"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/bservice"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -869,7 +920,7 @@ func main() {
|
|||||||
- ToString(): строковое представление результата выполнения задачи
|
- ToString(): строковое представление результата выполнения задачи
|
||||||
- ID() и Name(): получение ID и имени созданного в результате выполнения задачи ресурса
|
- ID() и Name(): получение ID и имени созданного в результате выполнения задачи ресурса
|
||||||
- ToMaps(): получение списка карт, содержащих информацию о дисках, восстановленных в результате выполнения задачи.
|
- ToMaps(): получение списка карт, содержащих информацию о дисках, восстановленных в результате выполнения задачи.
|
||||||
Все методы оборудованы возвратом ошибок. Непустая ошибка означает, что из поля Result нельзя получить информацию, которую предоставляет метод.
|
Все методы оборудованы возвратом ошибок. Непустая ошибка означает, что из поля Result нельзя получить информацию, которую предоставляет метод.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
@@ -878,10 +929,10 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudapi/tasks"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/tasks"
|
||||||
tasks_cb "repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudbroker/tasks"
|
tasks_cb "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker/tasks"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -961,7 +1012,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main(){
|
func main(){
|
||||||
@@ -985,7 +1036,7 @@ func main(){
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1026,8 +1077,8 @@ sslSkipVerify: true
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1054,8 +1105,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1137,7 +1188,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main(){
|
func main(){
|
||||||
@@ -1165,7 +1216,7 @@ func main(){
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1182,7 +1233,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1248,8 +1299,8 @@ func main() {
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1282,8 +1333,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1323,8 +1374,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1362,8 +1413,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1416,11 +1467,11 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/internal/constants"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/pkg/cloudbroker/kvmx86"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker/kvmx86"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1476,13 +1527,13 @@ func main() {
|
|||||||
| BVSConfig | *BVSConfig | Нет | Конфигурация BVS |
|
| BVSConfig | *BVSConfig | Нет | Конфигурация BVS |
|
||||||
| LegacyConfig | string | Нет | Конфигурация Legacy |
|
| LegacyConfig | string | Нет | Конфигурация Legacy |
|
||||||
|
|
||||||
В универсальном клиенте можно использовать только один тип конфигурации одновременно.
|
В универсальном клиенте можно использовать только один тип конфигурации одновременно.
|
||||||
|
|
||||||
#### Пример конфигурации универсального клиента
|
#### Пример конфигурации универсального клиента
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main(){
|
func main(){
|
||||||
@@ -1515,8 +1566,8 @@ func main(){
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -1547,45 +1598,77 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk"
|
decort "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Настройка конфигурации
|
// Настройка конфигурации
|
||||||
legacyCfg := config.LegacyConfig{
|
legacyCfg := config.LegacyConfig{
|
||||||
Username: "<USERNAME>",
|
Username: "<USERNAME>",
|
||||||
Password: "<PASSWORD>",
|
Password: "<PASSWORD>",
|
||||||
Domain: "dynamix",
|
Domain: "dynamix",
|
||||||
DecortURL: "https://mr4.digitalenergy.online",
|
DecortURL: "https://mr4.digitalenergy.online",
|
||||||
Retries: 5,
|
Retries: 5,
|
||||||
}
|
|
||||||
|
|
||||||
legacyCfg.SetTimeout(5 * time.Minute)
|
|
||||||
|
|
||||||
cfg := config.UniversalConfig{
|
|
||||||
LegacyConfig: &legacyCfg,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
legacyCfg.SetTimeout(5 * time.Minute)
|
||||||
|
|
||||||
|
cfg := config.UniversalConfig{
|
||||||
|
LegacyConfig: &legacyCfg,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создание клиента
|
||||||
|
universalClient := decort.NewUniversal(cfg)
|
||||||
|
|
||||||
|
// Создание структуры запроса
|
||||||
|
// CreateRequest - реквест на создание виртуальной машины
|
||||||
|
req := kvmx86.CreateRequest{
|
||||||
|
RGID: 123,
|
||||||
|
Name: "compute",
|
||||||
|
CPU: 4,
|
||||||
|
RAM: 4096,
|
||||||
|
ImageID: 321,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выполнение запроса
|
||||||
|
res, err := universalClient.CloudAPI().KVMX86().Create(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(res)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Проверка соответствия версии платформы и версии dynamix
|
||||||
|
|
||||||
|
С версии v1.11.0 для каждого клиента добавлен метод `Check` для проверки соответствия decort-sdk и платформы dynamix.
|
||||||
|
В случае соответсвия decort-sdk и платформы dynamix возвращается структура, содержащая информацию о версии и актуальном билде платформы.
|
||||||
|
|
||||||
|
#### Пример выполнения запроса
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main(){
|
||||||
|
// Настройка конфигурации
|
||||||
|
config := config.Config{
|
||||||
|
AppID: "<APP_ID>",
|
||||||
|
AppSecret: "<APP_SECRET>",
|
||||||
|
SSOURL: "https://sso.digitalenergy.online",
|
||||||
|
DecortURL: "https://mr4.digitalenergy.online",
|
||||||
|
Retries: 5,
|
||||||
|
SSLSkipVerify: true,
|
||||||
|
}
|
||||||
|
|
||||||
// Создание клиента
|
// Создание клиента
|
||||||
universalClient := decort.NewUniversal(cfg)
|
client := decort.New(config)
|
||||||
|
|
||||||
// Создание структуры запроса
|
// Проверка соответствия версии
|
||||||
// CreateRequest - реквест на создание виртуальной машины
|
checkInfo, err := client.Check()
|
||||||
req := kvmx86.CreateRequest{
|
|
||||||
RGID: 123,
|
|
||||||
Name: "compute",
|
|
||||||
CPU: 4,
|
|
||||||
RAM: 4096,
|
|
||||||
ImageID: 321,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Выполнение запроса
|
|
||||||
res, err := universalClient.CloudAPI().KVMX86().Create(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(res)
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
92
check.go
Normal file
92
check.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
package decortsdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/constants"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CheckInfo struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Build uint64 `json:"build"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const versionURL = "/system/info/version"
|
||||||
|
|
||||||
|
func (de DecortClient) Check() (*CheckInfo, error) {
|
||||||
|
res, err := de.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := CheckInfo{}
|
||||||
|
|
||||||
|
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
|
||||||
|
if err != nil {
|
||||||
|
if _, exists := constants.VersionMap[string(res)]; exists {
|
||||||
|
info.Version = string(res)
|
||||||
|
} else {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := constants.VersionMap[info.Version]; ok {
|
||||||
|
if v == "-" {
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bvs BVSDecortClient) Check() (*CheckInfo, error) {
|
||||||
|
res, err := bvs.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := CheckInfo{}
|
||||||
|
|
||||||
|
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := constants.VersionMap[info.Version]; ok {
|
||||||
|
if v == "-" {
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ldc LegacyDecortClient) Check() (*CheckInfo, error) {
|
||||||
|
res, err := ldc.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := CheckInfo{}
|
||||||
|
|
||||||
|
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := constants.VersionMap[info.Version]; ok {
|
||||||
|
if v == "-" {
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
|
||||||
|
}
|
||||||
102
client.go
102
client.go
@@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -16,11 +17,12 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/constants"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudbroker"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker"
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/sdn"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DecortClient is HTTP-client for platform
|
// DecortClient is HTTP-client for platform
|
||||||
@@ -38,12 +40,6 @@ func New(cfg config.Config) *DecortClient {
|
|||||||
cfg.Retries = 5
|
cfg.Retries = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
var expiryTime time.Time
|
|
||||||
|
|
||||||
if cfg.Token != "" {
|
|
||||||
expiryTime = time.Now().AddDate(0, 0, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &DecortClient{
|
return &DecortClient{
|
||||||
decortURL: cfg.DecortURL,
|
decortURL: cfg.DecortURL,
|
||||||
client: &http.Client{
|
client: &http.Client{
|
||||||
@@ -54,9 +50,8 @@ func New(cfg config.Config) *DecortClient {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cfg: trimConfig(&cfg),
|
cfg: trimConfig(&cfg),
|
||||||
expiryTime: expiryTime,
|
mutex: &sync.Mutex{},
|
||||||
mutex: &sync.Mutex{},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +65,11 @@ func (dc *DecortClient) CloudBroker() *cloudbroker.CloudBroker {
|
|||||||
return cloudbroker.New(dc)
|
return cloudbroker.New(dc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SDN builder
|
||||||
|
func (dc *DecortClient) SDN() *sdn.SDN {
|
||||||
|
return sdn.New(dc)
|
||||||
|
}
|
||||||
|
|
||||||
// DecortApiCall method for sending requests to the platform
|
// DecortApiCall method for sending requests to the platform
|
||||||
func (dc *DecortClient) DecortApiCall(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
func (dc *DecortClient) DecortApiCall(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
||||||
|
|
||||||
@@ -107,6 +107,47 @@ func (dc *DecortClient) DecortApiCall(ctx context.Context, method, url string, p
|
|||||||
return respBytes, err
|
return respBytes, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecortApiCallCtype method for sending requests to the platform with content type
|
||||||
|
func (dc *DecortClient) DecortApiCallCtype(ctx context.Context, method, url, ctype string, params interface{}) ([]byte, error) {
|
||||||
|
|
||||||
|
var body *bytes.Buffer
|
||||||
|
|
||||||
|
switch ctype {
|
||||||
|
case constants.MIMESTREAM:
|
||||||
|
body = bytes.NewBuffer(params.([]byte))
|
||||||
|
case constants.MIMEJSON:
|
||||||
|
jsonBody, err := json.Marshal(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBuffer(jsonBody)
|
||||||
|
default:
|
||||||
|
ctype = constants.MIMEPOSTForm
|
||||||
|
values, err := query.Values(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBufferString(values.Encode())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequestWithContext(ctx, method, dc.decortURL+constants.RESTMACHINE+url, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// get token
|
||||||
|
if err = dc.getToken(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// perform request
|
||||||
|
respBytes, err := dc.do(req, ctype)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBytes, err
|
||||||
|
}
|
||||||
|
|
||||||
// DecortApiCallMP method for sending requests to the platform
|
// DecortApiCallMP method for sending requests to the platform
|
||||||
func (dc *DecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
func (dc *DecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
||||||
body, ctype, err := multiPartReq(params)
|
body, ctype, err := multiPartReq(params)
|
||||||
@@ -170,8 +211,13 @@ func (dc *DecortClient) getToken(ctx context.Context) error {
|
|||||||
|
|
||||||
// save token in config
|
// save token in config
|
||||||
token := string(tokenBytes)
|
token := string(tokenBytes)
|
||||||
|
expiryTime, err := getTokenExp(token)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot get expiry time: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
dc.cfg.Token = token
|
dc.cfg.Token = token
|
||||||
dc.expiryTime = time.Now().AddDate(0, 0, 1)
|
dc.expiryTime = expiryTime
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -375,3 +421,29 @@ func trimConfig(cfg *config.Config) config.Config {
|
|||||||
cfg.DecortURL = strings.TrimSuffix(cfg.DecortURL, "/")
|
cfg.DecortURL = strings.TrimSuffix(cfg.DecortURL, "/")
|
||||||
return *cfg
|
return *cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getTokenExp(token string) (time.Time, error) {
|
||||||
|
parts := strings.Split(token, ".")
|
||||||
|
if len(parts) != 3 {
|
||||||
|
return time.Time{}, fmt.Errorf("invalid token format")
|
||||||
|
}
|
||||||
|
|
||||||
|
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
|
||||||
|
if err != nil {
|
||||||
|
return time.Time{}, fmt.Errorf("error decode payload from token: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var claims map[string]interface{}
|
||||||
|
if err := json.Unmarshal(payload, &claims); err != nil {
|
||||||
|
return time.Time{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
exp, ok := claims["exp"]
|
||||||
|
if !ok {
|
||||||
|
return time.Time{}, fmt.Errorf("exp time bot found")
|
||||||
|
}
|
||||||
|
|
||||||
|
expTime := time.Unix(int64(exp.(float64)), 0)
|
||||||
|
|
||||||
|
return expTime, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/constants"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudbroker"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BVSDecortClient is HTTP-client for platform
|
// BVSDecortClient is HTTP-client for platform
|
||||||
@@ -131,6 +131,72 @@ func (bdc *BVSDecortClient) DecortApiCall(ctx context.Context, method, url strin
|
|||||||
return respBytes, err
|
return respBytes, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecortApiCallCtype method for sending requests to the platform with content type
|
||||||
|
func (bdc *BVSDecortClient) DecortApiCallCtype(ctx context.Context, method, url, ctype string, params interface{}) ([]byte, error) {
|
||||||
|
var body *bytes.Buffer
|
||||||
|
|
||||||
|
switch ctype {
|
||||||
|
case constants.MIMESTREAM:
|
||||||
|
body = bytes.NewBuffer(params.([]byte))
|
||||||
|
case constants.MIMEJSON:
|
||||||
|
jsonBody, err := json.Marshal(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBuffer(jsonBody)
|
||||||
|
default:
|
||||||
|
ctype = constants.MIMEPOSTForm
|
||||||
|
values, err := query.Values(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBufferString(values.Encode())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequestWithContext(ctx, method, bdc.decortURL+constants.RESTMACHINE+url, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// get token
|
||||||
|
if bdc.cfg.Token.AccessToken == "" {
|
||||||
|
if _, err = bdc.GetToken(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// refresh token
|
||||||
|
if bdc.cfg.Token.RefreshToken != "" && bdc.cfg.Token.Expiry.Add(-time.Duration(bdc.cfg.TimeToRefresh)*time.Minute).Before(time.Now()) {
|
||||||
|
if _, err := bdc.RefreshToken(ctx); err != nil {
|
||||||
|
if _, err = bdc.GetToken(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// perform request
|
||||||
|
reqCopy := req.Clone(ctx)
|
||||||
|
respBytes, err := bdc.do(req, ctype)
|
||||||
|
if err == nil {
|
||||||
|
return respBytes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// get token and retry in case of access denied
|
||||||
|
if err.Error() == "access is denied" {
|
||||||
|
_, err = bdc.GetToken(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
respBytes, err = bdc.do(reqCopy, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBytes, err
|
||||||
|
}
|
||||||
|
|
||||||
func (bdc *BVSDecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
func (bdc *BVSDecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
||||||
body, ctype, err := multiPartReq(params)
|
body, ctype, err := multiPartReq(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Configuration for creating request to platform
|
// Configuration for creating request to platform
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/serialization"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/serialization"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BVSConfig struct {
|
type BVSConfig struct {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Legacy client configuration
|
// Legacy client configuration
|
||||||
|
|||||||
3
go.mod
3
go.mod
@@ -1,11 +1,10 @@
|
|||||||
module repository.basistech.ru/BASIS/dynamix-golang-sdk/v9
|
module repository.basistech.ru/BASIS/dynamix-golang-sdk/v12
|
||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-playground/validator/v10 v10.11.2
|
github.com/go-playground/validator/v10 v10.11.2
|
||||||
github.com/google/go-querystring v1.1.0
|
github.com/google/go-querystring v1.1.0
|
||||||
github.com/joho/godotenv v1.5.1
|
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -13,8 +13,6 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
|||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
|
||||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
|
||||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ type Caller interface {
|
|||||||
// DecortApiCall method for sending requests to the platform
|
// DecortApiCall method for sending requests to the platform
|
||||||
DecortApiCall(ctx context.Context, method, url string, params interface{}) ([]byte, error)
|
DecortApiCall(ctx context.Context, method, url string, params interface{}) ([]byte, error)
|
||||||
|
|
||||||
|
// DecortApiCallCtype method for sending requests to the platform
|
||||||
|
DecortApiCallCtype(ctx context.Context, method, url, ctype string, params interface{}) ([]byte, error)
|
||||||
|
|
||||||
// DecortApiCallMP method for sending requests to the platform
|
// DecortApiCallMP method for sending requests to the platform
|
||||||
DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error)
|
DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,23 @@ package constants
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
RESTMACHINE = "/restmachine"
|
RESTMACHINE = "/restmachine"
|
||||||
|
)
|
||||||
|
|
||||||
// RAM_DIVISIBILITY sets divisibility of RAM value
|
const (
|
||||||
RAM_DIVISIBILITY uint64 = 128
|
MIMEJSON = "application/json"
|
||||||
|
MIMEHTML = "text/html"
|
||||||
|
MIMEXML = "application/xml"
|
||||||
|
MIMEXML2 = "text/xml"
|
||||||
|
MIMEPlain = "text/plain"
|
||||||
|
MIMEPOSTForm = "application/x-www-form-urlencoded"
|
||||||
|
MIMEMultipartPOSTForm = "multipart/form-data"
|
||||||
|
MIMEPROTOBUF = "application/x-protobuf"
|
||||||
|
MIMEMSGPACK = "application/x-msgpack"
|
||||||
|
MIMEMSGPACK2 = "application/msgpack"
|
||||||
|
MIMEYAML = "application/x-yaml"
|
||||||
|
MIMEYAML2 = "application/yaml"
|
||||||
|
MIMETOML = "application/toml"
|
||||||
|
MIMESTREAM = "application/octet-stream"
|
||||||
)
|
)
|
||||||
|
|
||||||
var FileName = map[string]string{
|
var FileName = map[string]string{
|
||||||
@@ -12,3 +26,11 @@ var FileName = map[string]string{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
|
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
|
||||||
|
|
||||||
|
var VersionMap = map[string]string{
|
||||||
|
"4.4.0": "-",
|
||||||
|
"4.3.0": "v11.0.0",
|
||||||
|
"4.2.0": "v10.0.0",
|
||||||
|
"4.1.1": "v9.0.0",
|
||||||
|
"4.1.0": "v9.0.0",
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,20 +6,14 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/interfaces"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/interfaces"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/multierror"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/multierror"
|
||||||
)
|
)
|
||||||
|
|
||||||
// computeDriverValidator is used to validate Driver field in kvmx86 create.
|
|
||||||
func computeDriverValidator(fe validator.FieldLevel) bool {
|
|
||||||
fieldValue := fe.Field().String()
|
|
||||||
|
|
||||||
return IsInSlice(fieldValue, computeDriverValues)
|
|
||||||
}
|
|
||||||
|
|
||||||
// protoValidator is used to validate Proto fields.
|
// protoValidator is used to validate Proto fields.
|
||||||
func protoValidator(fe validator.FieldLevel) bool {
|
func protoValidator(fe validator.FieldLevel) bool {
|
||||||
fieldValue := fe.Field().String()
|
fieldValue := fe.Field().String()
|
||||||
@@ -27,6 +21,13 @@ func protoValidator(fe validator.FieldLevel) bool {
|
|||||||
return IsInSlice(fieldValue, protoValues)
|
return IsInSlice(fieldValue, protoValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// apiGroupValidator is used to validate APIGroup fields
|
||||||
|
func apiGroupValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, apiGroupValues)
|
||||||
|
}
|
||||||
|
|
||||||
// accessTypeValidator is used to validate AccessType fields.
|
// accessTypeValidator is used to validate AccessType fields.
|
||||||
func accessTypeValidator(fe validator.FieldLevel) bool {
|
func accessTypeValidator(fe validator.FieldLevel) bool {
|
||||||
fieldValue := fe.Field().String()
|
fieldValue := fe.Field().String()
|
||||||
@@ -50,13 +51,6 @@ func resTypesValidator(fe validator.FieldLevel) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// driverValidator is used to validate Driver fields.
|
|
||||||
func driverValidator(fe validator.FieldLevel) bool {
|
|
||||||
fieldValue := fe.Field().String()
|
|
||||||
|
|
||||||
return IsInSlice(fieldValue, driverValues)
|
|
||||||
}
|
|
||||||
|
|
||||||
// accountCUTypeValidator is used to validate CUType field.
|
// accountCUTypeValidator is used to validate CUType field.
|
||||||
func accountCUTypeValidator(fe validator.FieldLevel) bool {
|
func accountCUTypeValidator(fe validator.FieldLevel) bool {
|
||||||
fieldValue := fe.Field().String()
|
fieldValue := fe.Field().String()
|
||||||
@@ -113,6 +107,27 @@ func computex86NetTypeValidator(fe validator.FieldLevel) bool {
|
|||||||
return IsInSlice(fieldValue, computex86NetTypeValues)
|
return IsInSlice(fieldValue, computex86NetTypeValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// securityGroupDirectionValidator is used to validate Direction field
|
||||||
|
func securityGroupDirectionValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, securityGroupDirectionValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
// securityGroupEthertypeValidator is used to validate Ethertype field
|
||||||
|
func securityGroupEthertypeValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, securityGroupEthertypeValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
// securityGroupProtocolValidator is used to validate Protocol field
|
||||||
|
func securityGroupProtocolValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, securityGroupProtocolValues)
|
||||||
|
}
|
||||||
|
|
||||||
// computeOrderValidator is used to validate Order field.
|
// computeOrderValidator is used to validate Order field.
|
||||||
func computeOrderValidator(fe validator.FieldLevel) bool {
|
func computeOrderValidator(fe validator.FieldLevel) bool {
|
||||||
fieldSlice, ok := fe.Field().Interface().([]string)
|
fieldSlice, ok := fe.Field().Interface().([]string)
|
||||||
@@ -199,22 +214,6 @@ func imageTypeValidator(fe validator.FieldLevel) bool {
|
|||||||
return IsInSlice(fieldValue, imageTypeValues)
|
return IsInSlice(fieldValue, imageTypeValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
// imageDriversValidator is used to validate Drivers field.
|
|
||||||
func imageDriversValidator(fe validator.FieldLevel) bool {
|
|
||||||
fieldSlice, ok := fe.Field().Interface().([]string)
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, item := range fieldSlice {
|
|
||||||
if !IsInSlice(item, imageDriversValues) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// imageArchitectureValidator is used to validate Architecture field.
|
// imageArchitectureValidator is used to validate Architecture field.
|
||||||
func imageArchitectureValidator(fe validator.FieldLevel) bool {
|
func imageArchitectureValidator(fe validator.FieldLevel) bool {
|
||||||
fieldValue := fe.Field().String()
|
fieldValue := fe.Field().String()
|
||||||
@@ -374,11 +373,59 @@ func urlValidartor(fl validator.FieldLevel) bool {
|
|||||||
|
|
||||||
func chipsetValidator(fe validator.FieldLevel) bool {
|
func chipsetValidator(fe validator.FieldLevel) bool {
|
||||||
fieldValue := fe.Field().String()
|
fieldValue := fe.Field().String()
|
||||||
fieldValue = strings.ToLower(fieldValue)
|
|
||||||
|
|
||||||
return IsInSlice(fieldValue, chipsetValues)
|
return IsInSlice(fieldValue, chipsetValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func preferredCPUValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldSlice, ok := fe.Field().Interface().([]int64)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range fieldSlice {
|
||||||
|
if value < -1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// loaderTypeValidator is used to validate loaderType fields
|
||||||
|
func loaderTypeValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, loaderTypeValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
// languageValidator is used to validate language fields
|
||||||
|
func languageValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, languageValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
func userProviderValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, userProviders)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sepTypeValidator is used to validate sepType fields
|
||||||
|
func sepTypeValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, sepTypeValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
// deviceValidator is used to validate extnet device fields
|
||||||
|
func deviceValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, deviceValues)
|
||||||
|
}
|
||||||
|
|
||||||
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
|
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
|
||||||
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
|
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
|
||||||
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
|
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
|
||||||
@@ -400,3 +447,13 @@ func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
|
|||||||
}
|
}
|
||||||
return multierror.Join(errs...)
|
return multierror.Join(errs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// trunkTagsValidator checks if trunk_tags is in range from 1 to 4095
|
||||||
|
func trunkTagsValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
numFieldValue, err := strconv.ParseInt(fieldValue, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return uint64(numFieldValue) >= uint64(trunkTagsMin) && uint64(numFieldValue) <= uint64(trunkTagsMax)
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package validators
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/multierror"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/multierror"
|
||||||
|
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -28,12 +28,6 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
case "isBool":
|
case "isBool":
|
||||||
return fmt.Sprintf("%s %s: must be bool type", prefix, fe.Field())
|
return fmt.Sprintf("%s %s: must be bool type", prefix, fe.Field())
|
||||||
|
|
||||||
case "driver":
|
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
|
||||||
prefix,
|
|
||||||
fe.Field(),
|
|
||||||
joinValues(driverValues))
|
|
||||||
|
|
||||||
case "accessType":
|
case "accessType":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
prefix,
|
prefix,
|
||||||
@@ -52,6 +46,13 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
fe.Field(),
|
fe.Field(),
|
||||||
joinValues(protoValues))
|
joinValues(protoValues))
|
||||||
|
|
||||||
|
// apiGroup Validators
|
||||||
|
case "apiGroup":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(apiGroupValues))
|
||||||
|
|
||||||
// Account Validators
|
// Account Validators
|
||||||
case "accountCUType":
|
case "accountCUType":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
@@ -94,6 +95,9 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
case "mtu":
|
case "mtu":
|
||||||
return fmt.Sprint(prefix, fe.Field(), "must be ", mtuMin, "-", mtuMax)
|
return fmt.Sprint(prefix, fe.Field(), "must be ", mtuMin, "-", mtuMax)
|
||||||
|
|
||||||
|
case "preferredCPU":
|
||||||
|
return fmt.Sprint(prefix, fe.Field(), "must be equal to or greater than", -1)
|
||||||
|
|
||||||
case "computex86NetType":
|
case "computex86NetType":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
prefix,
|
prefix,
|
||||||
@@ -118,12 +122,6 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
fe.Field(),
|
fe.Field(),
|
||||||
joinValues(computeDataDisksValues))
|
joinValues(computeDataDisksValues))
|
||||||
|
|
||||||
case "computeDriver":
|
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
|
||||||
prefix,
|
|
||||||
fe.Field(),
|
|
||||||
joinValues(computeDriverValues))
|
|
||||||
|
|
||||||
// Disk Validators
|
// Disk Validators
|
||||||
case "diskType":
|
case "diskType":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
@@ -191,12 +189,6 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
fe.Field(),
|
fe.Field(),
|
||||||
joinValues(imageTypeValues))
|
joinValues(imageTypeValues))
|
||||||
|
|
||||||
case "imageDrivers":
|
|
||||||
return fmt.Sprintf("%s %s must contain only the following: %s",
|
|
||||||
prefix,
|
|
||||||
fe.Field(),
|
|
||||||
joinValues(imageDriversValues))
|
|
||||||
|
|
||||||
case "imageArchitecture":
|
case "imageArchitecture":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
prefix,
|
prefix,
|
||||||
@@ -305,6 +297,62 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
prefix,
|
prefix,
|
||||||
fe.Field(),
|
fe.Field(),
|
||||||
joinValues(chipsetValues))
|
joinValues(chipsetValues))
|
||||||
|
|
||||||
|
case "loaderType":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(loaderTypeValues))
|
||||||
|
|
||||||
|
case "language":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(languageValues))
|
||||||
|
|
||||||
|
case "sepType":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(sepTypeValues))
|
||||||
|
|
||||||
|
// user validators
|
||||||
|
case "userProvider":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(userProviders))
|
||||||
|
|
||||||
|
// security group validators
|
||||||
|
case "securityGroupDirection":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(securityGroupDirectionValues))
|
||||||
|
|
||||||
|
case "securityGroupEthertype":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(securityGroupEthertypeValues))
|
||||||
|
|
||||||
|
case "securityGroupProtocol":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(securityGroupProtocolValues))
|
||||||
|
|
||||||
|
// trunk tags validator
|
||||||
|
case "trunkTags":
|
||||||
|
return fmt.Sprintf("%s %s must be in range from 1 to 4095",
|
||||||
|
prefix,
|
||||||
|
fe.Field())
|
||||||
|
|
||||||
|
case "device":
|
||||||
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
prefix,
|
||||||
|
fe.Field(),
|
||||||
|
joinValues(deviceValues))
|
||||||
}
|
}
|
||||||
|
|
||||||
return fe.Error()
|
return fe.Error()
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = validate.RegisterValidation("computeDriver", computeDriverValidator)
|
err = validate.RegisterValidation("apiGroup", apiGroupValidator)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -46,11 +46,6 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = validate.RegisterValidation("driver", driverValidator)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = validate.RegisterValidation("imageBootType", imageBootTypeValidator)
|
err = validate.RegisterValidation("imageBootType", imageBootTypeValidator)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -61,11 +56,6 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = validate.RegisterValidation("imageDrivers", imageDriversValidator)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = validate.RegisterValidation("imageArchitecture", imageArchitectureValidator)
|
err = validate.RegisterValidation("imageArchitecture", imageArchitectureValidator)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -261,5 +251,55 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("preferredCPU", preferredCPUValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("loaderType", loaderTypeValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("language", languageValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("userProvider", userProviderValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("sepType", sepTypeValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("device", deviceValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("trunkTags", trunkTagsValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("securityGroupDirection", securityGroupDirectionValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("securityGroupEthertype", securityGroupEthertypeValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("securityGroupProtocol", securityGroupProtocolValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package validators
|
package validators
|
||||||
|
|
||||||
var (
|
var (
|
||||||
driverValues = []string{"KVM_X86"}
|
apiGroupValues = []string{"cloudapi", "cloudbroker", "system"}
|
||||||
|
|
||||||
accessTypeValues = []string{"R", "RCX", "ARCXDU"}
|
accessTypeValues = []string{"R", "RCX", "ARCXDU"}
|
||||||
resTypesValues = []string{"compute", "vins", "k8s", "openshift", "lb", "flipgroup"}
|
resTypesValues = []string{"compute", "vins", "k8s", "openshift", "lb", "flipgroup"}
|
||||||
protoValues = []string{"tcp", "udp"}
|
protoValues = []string{"tcp", "udp"}
|
||||||
@@ -15,17 +16,16 @@ var (
|
|||||||
computeModeValues = []string{"EQ", "EN", "ANY"}
|
computeModeValues = []string{"EQ", "EN", "ANY"}
|
||||||
computeDiskTypeValues = []string{"D", "B"}
|
computeDiskTypeValues = []string{"D", "B"}
|
||||||
computeNetTypeValues = []string{"EXTNET", "VINS"}
|
computeNetTypeValues = []string{"EXTNET", "VINS"}
|
||||||
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK"}
|
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "EMPTY", "TRUNK"}
|
||||||
computeOrderValues = []string{"cdrom", "network", "hd"}
|
computeOrderValues = []string{"cdrom", "network", "hd"}
|
||||||
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
|
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
|
||||||
computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"}
|
|
||||||
|
|
||||||
diskTypeValues = []string{"B", "T", "D"}
|
diskTypeValues = []string{"B", "T", "D"}
|
||||||
|
|
||||||
flipgroupClientTypeValues = []string{"compute", "vins"}
|
flipgroupClientTypeValues = []string{"compute", "vins"}
|
||||||
|
|
||||||
kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"}
|
kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"}
|
||||||
kvmx86NetTypeValues = []string{"EXTNET", "VINS", "NONE", "VFNIC", "DPDK"}
|
kvmx86NetTypeValues = []string{"EXTNET", "VINS", "EMPTY", "VFNIC", "DPDK", "SDN", "TRUNK"}
|
||||||
|
|
||||||
lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"}
|
lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"}
|
||||||
|
|
||||||
@@ -35,8 +35,7 @@ var (
|
|||||||
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDED"}
|
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDED"}
|
||||||
|
|
||||||
imageBootTypeValues = []string{"uefi", "bios"}
|
imageBootTypeValues = []string{"uefi", "bios"}
|
||||||
imageTypeValues = []string{"windows", "linux", "other"}
|
imageTypeValues = []string{"windows", "linux", "unknown"}
|
||||||
imageDriversValues = []string{"KVM_X86"}
|
|
||||||
imageArchitectureValues = []string{"X86_64"}
|
imageArchitectureValues = []string{"X86_64"}
|
||||||
|
|
||||||
sepFieldTypeValues = []string{"int", "str", "bool", "list", "dict"}
|
sepFieldTypeValues = []string{"int", "str", "bool", "list", "dict"}
|
||||||
@@ -47,11 +46,11 @@ var (
|
|||||||
|
|
||||||
interfaceStateValues = []string{"on", "off"}
|
interfaceStateValues = []string{"on", "off"}
|
||||||
|
|
||||||
actionValues = []string{"power_on", "shutdown", "force_shutdown", "reboot"}
|
actionValues = []string{"is_powered", "power_on", "shutdown", "force_shutdown", "reboot"}
|
||||||
|
|
||||||
vmActionValues = []string{"stop", "move"}
|
vmActionValues = []string{"stop", "move"}
|
||||||
|
|
||||||
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic"}
|
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}
|
||||||
|
|
||||||
networkInterfaceNamingValues = []string{"eth", "ens"}
|
networkInterfaceNamingValues = []string{"eth", "ens"}
|
||||||
|
|
||||||
@@ -64,10 +63,26 @@ var (
|
|||||||
eventIDxValues = []string{"on", "off", "selected by hypervisor"}
|
eventIDxValues = []string{"on", "off", "selected by hypervisor"}
|
||||||
|
|
||||||
chipsetValues = []string{"i440fx", "Q35"}
|
chipsetValues = []string{"i440fx", "Q35"}
|
||||||
|
|
||||||
|
loaderTypeValues = []string{"linux", "windows", "unknown"}
|
||||||
|
|
||||||
|
sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"}
|
||||||
|
|
||||||
|
languageValues = []string{"ru", "en"}
|
||||||
|
|
||||||
|
userProviders = []string{"bvs", "decs3o"}
|
||||||
|
|
||||||
|
deviceValues = []string{"primary", "secondary"}
|
||||||
|
|
||||||
|
securityGroupDirectionValues = []string{"inbound", "outbound"}
|
||||||
|
securityGroupEthertypeValues = []string{"IPv4", "IPv6"}
|
||||||
|
securityGroupProtocolValues = []string{"icmp", "tcp", "udp"}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mtuMin = 1
|
mtuMin = 1
|
||||||
|
|
||||||
mtuMax = 9216
|
mtuMax = 9216
|
||||||
|
|
||||||
|
trunkTagsMin = 1
|
||||||
|
trunkTagsMax = 4095
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -13,10 +14,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/config"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/config"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/constants"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi"
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudbroker"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudbroker"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LegacyDecortClient is Legacy HTTP-client for platform
|
// LegacyDecortClient is Legacy HTTP-client for platform
|
||||||
@@ -102,6 +103,47 @@ func (ldc *LegacyDecortClient) DecortApiCall(ctx context.Context, method, url st
|
|||||||
return respBytes, err
|
return respBytes, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecortApiCallCtype method for sending requests to the platform with content type
|
||||||
|
func (ldc *LegacyDecortClient) DecortApiCallCtype(ctx context.Context, method, url, ctype string, params interface{}) ([]byte, error) {
|
||||||
|
// get token
|
||||||
|
if err := ldc.getToken(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var body *bytes.Buffer
|
||||||
|
|
||||||
|
switch ctype {
|
||||||
|
case constants.MIMESTREAM:
|
||||||
|
body = bytes.NewBuffer(params.([]byte))
|
||||||
|
case constants.MIMEJSON:
|
||||||
|
jsonBody, err := json.Marshal(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBuffer(jsonBody)
|
||||||
|
default:
|
||||||
|
ctype = constants.MIMEPOSTForm
|
||||||
|
values, err := query.Values(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body = bytes.NewBufferString(values.Encode() + fmt.Sprintf("&authkey=%s", ldc.cfg.Token))
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequestWithContext(ctx, method, ldc.decortURL+constants.RESTMACHINE+url, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// perform request
|
||||||
|
respBytes, err := ldc.do(req, ctype)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBytes, err
|
||||||
|
}
|
||||||
|
|
||||||
func (ldc *LegacyDecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
func (ldc *LegacyDecortClient) DecortApiCallMP(ctx context.Context, method, url string, params interface{}) ([]byte, error) {
|
||||||
body, ctype, err := multiPartReq(params)
|
body, ctype, err := multiPartReq(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package cloudapi
|
package cloudapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi/account"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/account"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Accessing the Account method group
|
// Accessing the Account method group
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
package account
|
package account
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/interfaces"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/interfaces"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Structure for creating request to account
|
// Structure for creating request to account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddUserRequest struct to add permission to access account for a user
|
// AddUserRequest struct to add permission to access account for a user
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AuditsRequest struct to give list of account audits
|
// AuditsRequest struct to give list of account audits
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CreateRequest struct for creating account
|
|
||||||
type CreateRequest struct {
|
|
||||||
// Display name
|
|
||||||
// Required: true
|
|
||||||
Name string `url:"name" json:"name" validate:"required"`
|
|
||||||
|
|
||||||
// Name of the account
|
|
||||||
// Required: true
|
|
||||||
Username string `url:"username" json:"username" validate:"required"`
|
|
||||||
|
|
||||||
// Email
|
|
||||||
// Required: false
|
|
||||||
EmailAddress string `url:"emailaddress,omitempty" json:"emailaddress,omitempty" validate:"omitempty,email"`
|
|
||||||
|
|
||||||
// Max size of memory in MB
|
|
||||||
// Required: false
|
|
||||||
MaxMemoryCapacity int64 `url:"maxMemoryCapacity,omitempty" json:"maxMemoryCapacity,omitempty"`
|
|
||||||
|
|
||||||
// Max size of aggregated vdisks in GB
|
|
||||||
// Required: false
|
|
||||||
MaxVDiskCapacity int64 `url:"maxVDiskCapacity,omitempty" json:"maxVDiskCapacity,omitempty"`
|
|
||||||
|
|
||||||
// Max number of CPU cores
|
|
||||||
// Required: false
|
|
||||||
MaxCPUCapacity int64 `url:"maxCPUCapacity,omitempty" json:"maxCPUCapacity,omitempty"`
|
|
||||||
|
|
||||||
// Max sent/received network transfer peering
|
|
||||||
// Required: false
|
|
||||||
MaxNetworkPeerTransfer int64 `url:"maxNetworkPeerTransfer,omitempty" json:"maxNetworkPeerTransfer,omitempty"`
|
|
||||||
|
|
||||||
// Max number of assigned public IPs
|
|
||||||
// Required: false
|
|
||||||
MaxNumPublicIP int64 `url:"maxNumPublicIP,omitempty" json:"maxNumPublicIP,omitempty"`
|
|
||||||
|
|
||||||
// If true send emails when a user is granted access to resources
|
|
||||||
// Required: false
|
|
||||||
SendAccessEmails bool `url:"sendAccessEmails" json:"sendAccessEmails"`
|
|
||||||
|
|
||||||
// Limit (positive) or disable (0) GPU resources
|
|
||||||
// Required: false
|
|
||||||
GPUUnits int64 `url:"gpu_units,omitempty" json:"gpu_units,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create creates account
|
|
||||||
// Setting a cloud unit maximum to -1 or empty will not put any restrictions on the resource
|
|
||||||
func (a Account) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/create"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeleteRequest struct to delete account
|
// DeleteRequest struct to delete account
|
||||||
@@ -19,18 +19,18 @@ type DeleteRequest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed
|
// Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed
|
||||||
func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
url := "/cloudapi/account/delete"
|
url := "/cloudapi/account/delete"
|
||||||
|
|
||||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, nil
|
return string(result), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeleteUserRequest struct to revoke access to account
|
// DeleteUserRequest struct to revoke access to account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DisableEnableRequest struct to change status of account
|
// DisableEnableRequest struct to change status of account
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
var accounts = ListAccounts{
|
var accounts = ListAccounts{
|
||||||
Data: []ItemAccount{
|
Data: []ItemAccount{
|
||||||
{
|
{
|
||||||
ACL: []RecordACL{
|
ACL: []ListRecordACL{
|
||||||
{
|
{
|
||||||
IsExplicit: true,
|
IsExplicit: true,
|
||||||
GUID: "",
|
GUID: "",
|
||||||
@@ -25,7 +25,7 @@ var accounts = ListAccounts{
|
|||||||
UpdatedTime: 1676645275,
|
UpdatedTime: 1676645275,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ACL: []RecordACL{
|
ACL: []ListRecordACL{
|
||||||
{
|
{
|
||||||
IsExplicit: true,
|
IsExplicit: true,
|
||||||
GUID: "",
|
GUID: "",
|
||||||
@@ -43,7 +43,7 @@ var accounts = ListAccounts{
|
|||||||
UpdatedTime: 1676645275,
|
UpdatedTime: 1676645275,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ACL: []RecordACL{
|
ACL: []ListRecordACL{
|
||||||
{
|
{
|
||||||
IsExplicit: true,
|
IsExplicit: true,
|
||||||
GUID: "",
|
GUID: "",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRequest struct to get information about account
|
// GetRequest struct to get information about account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetConsumedAccountUnitsRequest struct to calculate the currently consumed units for all cloudspaces and resource groups in the account
|
// GetConsumedAccountUnitsRequest struct to calculate the currently consumed units for all cloudspaces and resource groups in the account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetConsumedCloudUnitsByTypeRequest struct to calculate the currently consumed cloud units of the specified type for all cloudspaces and resource groups in the account
|
// GetConsumedCloudUnitsByTypeRequest struct to calculate the currently consumed cloud units of the specified type for all cloudspaces and resource groups in the account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetReservedAccountUnitsRequest struct to calculate the reserved units for all cloudspaces and resource groups in the account
|
// GetReservedAccountUnitsRequest struct to calculate the reserved units for all cloudspaces and resource groups in the account
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetResourceConsumptionRequest struct to get resource consumption
|
// GetResourceConsumptionRequest struct to get resource consumption
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListRequest struct to get list of accounts
|
// ListRequest struct to get list of accounts
|
||||||
@@ -30,6 +30,11 @@ type ListRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
||||||
|
|
||||||
|
// Sort by zone id
|
||||||
|
// Default value: 0
|
||||||
|
// Required: false
|
||||||
|
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
|
||||||
|
|
||||||
// Page number
|
// Page number
|
||||||
// Required: false
|
// Required: false
|
||||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListComputesRequest struct to get a list of compute instances
|
// ListComputesRequest struct to get a list of compute instances
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListDeletedRequest struct to get a list of deleted accounts
|
// ListDeletedRequest struct to get a list of deleted accounts
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListDisksRequest struct to get a list of deleted disks
|
// ListDisksRequest struct to get a list of deleted disks
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListFLIPGroupsRequest struct to get a list of FLIPGroups
|
// ListFLIPGroupsRequest struct to get a list of FLIPGroups
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListRGRequest struct to get a list of resource groups
|
// ListRGRequest struct to get a list of resource groups
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListTemplatesRequest struct to get a list of templates
|
// ListTemplatesRequest struct to get a list of templates
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListVINSRequest struct to get a list of VINS
|
// ListVINSRequest struct to get a list of VINS
|
||||||
|
|||||||
@@ -1,7 +1,34 @@
|
|||||||
package account
|
package account
|
||||||
|
|
||||||
|
// Access Control List
|
||||||
|
type ListRecordACL struct {
|
||||||
|
// Whether access is explicitly specified
|
||||||
|
IsExplicit bool `json:"explicit"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID string `json:"guid"`
|
||||||
|
|
||||||
|
// Access rights
|
||||||
|
Rights string `json:"right"`
|
||||||
|
|
||||||
|
// Status
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Account Type
|
||||||
|
Type string `json:"type"`
|
||||||
|
|
||||||
|
// Account owner ID
|
||||||
|
UgroupID string `json:"userGroupId"`
|
||||||
|
|
||||||
|
// Is it possible to remove
|
||||||
|
CanBeDeleted bool `json:"canBeDeleted"`
|
||||||
|
}
|
||||||
|
|
||||||
// Access Control List
|
// Access Control List
|
||||||
type RecordACL struct {
|
type RecordACL struct {
|
||||||
|
// Emails
|
||||||
|
Emails []string `json:"emails"`
|
||||||
|
|
||||||
// Whether access is explicitly specified
|
// Whether access is explicitly specified
|
||||||
IsExplicit bool `json:"explicit"`
|
IsExplicit bool `json:"explicit"`
|
||||||
|
|
||||||
@@ -46,12 +73,21 @@ type ResourceLimits struct {
|
|||||||
|
|
||||||
// Number of graphics cores
|
// Number of graphics cores
|
||||||
GPUUnits float64 `json:"gpu_units"`
|
GPUUnits float64 `json:"gpu_units"`
|
||||||
|
|
||||||
|
// Storage policy
|
||||||
|
StoragePolicy []StoragePolicyItem `json:"storage_policy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StoragePolicyItem struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
Limit int `json:"limit"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information in one of if the list of accounts
|
// Main information in one of if the list of accounts
|
||||||
type ItemAccount struct {
|
type ItemAccount struct {
|
||||||
// Access Control List
|
// Access Control List
|
||||||
ACL []RecordACL `json:"acl"`
|
ACL []ListRecordACL `json:"acl"`
|
||||||
|
|
||||||
// Compute Features
|
// Compute Features
|
||||||
ComputeFeatures []string `json:"computeFeatures"`
|
ComputeFeatures []string `json:"computeFeatures"`
|
||||||
@@ -62,6 +98,9 @@ type ItemAccount struct {
|
|||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
// ID
|
// ID
|
||||||
ID uint64 `json:"id"`
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
@@ -73,6 +112,9 @@ type ItemAccount struct {
|
|||||||
|
|
||||||
// Updated time
|
// Updated time
|
||||||
UpdatedTime uint64 `json:"updatedTime"`
|
UpdatedTime uint64 `json:"updatedTime"`
|
||||||
|
|
||||||
|
// Zones
|
||||||
|
ZoneIDs []uint64 `json:"zoneIds"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of accounts
|
// List of accounts
|
||||||
@@ -82,6 +124,18 @@ type ListAccounts struct {
|
|||||||
EntryCount uint64 `json:"entryCount"`
|
EntryCount uint64 `json:"entryCount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Policy
|
||||||
|
type Policy struct {
|
||||||
|
// Size of the disk
|
||||||
|
DiskSize float64 `json:"disksize"`
|
||||||
|
|
||||||
|
// Max size of the disk
|
||||||
|
DiskSizeMax float64 `json:"disksizemax"`
|
||||||
|
|
||||||
|
// SEPs used
|
||||||
|
SEPs map[string]map[string]DiskUsage `json:"seps"`
|
||||||
|
}
|
||||||
|
|
||||||
// Resources used
|
// Resources used
|
||||||
type Resource struct {
|
type Resource struct {
|
||||||
// Number of cores
|
// Number of cores
|
||||||
@@ -102,6 +156,9 @@ type Resource struct {
|
|||||||
// Number of grafic cores
|
// Number of grafic cores
|
||||||
GPU int64 `json:"gpu"`
|
GPU int64 `json:"gpu"`
|
||||||
|
|
||||||
|
// Policies
|
||||||
|
Policies map[string]Policy `json:"policies"`
|
||||||
|
|
||||||
// Number of RAM
|
// Number of RAM
|
||||||
RAM int64 `json:"ram"`
|
RAM int64 `json:"ram"`
|
||||||
|
|
||||||
@@ -162,14 +219,20 @@ type Machines struct {
|
|||||||
Halted uint64 `json:"halted"`
|
Halted uint64 `json:"halted"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detailed information about the account zone
|
||||||
|
type ZoneID struct {
|
||||||
|
// ID of zone
|
||||||
|
ID int64 `json:"id"`
|
||||||
|
|
||||||
|
// Name of zone
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
// Main information about account
|
// Main information about account
|
||||||
type RecordAccount struct {
|
type RecordAccount struct {
|
||||||
// DCLocation
|
// DCLocation
|
||||||
DCLocation string `json:"DCLocation"`
|
DCLocation string `json:"DCLocation"`
|
||||||
|
|
||||||
// CKey
|
|
||||||
CKey string `json:"_ckey"`
|
|
||||||
|
|
||||||
// Access control list
|
// Access control list
|
||||||
ACL []RecordACL `json:"acl"`
|
ACL []RecordACL `json:"acl"`
|
||||||
|
|
||||||
@@ -197,6 +260,9 @@ type RecordAccount struct {
|
|||||||
// Created time
|
// Created time
|
||||||
CreatedTime uint64 `json:"createdTime"`
|
CreatedTime uint64 `json:"createdTime"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
// Deactivation time
|
// Deactivation time
|
||||||
DeactivationTime float64 `json:"deactivationTime"`
|
DeactivationTime float64 `json:"deactivationTime"`
|
||||||
|
|
||||||
@@ -233,6 +299,9 @@ type RecordAccount struct {
|
|||||||
// Status
|
// Status
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Storage policy ids
|
||||||
|
StoragePolicyIDs []uint64 `json:"storage_policy_ids"`
|
||||||
|
|
||||||
// UniqPools
|
// UniqPools
|
||||||
UniqPools []interface{} `json:"uniqPools"`
|
UniqPools []interface{} `json:"uniqPools"`
|
||||||
|
|
||||||
@@ -247,6 +316,12 @@ type RecordAccount struct {
|
|||||||
|
|
||||||
// VINSes
|
// VINSes
|
||||||
VINSes uint64 `json:"vinses"`
|
VINSes uint64 `json:"vinses"`
|
||||||
|
|
||||||
|
// Zone
|
||||||
|
ZoneIDs []ZoneID `json:"zoneIds"`
|
||||||
|
|
||||||
|
// Zones
|
||||||
|
DefaultZoneID uint64 `json:"defaultZoneId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information about compute
|
// Main information about compute
|
||||||
@@ -512,6 +587,9 @@ type ItemRG struct {
|
|||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
// Resource group ID
|
// Resource group ID
|
||||||
RGID uint64 `json:"id"`
|
RGID uint64 `json:"id"`
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RestoreRequest struct to restore a deleted account
|
// RestoreRequest struct to restore a deleted account
|
||||||
@@ -15,18 +15,18 @@ type RestoreRequest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Restore restores a deleted account
|
// Restore restores a deleted account
|
||||||
func (a Account) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
|
func (a Account) Restore(ctx context.Context, req RestoreRequest) (string, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
url := "/cloudapi/account/restore"
|
url := "/cloudapi/account/restore"
|
||||||
|
|
||||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, nil
|
return string(result), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package account
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/serialization"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/serialization"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdateRequest struct to update account
|
// UpdateRequest struct to update account
|
||||||
@@ -14,6 +14,10 @@ type UpdateRequest struct {
|
|||||||
// Required: true
|
// Required: true
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
// Required: false
|
||||||
|
Description string `url:"desc,omitempty" json:"desc,omitempty"`
|
||||||
|
|
||||||
// Name of the account
|
// Name of the account
|
||||||
// Required: false
|
// Required: false
|
||||||
Name string `url:"name,omitempty" json:"name,omitempty"`
|
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||||
@@ -50,6 +54,10 @@ type UpdateRequest struct {
|
|||||||
// i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
|
// i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
|
||||||
// Required: false
|
// Required: false
|
||||||
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
|
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
|
||||||
|
|
||||||
|
// Default zone ID
|
||||||
|
// Required: false
|
||||||
|
DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update updates an account name and resource types and limits
|
// Update updates an account name and resource types and limits
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdateUserRequest struct to update user access rights
|
// UpdateUserRequest struct to update user access rights
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package cloudapi
|
package cloudapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi/audit"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/audit"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Accessing the Stack method group
|
// Accessing the Stack method group
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package audit
|
package audit
|
||||||
|
|
||||||
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/interfaces"
|
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/interfaces"
|
||||||
|
|
||||||
// Structure for creating request to audit
|
// Structure for creating request to audit
|
||||||
type Audit struct {
|
type Audit struct {
|
||||||
|
|||||||
81
pkg/cloudapi/audit/filter.go
Normal file
81
pkg/cloudapi/audit/filter.go
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package audit
|
||||||
|
|
||||||
|
// FilterByID returns ListAudits with specified ID.
|
||||||
|
func (la ListAudits) FilterByID(guid string) ListAudits {
|
||||||
|
predicate := func(ia ItemAudit) bool {
|
||||||
|
return ia.GUID == guid
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByCall returns ListAudits with specified call.
|
||||||
|
func (la ListAudits) FilterByCall(call string) ListAudits {
|
||||||
|
predicate := func(ic ItemAudit) bool {
|
||||||
|
return ic.Call == call
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByCorrelationID returns ListAudits with specified correlation id.
|
||||||
|
func (la ListAudits) FilterByCorrelationID(correlationID string) ListAudits {
|
||||||
|
predicate := func(ic ItemAudit) bool {
|
||||||
|
return ic.CorrelationID == correlationID
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByRemoteAddr returns ListAudits with specified remote address.
|
||||||
|
func (la ListAudits) FilterByRemoteAddr(remoteAddr string) ListAudits {
|
||||||
|
predicate := func(ic ItemAudit) bool {
|
||||||
|
return ic.RemoteAddr == remoteAddr
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByUser returns ListAudits with specified user name.
|
||||||
|
func (la ListAudits) FilterByUser(user string) ListAudits {
|
||||||
|
predicate := func(ic ItemAudit) bool {
|
||||||
|
return ic.User == user
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByStatusCode return ListAudits with specified status code.
|
||||||
|
func (la ListAudits) FilterByStatusCode(statusCode uint64) ListAudits {
|
||||||
|
predicate := func(ic ItemAudit) bool {
|
||||||
|
return ic.StatusCode == statusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.FilterFunc(predicate)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterFunc allows filtering ListAudits based on a user-specified predicate.
|
||||||
|
func (la ListAudits) FilterFunc(predicate func(ItemAudit) bool) ListAudits {
|
||||||
|
var result ListAudits
|
||||||
|
|
||||||
|
for _, item := range la.Data {
|
||||||
|
if predicate(item) {
|
||||||
|
result.Data = append(result.Data, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.EntryCount = uint64(len(result.Data))
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindOne returns first found ItemAudit
|
||||||
|
// If none was found, returns an empty struct.
|
||||||
|
func (la ListAudits) FindOne() ItemAudit {
|
||||||
|
if len(la.Data) == 0 {
|
||||||
|
return ItemAudit{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return la.Data[0]
|
||||||
|
}
|
||||||
115
pkg/cloudapi/audit/filter_test.go
Normal file
115
pkg/cloudapi/audit/filter_test.go
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
package audit
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var audits = ListAudits{
|
||||||
|
Data: []ItemAudit{
|
||||||
|
{
|
||||||
|
Args: "[]",
|
||||||
|
Call: "/restmachine/cloudapi/audit/linkedJobs",
|
||||||
|
GUID: "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
CorrelationID: "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
|
||||||
|
RemoteAddr: "192.168.1.100",
|
||||||
|
ResponseTime: 1,
|
||||||
|
Result: `[]`,
|
||||||
|
StatusCode: 200,
|
||||||
|
Timestamp: 1640995200,
|
||||||
|
TimestampEnd: 1640995201,
|
||||||
|
User: "test@example.com",
|
||||||
|
TTL: "2025-07-31T14:22:57.028000",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Args: "[]",
|
||||||
|
Call: "/restmachine/cloudapi/audit/test",
|
||||||
|
GUID: "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
CorrelationID: "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
|
||||||
|
RemoteAddr: "192.168.1.105",
|
||||||
|
ResponseTime: 5,
|
||||||
|
Result: `[]`,
|
||||||
|
StatusCode: 400,
|
||||||
|
Timestamp: 1640995200,
|
||||||
|
TimestampEnd: 1640995201,
|
||||||
|
User: "test2@example.com",
|
||||||
|
TTL: "2025-07-31T14:22:57.028000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
EntryCount: 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByID(t *testing.T) {
|
||||||
|
actual := audits.FilterByID("550e8400-e29b-41d4-a716-446655440002").FindOne()
|
||||||
|
|
||||||
|
if actual.GUID != "550e8400-e29b-41d4-a716-446655440002" {
|
||||||
|
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.GUID)
|
||||||
|
}
|
||||||
|
|
||||||
|
actualEmpty := audits.FilterByID("")
|
||||||
|
|
||||||
|
if len(actualEmpty.Data) != 0 {
|
||||||
|
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByCorrelationID(t *testing.T) {
|
||||||
|
actual := audits.FilterByCorrelationID("550e8400-e29b-41d4-a716-446655440002").FindOne()
|
||||||
|
|
||||||
|
if actual.CorrelationID != "550e8400-e29b-41d4-a716-446655440002" {
|
||||||
|
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.CorrelationID)
|
||||||
|
}
|
||||||
|
|
||||||
|
actualEmpty := audits.FilterByCorrelationID("")
|
||||||
|
|
||||||
|
if len(actualEmpty.Data) != 0 {
|
||||||
|
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByRemoteAddr(t *testing.T) {
|
||||||
|
actual := audits.FilterByRemoteAddr("192.168.1.100").FindOne()
|
||||||
|
|
||||||
|
if actual.RemoteAddr != "192.168.1.100" {
|
||||||
|
t.Fatal("expected remote address 192.168.1.100, found: ", actual.RemoteAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
actualEmpty := audits.FilterByRemoteAddr("")
|
||||||
|
|
||||||
|
if len(actualEmpty.Data) != 0 {
|
||||||
|
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByUser(t *testing.T) {
|
||||||
|
actual := audits.FilterByUser("test@example.com").FindOne()
|
||||||
|
|
||||||
|
if actual.User != "test@example.com" {
|
||||||
|
t.Fatal("expected user test@example.com, found: ", actual.RemoteAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
actualEmpty := audits.FilterByUser("")
|
||||||
|
|
||||||
|
if len(actualEmpty.Data) != 0 {
|
||||||
|
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByCall(t *testing.T) {
|
||||||
|
actual := audits.FilterByCall("/restmachine/cloudapi/audit/test").FindOne()
|
||||||
|
|
||||||
|
if actual.Call != "/restmachine/cloudapi/audit/test" {
|
||||||
|
t.Fatal("expected call /restmachine/cloudapi/audit/test, found: ", actual.Call)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByStatusCode(t *testing.T) {
|
||||||
|
actual := audits.FilterByStatusCode(200)
|
||||||
|
|
||||||
|
for _, item := range actual.Data {
|
||||||
|
if item.StatusCode != 200 {
|
||||||
|
t.Fatal("expected 200 status code, found: ", item.StatusCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,14 +5,14 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRequest struct to get information about account
|
// GetRequest struct to get information about account
|
||||||
type GetRequest struct {
|
type GetRequest struct {
|
||||||
// Audit GUID
|
// Audit GUID
|
||||||
// Required: true
|
// Required: true
|
||||||
AuditGuid string `url:"auditGuid" json:"auditGuid" validate:"required"`
|
AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get gets information about audit as a RecordAudit struct
|
// Get gets information about audit as a RecordAudit struct
|
||||||
|
|||||||
124
pkg/cloudapi/audit/list.go
Normal file
124
pkg/cloudapi/audit/list.go
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
package audit
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListRequest struct to give list of account audits
|
||||||
|
type ListRequest struct {
|
||||||
|
|
||||||
|
// Find all audits after point in time (unixtime)
|
||||||
|
// Required: false
|
||||||
|
TimestampAt uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
|
||||||
|
|
||||||
|
// Find all audits before point in time (unixtime)
|
||||||
|
// Required: false
|
||||||
|
TimestampTo uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
|
||||||
|
|
||||||
|
// Find by user (Mongo RegExp supported)
|
||||||
|
// Required: false
|
||||||
|
User string `url:"user,omitempty" json:"user,omitempty"`
|
||||||
|
|
||||||
|
// Find by api endpoint (Mongo RegExp supported)
|
||||||
|
// Required: false
|
||||||
|
Call string `url:"call,omitempty" json:"call,omitempty"`
|
||||||
|
|
||||||
|
// Find by request id
|
||||||
|
// Required: false
|
||||||
|
RequestID string `url:"request_id,omitempty" json:"request_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by HTTP min status code
|
||||||
|
// Required: false
|
||||||
|
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
|
||||||
|
|
||||||
|
// Find by HTTP max status code
|
||||||
|
// Required: false
|
||||||
|
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
|
||||||
|
|
||||||
|
// Sort by one of supported fields, format +|-(field)
|
||||||
|
// Required: false
|
||||||
|
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty" validate:"omitempty,sortBy"`
|
||||||
|
|
||||||
|
// Page number
|
||||||
|
// Required: false
|
||||||
|
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||||
|
|
||||||
|
// Page size
|
||||||
|
// Required: false
|
||||||
|
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
||||||
|
|
||||||
|
// Find by resource group id
|
||||||
|
// Required: false
|
||||||
|
RGID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by compute id
|
||||||
|
// Required: false
|
||||||
|
ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by account id
|
||||||
|
// Required: false
|
||||||
|
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by vins id
|
||||||
|
// Required: false
|
||||||
|
VINSID uint64 `url:"vins_id,omitempty" json:"vins_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by service id
|
||||||
|
// Required: false
|
||||||
|
ServiceID uint64 `url:"service_id,omitempty" json:"service_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by k8s id
|
||||||
|
// Required: false
|
||||||
|
K8SID uint64 `url:"k8s_id,omitempty" json:"k8s_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by flipgroup id
|
||||||
|
// Required: false
|
||||||
|
FLIPGroupID uint64 `url:"flipgroup_id,omitempty" json:"flipgroup_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by load balancer id
|
||||||
|
// Required: false
|
||||||
|
LBID uint64 `url:"lb_id,omitempty" json:"lb_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by sep id
|
||||||
|
// Required: false
|
||||||
|
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`
|
||||||
|
|
||||||
|
// Exclude audit lines from response
|
||||||
|
// Required: false
|
||||||
|
ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// List gets audit records for the specified account object
|
||||||
|
func (a Audit) List(ctx context.Context, req ListRequest) (*ListAudits, error) {
|
||||||
|
|
||||||
|
res, err := a.ListRaw(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
list := ListAudits{}
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &list)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &list, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListRaw gets list of audit records an array of bytes
|
||||||
|
func (a Audit) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
||||||
|
|
||||||
|
if err := validators.ValidateRequest(req); err != nil {
|
||||||
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/audit/list"
|
||||||
|
|
||||||
|
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -12,6 +12,9 @@ type RecordAudit struct {
|
|||||||
// GUID
|
// GUID
|
||||||
GUID string `json:"guid"`
|
GUID string `json:"guid"`
|
||||||
|
|
||||||
|
// Correlation ID
|
||||||
|
CorrelationID string `json:"correlation_id"`
|
||||||
|
|
||||||
// Kwargs
|
// Kwargs
|
||||||
Kwargs string `json:"kwargs"`
|
Kwargs string `json:"kwargs"`
|
||||||
|
|
||||||
@@ -39,3 +42,54 @@ type RecordAudit struct {
|
|||||||
// User
|
// User
|
||||||
User string `json:"user"`
|
User string `json:"user"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Main info about audit
|
||||||
|
type ItemAudit struct {
|
||||||
|
// Args
|
||||||
|
Args string `json:"args"`
|
||||||
|
|
||||||
|
// Call
|
||||||
|
Call string `json:"call"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID string `json:"guid"`
|
||||||
|
|
||||||
|
// Correlation ID
|
||||||
|
CorrelationID string `json:"correlation_id"`
|
||||||
|
|
||||||
|
// Kwargs
|
||||||
|
Kwargs string `json:"kwargs"`
|
||||||
|
|
||||||
|
// RemoteAddr
|
||||||
|
RemoteAddr string `json:"remote_addr"`
|
||||||
|
|
||||||
|
// Response time
|
||||||
|
ResponseTime float64 `json:"responsetime"`
|
||||||
|
|
||||||
|
// Result
|
||||||
|
Result string `json:"result"`
|
||||||
|
|
||||||
|
// Status code
|
||||||
|
StatusCode uint64 `json:"statuscode"`
|
||||||
|
|
||||||
|
// Timestamp
|
||||||
|
Timestamp float64 `json:"timestamp"`
|
||||||
|
|
||||||
|
// Timestamp End
|
||||||
|
TimestampEnd float64 `json:"timestampEnd"`
|
||||||
|
|
||||||
|
// User
|
||||||
|
User string `json:"user"`
|
||||||
|
|
||||||
|
// TTL
|
||||||
|
TTL string `json:"_ttl"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// List of audits
|
||||||
|
type ListAudits struct {
|
||||||
|
// Data
|
||||||
|
Data []ItemAudit `json:"data"`
|
||||||
|
|
||||||
|
// EntryCount
|
||||||
|
EntryCount uint64 `json:"entryCount"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package cloudapi
|
package cloudapi
|
||||||
|
|
||||||
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi/bservice"
|
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/bservice"
|
||||||
|
|
||||||
// Accessing the BService method group
|
// Accessing the BService method group
|
||||||
func (ca *CloudAPI) BService() *bservice.BService {
|
func (ca *CloudAPI) BService() *bservice.BService {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// API Actor for managing Compute Group. This actor is a final API for endusers to manage Compute Group
|
// API Actor for managing Compute Group. This actor is a final API for endusers to manage Compute Group
|
||||||
package bservice
|
package bservice
|
||||||
|
|
||||||
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/interfaces"
|
import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/interfaces"
|
||||||
|
|
||||||
// Structure for creating request to bservice
|
// Structure for creating request to bservice
|
||||||
type BService struct {
|
type BService struct {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateRequest struct for BasicService
|
// CreateRequest struct for BasicService
|
||||||
@@ -25,6 +25,10 @@ type CreateRequest struct {
|
|||||||
// SSH key to deploy for the specified user. Same key will be deployed to all computes of the service
|
// SSH key to deploy for the specified user. Same key will be deployed to all computes of the service
|
||||||
// Required: false
|
// Required: false
|
||||||
SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"`
|
SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
// Required: false
|
||||||
|
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create creates blank BasicService instance
|
// Create creates blank BasicService instance
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeleteRequest struct to delete basic service
|
// DeleteRequest struct to delete basic service
|
||||||
@@ -16,6 +16,7 @@ type DeleteRequest struct {
|
|||||||
|
|
||||||
// If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately
|
// If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately
|
||||||
// Required: false
|
// Required: false
|
||||||
|
// Default: false
|
||||||
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
|
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DisableRequest struct for disable service
|
// DisableRequest struct for disable service
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EnableRequest struct to disable service
|
// EnableRequest struct to disable service
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRequest struct to get detailed information about service
|
// GetRequest struct to get detailed information about service
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupAddRequest struct to create new compute group within BasicService
|
// GroupAddRequest struct to create new compute group within BasicService
|
||||||
@@ -38,11 +38,9 @@ type GroupAddRequest struct {
|
|||||||
// Required: true
|
// Required: true
|
||||||
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
|
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
|
||||||
|
|
||||||
// Compute driver
|
// Compute driver like a KVM_X86, etc.
|
||||||
// should be one of:
|
|
||||||
// - KVM_X86
|
|
||||||
// Required: true
|
// Required: true
|
||||||
Driver string `url:"driver" json:"driver" validate:"driver"`
|
Driver string `url:"driver" json:"driver" validate:"required"`
|
||||||
|
|
||||||
// Storage endpoint provider ID
|
// Storage endpoint provider ID
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -71,6 +69,14 @@ type GroupAddRequest struct {
|
|||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format YAML "user_data": 1111
|
||||||
// Required: false
|
// Required: false
|
||||||
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
||||||
|
|
||||||
|
//Chipset "i440fx" or "Q35
|
||||||
|
//Required: false
|
||||||
|
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset,omitempty"`
|
||||||
|
|
||||||
|
// ID of the chosen storage policy
|
||||||
|
// Required: false
|
||||||
|
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupComputeRemoveRequest struct to remove group compute
|
// GroupComputeRemoveRequest struct to remove group compute
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupGetRequest struct to get detailed information about Compute Group
|
// GroupGetRequest struct to get detailed information about Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupParentAddRequest struct to add parent Compute Group relation to the specified Compute Group
|
// GroupParentAddRequest struct to add parent Compute Group relation to the specified Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupParentRemoveRequest struct to remove parent Compute Group
|
// GroupParentRemoveRequest struct to remove parent Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupRemoveRequest struct for destroy the specified Compute Group
|
// GroupRemoveRequest struct for destroy the specified Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupResizeRequest struct to resize the group
|
// GroupResizeRequest struct to resize the group
|
||||||
@@ -22,6 +22,12 @@ type GroupResizeRequest struct {
|
|||||||
// Required: true
|
// Required: true
|
||||||
Count int64 `url:"count" json:"count" validate:"required"`
|
Count int64 `url:"count" json:"count" validate:"required"`
|
||||||
|
|
||||||
|
//Chipset for new computes, either i440fx or Q35 (i440fx by default)
|
||||||
|
//Available values : i440fx, Q35
|
||||||
|
//Default value : i440fx
|
||||||
|
//Required: true
|
||||||
|
Chipset string `url:"chipset" json:"chipset" validate:"required,chipset"`
|
||||||
|
|
||||||
// Either delta or absolute value of computes
|
// Either delta or absolute value of computes
|
||||||
// Should be one of:
|
// Should be one of:
|
||||||
// - ABSOLUTE
|
// - ABSOLUTE
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupStartRequest struct to start the specified Compute Group
|
// GroupStartRequest struct to start the specified Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupStopRequest struct to stop the specified Compute Group
|
// GroupStopRequest struct to stop the specified Compute Group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupUpdateRequest struct to update existing Compute group
|
// GroupUpdateRequest struct to update existing Compute group
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupUpdateExtNetRequest struct to update External Network settings
|
// GroupUpdateExtNetRequest struct to update External Network settings
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupUpdateVINSRequest struct to update VINS settings
|
// GroupUpdateVINSRequest struct to update VINS settings
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListRequest struct to get list of BasicService instances
|
// ListRequest struct to get list of BasicService instances
|
||||||
@@ -46,6 +46,11 @@ type ListRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
||||||
|
|
||||||
|
// Sort by zone id
|
||||||
|
// Default value: 0
|
||||||
|
// Required: false
|
||||||
|
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
|
||||||
|
|
||||||
// Page number
|
// Page number
|
||||||
// Required: false
|
// Required: false
|
||||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListDeletedRequest struct to get list of deleted BasicService instances
|
// ListDeletedRequest struct to get list of deleted BasicService instances
|
||||||
|
|||||||
42
pkg/cloudapi/bservice/migrate_to_zone.go
Normal file
42
pkg/cloudapi/bservice/migrate_to_zone.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package bservice
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MigrateToZone struct to move basic service to another zone
|
||||||
|
type MigrateToZoneRequest struct {
|
||||||
|
// ID of the BasicService to move
|
||||||
|
// Required: true
|
||||||
|
ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"`
|
||||||
|
|
||||||
|
// ID of the zone to move
|
||||||
|
// Required: true
|
||||||
|
ZoneID uint64 `url:"zoneId" json:"zoneId" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MigrateToZone moves basic service instance to new zone
|
||||||
|
func (b BService) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/bservice/migrateToZone"
|
||||||
|
|
||||||
|
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
@@ -88,6 +88,9 @@ type RecordBasicService struct {
|
|||||||
|
|
||||||
// Whether user controlled
|
// Whether user controlled
|
||||||
UserManaged bool `json:"userManaged"`
|
UserManaged bool `json:"userManaged"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information about Compute
|
// Main information about Compute
|
||||||
@@ -295,6 +298,9 @@ type ItemGroupCompute struct {
|
|||||||
|
|
||||||
// List of information about OS Users
|
// List of information about OS Users
|
||||||
OSUsers ListOSUsers `json:"osUsers"`
|
OSUsers ListOSUsers `json:"osUsers"`
|
||||||
|
|
||||||
|
//Chipset
|
||||||
|
Chipset string `json:"chipset"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of Group Computes
|
// List of Group Computes
|
||||||
@@ -379,6 +385,9 @@ type ItemBasicService struct {
|
|||||||
|
|
||||||
// User Managed or not
|
// User Managed or not
|
||||||
UserManaged bool `json:"userManaged"`
|
UserManaged bool `json:"userManaged"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of BasicServices
|
// List of BasicServices
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RestoreRequest struct to restore BasicService instance
|
// RestoreRequest struct to restore BasicService instance
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package bservice
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/serialization"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/serialization"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SnapshotCreateRequest struct to create snapshot
|
// SnapshotCreateRequest struct to create snapshot
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SnapshotDeleteRequest struct to delete snapshot
|
// SnapshotDeleteRequest struct to delete snapshot
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SnapshotListRequest struct to get list of existing snapshots
|
// SnapshotListRequest struct to get list of existing snapshots
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SnapshotRollbackRequest struct to rollback snapshot
|
// SnapshotRollbackRequest struct to rollback snapshot
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StartRequest struct to start service
|
// StartRequest struct to start service
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StopRequest struct to stop service
|
// StopRequest struct to stop service
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
package cloudapi
|
package cloudapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/interfaces"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/interfaces"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Structure for creating request to CloudAPI groups
|
// Structure for creating request to CloudAPI groups
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package cloudapi
|
package cloudapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/pkg/cloudapi/compute"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/pkg/cloudapi/compute"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Accessing the Compute method group
|
// Accessing the Compute method group
|
||||||
|
|||||||
42
pkg/cloudapi/compute/abort_shared_snapshot_merge.go
Normal file
42
pkg/cloudapi/compute/abort_shared_snapshot_merge.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AbortSharedSnapshotMergeRequest struct to abort shared snapshots merge
|
||||||
|
type AbortSharedSnapshotMergeRequest struct {
|
||||||
|
// ID of the compute
|
||||||
|
// Required: true
|
||||||
|
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||||
|
|
||||||
|
// Label of the snapshot
|
||||||
|
// Required: true
|
||||||
|
Label string `url:"label" json:"label" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AbortSharedSnapshotMerge shared snapshots merge abort
|
||||||
|
func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/compute/abort_shared_snapshot_merge"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityGroupCheckStartRequest struct to check all computes with current affinity label can start
|
// AffinityGroupCheckStartRequest struct to check all computes with current affinity label can start
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityLabelRemoveRequest struct to clear affinity label for compute
|
// AffinityLabelRemoveRequest struct to clear affinity label for compute
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityLabelSetRequest struct to set affinity label for compute
|
// AffinityLabelSetRequest struct to set affinity label for compute
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityRelationsRequest struct to get dict of computes
|
// AffinityRelationsRequest struct to get dict of computes
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityRuleAddRequest struct to add affinity rule
|
// AffinityRuleAddRequest struct to add affinity rule
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityRuleRemoveRequest struct to remove affinity rule
|
// AffinityRuleRemoveRequest struct to remove affinity rule
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AffinityRulesClearRequest struct to clear affinity rules
|
// AffinityRulesClearRequest struct to clear affinity rules
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AntiAffinityRuleAddRequest struct to add anti affinity rule
|
// AntiAffinityRuleAddRequest struct to add anti affinity rule
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AntiAffinityRuleRemoveRequest struct to remove anti affinity rule
|
// AntiAffinityRuleRemoveRequest struct to remove anti affinity rule
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AntiAffinityRulesClearRequest struct to clear anti affinity rules
|
// AntiAffinityRulesClearRequest struct to clear anti affinity rules
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AttachGPURequest struct to attach GPU for compute
|
// AttachGPURequest struct to attach GPU for compute
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AttachPCIDeviceRequest struct to attach PCI device
|
// AttachPCIDeviceRequest struct to attach PCI device
|
||||||
|
|||||||
@@ -5,18 +5,54 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AuditsRequest struct to get audit records
|
// AuditsRequest struct to get audit records
|
||||||
type AuditsRequest struct {
|
type AuditsRequest struct {
|
||||||
// ID of the compute
|
// ID of the compute
|
||||||
// Required: true
|
// Required: true
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||||
|
|
||||||
|
// Find all audits after point in time
|
||||||
|
// Required: false
|
||||||
|
TimestampAT uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
|
||||||
|
|
||||||
|
// Find all audits before point in time
|
||||||
|
// Required: false
|
||||||
|
TimestampTO uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
|
||||||
|
|
||||||
|
// Find by user
|
||||||
|
// Required: false
|
||||||
|
User string `url:"user,omitempty" json:"user,omitempty"`
|
||||||
|
|
||||||
|
// Find by api endpoints
|
||||||
|
// Required: false
|
||||||
|
Call string `url:"call,omitempty" json:"call,omitempty"`
|
||||||
|
|
||||||
|
// Sort by one of supported fields, format ±<field>
|
||||||
|
// Required: false
|
||||||
|
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
||||||
|
|
||||||
|
// Page number
|
||||||
|
// Required: false
|
||||||
|
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||||
|
|
||||||
|
// Page size
|
||||||
|
// Required: false
|
||||||
|
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
||||||
|
|
||||||
|
// Find by HTTP min status code
|
||||||
|
// Required: false
|
||||||
|
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
|
||||||
|
|
||||||
|
// Find by HTTP max status code
|
||||||
|
// Required: false
|
||||||
|
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Audits gets audit records for the specified compute object
|
// Audits gets audit records for the specified compute object
|
||||||
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
|
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (*ListAudits, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
@@ -24,7 +60,7 @@ func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, err
|
|||||||
|
|
||||||
url := "/cloudapi/compute/audits"
|
url := "/cloudapi/compute/audits"
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -36,5 +72,5 @@ func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, err
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return list, nil
|
return &list, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BootDiskSetRequest struct to set boot disk for compute
|
// BootDiskSetRequest struct to set boot disk for compute
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v9/internal/validators"
|
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v12/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BootOrderGetRequest struct to get boot order
|
// BootOrderGetRequest struct to get boot order
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user