main v1.12.0
asteam 2 weeks ago
parent 1f8637400f
commit 7dacf35cd6

@ -1,13 +1,225 @@
## Version 1.11.6 ## Version 1.12.0
### Удалено ### Удалено
#### Account #### account
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-553 | Метод `Create` в cloudapi/account | | BGOS-450 | Метод `AddZone` и структура запроса `AddZoneRequest` в cloudbroker/account |
| BGOS-451 | Метод `RemoveZone` и структура запроса `RemoveZoneRequest` в cloudbroker/account |
| BGOS-459 | Опциональные поля `ZoneIDs` и `DefaultZoneID` в структуру ответа `RecordAccount` в cloudapi/account и в структуру ответа `InfoAccount` в cloudbroker/account, опциональное поле `DefaultZoneID` в структуру запроса `UpdateRequest` в cloudapi/account и cloudbroker/account и опциональные поля `ZoneIDs` и `DefaultZoneID` в структуру запроса `CreateRequest` в cloudbroker/account |
| BGOS-478 | Опциональное поле `Emails` в структуру `ACL` входящую в структуру ответа `RecordAccount` в cloudbroker/account |
| BGOS-495 | Поле `AccountID` в структуру ответа `RecordLB` в cloudapi/lb и cloudbroker/lb |
| BGOS-528 | Значение `trunk` для поля `ComputeFeatures` в cloudbroker/account |
#### Image #### bservice
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-552 | Метод `UploadImageFile` в cloudbroker/image | | BGOS-361 | Добавлена группа ручек `bservice` в cloudbroker |
| BGOS-448 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudapi/bservice |
| BGOS-456 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/bservice |
| BGOS-460 | Опциональное поле `ZoneId` в структуру запроса `CreateRequest` и в структуры ответа `RecordBasicService` и `ItemBasicService` в cloudapi/bservice и опциональное поле `ZoneID` в структуру запроса `CreateRequest` и в структуры ответа `RecordBasicService` и `ItemBasicService` в cloudbroker/bservice |
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-445 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudapi/compute |
| BGOS-453 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/compute |
| BGOS-461 | Поле `ZoneID` в структуры ответа `RecordCompute` и `ItemComputeDisk` в cloudapi/compute и поле `ZoneID` в структуры ответа `RecordCompute` и `InfoCompute` в cloudbroker/compute |
| BGOS-491 | Методы `AbortSharedSnapshotMerge` и `SharedSnapshotMergeStatus` и структуры запроса `AbortSharedSnapshotMergeRequest` и `SharedSnapshotMergeStatusRequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-493 | Метод `GuestAgentDisable` и структура запроса `GuestAgentDisableRequest` в cloudapi/compute и в cloudbroker/compute|
| BGOS-493 | Метод `GuestAgentEnable` и структура запроса `GuestAgentEnableRequest` в cloudapi/compute и в cloudbroker/compute|
| BGOS-493 | Метод `GuestAgentExecuteRequest` и структура запроса `GuestAgentExecuteRequest` в cloudapi/compute и в cloudbroker/compute|
| BGOS-493 | Метод `GuestAgentFeatureUpdateRequest` и структура запроса `GuestAgentFeatureUpdateRequest` в cloudapi/compute и в cloudbroker/compute|
| BGOS-493 | Метод `GuestAgentFeatureGetRequest` и структура запроса `GuestAgentFeatureGetRequest` в cloudapi/compute и в cloudbroker/compute|
| BGOS-497 | Метод `AsyncMigrate` в cloudbroker/compute |
| BGOS-505 | Поддержка NetType `SDN` и `TRUNK` структурах запросов `Interface` и `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-505 | Опциональное поле `SDNInterfaceID` в структуру запроса `Interface` в cloudapi/compute и cloudbroker/compute |
| BGOS-506 | Поле `SDNInterfaceID` в структуру ответа `ItemVNFInterface` в cloudapi/compute|
| BGOS-506 | Поле `SDNInterfaceID` в структуру ответа `ItemInterface` в cloudbroker/compute |
| BGOS-510 | Поддержка NetType `EMPTY` структурах запросов `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-535 | Метод `ChangeMTU` и структура запроса `ChangeMTURequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-509 | Опциональное поле `SDNInterfaceID` в структуру запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-543 | Поля `LiveMigrationJobID` и `QemuQuest` и структура ответа `QemuQuest` в структуры ответа `ItemCompute`, `RecordCompute` в cloudapi/compute и `RecordCompute`, `InfoCompute` в cloudbroker/compute |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-452 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/extnet |
| BGOS-462 | Поле `ZoneID` в структуру ответа `RecordExtNet` в cloudapi/extnet и поле `ZoneID` в структуры ответа `RecordExtNet` и `ItemExtNet` в cloudbroker/extnet |
| BGOS-462 | Опциональное поле `ZoneID` в структуру запроса `CreateRequest` в cloudbroker/extnet |
| BGOS-534 | Опциональное поле `MTU` в структуры запроса `CreateRequest` и `UpdateRequest` в cloudbroker/extnet |
| BGOS-534 | Поле `MTU` в структуру ответа `RecordExtNet` в cloudapi/extnet и в структуры ответа `ItemExtNet` и `RecordExtNet` в cloudbroker/extnet |
| BGOS-530 | Метод `SetHAMode` и структура запроса `SetHAModeRequest` в cloudbroker/extnet |
| BGOS-531 | Опциональные поля `PriVNFDevIP`, `SecVNFDevIP` и `HAMode` в структуру запроса `CreateRequest` в cloudbroker/extnet |
| BGOS-531 | Опциональное поле `Device` в структуру запроса `DeviceMigrateRequest` в cloudbroker/extnet |
| BGOS-531 | Поля `SecVNFDevID` и `Redundant` в структуры ответа `ItemExtNet` и `RecordExtNet` в cloudbroker/extnet |
| BGOS-531 | Поля `SecVNFDevID` и `Redundant` в структуру ответа `RecordExtNet` в cloudapi/extnet |
| BGOS-544 | Поле `PreReservations` в структуру ответа `RecordExtNet` в cloudapi/extnet и cloudbroker/extnet |
#### grid
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-549 | Поля `NetworkModes`, `SDNSupport` в структуры ответа `ItemGridList` и `RecordGrid` в cloudbroker/grid |
#### image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-481 | Метод `AsyncCreate` в cloudapi/image |
#### k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-449 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudapi/k8s |
| BGOS-463 | Поле `ZoneID` в структуры ответа `RecordK8S` и `ItemK8SCluster` в cloudapi/k8s и поле `ZoneID` в структуры ответа `RecordK8S` и `ItemK8S` в cloudbroker/k8s |
| BGOS-463 | Опциональное поле `ZoneID` в структуру запроса `CreateRequest` в cloudapi/k8s и в cloudbroker/k8s |
| BGOS-457 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/k8s |
#### kvmx86
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-466 | Опциональное поле `ZoneID` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 |
#### lb
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-447 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudapi/lb |
| BGOS-455 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/lb |
| BGOS-464 | Поле `ZoneID` в структуру ответа `RecordLB` в cloudapi/lb и поле `ZoneID` в структуры ответа `RecordLB` и `ItemLBList` в cloudbroker/lb |
| BGOS-464 | Опциональное поле `ZoneID` в структуру запроса `CreateRequest` в cloudapi/lb и в cloudbroker/lb |
#### locations
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-546 | Поле `NetworkModes` в структуре ответа `ItemLocation` в cloudapi/locations |
| BGOS-546 | Метод `ListGet` в cloudapi/locations |
#### node
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-484 | Новое значение `is_powered` в поле `action` в структуре запроса `ApplyIpmiActionRequest` в cloudbroker/node |
| BGOS-547 | Поля `SDNHypervisorName` и `ZoneID` в структуру ответа `ItemNode` и поле `ZoneID` в структуру ответа `RecordNode` в cloudbroker/node |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-504 | Поле `SDNAccessGroupID` в структуру запроса `CreateRequest` в cloudapi/rg и cloudbroker/rg |
| BGOS-504 | Поле `SDNAccessGroupID` в структуры ответа `RecordResourceGroup`, `ItemResourceGroup` в cloudapi/rg и в структуру ответа `ItemRG` в cloudbroker/rg |
| BGOS-528 | Значение `trunk` для поля `ComputeFeatures` в cloudbroker/rg |
#### trunk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-527 | Группа ручек `trunk` в cloudapi и в cloudbroker |
#### vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-446 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudapi/vins |
| BGOS-454 | Метод `MigrateToZone` и структура запроса `MigrateToZoneRequest` в cloudbroker/vins |
| BGOS-465 | Поле `ZoneID` в структуру ответа `RecordVINS` в cloudapi/vins и в структуры ответа `RecordVINS` и `ItemVINS` в cloudbroker/vins |
| BGOS-465 | Опциональное поле `ZoneID` в структуры запроса `CreateInRGRequest` и `CreateInAccountRequest` в cloudapi/vins и в cloudbroker/vins |
| BGOS-550 | Поле `SDNAccessGroupID` в структуру ответа `ItemVNFInterface` в cloudapi/vins и в структуру ответа `ItemInterface` в cloudbroker/vins |
#### zone
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-435 | Добавлена группа ручек zone в cloudapi и в cloudbroker |
#### user
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-494 | Опциональное поле `Provider` в структурe запроса `CreateRequest` в cloudbroker/user |
| BGOS-526 | Опциональное поле `Email` в структуру запроса `ListRequest` в cloudbroker/user |
| BGOS-502 | Поле `Blocked` в структуру ответа `ItemUser`, методы `Block` и `Unblock` и структуры запроса `BlockRequest` и `UnblockRequest` в cloudbroker/user |
### Исправлено
#### account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-512 | Исправлено возвращаемое значение с bool на string в методах `Delete` и `Restore` в cloudapi/account и в методах `Delete`, `Restore`, `DeleteAccounts`, `DisableAccounts` и `EnableAccounts` в cloudbroker/account |
#### bservice
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-483 | Изменен тип параметра `Permanently` на опциональный в структуре `DeleteRequest` в cloudbroker/bservice |
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-433 | Исправлена ошибка валидации поля LoaderType для всех структур в cloudapi/compute и в cloudbroker/compute |
| BGOS-458 | Изменен тип параметров `CPUPin`, `HPBacked`, `AutoStart`, `HotResize` с bool на interface в структуре `UpdateRequest` cloudapi/compute и в cloudbroker/compute |
| BGOS-503 | Исправлен тип поля `Explicit` cо string на bool в структурах ответа `ItemComputeACL` в cloudbroker/compute |
| BGOS-537 | В методе `GetLog` вызов api осуществляется с методом get в cloudapi/compute и в cloudbroker/compute |
#### disk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-468 | Исправлен тип поля `UpdatedBy` c uint64 на string в структурах ответа `ItemComputeDisk` в cloudapi/compute и `ItemDisk` в cloudbroker/compute |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-548 | В структурах ответа `RecordExtNet` в cloudapi/extnet и cloudbroker/extnet и `ItemExtNet` в cloudbroker/extnet поле `networkID` заменено на поле `networkIDs` |
#### flipgroup
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-482 | Изменен тип параметра `ClientType` на опциональный в структуре `CreateRequest` в cloudapi/bservice и cloudbroker/bservice |
#### image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-481 | Метод `SyncCreate` заменен на метод `AsyncCreateImage` со структурой запроса `CreateRequest` в cloudbroker/image |
#### lb
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-538 | Изменен тип поля `SysctlParams` в структурах ответа `RecordLB` и `ItemLBList` в cloudapi/lb и cloudbroker/lb |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-540 | Тип возвращаемого значения методов `MassEnable`, `MassDisable`, `MassDelete` с bool на string в cloudbroker/rg |
### Удалено
#### account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-541 | Опциональное поле `Reason` в структуре запроса `DisableEnableRequest` в cloudapi/account |
| BGOS-541 | Опциональное поле `Reason` в структурах запроса `DeleteRequest`, `DisableRequest`, `DisableAccountsRequest`, `RestoreRequest` в cloudbroker/account |
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-536 | Поля `Order` и `VMID` в структуре ответа `ItemComputeDisk` в cloudapi/compute и в структуре ответа `ItemDisk` в cloudbroker/compute |
| BGOS-551 | Значение `SVA_KVM_X86` в поле `Driver` в структурах запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/compute |
#### disks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-480 | Опциональное поле `Architecture` в структурах запроса `FromPlatformDiskRequest` в cloudapi/disks и в cloudbroker/disks |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-531 | Опциональное поле `VNFDevIP` в структуре запроса `CreateRequest` в cloudbroker/extnet |
#### image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-480 | Опциональное поле `Architecture` в структурах запроса `CreateRequest`, `ListRequest` в cloudapi/image и `CreateRequest`, `ListRequest`, `CreateCDROMImageRequest` в cloudbroker/image |
| BGOS-489 | Поле `Meta` в структуре ответа `ItemListStacks` в cloudbroker/image |
#### tasks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-500 | Опциональное поле `GUID` в структурах ответа `ItemAsyncTask` в cloudapi/tasks и `ItemTask` в cloudbroker/tasks |
#### user
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-494 | Опциональное поле `Groups` в структурe запроса `CreateRequest` в cloudbroker/user |

