Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e10ee7f801 | ||
|
|
7dacf35cd6 | ||
|
|
1f8637400f | ||
| 89831894df | |||
| 92431c5c65 | |||
|
|
c7a2c4ed5a | ||
| 0c44daa241 | |||
|
|
650b1c158b |
189
CHANGELOG.md
189
CHANGELOG.md
@@ -1,202 +1,27 @@
|
||||
## Version 1.11
|
||||
## Version 1.12.1
|
||||
|
||||
### Добавлено
|
||||
|
||||
#### account
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-304 | Опциональное поле `Description` в структуру запроса `UpdateCreateRequest` в cloudapi/account |
|
||||
| BGOS-304 | Опциональное поле `Description` в структуры запроса `CreateRequest`, `UpdateCreateRequest` в cloudbroker/account |
|
||||
| BGOS-304 | Поле `Description` в структуры ответа `ItemRG`, `RecordAccount`, `ItemAccount` в cloudapi/account и cloudbroker/account |
|
||||
| BGOS-316 | Опциональное поле `Reason` в структуру запроса `DisableEnableRequest` в cloudapi/account |
|
||||
| BGOS-316 | Опциональное поле `Reason` в структуры запроса `RestoreRequest`, `DisableAccountsRequest`, `DisableRequest` в cloudbroker/account |
|
||||
|
||||
#### apiaccess
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-306 | Метод `GetDefault` и структура ответа `ItemAPIAccessDefault` в cloudbroker/apiaccess |
|
||||
| BGOS-309 | Обязательные поля `APIGroup`, `APIMethod`, `APIObject` в структуру запроса `APIFindRequest` в cloudbroker/apiaccess |
|
||||
| BGOS-309 | Поле `DPDK` в структуры ответа `CloudAPIEndpoints` и `CloudBrokerEndpoints` в cloudbroker/apiaccess |
|
||||
|
||||
#### audit
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-307 | Опциональное поле `RequestID` в структуру запроса `ListRequest` в cloudapi/audit |
|
||||
| BGOS-337 | Поле `PhysicalNode` в структуру ответа `ItemLinkedJobs` в cloudbroker/audit |
|
||||
| BGOS-395 | Поле `TTL` в структуру ответа `RecordAudit` в cloudbroker/audit |
|
||||
| BGOS-395 | Поля `Args`, `Kwargs`, `RemoteAddr`, `Result`, `TimestampEnd`, `TTL` в структуру ответа `ItemAudit` в cloudbroker/audit |
|
||||
| BGOS-340 | Поле `Tags` в структуре ответа `ItemAudit` в cloudbroker/audit |
|
||||
|
||||
### bservice
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-317 | Опциональное поле `Chipset` в структуру запроса `GroupAddRequest` в cloudapi/bservice |
|
||||
| BGOS-354 | Опциональное поле `Chipset` в структуру запроса `GroupResizeRequest` в cloudapi/bservice |
|
||||
| BGOS-357 | Поле `Chipset` в структуру ответа `ItemGroupCompute` в cloudapi/bservice |
|
||||
| BGOS-559 | В структуру ответа `RecordACL` добавлено поле `Emails` в cloudapi/account |
|
||||
|
||||
#### compute
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-311 | Опциональное поле `StackName` в структуру запроса `ListRequest` в cloudbroker/list |
|
||||
| BGOS-312 | Опциональные поля `LoaderType`, `BootType`, `NetworkInterfaceNaming`, `HotResize` в структуру запроса `UpdateRequest` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-312 | Поля `LoaderType`, `BootType`, `NetworkInterfaceNaming`, `HotResize` в структуры ответа `InfoCompute`, `RecordCompute`, `ItemCompute` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-348 | Полe `NID` в структуру ответа `ItemCompute` в cloudbroker/compute |
|
||||
| BGOS-348 | Структуры ответов `ItemDeletedCompute`, `ListDeletedComputes` в cloudbroker/compute |
|
||||
| BGOS-388 | Поля `UpdatedBy`, `SizeAvailable` в структуру ответа `ItemDisk` в cloudapi/compute |
|
||||
| BGOS-388 | Поле `SizeAvailable` в структуру ответа `ItemDisk` в cloudbroker/compute |
|
||||
| BGOS-392 | Метод `ChangeMAC` и структура запроса `ChangeMACRequest` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-403 | Опциональное поле `MACAddr` в cloudapi/compute/netAttach и cloudbroker/compute/netAttach |
|
||||
|
||||
#### disks
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-318 | Опциональное поле `Name` в структуру запроса `DeleteRequest` в cloudbroker/disks |
|
||||
| BGOS-408 | Поля `DeletedBy`, `CreatedBy`, `MachineID`, `MachineName`, `UpdatedTime` и `Milestones` в структуру ответа `ItemDisk` и `RecordDisk` в cloudapi/disks |
|
||||
| BGOS-408 | Поля `DeletedBy`, `CreatedBy`, `UpdatedTime` и `UpdatedBy` в структуру ответа `RecordDisk` в cloudbroker/disks |
|
||||
| BGOS-401 | Поля `SizeAvailable` и `UpdatedBy` в структуру ответа `InfoDisk` в cloudbroker/disks |
|
||||
| BGOS-401 | Поля `SizeAvailable` и `UpdatedBy` в структуры ответа `ItemDisk` и `RecordDisk` в cloudapi/disks |
|
||||
|
||||
#### extnet
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-356 | Опциональное поле `OVSBridge` в структуру запроса `ListRequest` в cloudapi/extnet |
|
||||
| BGOS-351 | Поле `NTP` в структуру ответа `RecordExtNet` в cloudapi/extnet и cloudbroker/extnet |
|
||||
|
||||
#### image
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-315 | Поле `SnapshotID` в структуру ответа `RecordImage` в cloudapi/image |
|
||||
|
||||
#### k8s
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-304 | Поле `Description` в структуру ответа `RecordK8S` в cloudapi/k8s и cloudbroker/k8s |
|
||||
|
||||
#### kvmx86
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-312 | Опциональные поля `LoaderType`, `BootType`, `NetworkInterfaceNaming`, `HotResize` в структуру запроса `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
||||
| BGOS-312 | Опциональное поле `MAC` в структуру запроса `Interface` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
||||
|
||||
#### node
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-397 | Метод `SetVFsParams` и структура запроса `SetVFsParamsRequest` в cloudbroker/node |
|
||||
|
||||
#### prometheus
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-405 | Метод `Computes` структура запроса `ComputesRequest` и структура ответа `ComputesData` в cloudbroker/prometheus |
|
||||
|
||||
#### resmon
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-341 | Поля `ID`, `SizeAvailable` в структуру ответа `ItemDisk` сloudbroker/resmon |
|
||||
|
||||
#### sep
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-343 | Метод `GetTemplate` и структура запроса `GetTemplateRequest` в cloudbroker/sep |
|
||||
| BGOS-301 | Метод `ListAvailableSEPAndPools` структура запроса `ListAvailableSEPAndPoolsRequest` и структура ответа `ListAvailableSEP` в cloudapi/sep и cloudbroker/sep |
|
||||
| BGOS-299 | Обязательное поле `Force` в структуру запроса `DelConsumerNodesRequest` в cloudbroker/sep |
|
||||
|
||||
#### stack
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-389 | Структура ответа `LibGuestFSTools` входящая в структуру ответа `Packages` в cloudbroker/stack |
|
||||
|
||||
#### user
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-303 | Опциональное поле `SortBy` в структуру запроса `GetAuditRequest` cloudapi/user |
|
||||
|
||||
#### vins
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-300 | Опциональное поле `Status` в структуру запроса `ListRequest` cloudapi/vins и cloudbroker/vins |
|
||||
|
||||
### Удалено
|
||||
|
||||
#### apiaccess
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-309 | Обязательное поле `APIName` из структуры запроса `APIFindRequest` в cloudbroker/apiacces |
|
||||
| BGOS-309 | Метод `GetPreGroups` в cloudbroker/apiaccess |
|
||||
| BGOS-309 | Опциональное поле `CreatedBy` из структуры запроса `ListRequest` в cloudbroker/apiaccess |
|
||||
| BGOS-309 | Метод `ListDeletedRequest` и структура запроса `ListDeletedRequest` и в cloudbroker/apiaccess |
|
||||
| BGOS-309 | Поля `CreatedBy`, `UpdatedBy`, `DeletedBy`, `Milestone` из структуры ответа `ItemAPIAccess` в cloudbroker/apiaccess |
|
||||
|
||||
#### compute
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-338 | Опциональное поле `Depresent` из структуры запроса `StopRequest` в cloudbroker/compute |
|
||||
| BGOS-344 | Методы `RepairBootFS`, `MassRepairBootFS`, `Registration` в cloudbroker/compute |
|
||||
| BGOS-353 | Поля `PCISlot`, `BusNumber` из структуры ответа `InfoDisk` в cloudapi/compute и cloudbroker/compute |
|
||||
|
||||
#### disks
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-298 | Опциональные поля `Type, SSDSize` из структуры запроса `CreateRequest` в cloudapi/disks и cloudbroker/disks |
|
||||
| BGOS-338 | Обязательное поле `GID` из структуры запроса `CreateRequest` в cloudapi/disks и cloudbroker/disks |
|
||||
|
||||
#### image
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-338 | Обязательное поле `GID` из структур запроса `CreateRequest`, `CreateCDROMImageRequest` в cloudbroker/image |
|
||||
|
||||
#### node
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-308 | Опциональное поле `VDiskAction` из структуры запроса `MaintenanceRequest` в cloudbroker/node |
|
||||
|
||||
#### rg
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-342 | Опциональное поле `RegisterComputes` из структур запроса `CreateRequest`, `UpdateRequest` в cloudapi/rg и cloudbroker/rg |
|
||||
| BGOS-566 | Поле `TrunkTags` в структуру `ItemVNFInterface` в структуре ответа `RecordCompute` в cloudapi/compute и в структуру `ItemInterface` в структуре ответа `RecordCompute` в cloudbroker/compute |
|
||||
| BGOS-492 | Метод `MigrateAbort` и структура запроса `MigrateAbortRequest` в cloudbroker/compute |
|
||||
|
||||
### Исправлено
|
||||
|
||||
#### apiaccess
|
||||
#### accounts
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-308 | Изменены все теги `json` и `url` в структурах ответов и запросов с `CamelCase` на `snake_case` в cloudbroker/apiaccess |
|
||||
|
||||
#### audit
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-346 | Изменены все теги `json` и `url` в структурах запросов с `CamelCase` на `snake_case` в cloudapi/audit и cloudbroker/audit |
|
||||
|
||||
#### compute
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-314 | Измененен тип с `[]uint64` на `map[strint]uint64` полей `PresentTo` в структурах ответа `ItemComputeDisk`, `ItemDisk` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-355 | Переименованны поля с `Pinned` на `PinnedToStack` в структурах ответа `InfoCompute, RecordCompute, ItemCompute` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-355 | Изменен тип поля с `PinnedToStack` (ранее `Pinned`) с `bool` на `int` в структурах ответа `InfoCompute, RecordCompute` в cloudbroker/compute |
|
||||
| BGOS-388 | Изменен json тег поля `PCISlot` с `pciSlot` на `pci_slot` в структурах ответа `ItemDisk` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-392 | Изменены все теги `json` и `url` в структуре запроса `ChangeIPRequest` с `CamelCase` на `snake_case` в cloudapi/compute и cloudbroker/compute |
|
||||
|
||||
#### disks
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-314 | Измененен тип с `[]uint64` на `map[strint]uint64` полей `PresentTo` в структурах ответа `ItemDiskUnattached`, `RecordDisk`, `ItemDisk`, `InfoDisk` в cloudapi/disks и cloudbroker/disks |
|
||||
| BGOS-408 | Перенесены поля с `MachindeID` и `MachineName` из структуры ответа `ItemDisk` в `RecordDisk` в cloudbroker/disks |
|
||||
| BGOS-559 | Структура ответа `ItemAccount` использует структуру `ListRecordACL` в поле `ACL` в cloudapi/account |
|
||||
|
||||
#### image
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-314 | Измененен тип с `[]uint64` на `map[strint]uint64` полей `PresentTo` в структурах ответа `ItemImage`, `RecordImage` в cloudapi/image и cloudbroker/image |
|
||||
| BGOS-564 | Загрузка образов в cloudbroker/image |
|
||||
|
||||
#### image
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-305 | Изменен тип опционального поля `AccountIDs` c []uint64 на []int64 в моделях `GrantAccessRequest`, `RevokeAccessRequest` в cloudbroker/image |
|
||||
|
||||
#### resmon
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-341 | Изменен тип поле `SizeUsed`, `SizeMax` с int64 на float64 в структуре ответа `ItemDisk` сloudbroker/resmon |
|
||||
|
||||
#### sep
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-398 | Обязательные поля `Trust` и `Spoofchk` заменены на `VFParams` в структуре запроса `SetVFsNumberRequest` в cloudbroker/node |
|
||||
|
||||
60
README.md
60
README.md
@@ -1,3 +1,6 @@
|
||||
# Внимание
|
||||
Данная версия предназначена только для версии платформы 4.4.0 build 963!
|
||||
|
||||
# Decort SDK
|
||||
|
||||
Decort SDK - это библиотека, написанная на языке GO, позволяющая взаимодействовать с API облачной платформы **DECORT**. Библиотека содержит в себе структуры и методы, необходимые для отправки запросов. Decort SDK имеет встроенный http-клиент и поддерживает разные способы авторизации на платформе. Библиотека так же содержит в себе модели ответов от платформы.
|
||||
@@ -16,6 +19,7 @@ Decort SDK - это библиотека, написанная на языке G
|
||||
- Версия 1.9.х Decort-SDK соответствует 4.1.0 версии платформы
|
||||
- Версия 1.10.х Decort-SDK соответствует 4.2.0 версии платформы
|
||||
- Версия 1.11.х Decort-SDK соответствует 4.3.0 версии платформы
|
||||
- Версия 1.12.х Decort-SDK соответствует 4.4.0 версии платформы
|
||||
|
||||
## Оглавление
|
||||
|
||||
@@ -79,6 +83,8 @@ Decort SDK - это библиотека, написанная на языке G
|
||||
- [Создание универсального клиента](#создание-универсального-клиента)
|
||||
- [Пример создания универсального клиента](#пример-создания-универсального-клиента)
|
||||
- [Пример выполнения запроса](#пример-выполнения-запроса-4)
|
||||
- [Проверка соответствия версии платформы и версии dynamix](#проверка-соответствия-версии-платформы-и-версии-dynamix)
|
||||
- [Пример выполнения запроса](#пример-выполнения-запроса-5)
|
||||
|
||||
## Установка
|
||||
|
||||
@@ -114,12 +120,15 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
||||
- `KVMx86` - создание виртуальной машины x86;
|
||||
- `LB` - управление балансировщиками нагрузки;
|
||||
- `Locations` - получение информации о grid площадки;
|
||||
- `Prometheus` - получение статистики prometheus;
|
||||
- `RG` - управление ресурсными группами аккаунта;
|
||||
- `SEP` - управление storage endpoint (sep);
|
||||
- `Stack` - получение информации о вычислительных узлах;
|
||||
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
||||
- `Trunk` - получение информации о транковых портах;
|
||||
- `VFPool` - управление пулом виртуальных сетевых функций;
|
||||
- `VINS` - управление виртуальными изолированными сетями.
|
||||
- `VINS` - управление виртуальными изолированными сетями;
|
||||
- `Zone` - управление зонами.
|
||||
|
||||
### Cloudbroker
|
||||
|
||||
@@ -130,6 +139,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
||||
- `Audit` - получение информации о событиях системы;
|
||||
- `APIAccess` - управление доступом к API и его объектам;
|
||||
- `Backup` - управление резервным копированием;
|
||||
- `BService` - управление группами виртуальных машин (computes);
|
||||
- `Compute` - управление виртуальными машинами (индивидуально);
|
||||
- `Disks` - управление виртуальными дисками;
|
||||
- `DPDK` - управление виртуальными сетями DPDK;
|
||||
@@ -150,10 +160,12 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
||||
- `SEP` - управление storage endpoint (sep);
|
||||
- `Stack` - получение информации о вычислительных узлах;
|
||||
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
|
||||
- `Trunk` - управление транковыми портами;
|
||||
- `User` - управление пользователями (индивидуально);
|
||||
- `VGPU` - управление виртуальными графическими процессорами;
|
||||
- `VFPool` - управление пулом виртуальных сетевых функций;
|
||||
- `VINS` - управление виртуальными изолированными сетями.
|
||||
- `Zone` - управление зонами.
|
||||
|
||||
## Работа с библиотекой
|
||||
|
||||
@@ -299,17 +311,21 @@ func main() {
|
||||
- `pkg/cloudapi/kvmx86` - для `KVMX86`
|
||||
- `pkg/cloudapi/lb` - для `LB`
|
||||
- `pkg/cloudapi/locations` - для `Locations`
|
||||
- `pkg/cloudapi/prometheus` - для `Prometheus`
|
||||
- `pkg/cloudapi/rg` - для `RG`
|
||||
- `pkg/cloudbroker/sep` - для `SEP`
|
||||
- `pkg/cloudapi/sep` - для `SEP`
|
||||
- `pkg/cloudapi/stack` - для `Stack`
|
||||
- `pkg/cloudapi/tasks` - для `Tasks`
|
||||
- `pkg/cloudapi/trunk` - для `Trunk`
|
||||
- `pkg/cloudapi/vfpool` - для `VFPool`
|
||||
- `pkg/cloudapi/vins` - для `VINS`
|
||||
- `pkg/cloudapi/zone` - для `Zone`
|
||||
- **cloudbroker**:
|
||||
- `pkg/cloudbroker/account` - для `Account`
|
||||
- `pkg/cloudbroker/audit` - для `Audit`
|
||||
- `pkg/cloudbroker/apiaccess` - для `APIAccess`
|
||||
- `pkg/cloudbroker/backup` - для `Backup`
|
||||
- `pkg/cloudbroker/bservice` - для `Basic Service`
|
||||
- `pkg/cloudbroker/compute` - для `Compute`
|
||||
- `pkg/cloudbroker/disks` - для `Disks`
|
||||
- `pkg/cloudbroker/dpdknet` - для `DPDK`
|
||||
@@ -330,10 +346,12 @@ func main() {
|
||||
- `pkg/cloudbroker/sep` - для `SEP`
|
||||
- `pkg/cloudbroker/stack` - для `Stack`
|
||||
- `pkg/cloudbroker/tasks` - для `Tasks`
|
||||
- `pkg/cloudbroker/trunk` - для `Trunk`
|
||||
- `pkg/cloudbroker/user` - для `User`
|
||||
- `pkg/cloudbroker/vgpu` - для `VGPU`
|
||||
- `pkg/cloudbroker/vfpool` - для `VFPool`
|
||||
- `pkg/cloudbroker/vins` - для `VINS`
|
||||
- `pkg/cloudbroker/zone` - для `Zone`
|
||||
|
||||
Все поля структуры имеют описание, в которых содержится:
|
||||
|
||||
@@ -486,12 +504,15 @@ func main() {
|
||||
- `.KVMx86()` - для работы с `KVMX86`
|
||||
- `.LB()` - для работы с `LB`
|
||||
- `.Locations()` - для работы с `Locations`
|
||||
- `.Prometheus()` - для работы с `Prometheus`
|
||||
- `.RG()` - для работы с `RG`
|
||||
- `.SEP()` - для работы с `SEP`
|
||||
- `.Stack()` - для работы с `Stack`
|
||||
- `.Tasks()` - для работы с `Tasks`
|
||||
- `.Trunk()` - для работы с `Trunk`
|
||||
- `.VFPool()` - для работы с `VFPool`
|
||||
- `.VINS()` - для работы с `VINS`
|
||||
- `.Zone()` - для работы с `Zone`
|
||||
|
||||
Доступные методы для `.CloudBroker()`:
|
||||
|
||||
@@ -499,6 +520,7 @@ func main() {
|
||||
- `.Audit()` - для работы с `Audit`
|
||||
- `.APIAccess()` - для работы с `APIAccess`
|
||||
- `.Backup()` - для работы с `Backup`
|
||||
- `.BService()` - для работы с `BService`
|
||||
- `.Compute()` - для работы с `Compute`
|
||||
- `.Disks()` - для работы с `Disks`
|
||||
- `.DPDKNet()` - для работы с `DPDK`
|
||||
@@ -519,10 +541,12 @@ func main() {
|
||||
- `.SEP()` - для работы с `SEP`
|
||||
- `.Stack()` - для работы с `Stack`
|
||||
- `.Tasks()` - для работы с `Tasks`
|
||||
- `.Trunk()` - для работы с `Trunk`
|
||||
- `.User()` - для работы с `User`
|
||||
- `.VGPU()` - для работы с `VGPU`
|
||||
- `.VFPool()` - для работы с `VFPool`
|
||||
- `.VINS()` - для работы с `VINS`
|
||||
- `.Zone()` - для работы с `Zone`
|
||||
|
||||
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
|
||||
|
||||
@@ -1601,4 +1625,36 @@ func main() {
|
||||
|
||||
fmt.Println(res)
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Проверка соответствия версии платформы и версии dynamix
|
||||
|
||||
С версии 1.11.5 для каждого клиента добавлен метод `Check` для проверки соответствия decort-sdk и платформы dynamix.
|
||||
В случае соответсвия decort-sdk и платформы dynamix возвращается структура, содержащая информацию о версии и актуальном билде платформы.
|
||||
|
||||
#### Пример выполнения запроса
|
||||
|
||||
```go
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/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,
|
||||
}
|
||||
|
||||
// Создание клиента
|
||||
client := decort.New(config)
|
||||
|
||||
// Проверка соответствия версии
|
||||
checkInfo, err := client.Check()
|
||||
}
|
||||
```
|
||||
88
check.go
Normal file
88
check.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package decortsdk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/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 {
|
||||
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))
|
||||
}
|
||||
@@ -12,3 +12,7 @@ var FileName = map[string]string{
|
||||
}
|
||||
|
||||
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
|
||||
|
||||
var VersionMap = map[string]string{
|
||||
"4.3.0": "-",
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"net/url"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
@@ -414,6 +415,12 @@ func languageValidator(fe validator.FieldLevel) bool {
|
||||
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()
|
||||
@@ -421,6 +428,13 @@ func sepTypeValidator(fe validator.FieldLevel) bool {
|
||||
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.
|
||||
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
|
||||
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
|
||||
@@ -442,3 +456,13 @@ func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
|
||||
}
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -333,6 +333,25 @@ func errorMessage(fe validator.FieldError) string {
|
||||
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))
|
||||
|
||||
// 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()
|
||||
|
||||
@@ -271,15 +271,35 @@ func registerAllValidators(validate *validator.Validate) error {
|
||||
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
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -17,17 +17,17 @@ var (
|
||||
computeModeValues = []string{"EQ", "EN", "ANY"}
|
||||
computeDiskTypeValues = []string{"D", "B"}
|
||||
computeNetTypeValues = []string{"EXTNET", "VINS"}
|
||||
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK"}
|
||||
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "EMPTY", "TRUNK"}
|
||||
computeOrderValues = []string{"cdrom", "network", "hd"}
|
||||
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
|
||||
computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"}
|
||||
computeDriverValues = []string{"KVM_X86"}
|
||||
|
||||
diskTypeValues = []string{"B", "T", "D"}
|
||||
|
||||
flipgroupClientTypeValues = []string{"compute", "vins"}
|
||||
|
||||
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"}
|
||||
|
||||
@@ -49,11 +49,11 @@ var (
|
||||
|
||||
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"}
|
||||
|
||||
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}
|
||||
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}
|
||||
|
||||
networkInterfaceNamingValues = []string{"eth", "ens"}
|
||||
|
||||
@@ -72,10 +72,16 @@ var (
|
||||
sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"}
|
||||
|
||||
languageValues = []string{"ru", "en"}
|
||||
|
||||
userProviders = []string{"bvs", "decs3o"}
|
||||
|
||||
deviceValues = []string{"primary", "secondary"}
|
||||
)
|
||||
|
||||
const (
|
||||
mtuMin = 1
|
||||
|
||||
mtuMax = 9216
|
||||
|
||||
trunkTagsMin = 1
|
||||
trunkTagsMax = 4095
|
||||
)
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/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
|
||||
}
|
||||
@@ -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
|
||||
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)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(result), nil
|
||||
}
|
||||
|
||||
@@ -13,10 +13,6 @@ type DisableEnableRequest struct {
|
||||
// ID of account
|
||||
// Required: true
|
||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
||||
|
||||
// Reason of disabling
|
||||
// Required: false
|
||||
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
|
||||
}
|
||||
|
||||
// Disable disables an account
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
var accounts = ListAccounts{
|
||||
Data: []ItemAccount{
|
||||
{
|
||||
ACL: []RecordACL{
|
||||
ACL: []ListRecordACL{
|
||||
{
|
||||
IsExplicit: true,
|
||||
GUID: "",
|
||||
@@ -25,7 +25,7 @@ var accounts = ListAccounts{
|
||||
UpdatedTime: 1676645275,
|
||||
},
|
||||
{
|
||||
ACL: []RecordACL{
|
||||
ACL: []ListRecordACL{
|
||||
{
|
||||
IsExplicit: true,
|
||||
GUID: "",
|
||||
@@ -43,7 +43,7 @@ var accounts = ListAccounts{
|
||||
UpdatedTime: 1676645275,
|
||||
},
|
||||
{
|
||||
ACL: []RecordACL{
|
||||
ACL: []ListRecordACL{
|
||||
{
|
||||
IsExplicit: true,
|
||||
GUID: "",
|
||||
|
||||
@@ -1,7 +1,34 @@
|
||||
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
|
||||
type RecordACL struct {
|
||||
// Emails
|
||||
Emails []string `json:"emails"`
|
||||
|
||||
// Whether access is explicitly specified
|
||||
IsExplicit bool `json:"explicit"`
|
||||
|
||||
@@ -51,7 +78,7 @@ type ResourceLimits struct {
|
||||
// Main information in one of if the list of accounts
|
||||
type ItemAccount struct {
|
||||
// Access Control List
|
||||
ACL []RecordACL `json:"acl"`
|
||||
ACL []ListRecordACL `json:"acl"`
|
||||
|
||||
// Compute Features
|
||||
ComputeFeatures []string `json:"computeFeatures"`
|
||||
@@ -165,6 +192,15 @@ type Machines struct {
|
||||
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
|
||||
type RecordAccount struct {
|
||||
// DCLocation
|
||||
@@ -253,6 +289,12 @@ type RecordAccount struct {
|
||||
|
||||
// VINSes
|
||||
VINSes uint64 `json:"vinses"`
|
||||
|
||||
// Zone
|
||||
ZoneIDs []ZoneID
|
||||
|
||||
// Zones
|
||||
DefaultZoneID uint64 `json:"defaultZoneId"`
|
||||
}
|
||||
|
||||
// Main information about compute
|
||||
|
||||
@@ -3,6 +3,7 @@ package account
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
@@ -14,18 +15,18 @@ type RestoreRequest struct {
|
||||
}
|
||||
|
||||
// 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)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(result), nil
|
||||
}
|
||||
|
||||
@@ -54,6 +54,10 @@ type UpdateRequest struct {
|
||||
// i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
|
||||
// Required: false
|
||||
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
|
||||
|
||||
@@ -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
|
||||
// Required: false
|
||||
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
|
||||
|
||||
@@ -16,6 +16,7 @@ type DeleteRequest struct {
|
||||
|
||||
// If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately
|
||||
// Required: false
|
||||
// Default: false
|
||||
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ type GroupAddRequest struct {
|
||||
|
||||
//Chipset "i440fx" or "Q35
|
||||
//Required: false
|
||||
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset"`
|
||||
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset,omitempty"`
|
||||
}
|
||||
|
||||
// GetRAM returns RAM field values
|
||||
|
||||
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/decort-golang-sdk/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
|
||||
UserManaged bool `json:"userManaged"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// Main information about Compute
|
||||
@@ -382,6 +385,9 @@ type ItemBasicService struct {
|
||||
|
||||
// User Managed or not
|
||||
UserManaged bool `json:"userManaged"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// List of BasicServices
|
||||
|
||||
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/decort-golang-sdk/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
|
||||
}
|
||||
46
pkg/cloudapi/compute/change_mtu.go
Normal file
46
pkg/cloudapi/compute/change_mtu.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ChangeMTURequest struct to change MTU for a compute
|
||||
type ChangeMTURequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
|
||||
// Interface name or MAC address
|
||||
// Required: true
|
||||
Interface string `url:"interface" json:"interface" validate:"required"`
|
||||
|
||||
// Maximum transmission unit
|
||||
// Required: true
|
||||
MTU uint64 `url:"mtu" json:"mtu" validate:"required" validate:"omitempty,mtu"`
|
||||
}
|
||||
|
||||
// ChangeMTU change MTU for compute instance
|
||||
func (c Compute) ChangeMTU(ctx context.Context, req ChangeMTURequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/change_mtu"
|
||||
|
||||
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
|
||||
}
|
||||
@@ -39,10 +39,6 @@ type CreateTemplateFromBlankRequest struct {
|
||||
// Required: false
|
||||
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
|
||||
|
||||
// SEP ID
|
||||
// Required: false
|
||||
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
|
||||
|
||||
// Pool for image create
|
||||
// Required: false
|
||||
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`
|
||||
|
||||
@@ -27,7 +27,7 @@ func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error)
|
||||
|
||||
url := "/cloudapi/compute/getLog"
|
||||
|
||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
38
pkg/cloudapi/compute/guest_agent_disable.go
Normal file
38
pkg/cloudapi/compute/guest_agent_disable.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GuestAgentDisableRequest struct to disable guest agent
|
||||
type GuestAgentDisableRequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
}
|
||||
|
||||
// Disable guest agent at a specific compute
|
||||
func (c Compute) GuestAgentDisable(ctx context.Context, req GuestAgentDisableRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/guest_agent_disable"
|
||||
|
||||
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
|
||||
}
|
||||
38
pkg/cloudapi/compute/guest_agent_enable.go
Normal file
38
pkg/cloudapi/compute/guest_agent_enable.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GuestAgentEnableRequest struct to enable guest agent
|
||||
type GuestAgentEnableRequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
}
|
||||
|
||||
// Enable guest agent at a specific compute
|
||||
func (c Compute) GuestAgentEnable(ctx context.Context, req GuestAgentEnableRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/guest_agent_enable"
|
||||
|
||||
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
|
||||
}
|
||||
48
pkg/cloudapi/compute/guest_agent_execute.go
Normal file
48
pkg/cloudapi/compute/guest_agent_execute.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GuestAgentExecuteRequest struct to execute command from user to agent
|
||||
type GuestAgentExecuteRequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
|
||||
// Custom command from user to agent
|
||||
// Required: true
|
||||
Command string `url:"command" json:"command" validate:"required"`
|
||||
|
||||
// Arguments to command
|
||||
// Required: true
|
||||
Arguments string `url:"arguments" json:"arguments" validate:"required"`
|
||||
}
|
||||
|
||||
// Execute guest agent command
|
||||
func (c Compute) GuestAgentExecuteRequest(ctx context.Context, req GuestAgentExecuteRequest) (map[string]interface{}, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/guest_agent_execute"
|
||||
|
||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
|
||||
err = json.Unmarshal(res, &result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
40
pkg/cloudapi/compute/guest_agent_feature_get.go
Normal file
40
pkg/cloudapi/compute/guest_agent_feature_get.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GuestAgentFeatureGetRequest struct to feature get guest agent
|
||||
type GuestAgentFeatureGetRequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
}
|
||||
|
||||
// List of features
|
||||
func (c Compute) GuestAgentFeatureGet(ctx context.Context, req GuestAgentFeatureGetRequest) ([]string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/guest_agent_feature_get"
|
||||
|
||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
features := make([]string, 0)
|
||||
|
||||
err = json.Unmarshal(res, &features)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return features, nil
|
||||
}
|
||||
38
pkg/cloudapi/compute/guest_agent_feature_update.go
Normal file
38
pkg/cloudapi/compute/guest_agent_feature_update.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GuestAgentFeatureUpdateRequest struct to feature update guest agent
|
||||
type GuestAgentFeatureUpdateRequest struct {
|
||||
// ID of compute instance
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
}
|
||||
|
||||
// Feature update guest agent
|
||||
func (c Compute) GuestAgentFeatureUpdate(ctx context.Context, req GuestAgentFeatureUpdateRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/guest_agent_feature_update"
|
||||
|
||||
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
|
||||
}
|
||||
42
pkg/cloudapi/compute/migrate_to_zone.go
Normal file
42
pkg/cloudapi/compute/migrate_to_zone.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// MigrateToRGZone struct to move compute to another zone
|
||||
type MigrateToZoneRequest struct {
|
||||
// ID of the compute instance to move
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// ID of the zone to move
|
||||
// Required: true
|
||||
ZoneID uint64 `url:"zoneId" json:"zoneId " validate:"required"`
|
||||
}
|
||||
|
||||
// MoveToRG moves compute instance to new resource group
|
||||
func (c Compute) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/migrateToZone"
|
||||
|
||||
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
|
||||
}
|
||||
@@ -5,13 +5,13 @@ import "strconv"
|
||||
// Access Control List
|
||||
type RecordACL struct {
|
||||
// Account ACL list
|
||||
AccountACL ListACL `json:"accountAcl"`
|
||||
AccountACL ListACL `json:"accountACL"`
|
||||
|
||||
// Compute ACL list
|
||||
ComputeACL ListACL `json:"computeAcl"`
|
||||
ComputeACL ListACL `json:"computeACL"`
|
||||
|
||||
// Resource group ACL list
|
||||
RGACL ListACL `json:"rgAcl"`
|
||||
RGACL ListACL `json:"rgACL"`
|
||||
}
|
||||
|
||||
type ListUsers struct {
|
||||
@@ -386,6 +386,9 @@ type RecordCompute struct {
|
||||
// List interfaces
|
||||
Interfaces ListInterfaces `json:"interfaces"`
|
||||
|
||||
// Live migration job ID
|
||||
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
|
||||
|
||||
// Loader type
|
||||
LoaderType string `json:"loaderType"`
|
||||
|
||||
@@ -443,6 +446,9 @@ type RecordCompute struct {
|
||||
// PreferredCPU
|
||||
PreferredCPU []int64 `json:"preferredCpu"`
|
||||
|
||||
// Qemu_quest
|
||||
QemuQuest QemuQuest `json:"qemu_guest"`
|
||||
|
||||
// Number of RAM
|
||||
RAM uint64 `json:"ram"`
|
||||
|
||||
@@ -494,8 +500,8 @@ type RecordCompute struct {
|
||||
// Userdata
|
||||
Userdata interface{} `json:"userdata"`
|
||||
|
||||
// vGPU IDs
|
||||
VGPUs []uint64 `json:"vgpus"`
|
||||
// vGPUs list
|
||||
VGPUs []VGPUItem `json:"vgpus"`
|
||||
|
||||
// Virtual image ID
|
||||
VirtualImageID uint64 `json:"virtualImageId"`
|
||||
@@ -505,6 +511,77 @@ type RecordCompute struct {
|
||||
|
||||
// VNC password
|
||||
VNCPassword string `json:"vncPasswd"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
type QemuQuest struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
EnabledAgentFeatures []string `json:"enabled_agent_features"`
|
||||
GUID string `json:"guid"`
|
||||
LastUpdate uint64 `json:"last_update"`
|
||||
User string `json:"user"`
|
||||
}
|
||||
|
||||
type VGPUItem struct {
|
||||
// ID
|
||||
ID uint64 `json:"id"`
|
||||
|
||||
// GID
|
||||
GID uint64 `json:"gid"`
|
||||
|
||||
// Type
|
||||
Type string `json:"type"`
|
||||
|
||||
// Mode
|
||||
Mode string `json:"mode"`
|
||||
|
||||
// Status
|
||||
Status string `json:"status"`
|
||||
|
||||
// ProfileID
|
||||
ProfileID uint64 `json:"profileId"`
|
||||
|
||||
// RAM
|
||||
RAM uint64 `json:"ram"`
|
||||
|
||||
// LastUpdateTime
|
||||
LastUpdateTime uint64 `json:"lastUpdateTime"`
|
||||
|
||||
// CreatedTime
|
||||
CreatedTime uint64 `json:"createdTime"`
|
||||
|
||||
// DeletedTime
|
||||
DeletedTime uint64 `json:"deletedTime"`
|
||||
|
||||
// VMID
|
||||
VMID uint64 `json:"vmid"`
|
||||
|
||||
// PGPuid
|
||||
PGPuid uint64 `json:"pgpuid"`
|
||||
|
||||
// ReferenceID
|
||||
ReferenceID string `json:"referenceId"`
|
||||
|
||||
// AccountID
|
||||
AccountID uint64 `json:"accountId"`
|
||||
|
||||
// RgID
|
||||
RgID uint64 `json:"rgId"`
|
||||
|
||||
// LastClaimedBy
|
||||
LastClaimedBy uint64 `json:"lastClaimedBy"`
|
||||
|
||||
// PCISlot
|
||||
PCISlot uint64 `json:"pciSlot"`
|
||||
|
||||
// BusNumber
|
||||
BusNumber uint64 `json:"bus_number"`
|
||||
|
||||
// GUID
|
||||
GUID uint64 `json:"guid"`
|
||||
}
|
||||
|
||||
// Information about libvirt settings
|
||||
@@ -626,9 +703,15 @@ type ItemVNFInterface struct {
|
||||
// QOS
|
||||
QOS QOS `json:"qos"`
|
||||
|
||||
// SDN interface ID
|
||||
SDNInterfaceID string `json:"sdn_interface_id"`
|
||||
|
||||
// Target
|
||||
Target string `json:"target"`
|
||||
|
||||
// Trunk tags
|
||||
TrunkTags string `json:"trunk_tags"`
|
||||
|
||||
// Type
|
||||
Type string `json:"type"`
|
||||
|
||||
@@ -711,9 +794,6 @@ type ItemComputeDisk struct {
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Order
|
||||
Order uint64 `json:"order"`
|
||||
|
||||
// Params
|
||||
Params string `json:"params"`
|
||||
|
||||
@@ -754,7 +834,7 @@ type ItemComputeDisk struct {
|
||||
Shareable bool `json:"shareable"`
|
||||
|
||||
// Size available
|
||||
SizeAvailable uint64 `json:"sizeAvailable"`
|
||||
SizeAvailable float64 `json:"sizeAvailable"`
|
||||
|
||||
// Size max
|
||||
SizeMax uint64 `json:"sizeMax"`
|
||||
@@ -775,10 +855,10 @@ type ItemComputeDisk struct {
|
||||
Type string `json:"type"`
|
||||
|
||||
// Updated by
|
||||
UpdatedBy uint64 `json:"updatedBy"`
|
||||
UpdatedBy string `json:"updatedBy"`
|
||||
|
||||
// Virtual machine ID
|
||||
VMID uint64 `json:"vmid"`
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
type ItemReplication struct {
|
||||
@@ -977,6 +1057,9 @@ type ItemCompute struct {
|
||||
// List interfaces
|
||||
Interfaces ListInterfaces `json:"interfaces"`
|
||||
|
||||
// Live migration job ID
|
||||
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
|
||||
|
||||
// Loader type
|
||||
LoaderType string `json:"loaderType"`
|
||||
|
||||
@@ -1019,6 +1102,9 @@ type ItemCompute struct {
|
||||
// Number of RAM
|
||||
RAM uint64 `json:"ram"`
|
||||
|
||||
// Qemu_quest
|
||||
QemuQuest QemuQuest `json:"qemu_guest"`
|
||||
|
||||
// Reference ID
|
||||
ReferenceID string `json:"referenceId"`
|
||||
|
||||
|
||||
@@ -19,6 +19,9 @@ type NetAttachRequest struct {
|
||||
// 'VINS' for connect to ViNS
|
||||
// 'VFNIC' for connect to vfpool
|
||||
// 'DPDK' for connect to DPDK
|
||||
// `EMPTY` for connect empty network
|
||||
// `SDT` for connect to SDN
|
||||
// `TRUNK` for connect to TRUNK
|
||||
// Required: true
|
||||
NetType string `url:"netType" json:"netType" validate:"computex86NetType"`
|
||||
|
||||
@@ -36,9 +39,15 @@ type NetAttachRequest struct {
|
||||
// Required: false
|
||||
MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"`
|
||||
|
||||
// Used only for DPDK type, must be 1-9216
|
||||
// Required: false
|
||||
// Used only for EXTNET and DPDK
|
||||
// For DPDK must be 1-9216
|
||||
// For EXTNET must be 1500-9216
|
||||
// Required: false
|
||||
MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"`
|
||||
|
||||
// Unique identifier of logical port on SDN side
|
||||
// Required: false
|
||||
SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty" validate:"omitempty"`
|
||||
}
|
||||
|
||||
// NetAttach attaches network to compute and gets info about network
|
||||
|
||||
33
pkg/cloudapi/compute/shared_snapshot_merge_status.go
Normal file
33
pkg/cloudapi/compute/shared_snapshot_merge_status.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// SharedSnapshotMergeStatusRequest struct to get shared snapshot merge status
|
||||
type SharedSnapshotMergeStatusRequest struct {
|
||||
// ID of compute instance to get log for
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||
}
|
||||
|
||||
// SharedSnapshotMergeStatus shared snapshots merge status
|
||||
// returns a string representing either the current status or the progress percentage
|
||||
func (c Compute) SharedSnapshotMergeStatus(ctx context.Context, req SharedSnapshotMergeStatusRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/compute/shared_snapshot_merge_status"
|
||||
|
||||
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(res), nil
|
||||
}
|
||||
@@ -30,24 +30,21 @@ type UpdateRequest struct {
|
||||
// Default: none
|
||||
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
|
||||
|
||||
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
|
||||
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node, true or false
|
||||
// Required: false
|
||||
// Default: false
|
||||
CPUPin bool `url:"cpupin" json:"cpupin"`
|
||||
CPUPin interface{} `url:"cpupin,omitempty" json:"cpupin,omitempty" validate:"omitempty,isBool"`
|
||||
|
||||
// Type of the emulated system, Q35 or i440fx
|
||||
// Required: false
|
||||
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"`
|
||||
|
||||
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
|
||||
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node, true or false
|
||||
// Required: false
|
||||
// Default: false
|
||||
HPBacked bool `url:"hpBacked" json:"hpBacked"`
|
||||
HPBacked interface{} `url:"hpBacked,omitempty" json:"hpBacked,omitempty" validate:"omitempty,isBool"`
|
||||
|
||||
// Auto start when node restarted
|
||||
// Auto start when node restarted, true or false
|
||||
// Required: false
|
||||
// Default: false
|
||||
AutoStart bool `url:"autoStart" json:"autoStart"`
|
||||
AutoStart interface{} `url:"autoStart,omitempty" json:"autoStart,omitempty" validate:"omitempty,isBool"`
|
||||
|
||||
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
||||
// Required: false
|
||||
@@ -65,9 +62,9 @@ type UpdateRequest struct {
|
||||
// Required: false
|
||||
NetworkInterfaceNaming string `url:"networkInterfaceNaming,omitempty" json:"networkInterfaceNaming,omitempty" validate:"omitempty,networkInterfaceNaming"`
|
||||
|
||||
// Does this machine supports hot resize
|
||||
// Does this machine supports hot resize, true or false
|
||||
// Required: false
|
||||
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
|
||||
HotResize interface{} `url:"hotResize,omitempty" json:"hotResize,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
// Update updates some properties of the compute
|
||||
|
||||
@@ -27,12 +27,6 @@ type FromPlatformDiskRequest struct {
|
||||
// Required: true
|
||||
ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"`
|
||||
|
||||
// Binary architecture of this image
|
||||
// Should be:
|
||||
// - X86_64
|
||||
// Required: true
|
||||
Architecture string `url:"architecture" json:"architecture" validate:"imageArchitecture"`
|
||||
|
||||
// Username for the image
|
||||
// Required: false
|
||||
Username string `url:"username,omitempty" json:"username,omitempty"`
|
||||
@@ -45,10 +39,6 @@ type FromPlatformDiskRequest struct {
|
||||
// Required: false
|
||||
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
|
||||
|
||||
// SEP ID
|
||||
// Required: false
|
||||
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
|
||||
|
||||
// Pool for image create
|
||||
// Required: false
|
||||
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`
|
||||
|
||||
@@ -105,7 +105,7 @@ type ItemDisk struct {
|
||||
SepID uint64 `json:"sepId"`
|
||||
|
||||
// Size available
|
||||
SizeAvailable uint64 `json:"sizeAvailable"`
|
||||
SizeAvailable float64 `json:"sizeAvailable"`
|
||||
|
||||
// Size max
|
||||
SizeMax uint64 `json:"sizeMax"`
|
||||
@@ -463,7 +463,7 @@ type RecordDisk struct {
|
||||
Shareable bool `json:"shareable"`
|
||||
|
||||
// Size available
|
||||
SizeAvailable uint64 `json:"sizeAvailable"`
|
||||
SizeAvailable float64 `json:"sizeAvailable"`
|
||||
|
||||
// Size max
|
||||
SizeMax uint64 `json:"sizeMax"`
|
||||
|
||||
@@ -193,14 +193,17 @@ type RecordExtNet struct {
|
||||
// Milestones
|
||||
Milestones uint64 `json:"milestones"`
|
||||
|
||||
// MTU
|
||||
MTU uint64 `json:"mtu"`
|
||||
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Network
|
||||
Network string `json:"network"`
|
||||
|
||||
// Network ID
|
||||
NetworkID uint64 `json:"networkId"`
|
||||
// Network IDs
|
||||
NetworkIDs NetworkIDs `json:"networkIds"`
|
||||
|
||||
// NTP
|
||||
NTP []string `json:"ntp"`
|
||||
@@ -217,9 +220,18 @@ type RecordExtNet struct {
|
||||
// PriVNFDevID
|
||||
PriVNFDevID uint64 `json:"priVnfDevId"`
|
||||
|
||||
// Redundant
|
||||
Redundant bool `json:"redundant"`
|
||||
|
||||
// SecVnfDevId
|
||||
SecVNFDevID uint64 `json:"secVnfDevId"`
|
||||
|
||||
// List reservations
|
||||
Reservations ListReservations `json:"reservations"`
|
||||
|
||||
// List pre-reservations
|
||||
PreReservations ListReservations `json:"pre-reservations"`
|
||||
|
||||
// Shared with
|
||||
SharedWith []uint64 `json:"sharedWith"`
|
||||
|
||||
@@ -231,6 +243,17 @@ type RecordExtNet struct {
|
||||
|
||||
// VNFs
|
||||
VNFs VNFs `json:"vnfs"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
type NetworkIDs struct {
|
||||
// Primary
|
||||
Primary uint64 `json:"primary"`
|
||||
|
||||
// Secondary
|
||||
Secondary uint64 `json:"secondary"`
|
||||
}
|
||||
|
||||
// Detailed information about reserved address or address pool
|
||||
|
||||
@@ -32,8 +32,9 @@ type CreateRequest struct {
|
||||
// Type of client
|
||||
// - 'compute'
|
||||
// - 'vins' (will be later)
|
||||
// Required: true
|
||||
ClientType string `url:"clientType" json:"clientType" validate:"flipgroupClientType"`
|
||||
// Required: false
|
||||
// Default: "compute"
|
||||
ClientType string `url:"clientType,omitempty" json:"clientType,omitempty"`
|
||||
|
||||
// IP address to associate with this group. If empty, the platform will autoselect IP address
|
||||
// Required: false
|
||||
|
||||
@@ -2,6 +2,7 @@ package image
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -69,18 +70,17 @@ type CreateRequest struct {
|
||||
// Required: false
|
||||
Pool string `url:"poolName,omitempty" json:"poolName,omitempty"`
|
||||
|
||||
// Binary architecture of this image
|
||||
// Should be:
|
||||
// - X86_64
|
||||
// Required: false
|
||||
Architecture string `url:"architecture,omitempty" json:"architecture,omitempty" validate:"omitempty,imageArchitecture"`
|
||||
|
||||
// List of types of compute suitable for image
|
||||
// Example: [ "KVM_X86" ]
|
||||
// Required: true
|
||||
Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"`
|
||||
}
|
||||
|
||||
type asyncWrapperCreateRequest struct {
|
||||
CreateRequest
|
||||
AsyncMode bool `url:"asyncMode"`
|
||||
}
|
||||
|
||||
// Create creates image from a media identified by URL
|
||||
func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -102,3 +102,29 @@ func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// AsyncCreate creates image from a media identified by URL in async mode
|
||||
func (i Image) AsyncCreate(ctx context.Context, req CreateRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/image/create"
|
||||
|
||||
asyncReq := asyncWrapperCreateRequest{CreateRequest: req, AsyncMode: true}
|
||||
|
||||
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, asyncReq)
|
||||
if err != nil {
|
||||
return " ", err
|
||||
}
|
||||
|
||||
var taskID string
|
||||
|
||||
err = json.Unmarshal(res, &taskID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return taskID, nil
|
||||
}
|
||||
|
||||
@@ -26,10 +26,6 @@ type ListRequest struct {
|
||||
// Required: false
|
||||
Status string `url:"status,omitempty" json:"status,omitempty"`
|
||||
|
||||
// Find by architecture
|
||||
// Required: false
|
||||
Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"`
|
||||
|
||||
// Find by type
|
||||
// Required: false
|
||||
TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"`
|
||||
|
||||
@@ -166,6 +166,10 @@ type CreateRequest struct {
|
||||
// Type of the emulated system, Q35 or i440fx
|
||||
// Required: false
|
||||
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
// GetRAM returns RAM field values
|
||||
|
||||
42
pkg/cloudapi/k8s/migrate_to_zone.go
Normal file
42
pkg/cloudapi/k8s/migrate_to_zone.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package k8s
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// MigrateToZone struct to move k8s cluster to another zone
|
||||
type MigrateToZoneRequest struct {
|
||||
// Kubernetes cluster ID to move
|
||||
// Required: true
|
||||
K8SID uint64 `url:"k8sId" json:"k8sId" validate:"required"`
|
||||
|
||||
// ID of the zone to move
|
||||
// Required: true
|
||||
ZoneID uint64 `url:"zoneId" json:"zoneId" validate:"required"`
|
||||
}
|
||||
|
||||
// MigrateToZone moves k8s cluster instance to new zone
|
||||
func (k8s K8S) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/k8s/migrateToZone"
|
||||
|
||||
res, err := k8s.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
|
||||
}
|
||||
@@ -139,6 +139,9 @@ type RecordK8S struct {
|
||||
|
||||
// With LB
|
||||
WithLB bool `json:"withLB"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// Detailed information about address of the Virtual Internet Protocol
|
||||
@@ -305,6 +308,9 @@ type ItemK8SCluster struct {
|
||||
|
||||
// List workers group
|
||||
WorkersGroup ListK8SGroups `json:"workersGroups"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// Information about service account
|
||||
|
||||
@@ -16,6 +16,9 @@ type Interface struct {
|
||||
// - EXTNET
|
||||
// - VFNIC
|
||||
// - DPDK
|
||||
// - EMPTY
|
||||
// - SDN
|
||||
// - TRUNK
|
||||
NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"`
|
||||
|
||||
// Network ID for connect to,
|
||||
@@ -35,6 +38,10 @@ type Interface struct {
|
||||
// MAC address to assign to this VM when connecting to the specified network
|
||||
// Required: false
|
||||
MAC string `url:"mac,omitempty" json:"mac,omitempty" validate:"omitempty"`
|
||||
|
||||
// SDN interface id
|
||||
// Required: false
|
||||
SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty"`
|
||||
}
|
||||
|
||||
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
|
||||
@@ -143,7 +150,7 @@ type CreateRequest struct {
|
||||
// Required: false
|
||||
CustomFields string `url:"customFields,omitempty" json:"customFields,omitempty"`
|
||||
|
||||
// Type of compute Stateful (KVM_X86) or Stateless (SVA_KVM_X86)
|
||||
// Type of compute Stateful (KVM_X86)
|
||||
// Required: false
|
||||
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
|
||||
|
||||
@@ -172,6 +179,10 @@ type CreateRequest struct {
|
||||
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
||||
// Required: false
|
||||
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
// GetRAM returns RAM field values
|
||||
|
||||
@@ -57,7 +57,7 @@ type CreateBlankRequest struct {
|
||||
// Required: false
|
||||
Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
|
||||
|
||||
// Type of compute Stateful (KVM_X86) or Stateless (SVA_KVM_X86)
|
||||
// Type of compute Stateful (KVM_X86)
|
||||
// Required: false
|
||||
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
|
||||
|
||||
@@ -88,6 +88,10 @@ type CreateBlankRequest struct {
|
||||
// Does this machine supports hot resize
|
||||
// Required: false
|
||||
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
// GetRAM returns RAM field values
|
||||
|
||||
@@ -38,12 +38,16 @@ type CreateRequest struct {
|
||||
HighlyAvailable bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"`
|
||||
|
||||
// Start now Load balancer
|
||||
// Required: false
|
||||
Start bool `url:"start" json:"start"`
|
||||
// Required: true
|
||||
Start bool `url:"start" json:"start" validate:"required"`
|
||||
|
||||
// Text description of this load balancer
|
||||
// Required: false
|
||||
Description string `url:"desc,omitempty" json:"desc,omitempty"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequest struct {
|
||||
|
||||
42
pkg/cloudapi/lb/migrate_to_zone.go
Normal file
42
pkg/cloudapi/lb/migrate_to_zone.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package lb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// MigrateToZone struct to move lb to another zone
|
||||
type MigrateToZoneRequest struct {
|
||||
// ID of the load balancer instance to move
|
||||
// Required: true
|
||||
LBID uint64 `url:"lbId" json:"lbId" validate:"required"`
|
||||
|
||||
// ID of the zone to move
|
||||
// Required: true
|
||||
ZoneID uint64 `url:"zoneId" json:"zoneId" validate:"required"`
|
||||
}
|
||||
|
||||
// MigrateToZone moves lb instance to new zone
|
||||
func (l LB) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/lb/migrateToZone"
|
||||
|
||||
res, err := l.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
|
||||
}
|
||||
@@ -8,6 +8,9 @@ type RecordLB struct {
|
||||
// Access Control List
|
||||
ACL interface{} `json:"acl"`
|
||||
|
||||
//Account ID
|
||||
AccountID uint64 `json:"accountId"`
|
||||
|
||||
// BackendHAIP
|
||||
BackendHAIP string `json:"backendHAIP"`
|
||||
|
||||
@@ -84,7 +87,7 @@ type RecordLB struct {
|
||||
Status string `json:"status"`
|
||||
|
||||
// Sysctl Params
|
||||
SysctlParams interface{} `json:"sysctlParams"`
|
||||
SysctlParams map[string]string `json:"sysctlParams"`
|
||||
|
||||
// Tech status
|
||||
TechStatus string `json:"techStatus"`
|
||||
@@ -100,6 +103,9 @@ type RecordLB struct {
|
||||
|
||||
// VINS ID
|
||||
VINSID uint64 `json:"vinsId"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// Main information about load balancer
|
||||
|
||||
71
pkg/cloudapi/locations/get_list.go
Normal file
71
pkg/cloudapi/locations/get_list.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package locations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ListGetRequest struct to get list of locations
|
||||
type ListGetRequest struct {
|
||||
// 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 flag
|
||||
// Required: false
|
||||
Flag string `url:"flag,omitempty" json:"flag,omitempty"`
|
||||
|
||||
// Find by name
|
||||
// Required: false
|
||||
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||
|
||||
// Find by ID
|
||||
// Required: false
|
||||
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
|
||||
|
||||
// Find by code location
|
||||
// Required: false
|
||||
LocationCode string `url:"locationCode,omitempty" json:"locationCode,omitempty"`
|
||||
|
||||
// Sort by one of supported fields, format +|-(field)
|
||||
// Required: false
|
||||
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
||||
}
|
||||
|
||||
// ListGet gets list of all locations as a ListLocations struct
|
||||
func (l Locations) ListGet(ctx context.Context, req ListGetRequest) (*ListLocations, error) {
|
||||
|
||||
res, err := l.ListGetRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
list := ListLocations{}
|
||||
|
||||
err = json.Unmarshal(res, &list)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &list, nil
|
||||
}
|
||||
|
||||
// ListGetRaw gets list of all locations as an array of bytes
|
||||
func (l Locations) ListGetRaw(ctx context.Context, req ListGetRequest) ([]byte, error) {
|
||||
|
||||
if err := validators.ValidateRequest(req); err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/locations/list"
|
||||
|
||||
res, err := l.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
return res, err
|
||||
}
|
||||
@@ -20,6 +20,9 @@ type ItemLocation struct {
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Network Modes
|
||||
NetworkModes []string `json:"network_modes"`
|
||||
|
||||
// Flag
|
||||
Flag string `json:"flag"`
|
||||
|
||||
@@ -28,6 +31,9 @@ type ItemLocation struct {
|
||||
|
||||
// CKey
|
||||
CKey string `json:"_ckey"`
|
||||
|
||||
// Support of SDN
|
||||
SDNSupport bool `json:"sdn_support"`
|
||||
}
|
||||
|
||||
// List of locations
|
||||
|
||||
8
pkg/cloudapi/prometheus.go
Normal file
8
pkg/cloudapi/prometheus.go
Normal file
@@ -0,0 +1,8 @@
|
||||
package cloudapi
|
||||
|
||||
import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/prometheus"
|
||||
|
||||
// Accessing the Resmon method group
|
||||
func (ca *CloudAPI) Prometheus() *prometheus.Prometheus {
|
||||
return prometheus.New(ca.client)
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_cpu_load.go
Normal file
57
pkg/cloudapi/prometheus/compute_cpu_load.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeCPULoadRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Per-second CPU time consumed by Compute in percent, average over the time step specified
|
||||
func (p Prometheus) ComputeCPULoad(ctx context.Context, req ComputeCPULoadRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeCPULoadRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeCPULoadRaw(ctx context.Context, req ComputeCPULoadRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeCPUload"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
53
pkg/cloudapi/prometheus/compute_memory_available.go
Normal file
53
pkg/cloudapi/prometheus/compute_memory_available.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeMemoryAvailableRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
}
|
||||
|
||||
// Available Memory
|
||||
func (p Prometheus) ComputeMemoryAvailable(ctx context.Context, req ComputeMemoryAvailableRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeMemoryAvailableRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeMemoryAvailableRaw(ctx context.Context, req ComputeMemoryAvailableRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeMemoryAvailable"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
53
pkg/cloudapi/prometheus/compute_memory_unused.go
Normal file
53
pkg/cloudapi/prometheus/compute_memory_unused.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeMemoryUnusedRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
}
|
||||
|
||||
// Unused Memory
|
||||
func (p Prometheus) ComputeMemoryUnused(ctx context.Context, req ComputeMemoryUnusedRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeMemoryUnusedRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeMemoryUnusedRaw(ctx context.Context, req ComputeMemoryUnusedRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeMemoryUnused"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
53
pkg/cloudapi/prometheus/compute_memory_usable.go
Normal file
53
pkg/cloudapi/prometheus/compute_memory_usable.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeMemoryUsableRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
}
|
||||
|
||||
// Usable Memory
|
||||
func (p Prometheus) ComputeMemoryUsable(ctx context.Context, req ComputeMemoryUsableRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeMemoryUsableRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeMemoryUsableRaw(ctx context.Context, req ComputeMemoryUsableRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeMemoryUsable"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
53
pkg/cloudapi/prometheus/compute_memory_usage.go
Normal file
53
pkg/cloudapi/prometheus/compute_memory_usage.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeMemoryUsageRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
}
|
||||
|
||||
// Memory Usage
|
||||
func (p Prometheus) ComputeMemoryUsage(ctx context.Context, req ComputeMemoryUsageRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeMemoryUsageRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeMemoryUsageRaw(ctx context.Context, req ComputeMemoryUsageRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeMemoryUsage"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
53
pkg/cloudapi/prometheus/compute_memory_used.go
Normal file
53
pkg/cloudapi/prometheus/compute_memory_used.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeMemoryUsedRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
}
|
||||
|
||||
// Used Memory
|
||||
func (p Prometheus) ComputeMemoryUsed(ctx context.Context, req ComputeMemoryUsedRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeMemoryUsedRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeMemoryUsedRaw(ctx context.Context, req ComputeMemoryUsedRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeMemoryUsed"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_read_bytes.go
Normal file
57
pkg/cloudapi/prometheus/compute_read_bytes.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeReadBytesRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Read Bytes
|
||||
func (p Prometheus) ComputeReadBytes(ctx context.Context, req ComputeReadBytesRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeReadBytesRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeReadBytesRaw(ctx context.Context, req ComputeReadBytesRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeReadBytes"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_read_requests.go
Normal file
57
pkg/cloudapi/prometheus/compute_read_requests.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeReadRequestsRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Read Requests
|
||||
func (p Prometheus) ComputeReadRequests(ctx context.Context, req ComputeReadRequestsRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeReadRequestsRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeReadRequestsRaw(ctx context.Context, req ComputeReadRequestsRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeReadRequests"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_receive_bytes.go
Normal file
57
pkg/cloudapi/prometheus/compute_receive_bytes.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeReceiveBytesRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Receive Bytes
|
||||
func (p Prometheus) ComputeReceiveBytes(ctx context.Context, req ComputeReceiveBytesRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeReceiveBytesRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeReceiveBytesRaw(ctx context.Context, req ComputeReceiveBytesRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeReceiveBytes"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_receive_packets.go
Normal file
57
pkg/cloudapi/prometheus/compute_receive_packets.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeReceivePacketsRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Receive Packets
|
||||
func (p Prometheus) ComputeReceivePackets(ctx context.Context, req ComputeReceivePacketsRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeReceivePacketsRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeReceivePacketsRaw(ctx context.Context, req ComputeReceivePacketsRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeReceivePackets"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_transmit_bytes.go
Normal file
57
pkg/cloudapi/prometheus/compute_transmit_bytes.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeTransmitBytesRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Transmit Bytes
|
||||
func (p Prometheus) ComputeTransmitBytes(ctx context.Context, req ComputeTransmitBytesRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeTransmitBytesRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeTransmitBytesRaw(ctx context.Context, req ComputeTransmitBytesRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeTransmitBytes"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_transmit_packets.go
Normal file
57
pkg/cloudapi/prometheus/compute_transmit_packets.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeTransmitPacketsRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Transmit Packets
|
||||
func (p Prometheus) ComputeTransmitPackets(ctx context.Context, req ComputeTransmitPacketsRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeTransmitPacketsRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeTransmitPacketsRaw(ctx context.Context, req ComputeTransmitPacketsRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeTransmitPackets"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_write_bytes.go
Normal file
57
pkg/cloudapi/prometheus/compute_write_bytes.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeWriteBytesRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Write Bytes
|
||||
func (p Prometheus) ComputeWriteBytes(ctx context.Context, req ComputeWriteBytesRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeWriteBytesRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeWriteBytesRaw(ctx context.Context, req ComputeWriteBytesRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeWriteBytes"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
57
pkg/cloudapi/prometheus/compute_write_requests.go
Normal file
57
pkg/cloudapi/prometheus/compute_write_requests.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
type ComputeWriteRequestsRequest struct {
|
||||
// Compute ID
|
||||
// Required: true
|
||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Write Requests
|
||||
func (p Prometheus) ComputeWriteRequests(ctx context.Context, req ComputeWriteRequestsRequest) (*PrometheusData, error) {
|
||||
res, err := p.ComputeWriteRequestsRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := PrometheusData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputeWriteRequestsRaw(ctx context.Context, req ComputeWriteRequestsRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computeWriteRequests"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
77
pkg/cloudapi/prometheus/computes.go
Normal file
77
pkg/cloudapi/prometheus/computes.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
const (
|
||||
ComputeCPULoad = "computeCPUload"
|
||||
ComputeMemoryUsage = "computeMemoryUsage"
|
||||
ComputeMemoryUsable = "computeMemoryUsable"
|
||||
ComputeMemoryUnused = "computeMemoryUnused"
|
||||
ComputeMemoryUsed = "computeMemoryUsed"
|
||||
ComputeMemoryAvailable = "computeMemoryAvailable"
|
||||
ComputeReadBytes = "computeReadBytes"
|
||||
ComputeReadRequests = "computeReadRequests"
|
||||
ComputeReceiveBytes = "computeReceiveBytes"
|
||||
ComputeTransmitBytes = "computeTransmitBytes"
|
||||
ComputeTransmitPackets = "computeTransmitPackets"
|
||||
ComputeWriteBytes = "computeWriteBytes"
|
||||
ComputeWriteRequests = "computeWriteRequests"
|
||||
)
|
||||
|
||||
type ComputesRequest struct {
|
||||
// List of compute IDs to fetch metrics for
|
||||
// Required: true
|
||||
ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"required"`
|
||||
|
||||
// List of compute IDs to fetch metrics for
|
||||
// Required: true
|
||||
MetricIDs []string `url:"metricIds" json:"metricIds" validate:"required"`
|
||||
|
||||
// Time to loads of statistic in seconds
|
||||
// Required: false
|
||||
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
|
||||
|
||||
// The reading interval in seconds
|
||||
// Required: false
|
||||
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
|
||||
|
||||
// Number of zeros after the decimal point
|
||||
// Required: false
|
||||
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
|
||||
}
|
||||
|
||||
// Get multiple metrics for multiple compute instances
|
||||
func (p Prometheus) Computes(ctx context.Context, req ComputesRequest) (*ComputesData, error) {
|
||||
res, err := p.ComputesRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := ComputesData{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about compute as an array of bytes
|
||||
func (p Prometheus) ComputesRaw(ctx context.Context, req ComputesRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/prometheus/computes"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
40
pkg/cloudapi/prometheus/models.go
Normal file
40
pkg/cloudapi/prometheus/models.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package prometheus
|
||||
|
||||
// PrometheusData represents an array of data points
|
||||
type PrometheusData []PrometheusPoint
|
||||
|
||||
// PrometheusPoint represents a single data point
|
||||
type PrometheusPoint struct {
|
||||
// Value of the metric at a specific point in time
|
||||
Value float64 `json:"value"`
|
||||
|
||||
// Timestamp the Unix timestamp.
|
||||
Timestamp uint64 `json:"timestamp"`
|
||||
}
|
||||
|
||||
// ComputesData represents an array of data points for computes
|
||||
type ComputesData []ItemCompute
|
||||
|
||||
// ItemCompute represents a single data of compute
|
||||
type ItemCompute struct {
|
||||
// Compute ID
|
||||
ComputeID uint64 `json:"computeId"`
|
||||
|
||||
// Array of metrics
|
||||
Metrics []ItemMetric `json:"metrics"`
|
||||
|
||||
// Error
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
// ItemMetric represents a single data point of metric
|
||||
type ItemMetric struct {
|
||||
// Metric ID
|
||||
MetricID string `json:"metricId"`
|
||||
|
||||
// Data represents an array of data points
|
||||
Data PrometheusData `json:"data"`
|
||||
|
||||
// Error
|
||||
Error string `json:"error"`
|
||||
}
|
||||
15
pkg/cloudapi/prometheus/prometheus.go
Normal file
15
pkg/cloudapi/prometheus/prometheus.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package prometheus
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||
)
|
||||
|
||||
type Prometheus struct {
|
||||
client interfaces.Caller
|
||||
}
|
||||
|
||||
func New(client interfaces.Caller) *Prometheus {
|
||||
return &Prometheus{
|
||||
client: client,
|
||||
}
|
||||
}
|
||||
@@ -71,6 +71,10 @@ type CreateRequest struct {
|
||||
// External IP address
|
||||
// Required: false
|
||||
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
|
||||
|
||||
// SDN access group id
|
||||
// Required: false
|
||||
SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"`
|
||||
}
|
||||
|
||||
// Create creates resource group
|
||||
|
||||
@@ -17,20 +17,19 @@ var rgs = ListResourceGroups{
|
||||
UserGroupID: "sample_user_1@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedBy: "sample_user_1@decs3o",
|
||||
CreatedTime: 1676645305,
|
||||
DefNetID: 1,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7971,
|
||||
ID: 7971,
|
||||
LockStatus: "UNLOCKED",
|
||||
Milestones: 363459,
|
||||
Name: "rg_1",
|
||||
RegisterComputes: false,
|
||||
CreatedBy: "sample_user_1@decs3o",
|
||||
CreatedTime: 1676645305,
|
||||
DefNetID: 1,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7971,
|
||||
ID: 7971,
|
||||
LockStatus: "UNLOCKED",
|
||||
Milestones: 363459,
|
||||
Name: "rg_1",
|
||||
ResourceLimits: ResourceLimits{
|
||||
CUC: -1,
|
||||
CUI: -1,
|
||||
@@ -60,20 +59,19 @@ var rgs = ListResourceGroups{
|
||||
UserGroupID: "sample_user_1@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedBy: "sample_user_1@decs3o",
|
||||
CreatedTime: 1676645461,
|
||||
DefNetID: 2,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7972,
|
||||
ID: 7972,
|
||||
LockStatus: "UNLOCKED",
|
||||
Milestones: 363468,
|
||||
Name: "rg_2",
|
||||
RegisterComputes: false,
|
||||
CreatedBy: "sample_user_1@decs3o",
|
||||
CreatedTime: 1676645461,
|
||||
DefNetID: 2,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7972,
|
||||
ID: 7972,
|
||||
LockStatus: "UNLOCKED",
|
||||
Milestones: 363468,
|
||||
Name: "rg_2",
|
||||
ResourceLimits: ResourceLimits{
|
||||
CUC: -1,
|
||||
CUI: -1,
|
||||
@@ -103,20 +101,19 @@ var rgs = ListResourceGroups{
|
||||
UserGroupID: "sample_user_2@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedBy: "sample_user_2@decs3o",
|
||||
CreatedTime: 1676645548,
|
||||
DefNetID: 3,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7973,
|
||||
ID: 7973,
|
||||
LockStatus: "kjLOCKED",
|
||||
Milestones: 363471,
|
||||
Name: "rg_3",
|
||||
RegisterComputes: false,
|
||||
CreatedBy: "sample_user_2@decs3o",
|
||||
CreatedTime: 1676645548,
|
||||
DefNetID: 3,
|
||||
DefNetType: "NONE",
|
||||
DeletedBy: "",
|
||||
DeletedTime: 0,
|
||||
Description: "",
|
||||
GID: 212,
|
||||
GUID: 7973,
|
||||
ID: 7973,
|
||||
LockStatus: "kjLOCKED",
|
||||
Milestones: 363471,
|
||||
Name: "rg_3",
|
||||
ResourceLimits: ResourceLimits{
|
||||
CUC: -1,
|
||||
CUI: -1,
|
||||
|
||||
@@ -128,15 +128,15 @@ type RecordResourceGroup struct {
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// RegisterComputes
|
||||
RegisterComputes bool `json:"registerComputes"`
|
||||
|
||||
// Resource limits
|
||||
ResourceLimits ResourceLimits `json:"resourceLimits"`
|
||||
|
||||
// List of resource types
|
||||
ResTypes []string `json:"resourceTypes"`
|
||||
|
||||
// SDN access group id
|
||||
SDNAccessGroupID string `json:"sdn_access_group_id"`
|
||||
|
||||
// Secret
|
||||
Secret string `json:"secret"`
|
||||
|
||||
@@ -224,15 +224,15 @@ type ItemResourceGroup struct {
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// RegisterComputes
|
||||
RegisterComputes bool `json:"registerComputes"`
|
||||
|
||||
// Resource limits
|
||||
ResourceLimits ResourceLimits `json:"resourceLimits"`
|
||||
|
||||
// List of resource types
|
||||
ResTypes []string `json:"resourceTypes"`
|
||||
|
||||
// SDN access group id
|
||||
SDNAccessGroupID string `json:"sdn_access_group_id"`
|
||||
|
||||
// Secret
|
||||
Secret string `json:"secret"`
|
||||
|
||||
|
||||
@@ -46,9 +46,6 @@ type RecordAsyncTask struct {
|
||||
// Detailed information about task
|
||||
type ItemAsyncTask struct {
|
||||
RecordAsyncTask
|
||||
|
||||
// GUID
|
||||
GUID string `json:"guid"`
|
||||
}
|
||||
|
||||
// List of tasks
|
||||
|
||||
10
pkg/cloudapi/trunk.go
Normal file
10
pkg/cloudapi/trunk.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package cloudapi
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk"
|
||||
)
|
||||
|
||||
// Accessing the Trunk method group
|
||||
func (ca *CloudAPI) Trunk() *trunk.Trunk {
|
||||
return trunk.New(ca.client)
|
||||
}
|
||||
46
pkg/cloudapi/trunk/get.go
Normal file
46
pkg/cloudapi/trunk/get.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package trunk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GetRequest struct to get information about a trunk
|
||||
type GetRequest struct {
|
||||
// ID of trunk
|
||||
// Required: true
|
||||
TrunkID uint64 `url:"id" json:"id" validate:"required"`
|
||||
}
|
||||
|
||||
// Get gets detailed information about a trunk as a ItemTrunk struct
|
||||
func (t Trunk) Get(ctx context.Context, req GetRequest) (*ItemTrunk, error) {
|
||||
res, err := t.GetRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := ItemTrunk{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets detailed information about a trunk as an array of bytes
|
||||
func (t Trunk) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/trunk/get"
|
||||
|
||||
res, err := t.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
return res, err
|
||||
}
|
||||
61
pkg/cloudapi/trunk/list.go
Normal file
61
pkg/cloudapi/trunk/list.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package trunk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ListRequest struct to get list of trunks
|
||||
type ListRequest struct {
|
||||
// Account access ID to filter by
|
||||
AccountIDs []uint64 `url:"account_ids,omitempty" json:"account_ids,omitempty"`
|
||||
|
||||
// ID of the trunk to filter by
|
||||
IDs []uint64 `url:"ids,omitempty" json:"ids,omitempty"`
|
||||
|
||||
// Sort by one of supported fields, format ±<field>
|
||||
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
||||
|
||||
// Trunk tags to filter by
|
||||
TrunkTags string `url:"trunk_tags,omitempty" json:"trunk_tags,omitempty" validate:"omitempty,trunkTags"`
|
||||
|
||||
// Page number
|
||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||
|
||||
// Page size
|
||||
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
||||
}
|
||||
|
||||
// List gets list of all trunks as a ListTrunks struct
|
||||
func (t Trunk) List(ctx context.Context, req ListRequest) (*ListTrunks, error) {
|
||||
|
||||
res, err := t.ListRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
list := ListTrunks{}
|
||||
|
||||
err = json.Unmarshal(res, &list)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &list, nil
|
||||
}
|
||||
|
||||
// ListRaw gets list of all trunks as an array of bytes
|
||||
func (t Trunk) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
||||
|
||||
if err := validators.ValidateRequest(req); err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/trunk/list"
|
||||
|
||||
res, err := t.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
return res, err
|
||||
}
|
||||
59
pkg/cloudapi/trunk/models.go
Normal file
59
pkg/cloudapi/trunk/models.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package trunk
|
||||
|
||||
type ItemTrunk struct {
|
||||
|
||||
// List of account IDs with access to this trunk
|
||||
AccountIDs []uint64 `json:"accountIds"`
|
||||
|
||||
// Created at
|
||||
CreatedAt uint64 `json:"created_at"`
|
||||
|
||||
// Created by
|
||||
CreatedBy string `json:"created_by"`
|
||||
|
||||
// Deleted at
|
||||
DeletedAt uint64 `json:"deleted_at"`
|
||||
|
||||
// Deleted by
|
||||
DeletedBy string `json:"deleted_by"`
|
||||
|
||||
// Description of a trunk
|
||||
Description string `json:"description"`
|
||||
|
||||
// GUID
|
||||
GUID uint64 `json:"guid"`
|
||||
|
||||
// ID of a trunk
|
||||
ID uint64 `json:"id"`
|
||||
|
||||
// MAC
|
||||
MAC string `json:"mac"`
|
||||
|
||||
// Name of a trunk
|
||||
Name string `json:"name"`
|
||||
|
||||
// Native VLAN ID
|
||||
NativeVLANID uint64 `json:"nativeVlanId"`
|
||||
|
||||
// OVS bridge name
|
||||
OVSBridge string `json:"ovsBridge"`
|
||||
|
||||
// If the trunk is enabled
|
||||
Status string `json:"status"`
|
||||
|
||||
// List of trunk tags (values between 1-4095)
|
||||
TrunkTags string `json:"trunkTags"`
|
||||
|
||||
// Updated at
|
||||
UpdatedAt uint64 `json:"updated_at"`
|
||||
|
||||
// Updated by
|
||||
UpdatedBy string `json:"updated_by"`
|
||||
}
|
||||
|
||||
// List of trunks
|
||||
type ListTrunks struct {
|
||||
Data []ItemTrunk `json:"data"`
|
||||
|
||||
EntryCount uint64 `json:"entryCount"`
|
||||
}
|
||||
18
pkg/cloudapi/trunk/trunk.go
Normal file
18
pkg/cloudapi/trunk/trunk.go
Normal file
@@ -0,0 +1,18 @@
|
||||
// API Actor API for trunk nerworks
|
||||
package trunk
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||
)
|
||||
|
||||
// Structure for creating request to trunk
|
||||
type Trunk struct {
|
||||
client interfaces.Caller
|
||||
}
|
||||
|
||||
// Builder for trunk endpoints
|
||||
func New(client interfaces.Caller) *Trunk {
|
||||
return &Trunk{
|
||||
client,
|
||||
}
|
||||
}
|
||||
@@ -53,6 +53,10 @@ type CreateInAccountRequest struct {
|
||||
// List of static routes, each item must have destination, netmask, and gateway fields
|
||||
// Required: false
|
||||
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInAcc struct {
|
||||
|
||||
@@ -47,6 +47,10 @@ type CreateInRGRequest struct {
|
||||
// List of static routes, each item must have destination, netmask, and gateway fields
|
||||
// Required: false
|
||||
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
|
||||
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInRG struct {
|
||||
|
||||
42
pkg/cloudapi/vins/migrate_to_zone.go
Normal file
42
pkg/cloudapi/vins/migrate_to_zone.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package vins
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// MigrateToZone struct to move VINS to another zone
|
||||
type MigrateToZoneRequest struct {
|
||||
// VINSID to move
|
||||
// Required: true
|
||||
VINSID uint64 `url:"net_id" json:"net_id" validate:"required"`
|
||||
|
||||
// ID of the zone to move
|
||||
// Required: true
|
||||
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
|
||||
}
|
||||
|
||||
// MigrateToZone moves VINS instance to new zone
|
||||
func (v VINS) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/vins/migrateToZone"
|
||||
|
||||
res, err := v.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
|
||||
}
|
||||
@@ -305,6 +305,9 @@ type ItemVNFInterface struct {
|
||||
// NodeID
|
||||
NodeID int64 `json:"nodeId"`
|
||||
|
||||
// SDNInterfaceID
|
||||
SDNInterfaceID string `json:"sdn_interface_id"`
|
||||
|
||||
// PCI slot
|
||||
PCISlot int64 `json:"pciSlot"`
|
||||
|
||||
@@ -732,6 +735,9 @@ type RecordVINS struct {
|
||||
|
||||
// VXLAN ID
|
||||
VXLANID uint64 `json:"vxlanId"`
|
||||
|
||||
// Zone ID
|
||||
ZoneID uint64 `json:"zoneId"`
|
||||
}
|
||||
|
||||
// Information about libvirt settings
|
||||
|
||||
10
pkg/cloudapi/zone.go
Normal file
10
pkg/cloudapi/zone.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package cloudapi
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
|
||||
)
|
||||
|
||||
// Accessing the Zone method group
|
||||
func (ca *CloudAPI) Zone() *zone.Zone {
|
||||
return zone.New(ca.client)
|
||||
}
|
||||
53
pkg/cloudapi/zone/filter.go
Normal file
53
pkg/cloudapi/zone/filter.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package zone
|
||||
|
||||
// FilterByID returns ListZones with specified ID.
|
||||
func (list ListZones) FilterByID(id uint64) ListZones {
|
||||
predicate := func(izone RecordZone) bool {
|
||||
return izone.ID == id
|
||||
}
|
||||
|
||||
return list.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterByName returns ListZones with specified Name.
|
||||
func (list ListZones) FilterByName(name string) ListZones {
|
||||
predicate := func(izone RecordZone) bool {
|
||||
return izone.Name == name
|
||||
}
|
||||
|
||||
return list.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterByStatus returns ListZones with specified Status.
|
||||
func (list ListZones) FilterByStatus(status string) ListZones {
|
||||
predicate := func(izone RecordZone) bool {
|
||||
return izone.Status == status
|
||||
}
|
||||
|
||||
return list.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterFunc allows filtering ListZones based on a user-specified predicate.
|
||||
func (list ListZones) FilterFunc(predicate func(RecordZone) bool) ListZones {
|
||||
var result ListZones
|
||||
|
||||
for _, item := range list.Data {
|
||||
if predicate(item) {
|
||||
result.Data = append(result.Data, item)
|
||||
}
|
||||
}
|
||||
|
||||
result.EntryCount = uint64(len(result.Data))
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// FindOne returns first found RecordZone
|
||||
// If none was found, returns an empty struct.
|
||||
func (list ListZones) FindOne() RecordZone {
|
||||
if list.EntryCount == 0 {
|
||||
return RecordZone{}
|
||||
}
|
||||
|
||||
return list.Data[0]
|
||||
}
|
||||
86
pkg/cloudapi/zone/filter_test.go
Normal file
86
pkg/cloudapi/zone/filter_test.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package zone
|
||||
|
||||
import "testing"
|
||||
|
||||
var zones = ListZones{
|
||||
Data: []RecordZone{
|
||||
|
||||
{
|
||||
ID: 2,
|
||||
GUID: 0,
|
||||
GID: 0,
|
||||
Name: "System Config",
|
||||
Description: "",
|
||||
Deletable: true,
|
||||
Status: "LOCKED",
|
||||
CreatedTime: 1640995200, // 2022-01-01
|
||||
UpdatedTime: 1640995200,
|
||||
NodeIDs: nil,
|
||||
},
|
||||
{
|
||||
ID: 5,
|
||||
GUID: 5500,
|
||||
GID: 6600,
|
||||
Name: "ssss Nodes",
|
||||
Description: " infrastructure",
|
||||
Deletable: true,
|
||||
Status: "DISABLED",
|
||||
CreatedTime: 1577836800, // 2020-01-01
|
||||
UpdatedTime: 1580515200, // 2020-02-01
|
||||
NodeIDs: []uint64{777, 888, 999},
|
||||
},
|
||||
{
|
||||
ID: 10,
|
||||
GUID: 5500,
|
||||
GID: 6600,
|
||||
Name: "node",
|
||||
Description: "infrastructure",
|
||||
Deletable: true,
|
||||
Status: "DISABLED",
|
||||
CreatedTime: 1577836800,
|
||||
UpdatedTime: 1580515200,
|
||||
NodeIDs: []uint64{777, 888, 999},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestFilterByID(t *testing.T) {
|
||||
actual := zones.FilterByID(10).FindOne()
|
||||
|
||||
if actual.ID != 10 {
|
||||
t.Fatal("expected ID 10, found: ", actual.ID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterByName(t *testing.T) {
|
||||
name := "node"
|
||||
actual := zones.FilterByName(name).FindOne()
|
||||
|
||||
if actual.Name != name {
|
||||
t.Fatal("expected ", name, " found: ", actual.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterByStatus(t *testing.T) {
|
||||
actual := zones.FilterByStatus("DISABLED")
|
||||
|
||||
if len(actual.Data) != 2 {
|
||||
t.Fatal("expected 2 found, actual: ", len(actual.Data))
|
||||
}
|
||||
|
||||
for _, item := range actual.Data {
|
||||
if item.Status != "DISABLED" {
|
||||
t.Fatal("expected Status 'DISABLED', found: ", item.Status)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterFunc(t *testing.T) {
|
||||
actual := zones.FilterFunc(func(ien RecordZone) bool {
|
||||
return ien.Deletable == true
|
||||
})
|
||||
|
||||
if len(actual.Data) != 3 {
|
||||
t.Fatal("expected 3 elements, found: ", len(actual.Data))
|
||||
}
|
||||
}
|
||||
46
pkg/cloudapi/zone/get.go
Normal file
46
pkg/cloudapi/zone/get.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package zone
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GetRequest struct to get detailed information about zone
|
||||
type GetRequest struct {
|
||||
// ID of zone
|
||||
// Required: true
|
||||
ID uint64 `url:"id" json:"id" validate:"required"`
|
||||
}
|
||||
|
||||
// Get gets detailed information about zone struct
|
||||
func (e Zone) Get(ctx context.Context, req GetRequest) (*RecordZone, error) {
|
||||
res, err := e.GetRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := RecordZone{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets detailed information about zone as an array of bytes
|
||||
func (e Zone) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/zone/get"
|
||||
|
||||
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
10
pkg/cloudapi/zone/ids.go
Normal file
10
pkg/cloudapi/zone/ids.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package zone
|
||||
|
||||
// IDs gets array of IDs from ListZones struct
|
||||
func (le ListZones) IDs() []uint64 {
|
||||
res := make([]uint64, 0, len(le.Data))
|
||||
for _, e := range le.Data {
|
||||
res = append(res, e.ID)
|
||||
}
|
||||
return res
|
||||
}
|
||||
84
pkg/cloudapi/zone/list.go
Normal file
84
pkg/cloudapi/zone/list.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package zone
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ListRequest struct to get list of zones
|
||||
type ListRequest struct {
|
||||
|
||||
// Find by ID
|
||||
// Required: false
|
||||
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
|
||||
|
||||
// Find by Grid ID
|
||||
// Required: false
|
||||
GID uint64 `url:"gid,omitempty" json:"gid,omitempty"`
|
||||
|
||||
// Find by name
|
||||
// Required: false
|
||||
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||
|
||||
// Find by description
|
||||
// Required: false
|
||||
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||
|
||||
// Find by status
|
||||
// Required: false
|
||||
Status string `url:"status,omitempty" json:"status,omitempty"`
|
||||
|
||||
// Find by deletable
|
||||
// Required: false
|
||||
Deletable bool `url:"deletable,omitempty" json:"deletable,omitempty"`
|
||||
|
||||
// Find by node ID
|
||||
// Required: false
|
||||
NodeID uint64 `url:"nodeId,omitempty" json:"nodeId,omitempty"`
|
||||
|
||||
// Sort by one of supported fields, format +|-(field)
|
||||
// Required: false
|
||||
SortBy string `url:"sortBy,omitempty" json:"sortBy,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"`
|
||||
}
|
||||
|
||||
// List gets list of all zones as a ListZones struct
|
||||
func (e Zone) List(ctx context.Context, req ListRequest) (*ListZones, error) {
|
||||
|
||||
res, err := e.ListRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
list := ListZones{}
|
||||
|
||||
err = json.Unmarshal(res, &list)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &list, nil
|
||||
}
|
||||
|
||||
// ListRaw gets list of all available zones as an array of bytes
|
||||
func (e Zone) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
||||
|
||||
if err := validators.ValidateRequest(req); err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/zone/list"
|
||||
|
||||
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
1
pkg/cloudapi/zone/migrate_to_zone.go
Normal file
1
pkg/cloudapi/zone/migrate_to_zone.go
Normal file
@@ -0,0 +1 @@
|
||||
package zone
|
||||
42
pkg/cloudapi/zone/models.go
Normal file
42
pkg/cloudapi/zone/models.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package zone
|
||||
|
||||
type ListZones struct {
|
||||
// Entry count
|
||||
EntryCount uint64 `json:"entryCount"`
|
||||
|
||||
// Data
|
||||
Data []RecordZone `json:"data"`
|
||||
}
|
||||
|
||||
// Detailed information about the zone record
|
||||
type RecordZone struct {
|
||||
// ID
|
||||
ID uint64 `json:"id"`
|
||||
|
||||
// GUID
|
||||
GUID uint64 `json:"guid"`
|
||||
|
||||
// GID
|
||||
GID uint64 `json:"gid"`
|
||||
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Description
|
||||
Description string `json:"description"`
|
||||
|
||||
// Deletable flag
|
||||
Deletable bool `json:"deletable"`
|
||||
|
||||
// Status
|
||||
Status string `json:"status"`
|
||||
|
||||
// Created timestamp
|
||||
CreatedTime uint64 `json:"createdTime"`
|
||||
|
||||
// Updated timestamp
|
||||
UpdatedTime uint64 `json:"updatedTime"`
|
||||
|
||||
// List of associated Node IDs
|
||||
NodeIDs []uint64 `json:"nodeIds"`
|
||||
}
|
||||
43
pkg/cloudapi/zone/serialize.go
Normal file
43
pkg/cloudapi/zone/serialize.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package zone
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/serialization"
|
||||
)
|
||||
|
||||
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
||||
//
|
||||
// In order to serialize with indent make sure to follow these guidelines:
|
||||
// - First argument -> prefix
|
||||
// - Second argument -> indent
|
||||
func (list ListZones) Serialize(params ...string) (serialization.Serialized, error) {
|
||||
if list.EntryCount == 0 {
|
||||
return []byte{}, nil
|
||||
}
|
||||
|
||||
if len(params) > 1 {
|
||||
prefix := params[0]
|
||||
indent := params[1]
|
||||
|
||||
return json.MarshalIndent(list, prefix, indent)
|
||||
}
|
||||
|
||||
return json.Marshal(list)
|
||||
}
|
||||
|
||||
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
|
||||
//
|
||||
// In order to serialize with indent make sure to follow these guidelines:
|
||||
// - First argument -> prefix
|
||||
// - Second argument -> indent
|
||||
func (item RecordZone) Serialize(params ...string) (serialization.Serialized, error) {
|
||||
if len(params) > 1 {
|
||||
prefix := params[0]
|
||||
indent := params[1]
|
||||
|
||||
return json.MarshalIndent(item, prefix, indent)
|
||||
}
|
||||
|
||||
return json.Marshal(item)
|
||||
}
|
||||
18
pkg/cloudapi/zone/zone.go
Normal file
18
pkg/cloudapi/zone/zone.go
Normal file
@@ -0,0 +1,18 @@
|
||||
// API Actor for use zones
|
||||
package zone
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||
)
|
||||
|
||||
// Structure for creating request to zone
|
||||
type Zone struct {
|
||||
client interfaces.Caller
|
||||
}
|
||||
|
||||
// Builder for zone endpoints
|
||||
func New(client interfaces.Caller) *Zone {
|
||||
return &Zone{
|
||||
client,
|
||||
}
|
||||
}
|
||||
42
pkg/cloudbroker/account/add_zone.go
Normal file
42
pkg/cloudbroker/account/add_zone.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// AddZoneRequest struct for adding zone to account for a user
|
||||
type AddZoneRequest struct {
|
||||
// ID of account to add to
|
||||
// Required: true
|
||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
||||
|
||||
// IDs of zones
|
||||
// Required: true
|
||||
ZoneIDs []uint64 `url:"zoneIds" json:"zoneIds" validate:"required"`
|
||||
}
|
||||
|
||||
// AddUser gives a user access rights.
|
||||
func (a Account) AddZone(ctx context.Context, req AddZoneRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/account/addZone"
|
||||
|
||||
res, err := a.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
|
||||
}
|
||||
@@ -60,9 +60,17 @@ type CreateRequest struct {
|
||||
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
|
||||
|
||||
// Advanced compute features,
|
||||
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac
|
||||
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk
|
||||
// Required: false
|
||||
ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"`
|
||||
|
||||
// Default zone ID
|
||||
// Required: false
|
||||
DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"`
|
||||
|
||||
// Zones
|
||||
// Required: false
|
||||
ZoneIDs []uint64 `url:"zoneIds,omitempty" json:"zoneIds,omitempty"`
|
||||
}
|
||||
|
||||
// Create creates account
|
||||
|
||||
@@ -16,21 +16,25 @@ type DeleteRequest struct {
|
||||
// Whether to completely delete the account
|
||||
// Required: false
|
||||
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
|
||||
|
||||
// Name of account
|
||||
// Required: false
|
||||
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||
}
|
||||
|
||||
// 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)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/account/delete"
|
||||
|
||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(result), nil
|
||||
}
|
||||
|
||||
@@ -19,18 +19,18 @@ type DeleteAccountsRequest struct {
|
||||
}
|
||||
|
||||
// DeleteAccounts destroys a group of accounts
|
||||
func (a Account) DeleteAccounts(ctx context.Context, req DeleteAccountsRequest) (bool, error) {
|
||||
func (a Account) DeleteAccounts(ctx context.Context, req DeleteAccountsRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/account/deleteAccounts"
|
||||
|
||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(res), nil
|
||||
}
|
||||
|
||||
@@ -13,10 +13,6 @@ type DisableRequest struct {
|
||||
// ID of account
|
||||
// Required: true
|
||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
||||
|
||||
// Reason of disabling
|
||||
// Required: false
|
||||
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
|
||||
}
|
||||
|
||||
// Disable disables an account
|
||||
|
||||
@@ -12,25 +12,21 @@ type DisableAccountsRequest struct {
|
||||
// IDs of accounts
|
||||
// Required: true
|
||||
AccountIDs []uint64 `url:"accountIds" json:"accountIds" validate:"min=1"`
|
||||
|
||||
// Reason of disabling
|
||||
// Required: false
|
||||
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
|
||||
}
|
||||
|
||||
// DisableAccounts disables accounts
|
||||
func (a Account) DisableAccounts(ctx context.Context, req DisableAccountsRequest) (bool, error) {
|
||||
func (a Account) DisableAccounts(ctx context.Context, req DisableAccountsRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/account/disableAccounts"
|
||||
|
||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(res), nil
|
||||
}
|
||||
|
||||
@@ -15,18 +15,18 @@ type EnableAccountsRequest struct {
|
||||
}
|
||||
|
||||
// EnableAccounts enables accounts
|
||||
func (a Account) EnableAccounts(ctx context.Context, req EnableAccountsRequest) (bool, error) {
|
||||
func (a Account) EnableAccounts(ctx context.Context, req EnableAccountsRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/account/enableAccounts"
|
||||
|
||||
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
return string(res), nil
|
||||
}
|
||||
|
||||
@@ -9,16 +9,6 @@ var accounts = ListAccounts{
|
||||
{
|
||||
Meta: []interface{}{},
|
||||
InfoAccount: InfoAccount{
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "not_really_timofey_tkachev_1@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedTime: 1676878820,
|
||||
DeletedTime: 0,
|
||||
ID: 132847,
|
||||
@@ -26,20 +16,20 @@ var accounts = ListAccounts{
|
||||
Status: "CONFIRMED",
|
||||
UpdatedTime: 1676645275,
|
||||
},
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "not_really_timofey_tkachev_1@decs3o",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Meta: []interface{}{},
|
||||
InfoAccount: InfoAccount{
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "timofey_tkachev_1@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedTime: 1676645275,
|
||||
DeletedTime: 1677723401,
|
||||
ID: 132846,
|
||||
@@ -47,28 +37,20 @@ var accounts = ListAccounts{
|
||||
Status: "DELETED",
|
||||
UpdatedTime: 1676645275,
|
||||
},
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "timofey_tkachev_1@decs3o",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Meta: []interface{}{},
|
||||
InfoAccount: InfoAccount{
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "timofey_tkachev_1@decs3o",
|
||||
},
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "second_account@decs3o",
|
||||
},
|
||||
},
|
||||
CreatedTime: 1676883850,
|
||||
DeletedTime: 1676883899,
|
||||
ID: 132848,
|
||||
@@ -76,6 +58,24 @@ var accounts = ListAccounts{
|
||||
Status: "DELETED",
|
||||
UpdatedTime: 1676878820,
|
||||
},
|
||||
ACL: []ACL{
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "timofey_tkachev_1@decs3o",
|
||||
},
|
||||
{
|
||||
Explicit: true,
|
||||
GUID: "",
|
||||
Right: "CXDRAU",
|
||||
Status: "CONFIRMED",
|
||||
Type: "U",
|
||||
UserGroupID: "second_account@decs3o",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
EntryCount: 3,
|
||||
|
||||
@@ -102,6 +102,15 @@ type ACL struct {
|
||||
UserGroupID string `json:"userGroupId"`
|
||||
}
|
||||
|
||||
// Access Control List with emails field
|
||||
type ACLWithEmails struct {
|
||||
// ACL
|
||||
ACL
|
||||
|
||||
// Emails
|
||||
Emails []string `json:"emails"`
|
||||
}
|
||||
|
||||
// Resource limits
|
||||
type ResourceLimits struct {
|
||||
// CuC
|
||||
@@ -134,9 +143,6 @@ type InfoAccount struct {
|
||||
// CKey
|
||||
CKey string `json:"_ckey"`
|
||||
|
||||
// Access Control List
|
||||
ACL []ACL `json:"acl"`
|
||||
|
||||
// Company
|
||||
Company string `json:"company"`
|
||||
|
||||
@@ -205,12 +211,30 @@ type InfoAccount struct {
|
||||
|
||||
// List of VINS IDs
|
||||
VINS []uint64 `json:"vins"`
|
||||
|
||||
// Default zone ID
|
||||
DefaultZoneID uint64 `json:"defaultZoneId"`
|
||||
}
|
||||
|
||||
// Deatailed information about the account zone
|
||||
type ZoneID struct {
|
||||
// ID of zone
|
||||
ID int64 `json:"id"`
|
||||
|
||||
// Name of zone
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
// Deatailed information about account
|
||||
type RecordAccount struct {
|
||||
// Main information about account
|
||||
InfoAccount
|
||||
|
||||
// Access Control List
|
||||
ACL []ACLWithEmails `json:"acl"`
|
||||
|
||||
// Zones IDs
|
||||
ZoneIDs []ZoneID
|
||||
}
|
||||
|
||||
// More information about account
|
||||
@@ -218,8 +242,14 @@ type ItemAccount struct {
|
||||
// Meta
|
||||
Meta []interface{} `json:"_meta"`
|
||||
|
||||
// Access Control List
|
||||
ACL []ACL `json:"acl"`
|
||||
|
||||
// Main information about account
|
||||
InfoAccount
|
||||
|
||||
// Zones
|
||||
ZoneIDs []uint64
|
||||
}
|
||||
|
||||
// List of accounts
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user