@ -16,6 +16,7 @@ Decort SDK - это библиотека, написанная на языке G
- Версия 1.9.х Decort-SDK соответствует 4.1.0 версии платформы - Версия 1.9.х Decort-SDK соответствует 4.1.0 версии платформы
- Версия 1.10.х Decort-SDK соответствует 4.2.0 версии платформы - Версия 1.10.х Decort-SDK соответствует 4.2.0 версии платформы
- Версия 1.11.х Decort-SDK соответствует 4.3.0 версии платформы - Версия 1.11.х Decort-SDK соответствует 4.3.0 версии платформы
- Версия 1.12.х Decort-SDK соответствует 4.4.0 версии платформы
## Оглавление ## Оглавление
@ -122,7 +123,8 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `Stack` - получение информации о вычислительных узлах; - `Stack` - получение информации о вычислительных узлах;
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера); - `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
- `VFPool` - управление пулом виртуальных сетевых функций; - `VFPool` - управление пулом виртуальных сетевых функций;
- `VINS` - управление виртуальными изолированными сетями. - `VINS` - управление виртуальными изолированными сетями;
- `Zone` - управление зонами.
### Cloudbroker ### Cloudbroker
@ -133,6 +135,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `Audit` - получение информации о событиях системы; - `Audit` - получение информации о событиях системы;
- `APIAccess` - управление доступом к API и его объектам; - `APIAccess` - управление доступом к API и его объектам;
- `Backup` - управление резервным копированием; - `Backup` - управление резервным копированием;
- `BService` - управление группами виртуальных машин (computes);
- `Compute` - управление виртуальными машинами (индивидуально); - `Compute` - управление виртуальными машинами (индивидуально);
- `Disks` - управление виртуальными дисками; - `Disks` - управление виртуальными дисками;
- `DPDK` - управление виртуальными сетями DPDK; - `DPDK` - управление виртуальными сетями DPDK;
@ -157,6 +160,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `VGPU` - управление виртуальными графическими процессорами; - `VGPU` - управление виртуальными графическими процессорами;
- `VFPool` - управление пулом виртуальных сетевых функций; - `VFPool` - управление пулом виртуальных сетевых функций;
- `VINS` - управление виртуальными изолированными сетями. - `VINS` - управление виртуальными изолированными сетями.
- `Zone` - управление зонами.
## Работа с библиотекой ## Работа с библиотекой
@ -307,13 +311,16 @@ func main() {
- `pkg/cloudapi/sep` - для `SEP` - `pkg/cloudapi/sep` - для `SEP`
- `pkg/cloudapi/stack` - для `Stack` - `pkg/cloudapi/stack` - для `Stack`
- `pkg/cloudapi/tasks` - для `Tasks` - `pkg/cloudapi/tasks` - для `Tasks`
- `pkg/cloudapi/trunk` - для `Trunk`
- `pkg/cloudapi/vfpool` - для `VFPool` - `pkg/cloudapi/vfpool` - для `VFPool`
- `pkg/cloudapi/vins` - для `VINS` - `pkg/cloudapi/vins` - для `VINS`
- `pkg/cloudapi/zone` - для `Zone`
- **cloudbroker**: - **cloudbroker**:
- `pkg/cloudbroker/account` - для `Account` - `pkg/cloudbroker/account` - для `Account`
- `pkg/cloudbroker/audit` - для `Audit` - `pkg/cloudbroker/audit` - для `Audit`
- `pkg/cloudbroker/apiaccess` - для `APIAccess` - `pkg/cloudbroker/apiaccess` - для `APIAccess`
- `pkg/cloudbroker/backup` - для `Backup` - `pkg/cloudbroker/backup` - для `Backup`
- `pkg/cloudbroker/bservice` - для `Basic Service`
- `pkg/cloudbroker/compute` - для `Compute` - `pkg/cloudbroker/compute` - для `Compute`
- `pkg/cloudbroker/disks` - для `Disks` - `pkg/cloudbroker/disks` - для `Disks`
- `pkg/cloudbroker/dpdknet` - для `DPDK` - `pkg/cloudbroker/dpdknet` - для `DPDK`
@ -334,10 +341,12 @@ func main() {
- `pkg/cloudbroker/sep` - для `SEP` - `pkg/cloudbroker/sep` - для `SEP`
- `pkg/cloudbroker/stack` - для `Stack` - `pkg/cloudbroker/stack` - для `Stack`
- `pkg/cloudbroker/tasks` - для `Tasks` - `pkg/cloudbroker/tasks` - для `Tasks`
- `pkg/cloudbroker/trunk` - для `Trunk`
- `pkg/cloudbroker/user` - для `User` - `pkg/cloudbroker/user` - для `User`
- `pkg/cloudbroker/vgpu` - для `VGPU` - `pkg/cloudbroker/vgpu` - для `VGPU`
- `pkg/cloudbroker/vfpool` - для `VFPool` - `pkg/cloudbroker/vfpool` - для `VFPool`
- `pkg/cloudbroker/vins` - для `VINS` - `pkg/cloudbroker/vins` - для `VINS`
- `pkg/cloudapi/zone` - для `Zone`
Все поля структуры имеют описание, в которых содержится: Все поля структуры имеют описание, в которых содержится:
@ -495,8 +504,10 @@ func main() {
- `.SEP()` - для работы с `SEP` - `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack` - `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks` - `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.VFPool()` - для работы с `VFPool` - `.VFPool()` - для работы с `VFPool`
- `.VINS()` - для работы с `VINS` - `.VINS()` - для работы с `VINS`
- `.Zone()` - для работы с `Zone`
Доступные методы для `.CloudBroker()`: Доступные методы для `.CloudBroker()`:
@ -504,6 +515,7 @@ func main() {
- `.Audit()` - для работы с `Audit` - `.Audit()` - для работы с `Audit`
- `.APIAccess()` - для работы с `APIAccess` - `.APIAccess()` - для работы с `APIAccess`
- `.Backup()` - для работы с `Backup` - `.Backup()` - для работы с `Backup`
- `.BService()` - для работы с `BService`
- `.Compute()` - для работы с `Compute` - `.Compute()` - для работы с `Compute`
- `.Disks()` - для работы с `Disks` - `.Disks()` - для работы с `Disks`
- `.DPDKNet()` - для работы с `DPDK` - `.DPDKNet()` - для работы с `DPDK`
@ -524,10 +536,12 @@ func main() {
- `.SEP()` - для работы с `SEP` - `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack` - `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks` - `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.User()` - для работы с `User` - `.User()` - для работы с `User`
- `.VGPU()` - для работы с `VGPU` - `.VGPU()` - для работы с `VGPU`
- `.VFPool()` - для работы с `VFPool` - `.VFPool()` - для работы с `VFPool`
- `.VINS()` - для работы с `VINS` - `.VINS()` - для работы с `VINS`
- `.Zone()` - для работы с `Zone`
3. Вызвать метод, отвечающий за выполнение запроса и передать в него: 3. Вызвать метод, отвечающий за выполнение запроса и передать в него:

@ -6,6 +6,7 @@ import (
"net/url" "net/url"
"reflect" "reflect"
"regexp" "regexp"
"strconv"
"strings" "strings"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
@ -414,6 +415,12 @@ func languageValidator(fe validator.FieldLevel) bool {
return IsInSlice(fieldValue, languageValues) 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 // sepTypeValidator is used to validate sepType fields
func sepTypeValidator(fe validator.FieldLevel) bool { func sepTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String() fieldValue := fe.Field().String()
@ -421,6 +428,13 @@ func sepTypeValidator(fe validator.FieldLevel) bool {
return IsInSlice(fieldValue, sepTypeValues) return IsInSlice(fieldValue, sepTypeValues)
} }
// deviceValidator is used to validate extnet device fields
func deviceValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, deviceValues)
}
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed. // ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement // It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error { func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
@ -442,3 +456,13 @@ func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
} }
return multierror.Join(errs...) return multierror.Join(errs...)
} }
// trunkTagsValidator checks if trunk_tags is in range from 1 to 4095
func trunkTagsValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
numFieldValue, err := strconv.ParseInt(fieldValue, 10, 64)
if err != nil {
return false
}
return uint64(numFieldValue) >= uint64(trunkTagsMin) && uint64(numFieldValue) <= uint64(trunkTagsMax)
}

@ -333,6 +333,25 @@ func errorMessage(fe validator.FieldError) string {
prefix, prefix,
fe.Field(), fe.Field(),
joinValues(sepTypeValues)) 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() return fe.Error()

@ -281,10 +281,25 @@ func registerAllValidators(validate *validator.Validate) error {
return err return err
} }
err = validate.RegisterValidation("userProvider", userProviderValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("sepType", sepTypeValidator) err = validate.RegisterValidation("sepType", sepTypeValidator)
if err != nil { if err != nil {
return err return err
} }
err = validate.RegisterValidation("device", deviceValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("trunkTags", trunkTagsValidator)
if err != nil {
return err
}
return nil return nil
} }

@ -17,17 +17,17 @@ var (
computeModeValues = []string{"EQ", "EN", "ANY"} computeModeValues = []string{"EQ", "EN", "ANY"}
computeDiskTypeValues = []string{"D", "B"} computeDiskTypeValues = []string{"D", "B"}
computeNetTypeValues = []string{"EXTNET", "VINS"} computeNetTypeValues = []string{"EXTNET", "VINS"}
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK"} computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "EMPTY", "TRUNK"}
computeOrderValues = []string{"cdrom", "network", "hd"} computeOrderValues = []string{"cdrom", "network", "hd"}
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"} computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"} computeDriverValues = []string{"KVM_X86"}
diskTypeValues = []string{"B", "T", "D"} diskTypeValues = []string{"B", "T", "D"}
flipgroupClientTypeValues = []string{"compute", "vins"} flipgroupClientTypeValues = []string{"compute", "vins"}
kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"} kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"}
kvmx86NetTypeValues = []string{"EXTNET", "VINS", "NONE", "VFNIC", "DPDK"} kvmx86NetTypeValues = []string{"EXTNET", "VINS", "EMPTY", "VFNIC", "DPDK", "SDN", "TRUNK"}
lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"} lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"}
@ -49,11 +49,11 @@ var (
interfaceStateValues = []string{"on", "off"} interfaceStateValues = []string{"on", "off"}
actionValues = []string{"power_on", "shutdown", "force_shutdown", "reboot"} actionValues = []string{"is_powered", "power_on", "shutdown", "force_shutdown", "reboot"}
vmActionValues = []string{"stop", "move"} vmActionValues = []string{"stop", "move"}
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"} computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}
networkInterfaceNamingValues = []string{"eth", "ens"} networkInterfaceNamingValues = []string{"eth", "ens"}
@ -72,10 +72,16 @@ var (
sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"} sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"}
languageValues = []string{"ru", "en"} languageValues = []string{"ru", "en"}
userProviders = []string{"bvs", "decs3o"}
deviceValues = []string{"primary", "secondary"}
) )
const ( const (
mtuMin = 1 mtuMin = 1
mtuMax = 9216 mtuMax = 9216
trunkTagsMin = 1
trunkTagsMax = 4095
) )

@ -19,18 +19,18 @@ type DeleteRequest struct {
} }
// Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed // Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed
func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) { func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudapi/account/delete" url := "/cloudapi/account/delete"
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {
return false, err return "", err
} }
return true, nil return string(result), nil
} }

@ -13,10 +13,6 @@ type DisableEnableRequest struct {
// ID of account // ID of account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` 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 // Disable disables an account

@ -165,6 +165,15 @@ type Machines struct {
Halted uint64 `json:"halted"` Halted uint64 `json:"halted"`
} }
// Detailed information about the account zone
type ZoneID struct {
// ID of zone
ID int64 `json:"id"`
// Name of zone
Name string `json:"name"`
}
// Main information about account // Main information about account
type RecordAccount struct { type RecordAccount struct {
// DCLocation // DCLocation
@ -253,6 +262,12 @@ type RecordAccount struct {
// VINSes // VINSes
VINSes uint64 `json:"vinses"` VINSes uint64 `json:"vinses"`
// Zone
ZoneIDs []ZoneID
// Zones
DefaultZoneID uint64 `json:"defaultZoneId"`
} }
// Main information about compute // Main information about compute

@ -3,6 +3,7 @@ package account
import ( import (
"context" "context"
"net/http" "net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
@ -14,18 +15,18 @@ type RestoreRequest struct {
} }
// Restore restores a deleted account // Restore restores a deleted account
func (a Account) Restore(ctx context.Context, req RestoreRequest) (bool, error) { func (a Account) Restore(ctx context.Context, req RestoreRequest) (string, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudapi/account/restore" url := "/cloudapi/account/restore"
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {
return false, err return "", err
} }
return true, nil return string(result), nil
} }

@ -54,6 +54,10 @@ type UpdateRequest struct {
// i.e.: ["sep1_poolName1", "sep2_poolName2", etc] // i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
// Required: false // Required: false
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"` UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
// Default zone ID
// Required: false
DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"`
} }
// Update updates an account name and resource types and limits // Update updates an account name and resource types and limits

@ -25,6 +25,10 @@ type CreateRequest struct {
// SSH key to deploy for the specified user. Same key will be deployed to all computes of the service // SSH key to deploy for the specified user. Same key will be deployed to all computes of the service
// Required: false // Required: false
SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"` SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
} }
// Create creates blank BasicService instance // Create creates blank BasicService instance

@ -16,6 +16,7 @@ type DeleteRequest struct {
// If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately // If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately
// Required: false // Required: false
// Default: false
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
} }

@ -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 // Whether user controlled
UserManaged bool `json:"userManaged"` UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// Main information about Compute // Main information about Compute
@ -382,6 +385,9 @@ type ItemBasicService struct {
// User Managed or not // User Managed or not
UserManaged bool `json:"userManaged"` UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// List of BasicServices // List of BasicServices

@ -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
}

@ -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
}

@ -27,7 +27,7 @@ func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error)
url := "/cloudapi/compute/getLog" 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 { if err != nil {
return "", err return "", err
} }

@ -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
}

@ -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
}

@ -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
}

@ -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
}

@ -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
}

@ -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 // Access Control List
type RecordACL struct { type RecordACL struct {
// Account ACL list // Account ACL list
AccountACL ListACL `json:"accountAcl"` AccountACL ListACL `json:"accountACL"`
// Compute ACL list // Compute ACL list
ComputeACL ListACL `json:"computeAcl"` ComputeACL ListACL `json:"computeACL"`
// Resource group ACL list // Resource group ACL list
RGACL ListACL `json:"rgAcl"` RGACL ListACL `json:"rgACL"`
} }
type ListUsers struct { type ListUsers struct {
@ -386,6 +386,9 @@ type RecordCompute struct {
// List interfaces // List interfaces
Interfaces ListInterfaces `json:"interfaces"` Interfaces ListInterfaces `json:"interfaces"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
// Loader type // Loader type
LoaderType string `json:"loaderType"` LoaderType string `json:"loaderType"`
@ -443,6 +446,9 @@ type RecordCompute struct {
// PreferredCPU // PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"` PreferredCPU []int64 `json:"preferredCpu"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Number of RAM // Number of RAM
RAM uint64 `json:"ram"` RAM uint64 `json:"ram"`
@ -505,6 +511,18 @@ type RecordCompute struct {
// VNC password // VNC password
VNCPassword string `json:"vncPasswd"` 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 { type VGPUItem struct {
@ -685,6 +703,9 @@ type ItemVNFInterface struct {
// QOS // QOS
QOS QOS `json:"qos"` QOS QOS `json:"qos"`
// SDN interface ID
SDNInterfaceID string `json:"sdn_interface_id"`
// Target // Target
Target string `json:"target"` Target string `json:"target"`
@ -770,9 +791,6 @@ type ItemComputeDisk struct {
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Order
Order uint64 `json:"order"`
// Params // Params
Params string `json:"params"` Params string `json:"params"`
@ -836,8 +854,8 @@ type ItemComputeDisk struct {
// Updated by // Updated by
UpdatedBy string `json:"updatedBy"` UpdatedBy string `json:"updatedBy"`
// Virtual machine ID // Zone ID
VMID uint64 `json:"vmid"` ZoneID uint64 `json:"zoneId"`
} }
type ItemReplication struct { type ItemReplication struct {
@ -1036,6 +1054,9 @@ type ItemCompute struct {
// List interfaces // List interfaces
Interfaces ListInterfaces `json:"interfaces"` Interfaces ListInterfaces `json:"interfaces"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
// Loader type // Loader type
LoaderType string `json:"loaderType"` LoaderType string `json:"loaderType"`
@ -1078,6 +1099,9 @@ type ItemCompute struct {
// Number of RAM // Number of RAM
RAM uint64 `json:"ram"` RAM uint64 `json:"ram"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Reference ID // Reference ID
ReferenceID string `json:"referenceId"` ReferenceID string `json:"referenceId"`

@ -19,6 +19,9 @@ type NetAttachRequest struct {
// 'VINS' for connect to ViNS // 'VINS' for connect to ViNS
// 'VFNIC' for connect to vfpool // 'VFNIC' for connect to vfpool
// 'DPDK' for connect to DPDK // 'DPDK' for connect to DPDK
// `EMPTY` for connect empty network
// `SDT` for connect to SDN
// `TRUNK` for connect to TRUNK
// Required: true // Required: true
NetType string `url:"netType" json:"netType" validate:"computex86NetType"` NetType string `url:"netType" json:"netType" validate:"computex86NetType"`
@ -36,9 +39,15 @@ type NetAttachRequest struct {
// Required: false // Required: false
MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"` MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"`
// Used only for DPDK type, must be 1-9216 // Used only for EXTNET and DPDK
// Required: false // 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"` 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 // NetAttach attaches network to compute and gets info about network

@ -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
}

@ -27,12 +27,6 @@ type FromPlatformDiskRequest struct {
// Required: true // Required: true
ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"` 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 // Username for the image
// Required: false // Required: false
Username string `url:"username,omitempty" json:"username,omitempty"` Username string `url:"username,omitempty" json:"username,omitempty"`

@ -193,14 +193,17 @@ type RecordExtNet struct {
// Milestones // Milestones
Milestones uint64 `json:"milestones"` Milestones uint64 `json:"milestones"`
// MTU
MTU uint64 `json:"mtu"`
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Network // Network
Network string `json:"network"` Network string `json:"network"`
// Network ID // Network IDs
NetworkID uint64 `json:"networkId"` NetworkIDs NetworkIDs `json:"networkIds"`
// NTP // NTP
NTP []string `json:"ntp"` NTP []string `json:"ntp"`
@ -217,9 +220,18 @@ type RecordExtNet struct {
// PriVNFDevID // PriVNFDevID
PriVNFDevID uint64 `json:"priVnfDevId"` PriVNFDevID uint64 `json:"priVnfDevId"`
// Redundant
Redundant bool `json:"redundant"`
// SecVnfDevId
SecVNFDevID uint64 `json:"secVnfDevId"`
// List reservations // List reservations
Reservations ListReservations `json:"reservations"` Reservations ListReservations `json:"reservations"`
// List pre-reservations
PreReservations ListReservations `json:"pre-reservations"`
// Shared with // Shared with
SharedWith []uint64 `json:"sharedWith"` SharedWith []uint64 `json:"sharedWith"`
@ -231,6 +243,17 @@ type RecordExtNet struct {
// VNFs // VNFs
VNFs VNFs `json:"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 // Detailed information about reserved address or address pool

@ -32,8 +32,9 @@ type CreateRequest struct {
// Type of client // Type of client
// - 'compute' // - 'compute'
// - 'vins' (will be later) // - 'vins' (will be later)
// Required: true // Required: false
ClientType string `url:"clientType" json:"clientType" validate:"flipgroupClientType"` // 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 // IP address to associate with this group. If empty, the platform will autoselect IP address
// Required: false // Required: false

@ -2,6 +2,7 @@ package image
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@ -69,18 +70,17 @@ type CreateRequest struct {
// Required: false // Required: false
Pool string `url:"poolName,omitempty" json:"poolName,omitempty"` 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 // List of types of compute suitable for image
// Example: [ "KVM_X86" ] // Example: [ "KVM_X86" ]
// Required: true // Required: true
Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"` 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 // Create creates image from a media identified by URL
func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) { func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@ -102,3 +102,29 @@ func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) {
return result, nil 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 // Required: false
Status string `url:"status,omitempty" json:"status,omitempty"` Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by architecture
// Required: false
Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"`
// Find by type // Find by type
// Required: false // Required: false
TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"` TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"`

@ -166,6 +166,10 @@ type CreateRequest struct {
// Type of the emulated system, Q35 or i440fx // Type of the emulated system, Q35 or i440fx
// Required: false // Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"` 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 // GetRAM returns RAM field values

@ -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 // With LB
WithLB bool `json:"withLB"` WithLB bool `json:"withLB"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// Detailed information about address of the Virtual Internet Protocol // Detailed information about address of the Virtual Internet Protocol
@ -305,6 +308,9 @@ type ItemK8SCluster struct {
// List workers group // List workers group
WorkersGroup ListK8SGroups `json:"workersGroups"` WorkersGroup ListK8SGroups `json:"workersGroups"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// Information about service account // Information about service account

@ -16,6 +16,9 @@ type Interface struct {
// - EXTNET // - EXTNET
// - VFNIC // - VFNIC
// - DPDK // - DPDK
// - EMPTY
// - SDN
// - TRUNK
NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"` NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"`
// Network ID for connect to, // 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 // MAC address to assign to this VM when connecting to the specified network
// Required: false // Required: false
MAC string `url:"mac,omitempty" json:"mac,omitempty" validate:"omitempty"` 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 // DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
@ -172,6 +179,10 @@ type CreateRequest struct {
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False // Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false // Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"` 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 // GetRAM returns RAM field values

@ -88,6 +88,10 @@ type CreateBlankRequest struct {
// Does this machine supports hot resize // Does this machine supports hot resize
// Required: false // Required: false
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"` 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 // GetRAM returns RAM field values

@ -38,12 +38,16 @@ type CreateRequest struct {
HighlyAvailable bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"` HighlyAvailable bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"`
// Start now Load balancer // Start now Load balancer
// Required: false // Required: true
Start bool `url:"start" json:"start"` Start bool `url:"start" json:"start" validate:"required"`
// Text description of this load balancer // Text description of this load balancer
// Required: false // Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"` Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
} }
type wrapperCreateRequest struct { type wrapperCreateRequest struct {

@ -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 // Access Control List
ACL interface{} `json:"acl"` ACL interface{} `json:"acl"`
//Account ID
AccountID uint64 `json:"accountId"`
// BackendHAIP // BackendHAIP
BackendHAIP string `json:"backendHAIP"` BackendHAIP string `json:"backendHAIP"`
@ -84,7 +87,7 @@ type RecordLB struct {
Status string `json:"status"` Status string `json:"status"`
// Sysctl Params // Sysctl Params
SysctlParams interface{} `json:"sysctlParams"` SysctlParams map[string]string `json:"sysctlParams"`
// Tech status // Tech status
TechStatus string `json:"techStatus"` TechStatus string `json:"techStatus"`
@ -100,6 +103,9 @@ type RecordLB struct {
// VINS ID // VINS ID
VINSID uint64 `json:"vinsId"` VINSID uint64 `json:"vinsId"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// Main information about load balancer // Main information about load balancer

@ -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
Name string `json:"name"` Name string `json:"name"`
// Network Modes
NetworkModes []string `json:"network_modes"`
// Flag // Flag
Flag string `json:"flag"` Flag string `json:"flag"`

@ -71,6 +71,10 @@ type CreateRequest struct {
// External IP address // External IP address
// Required: false // Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"` 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 // Create creates resource group

@ -134,6 +134,9 @@ type RecordResourceGroup struct {
// List of resource types // List of resource types
ResTypes []string `json:"resourceTypes"` ResTypes []string `json:"resourceTypes"`
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
// Secret // Secret
Secret string `json:"secret"` Secret string `json:"secret"`
@ -227,6 +230,9 @@ type ItemResourceGroup struct {
// List of resource types // List of resource types
ResTypes []string `json:"resourceTypes"` ResTypes []string `json:"resourceTypes"`
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
// Secret // Secret
Secret string `json:"secret"` Secret string `json:"secret"`

@ -46,9 +46,6 @@ type RecordAsyncTask struct {
// Detailed information about task // Detailed information about task
type ItemAsyncTask struct { type ItemAsyncTask struct {
RecordAsyncTask RecordAsyncTask
// GUID
GUID string `json:"guid"`
} }
// List of tasks // List of tasks

@ -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)
}

@ -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
}

@ -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
}

@ -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"`
}

@ -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 // List of static routes, each item must have destination, netmask, and gateway fields
// Required: false // Required: false
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
} }
type wrapperCreateRequestInAcc struct { type wrapperCreateRequestInAcc struct {

@ -47,6 +47,10 @@ type CreateInRGRequest struct {
// List of static routes, each item must have destination, netmask, and gateway fields // List of static routes, each item must have destination, netmask, and gateway fields
// Required: false // Required: false
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
} }
type wrapperCreateRequestInRG struct { type wrapperCreateRequestInRG struct {

@ -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
NodeID int64 `json:"nodeId"` NodeID int64 `json:"nodeId"`
// SDNInterfaceID
SDNInterfaceID string `json:"sdn_interface_id"`
// PCI slot // PCI slot
PCISlot int64 `json:"pciSlot"` PCISlot int64 `json:"pciSlot"`
@ -732,6 +735,9 @@ type RecordVINS struct {
// VXLAN ID // VXLAN ID
VXLANID uint64 `json:"vxlanId"` VXLANID uint64 `json:"vxlanId"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// Information about libvirt settings // Information about libvirt settings

@ -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)
}

@ -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]
}

@ -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))
}
}

@ -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
}

@ -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
}

@ -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
}

@ -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"`
}

@ -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)
}

@ -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,
}
}

@ -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"` UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
// Advanced compute features, // Advanced compute features,
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk
// Required: false // Required: false
ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"` 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 // Create creates account

@ -20,25 +20,21 @@ type DeleteRequest struct {
// Name of account // Name of account
// Required: false // Required: false
Name string `url:"name,omitempty" json:"name,omitempty"` Name string `url:"name,omitempty" json:"name,omitempty"`
// Reason of deleting
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
} }
// Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed // Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed
func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) { func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudbroker/account/delete" 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 { 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 // 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) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudbroker/account/deleteAccounts" 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 { 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 // ID of account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` 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 // Disable disables an account

@ -12,25 +12,21 @@ type DisableAccountsRequest struct {
// IDs of accounts // IDs of accounts
// Required: true // Required: true
AccountIDs []uint64 `url:"accountIds" json:"accountIds" validate:"min=1"` 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 // 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) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudbroker/account/disableAccounts" 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 { 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 // 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) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudbroker/account/enableAccounts" 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 { if err != nil {
return false, err return "", err
} }
return true, nil return string(res), nil
} }

@ -9,16 +9,6 @@ var accounts = ListAccounts{
{ {
Meta: []interface{}{}, Meta: []interface{}{},
InfoAccount: InfoAccount{ InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "not_really_timofey_tkachev_1@decs3o",
},
},
CreatedTime: 1676878820, CreatedTime: 1676878820,
DeletedTime: 0, DeletedTime: 0,
ID: 132847, ID: 132847,
@ -26,20 +16,20 @@ var accounts = ListAccounts{
Status: "CONFIRMED", Status: "CONFIRMED",
UpdatedTime: 1676645275, UpdatedTime: 1676645275,
}, },
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "not_really_timofey_tkachev_1@decs3o",
},
},
}, },
{ {
Meta: []interface{}{}, Meta: []interface{}{},
InfoAccount: InfoAccount{ InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
},
CreatedTime: 1676645275, CreatedTime: 1676645275,
DeletedTime: 1677723401, DeletedTime: 1677723401,
ID: 132846, ID: 132846,
@ -47,28 +37,20 @@ var accounts = ListAccounts{
Status: "DELETED", Status: "DELETED",
UpdatedTime: 1676645275, UpdatedTime: 1676645275,
}, },
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
},
}, },
{ {
Meta: []interface{}{}, Meta: []interface{}{},
InfoAccount: InfoAccount{ 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, CreatedTime: 1676883850,
DeletedTime: 1676883899, DeletedTime: 1676883899,
ID: 132848, ID: 132848,
@ -76,6 +58,24 @@ var accounts = ListAccounts{
Status: "DELETED", Status: "DELETED",
UpdatedTime: 1676878820, 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, EntryCount: 3,

@ -102,6 +102,15 @@ type ACL struct {
UserGroupID string `json:"userGroupId"` UserGroupID string `json:"userGroupId"`
} }
// Access Control List with emails field
type ACLWithEmails struct {
// ACL
ACL
// Emails
Emails []string `json:"emails"`
}
// Resource limits // Resource limits
type ResourceLimits struct { type ResourceLimits struct {
// CuC // CuC
@ -134,9 +143,6 @@ type InfoAccount struct {
// CKey // CKey
CKey string `json:"_ckey"` CKey string `json:"_ckey"`
// Access Control List
ACL []ACL `json:"acl"`
// Company // Company
Company string `json:"company"` Company string `json:"company"`
@ -205,12 +211,30 @@ type InfoAccount struct {
// List of VINS IDs // List of VINS IDs
VINS []uint64 `json:"vins"` 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 // Deatailed information about account
type RecordAccount struct { type RecordAccount struct {
// Main information about account // Main information about account
InfoAccount InfoAccount
// Access Control List
ACL []ACLWithEmails `json:"acl"`
// Zones IDs
ZoneIDs []ZoneID
} }
// More information about account // More information about account
@ -218,8 +242,14 @@ type ItemAccount struct {
// Meta // Meta
Meta []interface{} `json:"_meta"` Meta []interface{} `json:"_meta"`
// Access Control List
ACL []ACL `json:"acl"`
// Main information about account // Main information about account
InfoAccount InfoAccount
// Zones
ZoneIDs []uint64
} }
// List of accounts // List of accounts

@ -0,0 +1,42 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// RemoveZoneRequest struct for removing zone from account for a user
type RemoveZoneRequest 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"`
}
// RemoveZone removes zones with ids provided from a user.
func (a Account) RemoveZone(ctx context.Context, req RemoveZoneRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/account/removeZone"
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
}

@ -12,25 +12,21 @@ type RestoreRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Reason of disabling
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
} }
// Restore restores a deleted account // Restore restores a deleted account
func (a Account) Restore(ctx context.Context, req RestoreRequest) (bool, error) { func (a Account) Restore(ctx context.Context, req RestoreRequest) (string, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err)) return "", validators.ValidationErrors(validators.GetErrors(err))
} }
url := "/cloudbroker/account/restore" url := "/cloudbroker/account/restore"
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {
return false, err return "", err
} }
return true, nil return string(result), nil
} }

@ -59,6 +59,10 @@ type UpdateRequest struct {
// Default: false // Default: false
// Required: false // Required: false
ClearUniqPools bool `url:"clearUniqPools" json:"clearUniqPools"` ClearUniqPools bool `url:"clearUniqPools" json:"clearUniqPools"`
// Default zone ID
// Required: false
DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"`
} }
// Update updates an account name and resource types and limits // Update updates an account name and resource types and limits

@ -15,7 +15,7 @@ type UpdateComputeFeaturesRequest struct {
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Advanced compute features, // Advanced compute features,
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk
// Required: false // Required: false
ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"` ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"`
} }

@ -25,6 +25,10 @@ type CreateRequest struct {
// SSH key to deploy for the specified user. Same key will be deployed to all computes of the service // SSH key to deploy for the specified user. Same key will be deployed to all computes of the service
// Required: false // Required: false
SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"` SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
} }
// Create creates blank BasicService instance // Create creates blank BasicService instance

@ -15,8 +15,9 @@ type DeleteRequest struct {
ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"` ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"`
// If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately // If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately
// Required: true // Required: false
Permanently bool `url:"permanently" json:"permanently"` // Default: false
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
} }
// Delete deletes BasicService instance // Delete deletes BasicService instance

@ -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 := "/cloudbroker/bservice/migrateToZone"
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

@ -88,6 +88,9 @@ type RecordBasicService struct {
// Whether user controlled // Whether user controlled
UserManaged bool `json:"userManaged"` UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// List of Groups // List of Groups
@ -254,6 +257,9 @@ type ItemBasicService struct {
// User Managed or not // User Managed or not
UserManaged bool `json:"userManaged"` UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// List of Snapshots // List of Snapshots

@ -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 := "/cloudbroker/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
}

@ -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 := "/cloudbroker/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
}

@ -27,7 +27,7 @@ func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error)
url := "/cloudbroker/compute/getLog" url := "/cloudbroker/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 { if err != nil {
return "", err return "", err
} }

@ -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 := "/cloudbroker/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
}

@ -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 := "/cloudbroker/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
}

@ -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 := "/cloudbroker/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
}

@ -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 := "/cloudbroker/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
}

@ -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 := "/cloudbroker/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
}

@ -2,6 +2,7 @@ package compute
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@ -24,6 +25,11 @@ type MigrateRequest struct {
Force bool `url:"force,omitempty" json:"force,omitempty"` Force bool `url:"force,omitempty" json:"force,omitempty"`
} }
type asyncWrapperMigrateRequest struct {
MigrateRequest
SyncMode bool `url:"sync"`
}
// Migrate migrates compute to another stack // Migrate migrates compute to another stack
func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) { func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@ -33,7 +39,9 @@ func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error)
url := "/cloudbroker/compute/migrate" url := "/cloudbroker/compute/migrate"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) syncReq := asyncWrapperMigrateRequest{MigrateRequest: req, SyncMode: true}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, syncReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@ -45,3 +53,29 @@ func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error)
return result, nil return result, nil
} }
// AsyncMigrate migrates compute to another stack in async mode
func (c Compute) AsyncMigrate(ctx context.Context, req MigrateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate"
asyncReq := asyncWrapperMigrateRequest{MigrateRequest: req, SyncMode: false}
res, err := c.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
}

@ -0,0 +1,42 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateToZone 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"`
}
// MoveToZone moves compute to new zone
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 := "/cloudbroker/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
}

@ -44,7 +44,7 @@ type ItemACL struct {
// ACL compute information // ACL compute information
type ItemComputeACL struct { type ItemComputeACL struct {
// Explicit // Explicit
Explicit string `json:"explicit"` Explicit bool `json:"explicit"`
// GUID // GUID
GUID string `json:"guid"` GUID string `json:"guid"`
@ -412,9 +412,6 @@ type ItemDisk struct {
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Order
Order uint64 `json:"order"`
// Params // Params
Params string `json:"params"` Params string `json:"params"`
@ -486,9 +483,6 @@ type ItemDisk struct {
// Updated by // Updated by
UpdatedBy string `json:"updatedBy"` UpdatedBy string `json:"updatedBy"`
// Virtual machine ID
VMID uint64 `json:"vmid"`
} }
type ItemReplication struct { type ItemReplication struct {
@ -573,6 +567,9 @@ type ItemInterface struct {
// QOS // QOS
QOS QOS `json:"qos"` QOS QOS `json:"qos"`
// SDN interface ID
SDNInterfaceID string `json:"sdn_interface_id"`
// Target // Target
Target string `json:"target"` Target string `json:"target"`
@ -708,6 +705,9 @@ type InfoCompute struct {
// List interfaces // List interfaces
Interfaces ListInterfaces `json:"interfaces"` Interfaces ListInterfaces `json:"interfaces"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
// Loader type // Loader type
LoaderType string `json:"loaderType"` LoaderType string `json:"loaderType"`
@ -750,6 +750,9 @@ type InfoCompute struct {
// PreferredCPU // PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"` PreferredCPU []int64 `json:"preferredCpu"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Number of RAM // Number of RAM
RAM uint64 `json:"ram"` RAM uint64 `json:"ram"`
@ -818,6 +821,17 @@ type InfoCompute struct {
// Virtual image ID // Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"` VirtualImageID uint64 `json:"virtualImageId"`
// Zone ID
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"`
} }
// Information about libvirt settings // Information about libvirt settings
@ -954,6 +968,9 @@ type RecordCompute struct {
// List interfaces // List interfaces
Interfaces ListInterfaces `json:"interfaces"` Interfaces ListInterfaces `json:"interfaces"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
// Loader type // Loader type
LoaderType string `json:"loaderType"` LoaderType string `json:"loaderType"`
@ -1014,6 +1031,9 @@ type RecordCompute struct {
// PreferredCPU // PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"` PreferredCPU []int64 `json:"preferredCpu"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Number of RAM // Number of RAM
RAM uint64 `json:"ram"` RAM uint64 `json:"ram"`
@ -1085,6 +1105,9 @@ type RecordCompute struct {
// VNC password // VNC password
VNCPassword string `json:"vncPasswd"` VNCPassword string `json:"vncPasswd"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
type VGPUItem struct { type VGPUItem struct {

@ -19,6 +19,9 @@ type NetAttachRequest struct {
// 'VINS' for connect to ViNS // 'VINS' for connect to ViNS
// 'VFNIC' for connect to vfpool // 'VFNIC' for connect to vfpool
// 'DPDK' for connect to DPDK // 'DPDK' for connect to DPDK
// `EMPTY` for connect empty network
// `SDT` for connect to SDN
// `TRUNK` for connect to TRUNK
// Required: true // Required: true
NetType string `url:"netType" json:"netType" validate:"computex86NetType"` NetType string `url:"netType" json:"netType" validate:"computex86NetType"`
@ -36,9 +39,15 @@ type NetAttachRequest struct {
// Required: false // Required: false
MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"` MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"`
// Used only for DPDK type, must be 1-9216 // Used only for EXTNET and DPDK
// Required: false // 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"` 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 // NetAttach attaches network to compute and gets info about network

@ -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 := "/cloudbroker/compute/shared_snapshot_merge_status"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {
return "", err
}
return string(res), nil
}

@ -27,12 +27,6 @@ type FromPlatformDiskRequest struct {
// Required: true // Required: true
ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"` 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 // Username for the image
// Required: false // Required: false
Username string `url:"username,omitempty" json:"username,omitempty"` Username string `url:"username,omitempty" json:"username,omitempty"`

@ -47,6 +47,11 @@ type CreateRequest struct {
// Required: false // Required: false
DNS []string `url:"dns,omitempty" json:"dns,omitempty"` DNS []string `url:"dns,omitempty" json:"dns,omitempty"`
// Maximum transmission unit
// Default: 1500
// Required: false
MTU uint `url:"mtu,omitempty" json:"mtu,omitempty"`
// List of NTP addresses // List of NTP addresses
// Required: false // Required: false
NTP []string `url:"ntp,omitempty" json:"ntp,omitempty"` NTP []string `url:"ntp,omitempty" json:"ntp,omitempty"`
@ -71,9 +76,13 @@ type CreateRequest struct {
// Required: false // Required: false
EndIP string `url:"endIP,omitempty" json:"endIP,omitempty"` EndIP string `url:"endIP,omitempty" json:"endIP,omitempty"`
// IP to create VNFDev with // IP to create primary vnfdev with
// Required: false
PriVNFDevIP string `url:"priVnfdevIP,omitempty" json:"priVnfdevIP,omitempty"`
// IP to create secondary vnfdev with
// Required: false // Required: false
VNFDevIP string `url:"vnfdevIP,omitempty" json:"vnfdevIP,omitempty"` SecVNFDevIP string `url:"secVnfdevIP,omitempty" json:"secVnfdevIP,omitempty"`
// Number of pre created reservations // Number of pre created reservations
// Required: false // Required: false
@ -86,6 +95,15 @@ type CreateRequest struct {
// List of static routes, each item must have destination, netmask, and gateway fields // List of static routes, each item must have destination, netmask, and gateway fields
// Required: false // Required: false
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
// High Availability mode is enabled, default False
// Required: false
// Default: false
HAMode bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"`
} }
type wrapperCreateRequest struct { type wrapperCreateRequest struct {

@ -17,6 +17,11 @@ type DeviceMigrateRequest struct {
// Target stack ID to migrate to // Target stack ID to migrate to
// Required: false // Required: false
StackID uint64 `url:"stackId,omitempty" json:"stackId,omitempty"` StackID uint64 `url:"stackId,omitempty" json:"stackId,omitempty"`
// Target device to migrate
// Required: false
// Default: primary
Device string `url:"device,omitempty" json:"device,omitempty" validate:"omitempty,device"`
} }
// DeviceMigrate migrates external network VNF device // DeviceMigrate migrates external network VNF device

@ -18,7 +18,7 @@ var extnets = ListExtNet{
IPCIDR: "176.118.164.0/24", IPCIDR: "176.118.164.0/24",
Milestones: 1355466, Milestones: 1355466,
Name: "176.118.164.0/24", Name: "176.118.164.0/24",
NetworkID: 0, NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0},
OVSBridge: "", OVSBridge: "",
PreReservationsNum: 0, PreReservationsNum: 0,
PriVNFDevID: 0, PriVNFDevID: 0,
@ -41,7 +41,7 @@ var extnets = ListExtNet{
IPCIDR: "45.134.255.0/24", IPCIDR: "45.134.255.0/24",
Milestones: 2135543, Milestones: 2135543,
Name: "45.134.255.0/24", Name: "45.134.255.0/24",
NetworkID: 0, NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0},
OVSBridge: "", OVSBridge: "",
PreReservationsNum: 0, PreReservationsNum: 0,
PriVNFDevID: 0, PriVNFDevID: 0,
@ -64,7 +64,7 @@ var extnets = ListExtNet{
IPCIDR: "88.218.249.0/24", IPCIDR: "88.218.249.0/24",
Milestones: 1232134, Milestones: 1232134,
Name: "88.218.249.0/24", Name: "88.218.249.0/24",
NetworkID: 0, NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0},
OVSBridge: "", OVSBridge: "",
PreReservationsNum: 0, PreReservationsNum: 0,
PriVNFDevID: 0, PriVNFDevID: 0,

@ -0,0 +1,42 @@
package extnet
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateToZone struct to move extnet to another zone
type MigrateToZoneRequest struct {
// ID of external network
// Required: true
NetID 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"`
}
// MoveToZone moves extnet to new zone
func (e ExtNet) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/extnet/migrateToZone"
res, err := e.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
}

@ -91,11 +91,14 @@ type ItemExtNet struct {
// Milestones // Milestones
Milestones uint64 `json:"milestones"` Milestones uint64 `json:"milestones"`
// MTU
MTU uint64 `json:"mtu"`
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Network ID // Network IDs
NetworkID uint64 `json:"networkId"` NetworkIDs NetworkIDs `json:"networkIds"`
// OVSBridge // OVSBridge
OVSBridge string `json:"ovsBridge"` OVSBridge string `json:"ovsBridge"`
@ -106,6 +109,12 @@ type ItemExtNet struct {
// PriVNFDevID // PriVNFDevID
PriVNFDevID uint64 `json:"priVnfDevId"` PriVNFDevID uint64 `json:"priVnfDevId"`
// Redundant
Redundant bool `json:"redundant"`
// SecVnfDevId
SecVNFDevID uint64 `json:"secVnfDevId"`
// List of shared with // List of shared with
SharedWith []interface{} `json:"sharedWith"` SharedWith []interface{} `json:"sharedWith"`
@ -117,6 +126,9 @@ type ItemExtNet struct {
// VNFs // VNFs
VNFs VNFs `json:"vnfs"` VNFs VNFs `json:"vnfs"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
} }
// List external networks // List external networks
@ -175,14 +187,17 @@ type RecordExtNet struct {
// Milestones // Milestones
Milestones uint64 `json:"milestones"` Milestones uint64 `json:"milestones"`
// MTU
MTU uint64 `json:"mtu"`
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Network // Network
Network string `json:"network"` Network string `json:"network"`
// Network ID // Network IDs
NetworkID uint64 `json:"networkId"` NetworkIDs NetworkIDs `json:"networkIds"`
// NTP // NTP
NTP []string `json:"ntp"` NTP []string `json:"ntp"`
@ -199,9 +214,18 @@ type RecordExtNet struct {
// PriVNFDevID // PriVNFDevID
PriVNFDevID uint64 `json:"priVnfDevId"` PriVNFDevID uint64 `json:"priVnfDevId"`
// Redundant
Redundant bool `json:"redundant"`
// SecVnfDevId
SecVNFDevID uint64 `json:"secVnfDevId"`
// List reservations // List reservations
Reservations ListReservations `json:"reservations"` Reservations ListReservations `json:"reservations"`
// List pre-reservations
PreReservations ListReservations `json:"pre-reservations"`
// List of shared with // List of shared with
SharedWith []interface{} `json:"sharedWith"` SharedWith []interface{} `json:"sharedWith"`
@ -213,6 +237,17 @@ type RecordExtNet struct {
// VNFs // VNFs
VNFs VNFs `json:"vnfs"` VNFs VNFs `json:"vnfs"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
type NetworkIDs struct {
// Primary
Primary uint64 `json:"primary"`
// Secondary
Secondary uint64 `json:"secondary"`
} }
// List of static routes // List of static routes

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save