diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ea2fd..db942e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,225 @@ -## Version 1.11.6 +## Version 1.12.0 ### Удалено -#### Account +#### account | Идентификатор
задачи | Описание | | --- | --- | -| 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 | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-552 | Метод `UploadImageFile` в cloudbroker/image | \ No newline at end of file +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-549 | Поля `NetworkModes`, `SDNSupport` в структуры ответа `ItemGridList` и `RecordGrid` в cloudbroker/grid | + +#### image +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-481 | Метод `AsyncCreate` в cloudapi/image | + +#### k8s +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-466 | Опциональное поле `ZoneID` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 | + +#### lb +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-546 | Поле `NetworkModes` в структуре ответа `ItemLocation` в cloudapi/locations | +| BGOS-546 | Метод `ListGet` в cloudapi/locations | + +#### node +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-484 | Новое значение `is_powered` в поле `action` в структуре запроса `ApplyIpmiActionRequest` в cloudbroker/node | +| BGOS-547 | Поля `SDNHypervisorName` и `ZoneID` в структуру ответа `ItemNode` и поле `ZoneID` в структуру ответа `RecordNode` в cloudbroker/node | + +#### rg +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-527 | Группа ручек `trunk` в cloudapi и в cloudbroker | + +#### vins +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-435 | Добавлена группа ручек zone в cloudapi и в cloudbroker | + +#### user +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-494 | Опциональное поле `Provider` в структурe запроса `CreateRequest` в cloudbroker/user | +| BGOS-526 | Опциональное поле `Email` в структуру запроса `ListRequest` в cloudbroker/user | +| BGOS-502 | Поле `Blocked` в структуру ответа `ItemUser`, методы `Block` и `Unblock` и структуры запроса `BlockRequest` и `UnblockRequest` в cloudbroker/user | + +### Исправлено + +#### account +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-512 | Исправлено возвращаемое значение с bool на string в методах `Delete` и `Restore` в cloudapi/account и в методах `Delete`, `Restore`, `DeleteAccounts`, `DisableAccounts` и `EnableAccounts` в cloudbroker/account | + +#### bservice +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-483 | Изменен тип параметра `Permanently` на опциональный в структуре `DeleteRequest` в cloudbroker/bservice | + +#### compute +| Идентификатор
задачи | Описание | +| --- | --- | +| 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 +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-468 | Исправлен тип поля `UpdatedBy` c uint64 на string в структурах ответа `ItemComputeDisk` в cloudapi/compute и `ItemDisk` в cloudbroker/compute | + +#### extnet +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-548 | В структурах ответа `RecordExtNet` в cloudapi/extnet и cloudbroker/extnet и `ItemExtNet` в cloudbroker/extnet поле `networkID` заменено на поле `networkIDs` | + +#### flipgroup +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-482 | Изменен тип параметра `ClientType` на опциональный в структуре `CreateRequest` в cloudapi/bservice и cloudbroker/bservice | + +#### image +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-481 | Метод `SyncCreate` заменен на метод `AsyncCreateImage` со структурой запроса `CreateRequest` в cloudbroker/image | + +#### lb +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-538 | Изменен тип поля `SysctlParams` в структурах ответа `RecordLB` и `ItemLBList` в cloudapi/lb и cloudbroker/lb | + +#### rg +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-540 | Тип возвращаемого значения методов `MassEnable`, `MassDisable`, `MassDelete` с bool на string в cloudbroker/rg | + +### Удалено + +#### account +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-541 | Опциональное поле `Reason` в структуре запроса `DisableEnableRequest` в cloudapi/account | +| BGOS-541 | Опциональное поле `Reason` в структурах запроса `DeleteRequest`, `DisableRequest`, `DisableAccountsRequest`, `RestoreRequest` в cloudbroker/account | + +#### compute +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-536 | Поля `Order` и `VMID` в структуре ответа `ItemComputeDisk` в cloudapi/compute и в структуре ответа `ItemDisk` в cloudbroker/compute | +| BGOS-551 | Значение `SVA_KVM_X86` в поле `Driver` в структурах запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/compute | + +#### disks +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-480 | Опциональное поле `Architecture` в структурах запроса `FromPlatformDiskRequest` в cloudapi/disks и в cloudbroker/disks | + +#### extnet +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-531 | Опциональное поле `VNFDevIP` в структуре запроса `CreateRequest` в cloudbroker/extnet | + +#### image +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-480 | Опциональное поле `Architecture` в структурах запроса `CreateRequest`, `ListRequest` в cloudapi/image и `CreateRequest`, `ListRequest`, `CreateCDROMImageRequest` в cloudbroker/image | +| BGOS-489 | Поле `Meta` в структуре ответа `ItemListStacks` в cloudbroker/image | + +#### tasks +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-500 | Опциональное поле `GUID` в структурах ответа `ItemAsyncTask` в cloudapi/tasks и `ItemTask` в cloudbroker/tasks | + +#### user +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-494 | Опциональное поле `Groups` в структурe запроса `CreateRequest` в cloudbroker/user | + diff --git a/README.md b/README.md index 69e0a3a..2da08e6 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Decort SDK - это библиотека, написанная на языке G - Версия 1.9.х Decort-SDK соответствует 4.1.0 версии платформы - Версия 1.10.х Decort-SDK соответствует 4.2.0 версии платформы - Версия 1.11.х Decort-SDK соответствует 4.3.0 версии платформы + - Версия 1.12.х Decort-SDK соответствует 4.4.0 версии платформы ## Оглавление @@ -122,7 +123,8 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `Stack` - получение информации о вычислительных узлах; - `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера); - `VFPool` - управление пулом виртуальных сетевых функций; -- `VINS` - управление виртуальными изолированными сетями. +- `VINS` - управление виртуальными изолированными сетями; +- `Zone` - управление зонами. ### Cloudbroker @@ -133,6 +135,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `Audit` - получение информации о событиях системы; - `APIAccess` - управление доступом к API и его объектам; - `Backup` - управление резервным копированием; +- `BService` - управление группами виртуальных машин (computes); - `Compute` - управление виртуальными машинами (индивидуально); - `Disks` - управление виртуальными дисками; - `DPDK` - управление виртуальными сетями DPDK; @@ -157,6 +160,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `VGPU` - управление виртуальными графическими процессорами; - `VFPool` - управление пулом виртуальных сетевых функций; - `VINS` - управление виртуальными изолированными сетями. +- `Zone` - управление зонами. ## Работа с библиотекой @@ -307,13 +311,16 @@ func main() { - `pkg/cloudapi/sep` - для `SEP` - `pkg/cloudapi/stack` - для `Stack` - `pkg/cloudapi/tasks` - для `Tasks` + - `pkg/cloudapi/trunk` - для `Trunk` - `pkg/cloudapi/vfpool` - для `VFPool` - `pkg/cloudapi/vins` - для `VINS` + - `pkg/cloudapi/zone` - для `Zone` - **cloudbroker**: - `pkg/cloudbroker/account` - для `Account` - `pkg/cloudbroker/audit` - для `Audit` - `pkg/cloudbroker/apiaccess` - для `APIAccess` - `pkg/cloudbroker/backup` - для `Backup` + - `pkg/cloudbroker/bservice` - для `Basic Service` - `pkg/cloudbroker/compute` - для `Compute` - `pkg/cloudbroker/disks` - для `Disks` - `pkg/cloudbroker/dpdknet` - для `DPDK` @@ -334,10 +341,12 @@ func main() { - `pkg/cloudbroker/sep` - для `SEP` - `pkg/cloudbroker/stack` - для `Stack` - `pkg/cloudbroker/tasks` - для `Tasks` + - `pkg/cloudbroker/trunk` - для `Trunk` - `pkg/cloudbroker/user` - для `User` - `pkg/cloudbroker/vgpu` - для `VGPU` - `pkg/cloudbroker/vfpool` - для `VFPool` - `pkg/cloudbroker/vins` - для `VINS` + - `pkg/cloudapi/zone` - для `Zone` Все поля структуры имеют описание, в которых содержится: @@ -495,8 +504,10 @@ func main() { - `.SEP()` - для работы с `SEP` - `.Stack()` - для работы с `Stack` - `.Tasks()` - для работы с `Tasks` + - `.Trunk()` - для работы с `Trunk` - `.VFPool()` - для работы с `VFPool` - `.VINS()` - для работы с `VINS` + - `.Zone()` - для работы с `Zone` Доступные методы для `.CloudBroker()`: @@ -504,6 +515,7 @@ func main() { - `.Audit()` - для работы с `Audit` - `.APIAccess()` - для работы с `APIAccess` - `.Backup()` - для работы с `Backup` + - `.BService()` - для работы с `BService` - `.Compute()` - для работы с `Compute` - `.Disks()` - для работы с `Disks` - `.DPDKNet()` - для работы с `DPDK` @@ -524,10 +536,12 @@ func main() { - `.SEP()` - для работы с `SEP` - `.Stack()` - для работы с `Stack` - `.Tasks()` - для работы с `Tasks` + - `.Trunk()` - для работы с `Trunk` - `.User()` - для работы с `User` - `.VGPU()` - для работы с `VGPU` - `.VFPool()` - для работы с `VFPool` - `.VINS()` - для работы с `VINS` + - `.Zone()` - для работы с `Zone` 3. Вызвать метод, отвечающий за выполнение запроса и передать в него: diff --git a/internal/validators/custom.go b/internal/validators/custom.go index 15e457d..b8d9306 100644 --- a/internal/validators/custom.go +++ b/internal/validators/custom.go @@ -6,6 +6,7 @@ import ( "net/url" "reflect" "regexp" + "strconv" "strings" "github.com/go-playground/validator/v10" @@ -414,6 +415,12 @@ func languageValidator(fe validator.FieldLevel) bool { return IsInSlice(fieldValue, languageValues) } +func userProviderValidator(fe validator.FieldLevel) bool { + fieldValue := fe.Field().String() + + return IsInSlice(fieldValue, userProviders) +} + // sepTypeValidator is used to validate sepType fields func sepTypeValidator(fe validator.FieldLevel) bool { fieldValue := fe.Field().String() @@ -421,6 +428,13 @@ func sepTypeValidator(fe validator.FieldLevel) bool { return IsInSlice(fieldValue, sepTypeValues) } +// deviceValidator is used to validate extnet device fields +func deviceValidator(fe validator.FieldLevel) bool { + fieldValue := fe.Field().String() + + return IsInSlice(fieldValue, deviceValues) +} + // ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed. // It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error { @@ -442,3 +456,13 @@ func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error { } return multierror.Join(errs...) } + +// trunkTagsValidator checks if trunk_tags is in range from 1 to 4095 +func trunkTagsValidator(fe validator.FieldLevel) bool { + fieldValue := fe.Field().String() + numFieldValue, err := strconv.ParseInt(fieldValue, 10, 64) + if err != nil { + return false + } + return uint64(numFieldValue) >= uint64(trunkTagsMin) && uint64(numFieldValue) <= uint64(trunkTagsMax) +} diff --git a/internal/validators/messages.go b/internal/validators/messages.go index 9f558ef..2fa8436 100644 --- a/internal/validators/messages.go +++ b/internal/validators/messages.go @@ -333,6 +333,25 @@ func errorMessage(fe validator.FieldError) string { prefix, fe.Field(), joinValues(sepTypeValues)) + + // user validators + case "userProvider": + return fmt.Sprintf("%s %s must be one of the following: %s", + prefix, + fe.Field(), + joinValues(userProviders)) + + // trunk tags validator + case "trunkTags": + return fmt.Sprintf("%s %s must be in range from 1 to 4095", + prefix, + fe.Field()) + + case "device": + return fmt.Sprintf("%s %s must be one of the following: %s", + prefix, + fe.Field(), + joinValues(deviceValues)) } return fe.Error() diff --git a/internal/validators/validator.go b/internal/validators/validator.go index 5e9cf29..aaae78e 100644 --- a/internal/validators/validator.go +++ b/internal/validators/validator.go @@ -281,10 +281,25 @@ func registerAllValidators(validate *validator.Validate) error { return err } + err = validate.RegisterValidation("userProvider", userProviderValidator) + if err != nil { + return err + } + err = validate.RegisterValidation("sepType", sepTypeValidator) if err != nil { return err } + err = validate.RegisterValidation("device", deviceValidator) + if err != nil { + return err + } + + err = validate.RegisterValidation("trunkTags", trunkTagsValidator) + if err != nil { + return err + } + return nil } diff --git a/internal/validators/values.go b/internal/validators/values.go index 1d30630..029309a 100644 --- a/internal/validators/values.go +++ b/internal/validators/values.go @@ -17,17 +17,17 @@ var ( computeModeValues = []string{"EQ", "EN", "ANY"} computeDiskTypeValues = []string{"D", "B"} computeNetTypeValues = []string{"EXTNET", "VINS"} - computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK"} + computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "EMPTY", "TRUNK"} computeOrderValues = []string{"cdrom", "network", "hd"} computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"} - computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"} + computeDriverValues = []string{"KVM_X86"} diskTypeValues = []string{"B", "T", "D"} flipgroupClientTypeValues = []string{"compute", "vins"} kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"} - kvmx86NetTypeValues = []string{"EXTNET", "VINS", "NONE", "VFNIC", "DPDK"} + kvmx86NetTypeValues = []string{"EXTNET", "VINS", "EMPTY", "VFNIC", "DPDK", "SDN", "TRUNK"} lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"} @@ -49,11 +49,11 @@ var ( interfaceStateValues = []string{"on", "off"} - actionValues = []string{"power_on", "shutdown", "force_shutdown", "reboot"} + actionValues = []string{"is_powered", "power_on", "shutdown", "force_shutdown", "reboot"} vmActionValues = []string{"stop", "move"} - computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"} + computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"} networkInterfaceNamingValues = []string{"eth", "ens"} @@ -72,10 +72,16 @@ var ( sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"} languageValues = []string{"ru", "en"} + + userProviders = []string{"bvs", "decs3o"} + + deviceValues = []string{"primary", "secondary"} ) const ( mtuMin = 1 - mtuMax = 9216 + + trunkTagsMin = 1 + trunkTagsMax = 4095 ) diff --git a/pkg/cloudapi/account/delete.go b/pkg/cloudapi/account/delete.go index e543b2c..a8f2f02 100644 --- a/pkg/cloudapi/account/delete.go +++ b/pkg/cloudapi/account/delete.go @@ -19,18 +19,18 @@ type DeleteRequest struct { } // Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed -func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) { +func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudapi/account/delete" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(result), nil } diff --git a/pkg/cloudapi/account/disable_enable.go b/pkg/cloudapi/account/disable_enable.go index 09a0ace..3eb98d4 100644 --- a/pkg/cloudapi/account/disable_enable.go +++ b/pkg/cloudapi/account/disable_enable.go @@ -13,10 +13,6 @@ type DisableEnableRequest struct { // ID of account // Required: true AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` - - // Reason of disabling - // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` } // Disable disables an account diff --git a/pkg/cloudapi/account/models.go b/pkg/cloudapi/account/models.go index 019058e..ac7e442 100644 --- a/pkg/cloudapi/account/models.go +++ b/pkg/cloudapi/account/models.go @@ -165,6 +165,15 @@ type Machines struct { Halted uint64 `json:"halted"` } +// Detailed information about the account zone +type ZoneID struct { + // ID of zone + ID int64 `json:"id"` + + // Name of zone + Name string `json:"name"` +} + // Main information about account type RecordAccount struct { // DCLocation @@ -253,6 +262,12 @@ type RecordAccount struct { // VINSes VINSes uint64 `json:"vinses"` + + // Zone + ZoneIDs []ZoneID + + // Zones + DefaultZoneID uint64 `json:"defaultZoneId"` } // Main information about compute diff --git a/pkg/cloudapi/account/restore.go b/pkg/cloudapi/account/restore.go index d307805..02f5f07 100644 --- a/pkg/cloudapi/account/restore.go +++ b/pkg/cloudapi/account/restore.go @@ -3,6 +3,7 @@ package account import ( "context" "net/http" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -14,18 +15,18 @@ type RestoreRequest struct { } // Restore restores a deleted account -func (a Account) Restore(ctx context.Context, req RestoreRequest) (bool, error) { +func (a Account) Restore(ctx context.Context, req RestoreRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudapi/account/restore" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(result), nil } diff --git a/pkg/cloudapi/account/update.go b/pkg/cloudapi/account/update.go index 3215397..efbecaa 100644 --- a/pkg/cloudapi/account/update.go +++ b/pkg/cloudapi/account/update.go @@ -54,6 +54,10 @@ type UpdateRequest struct { // i.e.: ["sep1_poolName1", "sep2_poolName2", etc] // Required: false UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"` + + // Default zone ID + // Required: false + DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"` } // Update updates an account name and resource types and limits diff --git a/pkg/cloudapi/bservice/create.go b/pkg/cloudapi/bservice/create.go index 79e8073..24f17e5 100644 --- a/pkg/cloudapi/bservice/create.go +++ b/pkg/cloudapi/bservice/create.go @@ -25,6 +25,10 @@ type CreateRequest struct { // SSH key to deploy for the specified user. Same key will be deployed to all computes of the service // Required: false SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // Create creates blank BasicService instance diff --git a/pkg/cloudapi/bservice/delete.go b/pkg/cloudapi/bservice/delete.go index b9e7d91..30c89e9 100644 --- a/pkg/cloudapi/bservice/delete.go +++ b/pkg/cloudapi/bservice/delete.go @@ -16,6 +16,7 @@ type DeleteRequest struct { // If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately // Required: false + // Default: false Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` } diff --git a/pkg/cloudapi/bservice/migrate_to_zone.go b/pkg/cloudapi/bservice/migrate_to_zone.go new file mode 100644 index 0000000..cd3c7fc --- /dev/null +++ b/pkg/cloudapi/bservice/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudapi/bservice/models.go b/pkg/cloudapi/bservice/models.go index 86e6416..f6a1769 100644 --- a/pkg/cloudapi/bservice/models.go +++ b/pkg/cloudapi/bservice/models.go @@ -88,6 +88,9 @@ type RecordBasicService struct { // Whether user controlled UserManaged bool `json:"userManaged"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Main information about Compute @@ -382,6 +385,9 @@ type ItemBasicService struct { // User Managed or not UserManaged bool `json:"userManaged"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // List of BasicServices diff --git a/pkg/cloudapi/compute/abort_shared_snapshot_merge.go b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go new file mode 100644 index 0000000..5b4a925 --- /dev/null +++ b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go @@ -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 +} diff --git a/pkg/cloudapi/compute/change_mtu.go b/pkg/cloudapi/compute/change_mtu.go new file mode 100644 index 0000000..13829de --- /dev/null +++ b/pkg/cloudapi/compute/change_mtu.go @@ -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 +} diff --git a/pkg/cloudapi/compute/get_log.go b/pkg/cloudapi/compute/get_log.go index 2fe57e2..d673e2f 100644 --- a/pkg/cloudapi/compute/get_log.go +++ b/pkg/cloudapi/compute/get_log.go @@ -27,7 +27,7 @@ func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error) url := "/cloudapi/compute/getLog" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req) if err != nil { return "", err } diff --git a/pkg/cloudapi/compute/guest_agent_disable.go b/pkg/cloudapi/compute/guest_agent_disable.go new file mode 100644 index 0000000..c709baf --- /dev/null +++ b/pkg/cloudapi/compute/guest_agent_disable.go @@ -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 +} diff --git a/pkg/cloudapi/compute/guest_agent_enable.go b/pkg/cloudapi/compute/guest_agent_enable.go new file mode 100644 index 0000000..dc3eaa9 --- /dev/null +++ b/pkg/cloudapi/compute/guest_agent_enable.go @@ -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 +} diff --git a/pkg/cloudapi/compute/guest_agent_execute.go b/pkg/cloudapi/compute/guest_agent_execute.go new file mode 100644 index 0000000..fde7cf3 --- /dev/null +++ b/pkg/cloudapi/compute/guest_agent_execute.go @@ -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 +} diff --git a/pkg/cloudapi/compute/guest_agent_feature_get.go b/pkg/cloudapi/compute/guest_agent_feature_get.go new file mode 100644 index 0000000..95605bd --- /dev/null +++ b/pkg/cloudapi/compute/guest_agent_feature_get.go @@ -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 +} diff --git a/pkg/cloudapi/compute/guest_agent_feature_update.go b/pkg/cloudapi/compute/guest_agent_feature_update.go new file mode 100644 index 0000000..7150be7 --- /dev/null +++ b/pkg/cloudapi/compute/guest_agent_feature_update.go @@ -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 +} diff --git a/pkg/cloudapi/compute/migrate_to_zone.go b/pkg/cloudapi/compute/migrate_to_zone.go new file mode 100644 index 0000000..bab15a1 --- /dev/null +++ b/pkg/cloudapi/compute/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudapi/compute/models.go b/pkg/cloudapi/compute/models.go index 3aaf0f1..3868d49 100644 --- a/pkg/cloudapi/compute/models.go +++ b/pkg/cloudapi/compute/models.go @@ -5,13 +5,13 @@ import "strconv" // Access Control List type RecordACL struct { // Account ACL list - AccountACL ListACL `json:"accountAcl"` + AccountACL ListACL `json:"accountACL"` // Compute ACL list - ComputeACL ListACL `json:"computeAcl"` + ComputeACL ListACL `json:"computeACL"` // Resource group ACL list - RGACL ListACL `json:"rgAcl"` + RGACL ListACL `json:"rgACL"` } type ListUsers struct { @@ -386,6 +386,9 @@ type RecordCompute struct { // List interfaces Interfaces ListInterfaces `json:"interfaces"` + // Live migration job ID + LiveMigrationJobID uint64 `json:"live_migration_job_id"` + // Loader type LoaderType string `json:"loaderType"` @@ -443,6 +446,9 @@ type RecordCompute struct { // PreferredCPU PreferredCPU []int64 `json:"preferredCpu"` + // Qemu_quest + QemuQuest QemuQuest `json:"qemu_guest"` + // Number of RAM RAM uint64 `json:"ram"` @@ -505,6 +511,18 @@ type RecordCompute struct { // VNC password VNCPassword string `json:"vncPasswd"` + + // Zone ID + // Required: false + ZoneID uint64 `json:"zoneId"` +} + +type QemuQuest struct { + Enabled bool `json:"enabled"` + EnabledAgentFeatures []string `json:"enabled_agent_features"` + GUID string `json:"guid"` + LastUpdate uint64 `json:"last_update"` + User string `json:"user"` } type VGPUItem struct { @@ -685,6 +703,9 @@ type ItemVNFInterface struct { // QOS QOS QOS `json:"qos"` + // SDN interface ID + SDNInterfaceID string `json:"sdn_interface_id"` + // Target Target string `json:"target"` @@ -770,9 +791,6 @@ type ItemComputeDisk struct { // Name Name string `json:"name"` - // Order - Order uint64 `json:"order"` - // Params Params string `json:"params"` @@ -836,8 +854,8 @@ type ItemComputeDisk struct { // Updated by UpdatedBy string `json:"updatedBy"` - // Virtual machine ID - VMID uint64 `json:"vmid"` + // Zone ID + ZoneID uint64 `json:"zoneId"` } type ItemReplication struct { @@ -1036,6 +1054,9 @@ type ItemCompute struct { // List interfaces Interfaces ListInterfaces `json:"interfaces"` + // Live migration job ID + LiveMigrationJobID uint64 `json:"live_migration_job_id"` + // Loader type LoaderType string `json:"loaderType"` @@ -1078,6 +1099,9 @@ type ItemCompute struct { // Number of RAM RAM uint64 `json:"ram"` + // Qemu_quest + QemuQuest QemuQuest `json:"qemu_guest"` + // Reference ID ReferenceID string `json:"referenceId"` diff --git a/pkg/cloudapi/compute/net_attach.go b/pkg/cloudapi/compute/net_attach.go index 6e3d5f1..854a316 100644 --- a/pkg/cloudapi/compute/net_attach.go +++ b/pkg/cloudapi/compute/net_attach.go @@ -19,6 +19,9 @@ type NetAttachRequest struct { // 'VINS' for connect to ViNS // 'VFNIC' for connect to vfpool // 'DPDK' for connect to DPDK + // `EMPTY` for connect empty network + // `SDT` for connect to SDN + // `TRUNK` for connect to TRUNK // Required: true NetType string `url:"netType" json:"netType" validate:"computex86NetType"` @@ -36,9 +39,15 @@ type NetAttachRequest struct { // Required: false MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"` - // Used only for DPDK type, must be 1-9216 - // Required: false + // Used only for EXTNET and DPDK + // For DPDK must be 1-9216 + // For EXTNET must be 1500-9216 + // Required: false MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"` + + // Unique identifier of logical port on SDN side + // Required: false + SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty" validate:"omitempty"` } // NetAttach attaches network to compute and gets info about network diff --git a/pkg/cloudapi/compute/shared_snapshot_merge_status.go b/pkg/cloudapi/compute/shared_snapshot_merge_status.go new file mode 100644 index 0000000..92c8a59 --- /dev/null +++ b/pkg/cloudapi/compute/shared_snapshot_merge_status.go @@ -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 +} diff --git a/pkg/cloudapi/disks/from_platform_disk.go b/pkg/cloudapi/disks/from_platform_disk.go index a8fa29e..a69fd6a 100644 --- a/pkg/cloudapi/disks/from_platform_disk.go +++ b/pkg/cloudapi/disks/from_platform_disk.go @@ -27,12 +27,6 @@ type FromPlatformDiskRequest struct { // Required: true ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"` - // Binary architecture of this image - // Should be: - // - X86_64 - // Required: true - Architecture string `url:"architecture" json:"architecture" validate:"imageArchitecture"` - // Username for the image // Required: false Username string `url:"username,omitempty" json:"username,omitempty"` diff --git a/pkg/cloudapi/extnet/models.go b/pkg/cloudapi/extnet/models.go index 8911f61..0350823 100644 --- a/pkg/cloudapi/extnet/models.go +++ b/pkg/cloudapi/extnet/models.go @@ -193,14 +193,17 @@ type RecordExtNet struct { // Milestones Milestones uint64 `json:"milestones"` + // MTU + MTU uint64 `json:"mtu"` + // Name Name string `json:"name"` // Network Network string `json:"network"` - // Network ID - NetworkID uint64 `json:"networkId"` + // Network IDs + NetworkIDs NetworkIDs `json:"networkIds"` // NTP NTP []string `json:"ntp"` @@ -217,9 +220,18 @@ type RecordExtNet struct { // PriVNFDevID PriVNFDevID uint64 `json:"priVnfDevId"` + // Redundant + Redundant bool `json:"redundant"` + + // SecVnfDevId + SecVNFDevID uint64 `json:"secVnfDevId"` + // List reservations Reservations ListReservations `json:"reservations"` + // List pre-reservations + PreReservations ListReservations `json:"pre-reservations"` + // Shared with SharedWith []uint64 `json:"sharedWith"` @@ -231,6 +243,17 @@ type RecordExtNet struct { // VNFs VNFs VNFs `json:"vnfs"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` +} + +type NetworkIDs struct { + // Primary + Primary uint64 `json:"primary"` + + // Secondary + Secondary uint64 `json:"secondary"` } // Detailed information about reserved address or address pool diff --git a/pkg/cloudapi/flipgroup/create.go b/pkg/cloudapi/flipgroup/create.go index 97d0ce0..deea750 100644 --- a/pkg/cloudapi/flipgroup/create.go +++ b/pkg/cloudapi/flipgroup/create.go @@ -32,8 +32,9 @@ type CreateRequest struct { // Type of client // - 'compute' // - 'vins' (will be later) - // Required: true - ClientType string `url:"clientType" json:"clientType" validate:"flipgroupClientType"` + // Required: false + // Default: "compute" + ClientType string `url:"clientType,omitempty" json:"clientType,omitempty"` // IP address to associate with this group. If empty, the platform will autoselect IP address // Required: false diff --git a/pkg/cloudapi/image/create.go b/pkg/cloudapi/image/create.go index 4c224e3..f3a94a5 100644 --- a/pkg/cloudapi/image/create.go +++ b/pkg/cloudapi/image/create.go @@ -2,6 +2,7 @@ package image import ( "context" + "encoding/json" "net/http" "strconv" @@ -69,18 +70,17 @@ type CreateRequest struct { // Required: false Pool string `url:"poolName,omitempty" json:"poolName,omitempty"` - // Binary architecture of this image - // Should be: - // - X86_64 - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty" validate:"omitempty,imageArchitecture"` - // List of types of compute suitable for image // Example: [ "KVM_X86" ] // Required: true Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"` } +type asyncWrapperCreateRequest struct { + CreateRequest + AsyncMode bool `url:"asyncMode"` +} + // Create creates image from a media identified by URL func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) { err := validators.ValidateRequest(req) @@ -102,3 +102,29 @@ func (i Image) Create(ctx context.Context, req CreateRequest) (uint64, error) { return result, nil } + +// AsyncCreate creates image from a media identified by URL in async mode +func (i Image) AsyncCreate(ctx context.Context, req CreateRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/image/create" + + asyncReq := asyncWrapperCreateRequest{CreateRequest: req, AsyncMode: true} + + res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, asyncReq) + if err != nil { + return " ", err + } + + var taskID string + + err = json.Unmarshal(res, &taskID) + if err != nil { + return "", err + } + + return taskID, nil +} diff --git a/pkg/cloudapi/image/list.go b/pkg/cloudapi/image/list.go index a3e6f7d..c24a8ab 100644 --- a/pkg/cloudapi/image/list.go +++ b/pkg/cloudapi/image/list.go @@ -26,10 +26,6 @@ type ListRequest struct { // Required: false Status string `url:"status,omitempty" json:"status,omitempty"` - // Find by architecture - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"` - // Find by type // Required: false TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"` diff --git a/pkg/cloudapi/k8s/create.go b/pkg/cloudapi/k8s/create.go index f110c15..a98ba8b 100644 --- a/pkg/cloudapi/k8s/create.go +++ b/pkg/cloudapi/k8s/create.go @@ -166,6 +166,10 @@ type CreateRequest struct { // Type of the emulated system, Q35 or i440fx // Required: false Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM field values diff --git a/pkg/cloudapi/k8s/migrate_to_zone.go b/pkg/cloudapi/k8s/migrate_to_zone.go new file mode 100644 index 0000000..8ebe922 --- /dev/null +++ b/pkg/cloudapi/k8s/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudapi/k8s/models.go b/pkg/cloudapi/k8s/models.go index d5eb418..8d49c13 100644 --- a/pkg/cloudapi/k8s/models.go +++ b/pkg/cloudapi/k8s/models.go @@ -139,6 +139,9 @@ type RecordK8S struct { // With LB WithLB bool `json:"withLB"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Detailed information about address of the Virtual Internet Protocol @@ -305,6 +308,9 @@ type ItemK8SCluster struct { // List workers group WorkersGroup ListK8SGroups `json:"workersGroups"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Information about service account diff --git a/pkg/cloudapi/kvmx86/create.go b/pkg/cloudapi/kvmx86/create.go index b8fe7ce..405977c 100644 --- a/pkg/cloudapi/kvmx86/create.go +++ b/pkg/cloudapi/kvmx86/create.go @@ -16,6 +16,9 @@ type Interface struct { // - EXTNET // - VFNIC // - DPDK + // - EMPTY + // - SDN + // - TRUNK NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"` // Network ID for connect to, @@ -35,6 +38,10 @@ type Interface struct { // MAC address to assign to this VM when connecting to the specified network // Required: false MAC string `url:"mac,omitempty" json:"mac,omitempty" validate:"omitempty"` + + // SDN interface id + // Required: false + SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty"` } // DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest @@ -172,6 +179,10 @@ type CreateRequest struct { // Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False // Required: false PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM field values diff --git a/pkg/cloudapi/kvmx86/create_blank.go b/pkg/cloudapi/kvmx86/create_blank.go index b981eb8..9e6b54d 100644 --- a/pkg/cloudapi/kvmx86/create_blank.go +++ b/pkg/cloudapi/kvmx86/create_blank.go @@ -88,6 +88,10 @@ type CreateBlankRequest struct { // Does this machine supports hot resize // Required: false HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM field values diff --git a/pkg/cloudapi/lb/create.go b/pkg/cloudapi/lb/create.go index f469776..513ab91 100644 --- a/pkg/cloudapi/lb/create.go +++ b/pkg/cloudapi/lb/create.go @@ -38,12 +38,16 @@ type CreateRequest struct { HighlyAvailable bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"` // Start now Load balancer - // Required: false - Start bool `url:"start" json:"start"` + // Required: true + Start bool `url:"start" json:"start" validate:"required"` // Text description of this load balancer // Required: false Description string `url:"desc,omitempty" json:"desc,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequest struct { diff --git a/pkg/cloudapi/lb/migrate_to_zone.go b/pkg/cloudapi/lb/migrate_to_zone.go new file mode 100644 index 0000000..e491df4 --- /dev/null +++ b/pkg/cloudapi/lb/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudapi/lb/models.go b/pkg/cloudapi/lb/models.go index 519348e..60471b7 100644 --- a/pkg/cloudapi/lb/models.go +++ b/pkg/cloudapi/lb/models.go @@ -8,6 +8,9 @@ type RecordLB struct { // Access Control List ACL interface{} `json:"acl"` + //Account ID + AccountID uint64 `json:"accountId"` + // BackendHAIP BackendHAIP string `json:"backendHAIP"` @@ -84,7 +87,7 @@ type RecordLB struct { Status string `json:"status"` // Sysctl Params - SysctlParams interface{} `json:"sysctlParams"` + SysctlParams map[string]string `json:"sysctlParams"` // Tech status TechStatus string `json:"techStatus"` @@ -100,6 +103,9 @@ type RecordLB struct { // VINS ID VINSID uint64 `json:"vinsId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Main information about load balancer diff --git a/pkg/cloudapi/locations/get_list.go b/pkg/cloudapi/locations/get_list.go new file mode 100644 index 0000000..3676fe3 --- /dev/null +++ b/pkg/cloudapi/locations/get_list.go @@ -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 +} diff --git a/pkg/cloudapi/locations/models.go b/pkg/cloudapi/locations/models.go index fd0526e..adc5ea6 100644 --- a/pkg/cloudapi/locations/models.go +++ b/pkg/cloudapi/locations/models.go @@ -20,6 +20,9 @@ type ItemLocation struct { // Name Name string `json:"name"` + // Network Modes + NetworkModes []string `json:"network_modes"` + // Flag Flag string `json:"flag"` diff --git a/pkg/cloudapi/rg/create.go b/pkg/cloudapi/rg/create.go index a994500..dad9add 100644 --- a/pkg/cloudapi/rg/create.go +++ b/pkg/cloudapi/rg/create.go @@ -71,6 +71,10 @@ type CreateRequest struct { // External IP address // Required: false ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"` + + // SDN access group id + // Required: false + SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"` } // Create creates resource group diff --git a/pkg/cloudapi/rg/models.go b/pkg/cloudapi/rg/models.go index 6232570..a8311cf 100644 --- a/pkg/cloudapi/rg/models.go +++ b/pkg/cloudapi/rg/models.go @@ -134,6 +134,9 @@ type RecordResourceGroup struct { // List of resource types ResTypes []string `json:"resourceTypes"` + // SDN access group id + SDNAccessGroupID string `json:"sdn_access_group_id"` + // Secret Secret string `json:"secret"` @@ -227,6 +230,9 @@ type ItemResourceGroup struct { // List of resource types ResTypes []string `json:"resourceTypes"` + // SDN access group id + SDNAccessGroupID string `json:"sdn_access_group_id"` + // Secret Secret string `json:"secret"` diff --git a/pkg/cloudapi/tasks/models.go b/pkg/cloudapi/tasks/models.go index c9133ab..0680d41 100644 --- a/pkg/cloudapi/tasks/models.go +++ b/pkg/cloudapi/tasks/models.go @@ -46,9 +46,6 @@ type RecordAsyncTask struct { // Detailed information about task type ItemAsyncTask struct { RecordAsyncTask - - // GUID - GUID string `json:"guid"` } // List of tasks diff --git a/pkg/cloudapi/trunk.go b/pkg/cloudapi/trunk.go new file mode 100644 index 0000000..86c8997 --- /dev/null +++ b/pkg/cloudapi/trunk.go @@ -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) +} diff --git a/pkg/cloudapi/trunk/get.go b/pkg/cloudapi/trunk/get.go new file mode 100644 index 0000000..d47e9a8 --- /dev/null +++ b/pkg/cloudapi/trunk/get.go @@ -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 +} diff --git a/pkg/cloudapi/trunk/list.go b/pkg/cloudapi/trunk/list.go new file mode 100644 index 0000000..6039949 --- /dev/null +++ b/pkg/cloudapi/trunk/list.go @@ -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 ± + 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 +} diff --git a/pkg/cloudapi/trunk/models.go b/pkg/cloudapi/trunk/models.go new file mode 100644 index 0000000..de7742a --- /dev/null +++ b/pkg/cloudapi/trunk/models.go @@ -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"` +} diff --git a/pkg/cloudapi/trunk/trunk.go b/pkg/cloudapi/trunk/trunk.go new file mode 100644 index 0000000..e4c7605 --- /dev/null +++ b/pkg/cloudapi/trunk/trunk.go @@ -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, + } +} diff --git a/pkg/cloudapi/vins/create_in_account.go b/pkg/cloudapi/vins/create_in_account.go index d6b0ab6..b4f9f49 100644 --- a/pkg/cloudapi/vins/create_in_account.go +++ b/pkg/cloudapi/vins/create_in_account.go @@ -53,6 +53,10 @@ type CreateInAccountRequest struct { // List of static routes, each item must have destination, netmask, and gateway fields // Required: false Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequestInAcc struct { diff --git a/pkg/cloudapi/vins/create_in_rg.go b/pkg/cloudapi/vins/create_in_rg.go index db8bc78..351bf84 100644 --- a/pkg/cloudapi/vins/create_in_rg.go +++ b/pkg/cloudapi/vins/create_in_rg.go @@ -47,6 +47,10 @@ type CreateInRGRequest struct { // List of static routes, each item must have destination, netmask, and gateway fields // Required: false Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequestInRG struct { diff --git a/pkg/cloudapi/vins/migrate_to_zone.go b/pkg/cloudapi/vins/migrate_to_zone.go new file mode 100644 index 0000000..97d1ae8 --- /dev/null +++ b/pkg/cloudapi/vins/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudapi/vins/models.go b/pkg/cloudapi/vins/models.go index 1f54c3a..6dfef13 100644 --- a/pkg/cloudapi/vins/models.go +++ b/pkg/cloudapi/vins/models.go @@ -305,6 +305,9 @@ type ItemVNFInterface struct { // NodeID NodeID int64 `json:"nodeId"` + // SDNInterfaceID + SDNInterfaceID string `json:"sdn_interface_id"` + // PCI slot PCISlot int64 `json:"pciSlot"` @@ -732,6 +735,9 @@ type RecordVINS struct { // VXLAN ID VXLANID uint64 `json:"vxlanId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Information about libvirt settings diff --git a/pkg/cloudapi/zone.go b/pkg/cloudapi/zone.go new file mode 100644 index 0000000..bf93096 --- /dev/null +++ b/pkg/cloudapi/zone.go @@ -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) +} diff --git a/pkg/cloudapi/zone/filter.go b/pkg/cloudapi/zone/filter.go new file mode 100644 index 0000000..ec55a7a --- /dev/null +++ b/pkg/cloudapi/zone/filter.go @@ -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] +} diff --git a/pkg/cloudapi/zone/filter_test.go b/pkg/cloudapi/zone/filter_test.go new file mode 100644 index 0000000..5966796 --- /dev/null +++ b/pkg/cloudapi/zone/filter_test.go @@ -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)) + } +} diff --git a/pkg/cloudapi/zone/get.go b/pkg/cloudapi/zone/get.go new file mode 100644 index 0000000..a583df0 --- /dev/null +++ b/pkg/cloudapi/zone/get.go @@ -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 +} diff --git a/pkg/cloudapi/zone/ids.go b/pkg/cloudapi/zone/ids.go new file mode 100644 index 0000000..33f6193 --- /dev/null +++ b/pkg/cloudapi/zone/ids.go @@ -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 +} diff --git a/pkg/cloudapi/zone/list.go b/pkg/cloudapi/zone/list.go new file mode 100644 index 0000000..eb90577 --- /dev/null +++ b/pkg/cloudapi/zone/list.go @@ -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 +} diff --git a/pkg/cloudapi/zone/migrate_to_zone.go b/pkg/cloudapi/zone/migrate_to_zone.go new file mode 100644 index 0000000..6be865f --- /dev/null +++ b/pkg/cloudapi/zone/migrate_to_zone.go @@ -0,0 +1 @@ +package zone diff --git a/pkg/cloudapi/zone/models.go b/pkg/cloudapi/zone/models.go new file mode 100644 index 0000000..b2340ca --- /dev/null +++ b/pkg/cloudapi/zone/models.go @@ -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"` +} diff --git a/pkg/cloudapi/zone/serialize.go b/pkg/cloudapi/zone/serialize.go new file mode 100644 index 0000000..5e22cf3 --- /dev/null +++ b/pkg/cloudapi/zone/serialize.go @@ -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) +} diff --git a/pkg/cloudapi/zone/zone.go b/pkg/cloudapi/zone/zone.go new file mode 100644 index 0000000..f0605f5 --- /dev/null +++ b/pkg/cloudapi/zone/zone.go @@ -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, + } +} diff --git a/pkg/cloudbroker/account/add_zone.go b/pkg/cloudbroker/account/add_zone.go new file mode 100644 index 0000000..cb2be6d --- /dev/null +++ b/pkg/cloudbroker/account/add_zone.go @@ -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 +} diff --git a/pkg/cloudbroker/account/create.go b/pkg/cloudbroker/account/create.go index 6fca46f..087211b 100644 --- a/pkg/cloudbroker/account/create.go +++ b/pkg/cloudbroker/account/create.go @@ -60,9 +60,17 @@ type CreateRequest struct { UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"` // Advanced compute features, - // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac + // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk // Required: false ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"` + + // Default zone ID + // Required: false + DefaultZoneID uint64 `url:"defaultZoneId,omitempty" json:"defaultZoneId,omitempty"` + + // Zones + // Required: false + ZoneIDs []uint64 `url:"zoneIds,omitempty" json:"zoneIds,omitempty"` } // Create creates account diff --git a/pkg/cloudbroker/account/delete.go b/pkg/cloudbroker/account/delete.go index fad7b3e..674d39c 100644 --- a/pkg/cloudbroker/account/delete.go +++ b/pkg/cloudbroker/account/delete.go @@ -20,25 +20,21 @@ type DeleteRequest struct { // Name of account // Required: false 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 -func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) { +func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/account/delete" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(result), nil } diff --git a/pkg/cloudbroker/account/delete_accounts.go b/pkg/cloudbroker/account/delete_accounts.go index d5ec250..bde44d3 100644 --- a/pkg/cloudbroker/account/delete_accounts.go +++ b/pkg/cloudbroker/account/delete_accounts.go @@ -19,18 +19,18 @@ type DeleteAccountsRequest struct { } // DeleteAccounts destroys a group of accounts -func (a Account) DeleteAccounts(ctx context.Context, req DeleteAccountsRequest) (bool, error) { +func (a Account) DeleteAccounts(ctx context.Context, req DeleteAccountsRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/account/deleteAccounts" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/account/disable.go b/pkg/cloudbroker/account/disable.go index 20a3ed4..a4f62da 100644 --- a/pkg/cloudbroker/account/disable.go +++ b/pkg/cloudbroker/account/disable.go @@ -13,10 +13,6 @@ type DisableRequest struct { // ID of account // Required: true AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` - - // Reason of disabling - // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` } // Disable disables an account diff --git a/pkg/cloudbroker/account/disable_accounts.go b/pkg/cloudbroker/account/disable_accounts.go index 6b91b92..eb4f75d 100644 --- a/pkg/cloudbroker/account/disable_accounts.go +++ b/pkg/cloudbroker/account/disable_accounts.go @@ -12,25 +12,21 @@ type DisableAccountsRequest struct { // IDs of accounts // Required: true AccountIDs []uint64 `url:"accountIds" json:"accountIds" validate:"min=1"` - - // Reason of disabling - // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` } // DisableAccounts disables accounts -func (a Account) DisableAccounts(ctx context.Context, req DisableAccountsRequest) (bool, error) { +func (a Account) DisableAccounts(ctx context.Context, req DisableAccountsRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/account/disableAccounts" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/account/enable_accounts.go b/pkg/cloudbroker/account/enable_accounts.go index 685a68b..4997c97 100644 --- a/pkg/cloudbroker/account/enable_accounts.go +++ b/pkg/cloudbroker/account/enable_accounts.go @@ -15,18 +15,18 @@ type EnableAccountsRequest struct { } // EnableAccounts enables accounts -func (a Account) EnableAccounts(ctx context.Context, req EnableAccountsRequest) (bool, error) { +func (a Account) EnableAccounts(ctx context.Context, req EnableAccountsRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/account/enableAccounts" - _, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/account/filter_test.go b/pkg/cloudbroker/account/filter_test.go index 3b2458a..301d69f 100644 --- a/pkg/cloudbroker/account/filter_test.go +++ b/pkg/cloudbroker/account/filter_test.go @@ -9,16 +9,6 @@ var accounts = ListAccounts{ { Meta: []interface{}{}, InfoAccount: InfoAccount{ - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "CXDRAU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "not_really_timofey_tkachev_1@decs3o", - }, - }, CreatedTime: 1676878820, DeletedTime: 0, ID: 132847, @@ -26,20 +16,20 @@ var accounts = ListAccounts{ Status: "CONFIRMED", UpdatedTime: 1676645275, }, + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "CXDRAU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "not_really_timofey_tkachev_1@decs3o", + }, + }, }, { Meta: []interface{}{}, InfoAccount: InfoAccount{ - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "CXDRAU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "timofey_tkachev_1@decs3o", - }, - }, CreatedTime: 1676645275, DeletedTime: 1677723401, ID: 132846, @@ -47,28 +37,20 @@ var accounts = ListAccounts{ Status: "DELETED", UpdatedTime: 1676645275, }, + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "CXDRAU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "timofey_tkachev_1@decs3o", + }, + }, }, { Meta: []interface{}{}, InfoAccount: InfoAccount{ - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "CXDRAU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "timofey_tkachev_1@decs3o", - }, - { - Explicit: true, - GUID: "", - Right: "CXDRAU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "second_account@decs3o", - }, - }, CreatedTime: 1676883850, DeletedTime: 1676883899, ID: 132848, @@ -76,6 +58,24 @@ var accounts = ListAccounts{ Status: "DELETED", UpdatedTime: 1676878820, }, + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "CXDRAU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "timofey_tkachev_1@decs3o", + }, + { + Explicit: true, + GUID: "", + Right: "CXDRAU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "second_account@decs3o", + }, + }, }, }, EntryCount: 3, diff --git a/pkg/cloudbroker/account/models.go b/pkg/cloudbroker/account/models.go index e506d2f..e0a545a 100644 --- a/pkg/cloudbroker/account/models.go +++ b/pkg/cloudbroker/account/models.go @@ -102,6 +102,15 @@ type ACL struct { UserGroupID string `json:"userGroupId"` } +// Access Control List with emails field +type ACLWithEmails struct { + // ACL + ACL + + // Emails + Emails []string `json:"emails"` +} + // Resource limits type ResourceLimits struct { // CuC @@ -134,9 +143,6 @@ type InfoAccount struct { // CKey CKey string `json:"_ckey"` - // Access Control List - ACL []ACL `json:"acl"` - // Company Company string `json:"company"` @@ -205,12 +211,30 @@ type InfoAccount struct { // List of VINS IDs VINS []uint64 `json:"vins"` + + // Default zone ID + DefaultZoneID uint64 `json:"defaultZoneId"` +} + +// Deatailed information about the account zone +type ZoneID struct { + // ID of zone + ID int64 `json:"id"` + + // Name of zone + Name string `json:"name"` } // Deatailed information about account type RecordAccount struct { // Main information about account InfoAccount + + // Access Control List + ACL []ACLWithEmails `json:"acl"` + + // Zones IDs + ZoneIDs []ZoneID } // More information about account @@ -218,8 +242,14 @@ type ItemAccount struct { // Meta Meta []interface{} `json:"_meta"` + // Access Control List + ACL []ACL `json:"acl"` + // Main information about account InfoAccount + + // Zones + ZoneIDs []uint64 } // List of accounts diff --git a/pkg/cloudbroker/account/remove_zone.go b/pkg/cloudbroker/account/remove_zone.go new file mode 100644 index 0000000..8d67d5e --- /dev/null +++ b/pkg/cloudbroker/account/remove_zone.go @@ -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 +} diff --git a/pkg/cloudbroker/account/restore.go b/pkg/cloudbroker/account/restore.go index ec2e601..a02ac55 100644 --- a/pkg/cloudbroker/account/restore.go +++ b/pkg/cloudbroker/account/restore.go @@ -12,25 +12,21 @@ type RestoreRequest struct { // ID an account // Required: true 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 -func (a Account) Restore(ctx context.Context, req RestoreRequest) (bool, error) { +func (a Account) Restore(ctx context.Context, req RestoreRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/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 { - return false, err + return "", err } - return true, nil + return string(result), nil } diff --git a/pkg/cloudbroker/account/update.go b/pkg/cloudbroker/account/update.go index 9803f8c..7c4fe5d 100644 --- a/pkg/cloudbroker/account/update.go +++ b/pkg/cloudbroker/account/update.go @@ -59,6 +59,10 @@ type UpdateRequest struct { // Default: false // Required: false 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 diff --git a/pkg/cloudbroker/account/update_compute_features.go b/pkg/cloudbroker/account/update_compute_features.go index 35e248d..f55d5dc 100644 --- a/pkg/cloudbroker/account/update_compute_features.go +++ b/pkg/cloudbroker/account/update_compute_features.go @@ -15,7 +15,7 @@ type UpdateComputeFeaturesRequest struct { AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` // Advanced compute features, - // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac + // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk // Required: false ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"` } diff --git a/pkg/cloudbroker/bservice/create.go b/pkg/cloudbroker/bservice/create.go index 90b97d9..d5485b5 100644 --- a/pkg/cloudbroker/bservice/create.go +++ b/pkg/cloudbroker/bservice/create.go @@ -25,6 +25,10 @@ type CreateRequest struct { // SSH key to deploy for the specified user. Same key will be deployed to all computes of the service // Required: false SSHKey string `url:"sshKey,omitempty" json:"sshKey,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // Create creates blank BasicService instance diff --git a/pkg/cloudbroker/bservice/delete.go b/pkg/cloudbroker/bservice/delete.go index 9e53e32..504dbd8 100644 --- a/pkg/cloudbroker/bservice/delete.go +++ b/pkg/cloudbroker/bservice/delete.go @@ -15,8 +15,9 @@ type DeleteRequest struct { ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"` // If set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately - // Required: true - Permanently bool `url:"permanently" json:"permanently"` + // Required: false + // Default: false + Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` } // Delete deletes BasicService instance diff --git a/pkg/cloudbroker/bservice/migrate_to_zone.go b/pkg/cloudbroker/bservice/migrate_to_zone.go new file mode 100644 index 0000000..70f1662 --- /dev/null +++ b/pkg/cloudbroker/bservice/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudbroker/bservice/models.go b/pkg/cloudbroker/bservice/models.go index 08a0521..3790f99 100644 --- a/pkg/cloudbroker/bservice/models.go +++ b/pkg/cloudbroker/bservice/models.go @@ -88,6 +88,9 @@ type RecordBasicService struct { // Whether user controlled UserManaged bool `json:"userManaged"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // List of Groups @@ -254,6 +257,9 @@ type ItemBasicService struct { // User Managed or not UserManaged bool `json:"userManaged"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // List of Snapshots diff --git a/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go new file mode 100644 index 0000000..d4aa9ec --- /dev/null +++ b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/change_mtu.go b/pkg/cloudbroker/compute/change_mtu.go new file mode 100644 index 0000000..6ebdd7f --- /dev/null +++ b/pkg/cloudbroker/compute/change_mtu.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/get_log.go b/pkg/cloudbroker/compute/get_log.go index 25881aa..fd154bd 100644 --- a/pkg/cloudbroker/compute/get_log.go +++ b/pkg/cloudbroker/compute/get_log.go @@ -27,7 +27,7 @@ func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error) 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 { return "", err } diff --git a/pkg/cloudbroker/compute/guest_agent_disable.go b/pkg/cloudbroker/compute/guest_agent_disable.go new file mode 100644 index 0000000..f7e4475 --- /dev/null +++ b/pkg/cloudbroker/compute/guest_agent_disable.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/guest_agent_enable.go b/pkg/cloudbroker/compute/guest_agent_enable.go new file mode 100644 index 0000000..c0e545f --- /dev/null +++ b/pkg/cloudbroker/compute/guest_agent_enable.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/guest_agent_execute.go b/pkg/cloudbroker/compute/guest_agent_execute.go new file mode 100644 index 0000000..d2710cb --- /dev/null +++ b/pkg/cloudbroker/compute/guest_agent_execute.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/guest_agent_feature_get.go b/pkg/cloudbroker/compute/guest_agent_feature_get.go new file mode 100644 index 0000000..bc0538f --- /dev/null +++ b/pkg/cloudbroker/compute/guest_agent_feature_get.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/guest_agent_feature_update.go b/pkg/cloudbroker/compute/guest_agent_feature_update.go new file mode 100644 index 0000000..01a7aa2 --- /dev/null +++ b/pkg/cloudbroker/compute/guest_agent_feature_update.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/migrate.go b/pkg/cloudbroker/compute/migrate.go index 1ceca2b..264ab89 100644 --- a/pkg/cloudbroker/compute/migrate.go +++ b/pkg/cloudbroker/compute/migrate.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -24,6 +25,11 @@ type MigrateRequest struct { Force bool `url:"force,omitempty" json:"force,omitempty"` } +type asyncWrapperMigrateRequest struct { + MigrateRequest + SyncMode bool `url:"sync"` +} + // Migrate migrates compute to another stack func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) { err := validators.ValidateRequest(req) @@ -33,7 +39,9 @@ func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) 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 { return false, err } @@ -45,3 +53,29 @@ func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) 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 +} diff --git a/pkg/cloudbroker/compute/migrate_to_zone.go b/pkg/cloudbroker/compute/migrate_to_zone.go new file mode 100644 index 0000000..0d5095c --- /dev/null +++ b/pkg/cloudbroker/compute/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudbroker/compute/models.go b/pkg/cloudbroker/compute/models.go index 24572fa..4701105 100644 --- a/pkg/cloudbroker/compute/models.go +++ b/pkg/cloudbroker/compute/models.go @@ -44,7 +44,7 @@ type ItemACL struct { // ACL compute information type ItemComputeACL struct { // Explicit - Explicit string `json:"explicit"` + Explicit bool `json:"explicit"` // GUID GUID string `json:"guid"` @@ -412,9 +412,6 @@ type ItemDisk struct { // Name Name string `json:"name"` - // Order - Order uint64 `json:"order"` - // Params Params string `json:"params"` @@ -486,9 +483,6 @@ type ItemDisk struct { // Updated by UpdatedBy string `json:"updatedBy"` - - // Virtual machine ID - VMID uint64 `json:"vmid"` } type ItemReplication struct { @@ -573,6 +567,9 @@ type ItemInterface struct { // QOS QOS QOS `json:"qos"` + // SDN interface ID + SDNInterfaceID string `json:"sdn_interface_id"` + // Target Target string `json:"target"` @@ -708,6 +705,9 @@ type InfoCompute struct { // List interfaces Interfaces ListInterfaces `json:"interfaces"` + // Live migration job ID + LiveMigrationJobID uint64 `json:"live_migration_job_id"` + // Loader type LoaderType string `json:"loaderType"` @@ -750,6 +750,9 @@ type InfoCompute struct { // PreferredCPU PreferredCPU []int64 `json:"preferredCpu"` + // Qemu_quest + QemuQuest QemuQuest `json:"qemu_guest"` + // Number of RAM RAM uint64 `json:"ram"` @@ -818,6 +821,17 @@ type InfoCompute struct { // Virtual image ID 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 @@ -954,6 +968,9 @@ type RecordCompute struct { // List interfaces Interfaces ListInterfaces `json:"interfaces"` + // Live migration job ID + LiveMigrationJobID uint64 `json:"live_migration_job_id"` + // Loader type LoaderType string `json:"loaderType"` @@ -1014,6 +1031,9 @@ type RecordCompute struct { // PreferredCPU PreferredCPU []int64 `json:"preferredCpu"` + // Qemu_quest + QemuQuest QemuQuest `json:"qemu_guest"` + // Number of RAM RAM uint64 `json:"ram"` @@ -1085,6 +1105,9 @@ type RecordCompute struct { // VNC password VNCPassword string `json:"vncPasswd"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } type VGPUItem struct { diff --git a/pkg/cloudbroker/compute/net_attach.go b/pkg/cloudbroker/compute/net_attach.go index 5b41d4b..7975b14 100644 --- a/pkg/cloudbroker/compute/net_attach.go +++ b/pkg/cloudbroker/compute/net_attach.go @@ -19,6 +19,9 @@ type NetAttachRequest struct { // 'VINS' for connect to ViNS // 'VFNIC' for connect to vfpool // 'DPDK' for connect to DPDK + // `EMPTY` for connect empty network + // `SDT` for connect to SDN + // `TRUNK` for connect to TRUNK // Required: true NetType string `url:"netType" json:"netType" validate:"computex86NetType"` @@ -36,9 +39,15 @@ type NetAttachRequest struct { // Required: false MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"` - // Used only for DPDK type, must be 1-9216 - // Required: false + // Used only for EXTNET and DPDK + // For DPDK must be 1-9216 + // For EXTNET must be 1500-9216 + // Required: false MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"` + + // Unique identifier of logical port on SDN side + // Required: false + SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty" validate:"omitempty"` } // NetAttach attaches network to compute and gets info about network diff --git a/pkg/cloudbroker/compute/shared_snapshot_merge_status.go b/pkg/cloudbroker/compute/shared_snapshot_merge_status.go new file mode 100644 index 0000000..ad00854 --- /dev/null +++ b/pkg/cloudbroker/compute/shared_snapshot_merge_status.go @@ -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 +} diff --git a/pkg/cloudbroker/disks/from_platform_disk.go b/pkg/cloudbroker/disks/from_platform_disk.go index 690b05c..1682abd 100644 --- a/pkg/cloudbroker/disks/from_platform_disk.go +++ b/pkg/cloudbroker/disks/from_platform_disk.go @@ -27,12 +27,6 @@ type FromPlatformDiskRequest struct { // Required: true ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"` - // Binary architecture of this image - // Should be: - // - X86_64 - // Required: true - Architecture string `url:"architecture" json:"architecture" validate:"imageArchitecture"` - // Username for the image // Required: false Username string `url:"username,omitempty" json:"username,omitempty"` diff --git a/pkg/cloudbroker/extnet/create.go b/pkg/cloudbroker/extnet/create.go index 7ea42c3..0cfa90f 100644 --- a/pkg/cloudbroker/extnet/create.go +++ b/pkg/cloudbroker/extnet/create.go @@ -47,6 +47,11 @@ type CreateRequest struct { // Required: false 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 // Required: false NTP []string `url:"ntp,omitempty" json:"ntp,omitempty"` @@ -71,9 +76,13 @@ type CreateRequest struct { // Required: false 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 - VNFDevIP string `url:"vnfdevIP,omitempty" json:"vnfdevIP,omitempty"` + SecVNFDevIP string `url:"secVnfdevIP,omitempty" json:"secVnfdevIP,omitempty"` // Number of pre created reservations // Required: false @@ -86,6 +95,15 @@ type CreateRequest struct { // List of static routes, each item must have destination, netmask, and gateway fields // Required: false Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` + + // High Availability mode is enabled, default False + // Required: false + // Default: false + HAMode bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"` } type wrapperCreateRequest struct { diff --git a/pkg/cloudbroker/extnet/device_migrate.go b/pkg/cloudbroker/extnet/device_migrate.go index d7fcbd2..a2653c9 100644 --- a/pkg/cloudbroker/extnet/device_migrate.go +++ b/pkg/cloudbroker/extnet/device_migrate.go @@ -17,6 +17,11 @@ type DeviceMigrateRequest struct { // Target stack ID to migrate to // Required: false 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 diff --git a/pkg/cloudbroker/extnet/filter_test.go b/pkg/cloudbroker/extnet/filter_test.go index e92a0b3..4dcb212 100644 --- a/pkg/cloudbroker/extnet/filter_test.go +++ b/pkg/cloudbroker/extnet/filter_test.go @@ -18,7 +18,7 @@ var extnets = ListExtNet{ IPCIDR: "176.118.164.0/24", Milestones: 1355466, Name: "176.118.164.0/24", - NetworkID: 0, + NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0}, OVSBridge: "", PreReservationsNum: 0, PriVNFDevID: 0, @@ -41,7 +41,7 @@ var extnets = ListExtNet{ IPCIDR: "45.134.255.0/24", Milestones: 2135543, Name: "45.134.255.0/24", - NetworkID: 0, + NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0}, OVSBridge: "", PreReservationsNum: 0, PriVNFDevID: 0, @@ -64,7 +64,7 @@ var extnets = ListExtNet{ IPCIDR: "88.218.249.0/24", Milestones: 1232134, Name: "88.218.249.0/24", - NetworkID: 0, + NetworkIDs: NetworkIDs{Primary: 10, Secondary: 0}, OVSBridge: "", PreReservationsNum: 0, PriVNFDevID: 0, diff --git a/pkg/cloudbroker/extnet/migrate_to_zone.go b/pkg/cloudbroker/extnet/migrate_to_zone.go new file mode 100644 index 0000000..d98b1f6 --- /dev/null +++ b/pkg/cloudbroker/extnet/migrate_to_zone.go @@ -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 +} diff --git a/pkg/cloudbroker/extnet/models.go b/pkg/cloudbroker/extnet/models.go index 645b5d4..fcc44b9 100644 --- a/pkg/cloudbroker/extnet/models.go +++ b/pkg/cloudbroker/extnet/models.go @@ -91,11 +91,14 @@ type ItemExtNet struct { // Milestones Milestones uint64 `json:"milestones"` + // MTU + MTU uint64 `json:"mtu"` + // Name Name string `json:"name"` - // Network ID - NetworkID uint64 `json:"networkId"` + // Network IDs + NetworkIDs NetworkIDs `json:"networkIds"` // OVSBridge OVSBridge string `json:"ovsBridge"` @@ -106,6 +109,12 @@ type ItemExtNet struct { // PriVNFDevID PriVNFDevID uint64 `json:"priVnfDevId"` + // Redundant + Redundant bool `json:"redundant"` + + // SecVnfDevId + SecVNFDevID uint64 `json:"secVnfDevId"` + // List of shared with SharedWith []interface{} `json:"sharedWith"` @@ -117,6 +126,9 @@ type ItemExtNet struct { // VNFs VNFs VNFs `json:"vnfs"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // List external networks @@ -175,14 +187,17 @@ type RecordExtNet struct { // Milestones Milestones uint64 `json:"milestones"` + // MTU + MTU uint64 `json:"mtu"` + // Name Name string `json:"name"` // Network Network string `json:"network"` - // Network ID - NetworkID uint64 `json:"networkId"` + // Network IDs + NetworkIDs NetworkIDs `json:"networkIds"` // NTP NTP []string `json:"ntp"` @@ -199,9 +214,18 @@ type RecordExtNet struct { // PriVNFDevID PriVNFDevID uint64 `json:"priVnfDevId"` + // Redundant + Redundant bool `json:"redundant"` + + // SecVnfDevId + SecVNFDevID uint64 `json:"secVnfDevId"` + // List reservations Reservations ListReservations `json:"reservations"` + // List pre-reservations + PreReservations ListReservations `json:"pre-reservations"` + // List of shared with SharedWith []interface{} `json:"sharedWith"` @@ -213,6 +237,17 @@ type RecordExtNet struct { // VNFs VNFs VNFs `json:"vnfs"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` +} + +type NetworkIDs struct { + // Primary + Primary uint64 `json:"primary"` + + // Secondary + Secondary uint64 `json:"secondary"` } // List of static routes diff --git a/pkg/cloudbroker/extnet/set_highly_available.go b/pkg/cloudbroker/extnet/set_highly_available.go new file mode 100644 index 0000000..a869cb7 --- /dev/null +++ b/pkg/cloudbroker/extnet/set_highly_available.go @@ -0,0 +1,42 @@ +package extnet + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// SetHAModeRequest struct to set HA mode for external network +type SetHAModeRequest struct { + // ID of external network + // Required: true + NetID uint64 `url:"net_id" json:"net_id" validate:"required"` + + // HA Mode + // Required: true + HAMode bool `url:"highly_available" json:"highly_available" validate:"required"` +} + +// SetHAMode set HA mode for external network +func (e ExtNet) SetHAMode(ctx context.Context, req SetHAModeRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/extnet/set_highly_available" + + 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 +} diff --git a/pkg/cloudbroker/extnet/update.go b/pkg/cloudbroker/extnet/update.go index e1c7aac..7c35cb0 100644 --- a/pkg/cloudbroker/extnet/update.go +++ b/pkg/cloudbroker/extnet/update.go @@ -21,6 +21,11 @@ type UpdateRequest struct { // New external network description // Required: false Description string `url:"desc,omitempty" json:"desc,omitempty"` + + // Maximum transmission unit + // Default: 1500 + // Required: false + MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty"` } // Update updates external network parameters diff --git a/pkg/cloudbroker/flipgroup/create.go b/pkg/cloudbroker/flipgroup/create.go index f232dab..ee3690d 100644 --- a/pkg/cloudbroker/flipgroup/create.go +++ b/pkg/cloudbroker/flipgroup/create.go @@ -32,8 +32,9 @@ type CreateRequest struct { // Type of client // - 'compute' // - 'vins' (will be later) - // Required: true - ClientType string `url:"clientType" json:"clientType" validate:"flipgroupClientType"` + // Required: false + // Default: "compute" + ClientType string `url:"clientType,omitempty" json:"clientType,omitempty"` // IP address to associate with this group. If empty, the platform will autoselect IP address // Required: false diff --git a/pkg/cloudbroker/grid/models.go b/pkg/cloudbroker/grid/models.go index 1e78e81..9f5a6ed 100644 --- a/pkg/cloudbroker/grid/models.go +++ b/pkg/cloudbroker/grid/models.go @@ -93,6 +93,12 @@ type RecordGrid struct { // Name Name string `json:"name"` + + // Network modes + NetworkModes []string `json:"network_modes"` + + // SDN support + SDNSupport bool `json:"sdn_support"` } // Information about grid @@ -120,6 +126,12 @@ type ItemGridList struct { // Name Name string `json:"name"` + + // Network modes + NetworkModes []string `json:"network_modes"` + + // SDN support + SDNSupport bool `json:"sdn_support"` } // List Grids diff --git a/pkg/cloudbroker/image/create_cdrom_image.go b/pkg/cloudbroker/image/create_cdrom_image.go index a469be8..b7946af 100644 --- a/pkg/cloudbroker/image/create_cdrom_image.go +++ b/pkg/cloudbroker/image/create_cdrom_image.go @@ -38,12 +38,6 @@ type CreateCDROMImageRequest struct { // Required: false PasswordDl string `url:"passwordDL,omitempty" json:"passwordDL,omitempty"` - // Binary architecture of this image - // Should be one of: - // - X86_64 - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"` - // List of types of compute suitable for image. // Example: [ "KVM_X86" ] // Required: false diff --git a/pkg/cloudbroker/image/create_image.go b/pkg/cloudbroker/image/create_image.go index f150e8d..050f99d 100644 --- a/pkg/cloudbroker/image/create_image.go +++ b/pkg/cloudbroker/image/create_image.go @@ -2,6 +2,7 @@ package image import ( "context" + "encoding/json" "net/http" "strconv" @@ -72,12 +73,6 @@ type CreateRequest struct { // Required: false PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"` - // Binary architecture of this image - // Should be one of: - // - X86_64 - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"` - // List of types of compute suitable for image // Example: [ "KVM_X86" ] // Required: required @@ -88,6 +83,11 @@ type CreateRequest struct { Bootable bool `url:"bootable,omitempty" json:"bootable,omitempty"` } +type asyncWrapperCreateRequest struct { + CreateRequest + AsyncMode bool `url:"asyncMode"` +} + // CreateImage creates image from a media identified by URL func (i Image) CreateImage(ctx context.Context, req CreateRequest) (uint64, error) { err := validators.ValidateRequest(req) @@ -109,3 +109,29 @@ func (i Image) CreateImage(ctx context.Context, req CreateRequest) (uint64, erro return result, nil } + +// AsyncCreate creates image from a media identified by URL in async mode +func (i Image) AsyncCreateImage(ctx context.Context, req CreateRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/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 +} diff --git a/pkg/cloudbroker/image/list.go b/pkg/cloudbroker/image/list.go index b3291b7..8396c3a 100644 --- a/pkg/cloudbroker/image/list.go +++ b/pkg/cloudbroker/image/list.go @@ -26,10 +26,6 @@ type ListRequest struct { // Required: false Status string `url:"status,omitempty" json:"status,omitempty"` - // Find by architecture - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"` - // Find by type // Required: false TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"` diff --git a/pkg/cloudbroker/image/models.go b/pkg/cloudbroker/image/models.go index 6ace868..fd4aaa8 100644 --- a/pkg/cloudbroker/image/models.go +++ b/pkg/cloudbroker/image/models.go @@ -331,9 +331,6 @@ type ItemListStacks struct { // CKey CKey string `json:"_ckey"` - // Meta - Meta []interface{} `json:"_meta"` - // API URL APIURL string `json:"apiUrl"` diff --git a/pkg/cloudbroker/image/sync_create_image.go b/pkg/cloudbroker/image/sync_create_image.go deleted file mode 100644 index 6eb91ef..0000000 --- a/pkg/cloudbroker/image/sync_create_image.go +++ /dev/null @@ -1,111 +0,0 @@ -package image - -import ( - "context" - "net/http" - "strconv" - - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" -) - -// SyncCreateRequest struct to sync create image -type SyncCreateRequest struct { - // Name of the rescue disk - // Required: true - Name string `url:"name" json:"name" validate:"required"` - - // URL where to download media from - // Required: true - URL string `url:"url" json:"url" validate:"required"` - - // Boot type of image - // Should be one of: - // - bios - // - UEFI - // Required: true - BootType string `url:"boottype" json:"boottype" validate:"required,imageBootType"` - - // Image type - // Should be one of: - // - linux - // - windows - // - or other - // Required: true - ImageType string `url:"imagetype" json:"imagetype" validate:"required,imageType"` - - // Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming - // Should be: - // - eth - // - ens (default value) - // Required: false - NetworkInterfaceNaming string `url:"networkInterfaceNaming,omitempty" json:"networkInterfaceNaming,omitempty" validate:"omitempty,networkInterfaceNaming"` - - // Does this machine supports hot resize - // Required: false - HotResize bool `url:"hotresize,omitempty" json:"hotresize,omitempty"` - - // Optional username for the image - // Required: false - Username string `url:"username,omitempty" json:"username,omitempty"` - - // Optional password for the image - // Required: false - Password string `url:"password,omitempty" json:"password,omitempty"` - - // Account ID to make the image exclusive - // Required: false - AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` - - // Username for upload binary media - // Required: false - UsernameDL string `url:"usernameDL,omitempty" json:"usernameDL,omitempty"` - - // Password for upload binary media - // Required: false - PasswordDL string `url:"passwordDL,omitempty" json:"passwordDL,omitempty"` - - // Storage endpoint provider ID - // Required: false - SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"` - - // Pool for image create - // Required: false - PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"` - - // Binary architecture of this image - // Should be one of: - // - X86_64 - // Required: false - Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"` - - // List of types of compute suitable for image - // Example: [ "KVM_X86" ] - // Required: true - Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"` - - // Bootable image or not - // Required: false - Bootable bool `url:"bootable,omitempty" json:"bootable,omitempty"` -} - -// SyncCreate creates image from a media identified by URL (in synchronous mode) -func (i Image) SyncCreate(ctx context.Context, req SyncCreateRequest) (uint64, error) { - err := validators.ValidateRequest(req) - if err != nil { - return 0, validators.ValidationErrors(validators.GetErrors(err)) - } - - url := "/cloudbroker/image/syncCreateImage" - - res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req) - if err != nil { - return 0, err - } - - result, err := strconv.ParseUint(string(res), 10, 64) - if err != nil { - return 0, err - } - - return result, nil -} diff --git a/pkg/cloudbroker/k8s/create.go b/pkg/cloudbroker/k8s/create.go index 0a44290..c30cf81 100644 --- a/pkg/cloudbroker/k8s/create.go +++ b/pkg/cloudbroker/k8s/create.go @@ -168,6 +168,10 @@ type CreateRequest struct { // Type of the emulated system, Q35 or i440fx // Required: false Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM values diff --git a/pkg/cloudbroker/k8s/migrate_to_zone.go b/pkg/cloudbroker/k8s/migrate_to_zone.go new file mode 100644 index 0000000..00b6c64 --- /dev/null +++ b/pkg/cloudbroker/k8s/migrate_to_zone.go @@ -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 := "/cloudbroker/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 +} diff --git a/pkg/cloudbroker/k8s/models.go b/pkg/cloudbroker/k8s/models.go index ec180c1..f3d5fbe 100644 --- a/pkg/cloudbroker/k8s/models.go +++ b/pkg/cloudbroker/k8s/models.go @@ -139,6 +139,9 @@ type RecordK8S struct { // With LB WithLB bool `json:"withLB"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Detailed info about address of the Virtual Internet Protocol @@ -307,6 +310,9 @@ type ItemK8S struct { // List workers WorkersGroup ListK8SGroup `json:"workersGroups"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Service account diff --git a/pkg/cloudbroker/kvmx86/create.go b/pkg/cloudbroker/kvmx86/create.go index d7647f6..473fae4 100644 --- a/pkg/cloudbroker/kvmx86/create.go +++ b/pkg/cloudbroker/kvmx86/create.go @@ -16,6 +16,9 @@ type Interface struct { // - EXTNET // - VFNIC // - DPDK + // - EMPTY + // - SDN + // - TRUNK NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"` // Network ID for connect to, @@ -35,6 +38,10 @@ type Interface struct { // MAC address to assign to this VM when connecting to the specified network // Required: false MAC string `url:"mac,omitempty" json:"mac,omitempty" validate:"omitempty"` + + // SDN interface id + // Required: false + SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty"` } // DataDisk detailed struct for DataDisks field in CreateRequest, CreateBlankRequest and MassCreateRequest @@ -176,6 +183,10 @@ type CreateRequest struct { // Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False // Required: false PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM field values diff --git a/pkg/cloudbroker/kvmx86/create_blank.go b/pkg/cloudbroker/kvmx86/create_blank.go index a7261fe..49fd0e0 100644 --- a/pkg/cloudbroker/kvmx86/create_blank.go +++ b/pkg/cloudbroker/kvmx86/create_blank.go @@ -88,6 +88,10 @@ type CreateBlankRequest struct { // Does this machine supports hot resize // Required: false HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } // GetRAM returns RAM field values diff --git a/pkg/cloudbroker/kvmx86/mass_create.go b/pkg/cloudbroker/kvmx86/mass_create.go index 2fddda5..4f34fe8 100644 --- a/pkg/cloudbroker/kvmx86/mass_create.go +++ b/pkg/cloudbroker/kvmx86/mass_create.go @@ -79,6 +79,10 @@ type MassCreateRequest struct { // Type of the emulated system, Q35 or i440fx // Required: false Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type asyncWrapperMassCreateRequest struct { diff --git a/pkg/cloudbroker/lb/create.go b/pkg/cloudbroker/lb/create.go index 046652a..13d9055 100644 --- a/pkg/cloudbroker/lb/create.go +++ b/pkg/cloudbroker/lb/create.go @@ -44,6 +44,10 @@ type CreateRequest struct { // Text description of this load balancer // Required: false Description string `url:"desc,omitempty" json:"desc,omitempty"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequest struct { diff --git a/pkg/cloudbroker/lb/migrate_to_zone.go b/pkg/cloudbroker/lb/migrate_to_zone.go new file mode 100644 index 0000000..57aada1 --- /dev/null +++ b/pkg/cloudbroker/lb/migrate_to_zone.go @@ -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 := "/cloudbroker/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 +} diff --git a/pkg/cloudbroker/lb/models.go b/pkg/cloudbroker/lb/models.go index 11382cd..c4d41f1 100644 --- a/pkg/cloudbroker/lb/models.go +++ b/pkg/cloudbroker/lb/models.go @@ -153,6 +153,9 @@ type RecordLB struct { // Meta Meta []interface{} `json:"_meta"` + //Account ID + AccountID uint64 `json:"accountId"` + // Access Control List ACL interface{} `json:"acl"` @@ -220,7 +223,7 @@ type RecordLB struct { Status string `json:"status"` // Sysctl Params - SysctlParams interface{} `json:"sysctlParams"` + SysctlParams map[string]string `json:"sysctlParams"` // Tech status TechStatus string `json:"techStatus"` @@ -230,6 +233,9 @@ type RecordLB struct { // VINS ID VINSID uint64 `json:"vinsId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Detailed information about load balancer in List @@ -316,7 +322,7 @@ type ItemLBList struct { Status string `json:"status"` // Sysctl Params - SysctlParams interface{} `json:"sysctlParams"` + SysctlParams map[string]string `json:"sysctlParams"` // Tech status TechStatus string `json:"techStatus"` @@ -332,4 +338,7 @@ type ItemLBList struct { // VINS ID VINSID uint64 `json:"vinsId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } diff --git a/pkg/cloudbroker/node/apply_ipmi_action.go b/pkg/cloudbroker/node/apply_ipmi_action.go index 5408710..d239435 100644 --- a/pkg/cloudbroker/node/apply_ipmi_action.go +++ b/pkg/cloudbroker/node/apply_ipmi_action.go @@ -14,7 +14,7 @@ type ApplyIpmiActionRequest struct { NID uint64 `url:"nid" json:"nid" validate:"required"` // Action - // on of actions power_on shutdown force_shutdown reboot + // Available values : is_powered, power_on, shutdown, force_shutdown, reboot. // Required: true Action string `url:"action" json:"action" validate:"required,action"` } diff --git a/pkg/cloudbroker/node/models.go b/pkg/cloudbroker/node/models.go index 6f4c5cf..b4c9dd5 100644 --- a/pkg/cloudbroker/node/models.go +++ b/pkg/cloudbroker/node/models.go @@ -73,6 +73,9 @@ type RecordNode struct { // Version Version string `json:"version"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Resource consumption of the node @@ -227,6 +230,9 @@ type ItemNode struct { // Roles Roles []string `json:"roles"` + // SDN Hypervisor Name + SDNHypervisorName string `json:"sdn_hypervisor_name"` + // Seps Seps []uint64 `json:"seps"` @@ -253,6 +259,9 @@ type ItemNode struct { // Version Version string `json:"version"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Numa Topology Info diff --git a/pkg/cloudbroker/rg/create.go b/pkg/cloudbroker/rg/create.go index f1e1531..2181876 100644 --- a/pkg/cloudbroker/rg/create.go +++ b/pkg/cloudbroker/rg/create.go @@ -73,9 +73,13 @@ type CreateRequest struct { UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"` // Advanced compute features, - // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac + // one of: hugepages, numa, cpupin, vfnic, dpdk, changemac, trunk // Required: false ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"` + + // SDN access group id + // Required: false + SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"` } // Create creates resource group diff --git a/pkg/cloudbroker/rg/mass_delete.go b/pkg/cloudbroker/rg/mass_delete.go index b0b6b8b..758f92a 100644 --- a/pkg/cloudbroker/rg/mass_delete.go +++ b/pkg/cloudbroker/rg/mass_delete.go @@ -26,18 +26,18 @@ type MassDeleteRequest struct { } // MassDelete starts jobs to delete several resource groups -func (r RG) MassDelete(ctx context.Context, req MassDeleteRequest) (bool, error) { +func (r RG) MassDelete(ctx context.Context, req MassDeleteRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/rg/massDelete" - _, err = r.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/rg/mass_disable.go b/pkg/cloudbroker/rg/mass_disable.go index 000dc66..49cd63a 100644 --- a/pkg/cloudbroker/rg/mass_disable.go +++ b/pkg/cloudbroker/rg/mass_disable.go @@ -15,18 +15,18 @@ type MassDisableRequest struct { } // MassDisable start jobs to disable several resource groups -func (r RG) MassDisable(ctx context.Context, req MassDisableRequest) (bool, error) { +func (r RG) MassDisable(ctx context.Context, req MassDisableRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/rg/massDisable" - _, err = r.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/rg/mass_enable.go b/pkg/cloudbroker/rg/mass_enable.go index e178e6a..a1f49f4 100644 --- a/pkg/cloudbroker/rg/mass_enable.go +++ b/pkg/cloudbroker/rg/mass_enable.go @@ -15,18 +15,18 @@ type MassEnableRequest struct { } // MassEnable start jobs to enable several resource groups -func (r RG) MassEnable(ctx context.Context, req MassEnableRequest) (bool, error) { +func (r RG) MassEnable(ctx context.Context, req MassEnableRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/rg/massEnable" - _, err = r.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - return true, nil + return string(res), nil } diff --git a/pkg/cloudbroker/rg/models.go b/pkg/cloudbroker/rg/models.go index c09ea4e..fa5798d 100644 --- a/pkg/cloudbroker/rg/models.go +++ b/pkg/cloudbroker/rg/models.go @@ -202,6 +202,9 @@ type ItemRG struct { // Resource types list ResTypes []string `json:"resourceTypes"` + // SDN access group id + SDNAccessGroupID string `json:"sdn_access_group_id"` + // Secret Secret string `json:"secret"` diff --git a/pkg/cloudbroker/tasks/models.go b/pkg/cloudbroker/tasks/models.go index f2cbd13..43b7c17 100644 --- a/pkg/cloudbroker/tasks/models.go +++ b/pkg/cloudbroker/tasks/models.go @@ -28,9 +28,6 @@ type ItemTask struct { // Error Error string `json:"error"` - // GUID - GUID string `json:"guid"` - // List of logs Log []string `json:"log"` diff --git a/pkg/cloudbroker/trunk.go b/pkg/cloudbroker/trunk.go new file mode 100644 index 0000000..2d0f377 --- /dev/null +++ b/pkg/cloudbroker/trunk.go @@ -0,0 +1,10 @@ +package cloudbroker + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk" +) + +// Accessing the Trunk method group +func (cb *CloudBroker) Trunk() *trunk.Trunk { + return trunk.New(cb.client) +} diff --git a/pkg/cloudbroker/trunk/access_grant.go b/pkg/cloudbroker/trunk/access_grant.go new file mode 100644 index 0000000..2f1b1ab --- /dev/null +++ b/pkg/cloudbroker/trunk/access_grant.go @@ -0,0 +1,42 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AccessGrant struct to grant access to a trunk to some accounts +type AccessGrantRequest struct { + // ID of the trunk to disable + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` + + // IDs of the accounts to grant access to + // Required: true + AccountIDs []uint64 `url:"account_ids" json:"account_ids" validate:"required"` +} + +// AccessGrant grants access to a trunk +func (t Trunk) AccessGrant(ctx context.Context, req AccessGrantRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/access_grant" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/trunk/access_revoke.go b/pkg/cloudbroker/trunk/access_revoke.go new file mode 100644 index 0000000..6efa86e --- /dev/null +++ b/pkg/cloudbroker/trunk/access_revoke.go @@ -0,0 +1,42 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AccessRevoke struct to grant access to a trunk to some accounts +type AccessRevokeRequest struct { + // ID of the trunk to disable + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` + + // IDs of the accounts to revoke access from + // Required: true + AccountIDs []uint64 `url:"account_ids" json:"account_ids" validate:"required"` +} + +// AccessRevoke revokes access to a trunk from accounts +func (t Trunk) AccessRevoke(ctx context.Context, req AccessRevokeRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/access_revoke" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/trunk/create.go b/pkg/cloudbroker/trunk/create.go new file mode 100644 index 0000000..4985187 --- /dev/null +++ b/pkg/cloudbroker/trunk/create.go @@ -0,0 +1,58 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// CreateRequest struct to create a trunk +type CreateRequest struct { + // Name of the trunk + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // List of trunk tags (values between 1-4095) + // Required: true + TrunkTags string `url:"trunk_tags" json:"trunk_tags" validate:"required,trunkTags"` + + // OVS bridge name + // Required: true + OVSBridge string `url:"ovs_bridge" json:"ovs_bridge" validate:"required"` + + // Description of the trunk + // Required: false + Description string `url:"description,omitempty" json:"description,omitempty"` + + // List of account IDs with access to this trunk + // Required: false + AccountIDs []uint64 `url:"account_ids,omitempty" json:"account_ids,omitempty"` + + // Native VLAN ID + // Required: false + NativeVLANID uint64 `url:"native_vlan_id,omitempty" json:"native_vlan_id,omitempty"` +} + +// Create creates a user. +func (t Trunk) Create(ctx context.Context, req CreateRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + return 0, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/create" + + res, err := t.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return 0, err + } + + result, err := strconv.ParseUint(string(res), 10, 64) + if err != nil { + return 0, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/trunk/destroy.go b/pkg/cloudbroker/trunk/destroy.go new file mode 100644 index 0000000..b41cca3 --- /dev/null +++ b/pkg/cloudbroker/trunk/destroy.go @@ -0,0 +1,38 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DestroyRequest struct to destroy a trunk +type DestroyRequest struct { + // ID of the trunk to destroy + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` +} + +// Destroy destroys a trunk +func (t Trunk) Destroy(ctx context.Context, req DestroyRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/destroy" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/trunk/disable.go b/pkg/cloudbroker/trunk/disable.go new file mode 100644 index 0000000..5ced481 --- /dev/null +++ b/pkg/cloudbroker/trunk/disable.go @@ -0,0 +1,38 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DisableRequest struct to disable a trunk +type DisableRequest struct { + // ID of the trunk to disable + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` +} + +// Disable disables a trunk by ID +func (t Trunk) Disable(ctx context.Context, req DisableRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/disable" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/trunk/enable.go b/pkg/cloudbroker/trunk/enable.go new file mode 100644 index 0000000..11582c8 --- /dev/null +++ b/pkg/cloudbroker/trunk/enable.go @@ -0,0 +1,38 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// EnableRequest struct to enable a trunk +type EnableRequest struct { + // ID of the trunk to enable + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` +} + +// Enable enables a trunk +func (t Trunk) Enable(ctx context.Context, req EnableRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/enable" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/trunk/get.go b/pkg/cloudbroker/trunk/get.go new file mode 100644 index 0000000..39c4ce7 --- /dev/null +++ b/pkg/cloudbroker/trunk/get.go @@ -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 := "/cloudbroker/trunk/get" + + res, err := t.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudbroker/trunk/list.go b/pkg/cloudbroker/trunk/list.go new file mode 100644 index 0000000..da75c08 --- /dev/null +++ b/pkg/cloudbroker/trunk/list.go @@ -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 ± + 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 := "/cloudbroker/trunk/list" + + res, err := t.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudbroker/trunk/models.go b/pkg/cloudbroker/trunk/models.go new file mode 100644 index 0000000..de7742a --- /dev/null +++ b/pkg/cloudbroker/trunk/models.go @@ -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"` +} diff --git a/pkg/cloudbroker/trunk/trunk.go b/pkg/cloudbroker/trunk/trunk.go new file mode 100644 index 0000000..079b5d0 --- /dev/null +++ b/pkg/cloudbroker/trunk/trunk.go @@ -0,0 +1,17 @@ +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, + } +} diff --git a/pkg/cloudbroker/trunk/update.go b/pkg/cloudbroker/trunk/update.go new file mode 100644 index 0000000..8258971 --- /dev/null +++ b/pkg/cloudbroker/trunk/update.go @@ -0,0 +1,54 @@ +package trunk + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// UpdateRequest struct to update a trunk +type UpdateRequest struct { + // ID of the trunk to update + // Required: true + TrunkID uint64 `url:"id" json:"id" validate:"required"` + + // New name of the trunk + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // List of trunk tags (values between 1-4095) + // Required: true + TrunkTags string `url:"trunk_tags" json:"trunk_tags" validate:"required,trunkTags"` + + // New description of the trunk + // Required: false + Description string `url:"description,omitempty" json:"description,omitempty"` + + // New native VLAN ID + // Required: false + NativeVLANID uint64 `url:"native_vlan_id,omitempty" json:"native_vlan_id,omitempty"` +} + +// Update updates a trunk +func (t Trunk) Update(ctx context.Context, req UpdateRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/trunk/update" + + res, err := t.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 +} diff --git a/pkg/cloudbroker/user/block.go b/pkg/cloudbroker/user/block.go new file mode 100644 index 0000000..bc02bb4 --- /dev/null +++ b/pkg/cloudbroker/user/block.go @@ -0,0 +1,38 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// BlockRequest struct to block a user. +type BlockRequest struct { + // ID of the user to block. + // Required: true + UserID string `url:"user_id" json:"user_id" validate:"required"` +} + +// Block blocks a user +func (u User) Block(ctx context.Context, req BlockRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/user/block" + + res, err := u.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 +} diff --git a/pkg/cloudbroker/user/create.go b/pkg/cloudbroker/user/create.go index a3f4e48..c3b9383 100644 --- a/pkg/cloudbroker/user/create.go +++ b/pkg/cloudbroker/user/create.go @@ -20,15 +20,17 @@ type CreateRequest struct { // Password of user // Required: false + // Default: strongpassword Password string `url:"password,omitempty" json:"password,omitempty"` - // List of groups this user belongs to. - // Required: false - Groups []string `url:"groups,omitempty" json:"groups,omitempty"` - // List of apiaccess groups this user belongs to. // Required: false APIAccess []uint64 `url:"apiaccess,omitempty" json:"apiaccess,omitempty"` + + // Provider of user + // one of: bvs, decs3o + // Required: false + Provider string `url:"provider,omitempty" json:"provider,omitempty" validate:"omitempty,userProvider"` } // Create creates a user. diff --git a/pkg/cloudbroker/user/list.go b/pkg/cloudbroker/user/list.go index 493cf1f..53baa73 100644 --- a/pkg/cloudbroker/user/list.go +++ b/pkg/cloudbroker/user/list.go @@ -18,6 +18,10 @@ type ListRequest struct { // Required: false Active interface{} `url:"active,omitempty" json:"active,omitempty" validate:"omitempty,isBool"` + // Find by email. + // Required: false + Email string `url:"email,omitempty" json:"email,omitempty"` + // Find by serviceaccount. True or False. // Required: false ServiceAccount interface{} `url:"serviceaccount,omitempty" json:"serviceaccount,omitempty" validate:"omitempty,isBool"` diff --git a/pkg/cloudbroker/user/models.go b/pkg/cloudbroker/user/models.go index a928088..1c2cb47 100644 --- a/pkg/cloudbroker/user/models.go +++ b/pkg/cloudbroker/user/models.go @@ -21,6 +21,9 @@ type ItemUser struct { // AuthKeys AuthKeys []interface{} + // Blocked + Blocked bool `json:"blocked"` + // Data Data string `json:"data"` diff --git a/pkg/cloudbroker/user/unblock.go b/pkg/cloudbroker/user/unblock.go new file mode 100644 index 0000000..593f36c --- /dev/null +++ b/pkg/cloudbroker/user/unblock.go @@ -0,0 +1,38 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// UnblockRequest struct to block a user. +type UnblockRequest struct { + // ID of the user to block. + // Required: true + UserID string `url:"user_id" json:"user_id" validate:"required"` +} + +// Unblock unblocks a user +func (u User) Unblock(ctx context.Context, req UnblockRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/user/unblock" + + res, err := u.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 +} diff --git a/pkg/cloudbroker/vins/create_in_account.go b/pkg/cloudbroker/vins/create_in_account.go index eb7387a..b1e6e44 100644 --- a/pkg/cloudbroker/vins/create_in_account.go +++ b/pkg/cloudbroker/vins/create_in_account.go @@ -53,6 +53,10 @@ type CreateInAccountRequest struct { // List of static routes, each item must have destination, netmask, and gateway fields // Required: false Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequestInAcc struct { diff --git a/pkg/cloudbroker/vins/create_in_rg.go b/pkg/cloudbroker/vins/create_in_rg.go index 7a01e85..f6f3c62 100644 --- a/pkg/cloudbroker/vins/create_in_rg.go +++ b/pkg/cloudbroker/vins/create_in_rg.go @@ -47,6 +47,10 @@ type CreateInRGRequest struct { // List of static routes, each item must have destination, netmask, and gateway fields // Required: false Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"` + + // Zone ID + // Required: false + ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"` } type wrapperCreateRequestInRG struct { diff --git a/pkg/cloudbroker/vins/migrate_to_zone.go b/pkg/cloudbroker/vins/migrate_to_zone.go new file mode 100644 index 0000000..99a2059 --- /dev/null +++ b/pkg/cloudbroker/vins/migrate_to_zone.go @@ -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 := "/cloudbroker/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 +} diff --git a/pkg/cloudbroker/vins/models.go b/pkg/cloudbroker/vins/models.go index 3e3a2be..16f3a81 100644 --- a/pkg/cloudbroker/vins/models.go +++ b/pkg/cloudbroker/vins/models.go @@ -158,6 +158,9 @@ type ItemInterface struct { // NodeID NodeID int64 `json:"nodeId"` + // SDNInterfaceID + SDNInterfaceID string `json:"sdn_interface_id"` + // PCI slot PCISlot int64 `json:"pciSlot"` @@ -567,6 +570,9 @@ type RecordVINS struct { // VXLAN ID VXLANID uint64 `json:"vxlanId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // Information about libvirt settings @@ -786,6 +792,9 @@ type ItemVINS struct { // VXLAN ID VXLANID uint64 `json:"vxlanId"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` } // List of VINS diff --git a/pkg/cloudbroker/zone.go b/pkg/cloudbroker/zone.go new file mode 100644 index 0000000..a43e226 --- /dev/null +++ b/pkg/cloudbroker/zone.go @@ -0,0 +1,10 @@ +package cloudbroker + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" +) + +// Accessing the Zone method group +func (ca *CloudBroker) Zone() *zone.Zone { + return zone.New(ca.client) +} diff --git a/pkg/cloudbroker/zone/add_node.go b/pkg/cloudbroker/zone/add_node.go new file mode 100644 index 0000000..8d2fc98 --- /dev/null +++ b/pkg/cloudbroker/zone/add_node.go @@ -0,0 +1,43 @@ +package zone + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AddNodeRequest struct to add node to zone +type AddNodeRequest struct { + // ID of zone + // Required: true + ID uint64 `url:"id" json:"id" validate:"required"` + + // List of node ids + // Required: true + NodeIDs []uint64 `url:"nodeIds" json:"nodeIds" validate:"required"` +} + +// AddNode add nodes to zone +func (e Zone) AddNode(ctx context.Context, req AddNodeRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/zone/addNode" + + 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 +} diff --git a/pkg/cloudbroker/zone/create.go b/pkg/cloudbroker/zone/create.go new file mode 100644 index 0000000..c4f9eb9 --- /dev/null +++ b/pkg/cloudbroker/zone/create.go @@ -0,0 +1,43 @@ +package zone + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// CreateRequest struct to create zone +type CreateRequest struct { + // Name of zone + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // Description + // Required: false + Description string `url:"description,omitempty" json:"description,omitempty"` +} + +// Create creates zone object +func (e Zone) Create(ctx context.Context, req CreateRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + return 0, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/zone/create" + + res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req) + + if err != nil { + return 0, err + } + + result, err := strconv.ParseUint(string(res), 10, 64) + if err != nil { + return 0, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/zone/del_node.go b/pkg/cloudbroker/zone/del_node.go new file mode 100644 index 0000000..a6a2ee4 --- /dev/null +++ b/pkg/cloudbroker/zone/del_node.go @@ -0,0 +1,43 @@ +package zone + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DelNodeRequest struct to remove node from zone +type DelNodeRequest struct { + // ID of zone + // Required: true + ID uint64 `url:"id" json:"id" validate:"required"` + + // List of node ids + // Required: true + NodeIDs []uint64 `url:"nodeIds" json:"nodeIds" validate:"required"` +} + +// DelNode remove nodes from zone +func (e Zone) DelNode(ctx context.Context, req DelNodeRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/zone/delNode" + + 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 +} diff --git a/pkg/cloudbroker/zone/delete.go b/pkg/cloudbroker/zone/delete.go new file mode 100644 index 0000000..3d64b00 --- /dev/null +++ b/pkg/cloudbroker/zone/delete.go @@ -0,0 +1,39 @@ +package zone + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteRequest struct to delete zone +type DeleteRequest struct { + // ID of zone + // Required: true + ID uint64 `url:"id" json:"id" validate:"required"` +} + +// Delete deletes zone object +func (e Zone) Delete(ctx context.Context, req DeleteRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/zone/delete" + + 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 +} diff --git a/pkg/cloudbroker/zone/filter.go b/pkg/cloudbroker/zone/filter.go new file mode 100644 index 0000000..ec55a7a --- /dev/null +++ b/pkg/cloudbroker/zone/filter.go @@ -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] +} diff --git a/pkg/cloudbroker/zone/filter_test.go b/pkg/cloudbroker/zone/filter_test.go new file mode 100644 index 0000000..5966796 --- /dev/null +++ b/pkg/cloudbroker/zone/filter_test.go @@ -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)) + } +} diff --git a/pkg/cloudbroker/zone/get.go b/pkg/cloudbroker/zone/get.go new file mode 100644 index 0000000..788770a --- /dev/null +++ b/pkg/cloudbroker/zone/get.go @@ -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 := "/cloudbroker/zone/get" + + res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/zone/ids.go b/pkg/cloudbroker/zone/ids.go new file mode 100644 index 0000000..33f6193 --- /dev/null +++ b/pkg/cloudbroker/zone/ids.go @@ -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 +} diff --git a/pkg/cloudbroker/zone/list.go b/pkg/cloudbroker/zone/list.go new file mode 100644 index 0000000..2b7d141 --- /dev/null +++ b/pkg/cloudbroker/zone/list.go @@ -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 := "/cloudbroker/zone/list" + + res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/zone/models.go b/pkg/cloudbroker/zone/models.go new file mode 100644 index 0000000..b2340ca --- /dev/null +++ b/pkg/cloudbroker/zone/models.go @@ -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"` +} diff --git a/pkg/cloudbroker/zone/serialize.go b/pkg/cloudbroker/zone/serialize.go new file mode 100644 index 0000000..5e22cf3 --- /dev/null +++ b/pkg/cloudbroker/zone/serialize.go @@ -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) +} diff --git a/pkg/cloudbroker/zone/update.go b/pkg/cloudbroker/zone/update.go new file mode 100644 index 0000000..c017ae7 --- /dev/null +++ b/pkg/cloudbroker/zone/update.go @@ -0,0 +1,47 @@ +package zone + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// UpdateRequest struct to update zone +type UpdateRequest struct { + // ID of zone + // Required: true + ID uint64 `url:"id" json:"id" validate:"required"` + + // Name of zone + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Description + // Required: false + Description string `url:"description,omitempty" json:"description,omitempty"` +} + +// Update updates zone object +func (e Zone) Update(ctx context.Context, req UpdateRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/zone/update" + + 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 +} diff --git a/pkg/cloudbroker/zone/zone.go b/pkg/cloudbroker/zone/zone.go new file mode 100644 index 0000000..f0605f5 --- /dev/null +++ b/pkg/cloudbroker/zone/zone.go @@ -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, + } +} diff --git a/tests/platform_upgrade/cloud_test.go b/tests/platform_upgrade/cloud_test.go index 6b01359..c14ca90 100644 --- a/tests/platform_upgrade/cloud_test.go +++ b/tests/platform_upgrade/cloud_test.go @@ -20,7 +20,10 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/sep" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/stack" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/tasks" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" + account_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account" audit_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/audit" bservice_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/bservice" @@ -39,7 +42,9 @@ import ( sep_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep" stack_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stack" tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks" + trunk_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk" vins_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins" + zone_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" ) // TestGetListCloudAPI tests platforms responses vs. json tags of golang structures in cloudapi get/list methods @@ -316,6 +321,26 @@ func TestGetListCloudAPI(t *testing.T) { t.Errorf("Can not test Tasks get because Tasks list is empty") } + // Trunk + // List + bytes, err = client.CloudAPI().Trunk().ListRaw(context.Background(), trunk.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("Trunk list", bytes, tasks.ListTasks{}, t) + // Get + listTrunk, _ := client.CloudAPI().Trunk().List(context.Background(), trunk.ListRequest{}) + if len(listTrunk.Data) > 0 { + id := listTrunk.Data[0].ID + bytes, err = client.CloudAPI().Trunk().GetRaw(context.Background(), trunk.GetRequest{TrunkID: id}) + if err != nil { + t.Error(err) + } + getResult("Trunk get", bytes, trunk.ItemTrunk{}, t) + } else { + t.Errorf("Can not test Trunk get because Trunk list is empty") + } + // VINS // List bytes, err = client.CloudAPI().VINS().ListRaw(context.Background(), vins.ListRequest{}) @@ -336,6 +361,25 @@ func TestGetListCloudAPI(t *testing.T) { t.Errorf("Can not test VINS get because VINS list is empty") } + // Zone + // List + bytes, err = client.CloudAPI().Zone().ListRaw(context.Background(), zone.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("Zone list", bytes, vins.ListVINS{}, t) + // Get + ListZones, _ := client.CloudAPI().Zone().List(context.Background(), zone.ListRequest{}) + if len(ListZones.Data) > 0 { + id := ListZones.Data[0].ID + bytes, err = client.CloudAPI().Zone().GetRaw(context.Background(), zone.GetRequest{ID: id}) + if err != nil { + t.Error(err) + } + getResult("Zone get", bytes, zone.RecordZone{}, t) + } else { + t.Errorf("Can not test Zone get because Zones list is empty") + } } // WARNING: not working correctly due to inclusions of tagless structures in cloudbroker @@ -348,6 +392,7 @@ func TestGetListCloudbroker(t *testing.T) { t.Fatalf("Cannot get client: %v", err) } + const logFileName = "test_get_list_cloudbroker.log" // Account // List bytes, err = client.CloudBroker().Account().ListRaw(context.Background(), account_cb.ListRequest{}) @@ -690,6 +735,26 @@ func TestGetListCloudbroker(t *testing.T) { } getResult("Tasks list", bytes, tasks_cb.ListTasks{}, t) + // Trunk + // List + bytes, err = client.CloudBroker().Trunk().ListRaw(context.Background(), trunk_cb.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("Trunk list", bytes, trunk_cb.ListTrunks{}, t) + // Get + listTrunks, _ := client.CloudBroker().Trunk().List(context.Background(), trunk_cb.ListRequest{}) + if len(listTrunks.Data) > 0 { + id := listTrunks.Data[0].ID + bytes, err = client.CloudBroker().Trunk().GetRaw(context.Background(), trunk_cb.GetRequest{TrunkID: id}) + if err != nil { + t.Error(err) + } + getResult("Trunk get", bytes, trunk_cb.ItemTrunk{}, t) + } else { + t.Errorf("Can not test Trunk get because Trunk list is empty") + } + // VINS // List bytes, err = client.CloudBroker().VINS().ListRaw(context.Background(), vins_cb.ListRequest{}) @@ -709,6 +774,26 @@ func TestGetListCloudbroker(t *testing.T) { } else { t.Errorf("Can not test VINS get because VINS list is empty") } + + // Zone + // List + bytes, err = client.CloudBroker().Zone().ListRaw(context.Background(), zone_cb.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("Zone list", bytes, zone.ListZones{}, t) + // Get + ListZones, _ := client.CloudBroker().Zone().List(context.Background(), zone_cb.ListRequest{}) + if len(ListZones.Data) > 0 { + id := ListZones.Data[0].ID + bytes, err = client.CloudBroker().Zone().GetRaw(context.Background(), zone_cb.GetRequest{ID: id}) + if err != nil { + t.Error(err) + } + getResult("Zone get", bytes, zone_cb.RecordZone{}, t) + } else { + t.Errorf("Can not test Zone get because Zones list is empty") + } } // TestRequestsCloudAPI tests platform requests vs. golang request structures in sdk for cloudapi requests diff --git a/tests/platform_upgrade/request_map.go b/tests/platform_upgrade/request_map.go index aa29c73..5526088 100644 --- a/tests/platform_upgrade/request_map.go +++ b/tests/platform_upgrade/request_map.go @@ -21,9 +21,11 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/sep" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/stack" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/tasks" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/user" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vfpool" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" account_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account" apiaccess_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/apiaccess" @@ -48,10 +50,12 @@ import ( sep_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep" stack_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stack" tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks" + trunk_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk" user_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/user" vfpool_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vfpool" vgpu_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vgpu" vins_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins" + zone_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" ) type EmptyStruct struct{} @@ -116,83 +120,91 @@ func getRequestsMapCloudAPI() map[string]interface{} { "/restmachine/cloudapi/bservice/stop": bservice.StopRequest{}, // compute - "/restmachine/cloudapi/compute/affinityLabelRemove": compute.AffinityLabelRemoveRequest{}, - "/restmachine/cloudapi/compute/affinityLabelSet": compute.AffinityLabelSetRequest{}, - "/restmachine/cloudapi/compute/affinityRelations": compute.AffinityRelationsRequest{}, - "/restmachine/cloudapi/compute/affinityRuleAdd": compute.AffinityRuleAddRequest{}, - "/restmachine/cloudapi/compute/affinityRuleRemove": compute.AffinityRuleRemoveRequest{}, - "/restmachine/cloudapi/compute/affinityRulesClear": compute.AffinityRulesClearRequest{}, - "/restmachine/cloudapi/compute/antiAffinityRuleAdd": compute.AntiAffinityRuleAddRequest{}, - "/restmachine/cloudapi/compute/antiAffinityRuleRemove": compute.AntiAffinityRuleRemoveRequest{}, - "/restmachine/cloudapi/compute/antiAffinityRulesClear": compute.AffinityRulesClearRequest{}, - "/restmachine/cloudapi/compute/attachGpu": compute.AttachGPURequest{}, - "/restmachine/cloudapi/compute/attachPciDevice": compute.AttachPCIDeviceRequest{}, - "/restmachine/cloudapi/compute/audits": compute.AuditsRequest{}, - "/restmachine/cloudapi/compute/bootDiskSet": compute.BootDiskSetRequest{}, - "/restmachine/cloudapi/compute/bootOrderGet": compute.BootOrderGetRequest{}, - "/restmachine/cloudapi/compute/bootOrderSet": compute.BootOrderSetRequest{}, - "/restmachine/cloudapi/compute/cdEject": compute.CDEjectRequest{}, - "/restmachine/cloudapi/compute/cdInsert": compute.CDInsertRequest{}, - "/restmachine/cloudapi/compute/changeLinkState": compute.ChangeLinkStateRequest{}, - "/restmachine/cloudapi/compute/clone": compute.CloneRequest{}, - "/restmachine/cloudapi/compute/createTemplate": compute.CreateTemplateRequest{}, - "/restmachine/cloudapi/compute/createTemplateFromBlank": compute.CreateTemplateFromBlankRequest{}, - "/restmachine/cloudapi/compute/delete": compute.DeleteRequest{}, - "/restmachine/cloudapi/compute/deleteCustomFields": compute.DeleteCustomFieldsRequest{}, - "/restmachine/cloudapi/compute/detachGpu": compute.DetachGPURequest{}, - "/restmachine/cloudapi/compute/detachPciDevice": compute.DetachPCIDeviceRequest{}, - "/restmachine/cloudapi/compute/disable": compute.DisableRequest{}, - "/restmachine/cloudapi/compute/diskAdd": compute.DiskAddRequest{}, - "/restmachine/cloudapi/compute/diskAttach": compute.DiskAttachRequest{}, - "/restmachine/cloudapi/compute/diskDel": compute.DiskDelRequest{}, - "/restmachine/cloudapi/compute/diskDetach": compute.DiskDetachRequest{}, - "/restmachine/cloudapi/compute/diskMigrate": compute.DiskMigrateRequest{}, - "/restmachine/cloudapi/compute/diskQos": compute.DiskQOSRequest{}, - "/restmachine/cloudapi/compute/diskSwitchToReplication": compute.DiskSwitchToReplicationRequest{}, - "/restmachine/cloudapi/compute/diskResize": compute.DiskResizeRequest{}, - "/restmachine/cloudapi/compute/enable": compute.EnableRequest{}, - "/restmachine/cloudapi/compute/get": compute.GetRequest{}, - "/restmachine/cloudapi/compute/getAudits": compute.GetAuditsRequest{}, - "/restmachine/cloudapi/compute/getConsoleUrl": compute.GetConsoleURLRequest{}, - "/restmachine/cloudapi/compute/getCustomFields": compute.GetCustomFieldsRequest{}, - "/restmachine/cloudapi/compute/getLog": compute.GetLogRequest{}, - "/restmachine/cloudapi/compute/list": compute.ListRequest{}, - "/restmachine/cloudapi/compute/listDeleted": compute.ListDeletedRequest{}, - "/restmachine/cloudapi/compute/listPciDevice": compute.ListPCIDeviceRequest{}, - "/restmachine/cloudapi/compute/listVGpu": compute.ListVGPURequest{}, - "/restmachine/cloudapi/compute/moveToRg": compute.MoveToRGRequest{}, - "/restmachine/cloudapi/compute/netAttach": compute.NetAttachRequest{}, - "/restmachine/cloudapi/compute/netDetach": compute.NetDetachRequest{}, - "/restmachine/cloudapi/compute/pfwAdd": compute.PFWAddRequest{}, - "/restmachine/cloudapi/compute/pfwDel": compute.PFWDelRequest{}, - "/restmachine/cloudapi/compute/pfwList": compute.PFWListRequest{}, - "/restmachine/cloudapi/compute/pause": compute.PauseRequest{}, - "/restmachine/cloudapi/compute/pinToStack": compute.PinToStackRequest{}, - "/restmachine/cloudapi/compute/powerCycle": compute.PowerCycleRequest{}, - "/restmachine/cloudapi/compute/reboot": compute.RebootRequest{}, - "/restmachine/cloudapi/compute/redeploy": compute.RedeployRequest{}, - "/restmachine/cloudapi/compute/reset": compute.ResetRequest{}, - "/restmachine/cloudapi/compute/resize": compute.ResizeRequest{}, - "/restmachine/cloudapi/compute/restore": compute.RestoreRequest{}, - "/restmachine/cloudapi/compute/resume": compute.ResumeRequest{}, - "/restmachine/cloudapi/compute/setCustomFields": compute.SetCustomFieldsRequest{}, - "/restmachine/cloudapi/compute/snapshotCreate": compute.SnapshotCreateRequest{}, - "/restmachine/cloudapi/compute/snapshotDelete": compute.SnapshotDeleteRequest{}, - "/restmachine/cloudapi/compute/snapshotList": compute.SnapshotListRequest{}, - "/restmachine/cloudapi/compute/snapshotRollback": compute.SnapshotRollbackRequest{}, - "/restmachine/cloudapi/compute/snapshotUsage": compute.SnapshotUsageRequest{}, - "/restmachine/cloudapi/compute/start": compute.StartRequest{}, - "/restmachine/cloudapi/compute/stop": compute.StopRequest{}, - "/restmachine/cloudapi/compute/tagAdd": compute.TagAddRequest{}, - "/restmachine/cloudapi/compute/tagRemove": compute.TagRemoveRequest{}, - "/restmachine/cloudapi/compute/unpinFromStack": compute.UnpinFromStackRequest{}, - "/restmachine/cloudapi/compute/update": compute.UpdateRequest{}, - "/restmachine/cloudapi/compute/userGrant": compute.UserGrantRequest{}, - "/restmachine/cloudapi/compute/userList": compute.UserListRequest{}, - "/restmachine/cloudapi/compute/userRevoke": compute.UserRevokeRequest{}, - "/restmachine/cloudapi/compute/userUpdate": compute.UserUpdateRequest{}, - "/restmachine/cloudapi/compute/changeMac": compute.ChangeMACRequest{}, - "/restmachine/cloudapi/compute/changeIp": compute.ChangeIPRequest{}, + "/restmachine/cloudapi/compute/abort_shared_snapshot_merge": compute.AbortSharedSnapshotMergeRequest{}, + "/restmachine/cloudapi/compute/shared_snapshot_merge_status": compute.SharedSnapshotMergeStatusRequest{}, + "/restmachine/cloudapi/compute/change_mtu": compute.ChangeMTURequest{}, + "/restmachine/cloudapi/compute/affinityLabelRemove": compute.AffinityLabelRemoveRequest{}, + "/restmachine/cloudapi/compute/affinityLabelSet": compute.AffinityLabelSetRequest{}, + "/restmachine/cloudapi/compute/affinityRelations": compute.AffinityRelationsRequest{}, + "/restmachine/cloudapi/compute/affinityRuleAdd": compute.AffinityRuleAddRequest{}, + "/restmachine/cloudapi/compute/affinityRuleRemove": compute.AffinityRuleRemoveRequest{}, + "/restmachine/cloudapi/compute/affinityRulesClear": compute.AffinityRulesClearRequest{}, + "/restmachine/cloudapi/compute/antiAffinityRuleAdd": compute.AntiAffinityRuleAddRequest{}, + "/restmachine/cloudapi/compute/antiAffinityRuleRemove": compute.AntiAffinityRuleRemoveRequest{}, + "/restmachine/cloudapi/compute/antiAffinityRulesClear": compute.AffinityRulesClearRequest{}, + "/restmachine/cloudapi/compute/attachGpu": compute.AttachGPURequest{}, + "/restmachine/cloudapi/compute/attachPciDevice": compute.AttachPCIDeviceRequest{}, + "/restmachine/cloudapi/compute/audits": compute.AuditsRequest{}, + "/restmachine/cloudapi/compute/bootDiskSet": compute.BootDiskSetRequest{}, + "/restmachine/cloudapi/compute/bootOrderGet": compute.BootOrderGetRequest{}, + "/restmachine/cloudapi/compute/bootOrderSet": compute.BootOrderSetRequest{}, + "/restmachine/cloudapi/compute/cdEject": compute.CDEjectRequest{}, + "/restmachine/cloudapi/compute/cdInsert": compute.CDInsertRequest{}, + "/restmachine/cloudapi/compute/changeLinkState": compute.ChangeLinkStateRequest{}, + "/restmachine/cloudapi/compute/clone": compute.CloneRequest{}, + "/restmachine/cloudapi/compute/createTemplate": compute.CreateTemplateRequest{}, + "/restmachine/cloudapi/compute/createTemplateFromBlank": compute.CreateTemplateFromBlankRequest{}, + "/restmachine/cloudapi/compute/delete": compute.DeleteRequest{}, + "/restmachine/cloudapi/compute/deleteCustomFields": compute.DeleteCustomFieldsRequest{}, + "/restmachine/cloudapi/compute/detachGpu": compute.DetachGPURequest{}, + "/restmachine/cloudapi/compute/detachPciDevice": compute.DetachPCIDeviceRequest{}, + "/restmachine/cloudapi/compute/disable": compute.DisableRequest{}, + "/restmachine/cloudapi/compute/diskAdd": compute.DiskAddRequest{}, + "/restmachine/cloudapi/compute/diskAttach": compute.DiskAttachRequest{}, + "/restmachine/cloudapi/compute/diskDel": compute.DiskDelRequest{}, + "/restmachine/cloudapi/compute/diskDetach": compute.DiskDetachRequest{}, + "/restmachine/cloudapi/compute/diskMigrate": compute.DiskMigrateRequest{}, + "/restmachine/cloudapi/compute/diskQos": compute.DiskQOSRequest{}, + "/restmachine/cloudapi/compute/diskSwitchToReplication": compute.DiskSwitchToReplicationRequest{}, + "/restmachine/cloudapi/compute/diskResize": compute.DiskResizeRequest{}, + "/restmachine/cloudapi/compute/enable": compute.EnableRequest{}, + "/restmachine/cloudapi/compute/get": compute.GetRequest{}, + "/restmachine/cloudapi/compute/getAudits": compute.GetAuditsRequest{}, + "/restmachine/cloudapi/compute/getConsoleUrl": compute.GetConsoleURLRequest{}, + "/restmachine/cloudapi/compute/getCustomFields": compute.GetCustomFieldsRequest{}, + "/restmachine/cloudapi/compute/getLog": compute.GetLogRequest{}, + "/restmachine/cloudapi/compute/list": compute.ListRequest{}, + "/restmachine/cloudapi/compute/listDeleted": compute.ListDeletedRequest{}, + "/restmachine/cloudapi/compute/listPciDevice": compute.ListPCIDeviceRequest{}, + "/restmachine/cloudapi/compute/listVGpu": compute.ListVGPURequest{}, + "/restmachine/cloudapi/compute/moveToRg": compute.MoveToRGRequest{}, + "/restmachine/cloudapi/compute/netAttach": compute.NetAttachRequest{}, + "/restmachine/cloudapi/compute/netDetach": compute.NetDetachRequest{}, + "/restmachine/cloudapi/compute/pfwAdd": compute.PFWAddRequest{}, + "/restmachine/cloudapi/compute/pfwDel": compute.PFWDelRequest{}, + "/restmachine/cloudapi/compute/pfwList": compute.PFWListRequest{}, + "/restmachine/cloudapi/compute/pause": compute.PauseRequest{}, + "/restmachine/cloudapi/compute/pinToStack": compute.PinToStackRequest{}, + "/restmachine/cloudapi/compute/powerCycle": compute.PowerCycleRequest{}, + "/restmachine/cloudapi/compute/reboot": compute.RebootRequest{}, + "/restmachine/cloudapi/compute/redeploy": compute.RedeployRequest{}, + "/restmachine/cloudapi/compute/reset": compute.ResetRequest{}, + "/restmachine/cloudapi/compute/resize": compute.ResizeRequest{}, + "/restmachine/cloudapi/compute/restore": compute.RestoreRequest{}, + "/restmachine/cloudapi/compute/resume": compute.ResumeRequest{}, + "/restmachine/cloudapi/compute/setCustomFields": compute.SetCustomFieldsRequest{}, + "/restmachine/cloudapi/compute/snapshotCreate": compute.SnapshotCreateRequest{}, + "/restmachine/cloudapi/compute/snapshotDelete": compute.SnapshotDeleteRequest{}, + "/restmachine/cloudapi/compute/snapshotList": compute.SnapshotListRequest{}, + "/restmachine/cloudapi/compute/snapshotRollback": compute.SnapshotRollbackRequest{}, + "/restmachine/cloudapi/compute/snapshotUsage": compute.SnapshotUsageRequest{}, + "/restmachine/cloudapi/compute/start": compute.StartRequest{}, + "/restmachine/cloudapi/compute/stop": compute.StopRequest{}, + "/restmachine/cloudapi/compute/tagAdd": compute.TagAddRequest{}, + "/restmachine/cloudapi/compute/tagRemove": compute.TagRemoveRequest{}, + "/restmachine/cloudapi/compute/unpinFromStack": compute.UnpinFromStackRequest{}, + "/restmachine/cloudapi/compute/update": compute.UpdateRequest{}, + "/restmachine/cloudapi/compute/userGrant": compute.UserGrantRequest{}, + "/restmachine/cloudapi/compute/userList": compute.UserListRequest{}, + "/restmachine/cloudapi/compute/userRevoke": compute.UserRevokeRequest{}, + "/restmachine/cloudapi/compute/userUpdate": compute.UserUpdateRequest{}, + "/restmachine/cloudapi/compute/changeMac": compute.ChangeMACRequest{}, + "/restmachine/cloudapi/compute/changeIp": compute.ChangeIPRequest{}, + "/restmachine/cloudapi/compute/guest_agent_disable": compute.GuestAgentDisableRequest{}, + "/restmachine/cloudapi/compute/guest_agent_enable": compute.GuestAgentEnableRequest{}, + "/restmachine/cloudapi/compute/guest_agent_execute": compute.GuestAgentExecuteRequest{}, + "/restmachine/cloudapi/compute/guest_agent_feature_get": compute.GuestAgentFeatureGetRequest{}, + "/restmachine/cloudapi/compute/guest_agent_feature_update": compute.GuestAgentFeatureUpdateRequest{}, // disks "/restmachine/cloudapi/disks/create": disks.CreateRequest{}, @@ -372,6 +384,10 @@ func getRequestsMapCloudAPI() map[string]interface{} { "/restmachine/cloudapi/tasks/get": tasks.GetRequest{}, "/restmachine/cloudapi/tasks/list": tasks.ListRequest{}, + // trunk + "/restmachine/cloudapi/trunk/get": trunk.GetRequest{}, + "/restmachine/cloudapi/trunk/list": trunk.ListRequest{}, + // user "/restmachine/cloudapi/user/apiList": user.APIListRequest{}, "/restmachine/cloudapi/user/authenticate": user.AuthenticateRequest{}, @@ -414,6 +430,10 @@ func getRequestsMapCloudAPI() map[string]interface{} { "/restmachine/cloudapi/vins/staticRouteList": vins.StaticRouteListRequest{}, "/restmachine/cloudapi/vins/vnfdevRedeploy": vins.VNFDevRedeployRequest{}, "/restmachine/cloudapi/vins/vnfdevRestart": vins.VNFDevRestartRequest{}, + + // zone + "/restmachine/cloudapi/zone/get": zone.GetRequest{}, + "/restmachine/cloudapi/zone/list": zone.ListRequest{}, } } @@ -485,99 +505,107 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/backup/restoreDisksFromBackup": backup_cb.RestoreDisksFromBackupRequest{}, // compute_cb - "/restmachine/cloudbroker/compute/affinityGroupCheckStart": compute_cb.AffinityGroupCheckStartRequest{}, - "/restmachine/cloudbroker/compute/affinityLabelRemove": compute_cb.AffinityLabelRemoveRequest{}, - "/restmachine/cloudbroker/compute/affinityLabelSet": compute_cb.AffinityLabelSetRequest{}, - "/restmachine/cloudbroker/compute/affinityRelations": compute_cb.AffinityRelationsRequest{}, - "/restmachine/cloudbroker/compute/affinityRuleAdd": compute_cb.AffinityRuleAddRequest{}, - "/restmachine/cloudbroker/compute/affinityRuleRemove": compute_cb.AffinityRuleRemoveRequest{}, - "/restmachine/cloudbroker/compute/affinityRulesClear": compute_cb.AffinityRulesClearRequest{}, - "/restmachine/cloudbroker/compute/antiAffinityRuleAdd": compute_cb.AntiAffinityRuleAddRequest{}, - "/restmachine/cloudbroker/compute/antiAffinityRuleRemove": compute_cb.AntiAffinityRuleRemoveRequest{}, - "/restmachine/cloudbroker/compute/antiAffinityRulesClear": compute_cb.AffinityRulesClearRequest{}, - "/restmachine/cloudbroker/compute/attachGpu": compute_cb.AttachGPURequest{}, - "/restmachine/cloudbroker/compute/attachPciDevice": compute_cb.AttachPCIDeviceRequest{}, - "/restmachine/cloudbroker/compute/audits": compute_cb.AuditsRequest{}, - "/restmachine/cloudbroker/compute/bootDiskSet": compute_cb.BootDiskSetRequest{}, - "/restmachine/cloudbroker/compute/bootOrderGet": compute_cb.BootOrderGetRequest{}, - "/restmachine/cloudbroker/compute/bootOrderSet": compute_cb.BootOrderSetRequest{}, - "/restmachine/cloudbroker/compute/cdEject": compute_cb.CDEjectRequest{}, - "/restmachine/cloudbroker/compute/cdInsert": compute_cb.CDInsertRequest{}, - "/restmachine/cloudbroker/compute/changeLinkState": compute_cb.ChangeLinkStateRequest{}, - "/restmachine/cloudbroker/compute/clone": compute_cb.CloneRequest{}, - "/restmachine/cloudbroker/compute/computeciSet": compute_cb.ComputeCISetRequest{}, - "/restmachine/cloudbroker/compute/computeciUnset": compute_cb.ComputeCIUnsetRequest{}, - "/restmachine/cloudbroker/compute/createTemplate": compute_cb.CreateTemplateRequest{}, - "/restmachine/cloudbroker/compute/createTemplateFromBlank": compute_cb.CreateTemplateFromBlankRequest{}, - "/restmachine/cloudbroker/compute/delete": compute_cb.DeleteRequest{}, - "/restmachine/cloudbroker/compute/deleteCustomFields": compute_cb.DeleteCustomFieldsRequest{}, - "/restmachine/cloudbroker/compute/detachGpu": compute_cb.DetachGPURequest{}, - "/restmachine/cloudbroker/compute/detachPciDevice": compute_cb.DetachPCIDeviceRequest{}, - "/restmachine/cloudbroker/compute/disable": compute_cb.DisableRequest{}, - "/restmachine/cloudbroker/compute/diskAdd": compute_cb.DiskAddRequest{}, - "/restmachine/cloudbroker/compute/diskAttach": compute_cb.DiskAttachRequest{}, - "/restmachine/cloudbroker/compute/diskDel": compute_cb.DiskDelRequest{}, - "/restmachine/cloudbroker/compute/diskDetach": compute_cb.DiskDetachRequest{}, - "/restmachine/cloudbroker/compute/diskMigrate": compute_cb.DiskMigrateRequest{}, - "/restmachine/cloudbroker/compute/diskResize": compute_cb.DiskResizeRequest{}, - "/restmachine/cloudbroker/compute/diskSwitchToReplication": compute_cb.DiskSwitchToReplicationRequest{}, - "/restmachine/cloudbroker/compute/diskQos": compute_cb.DiskQOSRequest{}, - "/restmachine/cloudbroker/compute/enable": compute_cb.EnableRequest{}, - "/restmachine/cloudbroker/compute/get": compute_cb.GetRequest{}, - "/restmachine/cloudbroker/compute/getAudits": compute_cb.GetAuditsRequest{}, - "/restmachine/cloudbroker/compute/getConsoleUrl": compute_cb.GetConsoleURLRequest{}, - "/restmachine/cloudbroker/compute/getCustomFields": compute_cb.GetCustomFieldsRequest{}, - "/restmachine/cloudbroker/compute/getLog": compute_cb.GetLogRequest{}, - "/restmachine/cloudbroker/compute/list": compute_cb.ListRequest{}, - "/restmachine/cloudbroker/compute/listDeleted": compute_cb.ListDeletedRequest{}, - "/restmachine/cloudbroker/compute/listPciDevice": compute_cb.ListPCIDeviceRequest{}, - "/restmachine/cloudbroker/compute/listVGpu": compute_cb.ListVGPURequest{}, - "/restmachine/cloudbroker/compute/massDelete": compute_cb.MassDeleteRequest{}, - "/restmachine/cloudbroker/compute/massStart": compute_cb.MassStartRequest{}, - "/restmachine/cloudbroker/compute/massStop": compute_cb.MassStopRequest{}, - "/restmachine/cloudbroker/compute/massReboot": compute_cb.MassRebootRequest{}, - "/restmachine/cloudbroker/compute/migrate": compute_cb.MigrateRequest{}, - "/restmachine/cloudbroker/compute/migrateStorage": compute_cb.MigrateStorageRequest{}, - "/restmachine/cloudbroker/compute/migrateStorageAbort": compute_cb.MigrateStorageAbortRequest{}, - "/restmachine/cloudbroker/compute/migrateStorageCleanup": compute_cb.MigrateStorageCleanUpRequest{}, - "/restmachine/cloudbroker/compute/migrateStorageInfo": compute_cb.MigrateStorageInfoRequest{}, - "/restmachine/cloudbroker/compute/moveToRg": compute_cb.MoveToRGRequest{}, - "/restmachine/cloudbroker/compute/netAttach": compute_cb.NetAttachRequest{}, - "/restmachine/cloudbroker/compute/netDetach": compute_cb.NetDetachRequest{}, - "/restmachine/cloudbroker/compute/netQos": compute_cb.NetQOSRequest{}, - "/restmachine/cloudbroker/compute/pfwAdd": compute_cb.PFWAddRequest{}, - "/restmachine/cloudbroker/compute/pfwDel": compute_cb.PFWDelRequest{}, - "/restmachine/cloudbroker/compute/pfwList": compute_cb.PFWListRequest{}, - "/restmachine/cloudbroker/compute/pause": compute_cb.PauseRequest{}, - "/restmachine/cloudbroker/compute/pinToStack": compute_cb.PinToStackRequest{}, - "/restmachine/cloudbroker/compute/powerCycle": compute_cb.PowerCycleRequest{}, - "/restmachine/cloudbroker/compute/raiseDown": EmptyStruct{}, - "/restmachine/cloudbroker/compute/reboot": compute_cb.RebootRequest{}, - "/restmachine/cloudbroker/compute/redeploy": compute_cb.RedeployRequest{}, - "/restmachine/cloudbroker/compute/reset": compute_cb.ResetRequest{}, - "/restmachine/cloudbroker/compute/resize": compute_cb.ResizeRequest{}, - "/restmachine/cloudbroker/compute/restore": compute_cb.RestoreRequest{}, - "/restmachine/cloudbroker/compute/resume": compute_cb.ResumeRequest{}, - "/restmachine/cloudbroker/compute/setCustomFields": compute_cb.SetCustomFieldsRequest{}, - "/restmachine/cloudbroker/compute/snapshotCreate": compute_cb.SnapshotCreateRequest{}, - "/restmachine/cloudbroker/compute/snapshotDelete": compute_cb.SnapshotDeleteRequest{}, - "/restmachine/cloudbroker/compute/snapshotEvictDisk": compute_cb.SnapshotEvictDiskRequest{}, - "/restmachine/cloudbroker/compute/snapshotList": compute_cb.SnapshotListRequest{}, - "/restmachine/cloudbroker/compute/snapshotRollback": compute_cb.SnapshotRollbackRequest{}, - "/restmachine/cloudbroker/compute/snapshotUsage": compute_cb.SnapshotUsageRequest{}, - "/restmachine/cloudbroker/compute/start": compute_cb.StartRequest{}, - "/restmachine/cloudbroker/compute/stop": compute_cb.StopRequest{}, - "/restmachine/cloudbroker/compute/tagAdd": compute_cb.TagAddRequest{}, - "/restmachine/cloudbroker/compute/tagRemove": compute_cb.TagRemoveRequest{}, - "/restmachine/cloudbroker/compute/unpinFromStack": compute_cb.UnpinFromStackRequest{}, - "/restmachine/cloudbroker/compute/update": compute_cb.UpdateRequest{}, - "/restmachine/cloudbroker/compute/userGrant": compute_cb.UserGrantRequest{}, - "/restmachine/cloudbroker/compute/userList": compute_cb.UserListRequest{}, - "/restmachine/cloudbroker/compute/userRevoke": compute_cb.UserRevokeRequest{}, - "/restmachine/cloudbroker/compute/userUpdate": compute_cb.UserUpdateRequest{}, - "/restmachine/cloudbroker/compute/changeIp": compute_cb.ChangeIPRequest{}, - "/restmachine/cloudbroker/compute/changeMac": compute_cb.ChangeMACRequest{}, - "/restmachine/cloudbroker/compute/setNetConfig": compute_cb.SetNetConfigRequest{}, + "/restmachine/cloudapi/compute/abort_shared_snapshot_merge": compute.AbortSharedSnapshotMergeRequest{}, + "/restmachine/cloudapi/compute/shared_snapshot_merge_status": compute.SharedSnapshotMergeStatusRequest{}, + "/restmachine/cloudbroker/compute/affinityGroupCheckStart": compute_cb.AffinityGroupCheckStartRequest{}, + "/restmachine/cloudbroker/compute/affinityLabelRemove": compute_cb.AffinityLabelRemoveRequest{}, + "/restmachine/cloudbroker/compute/affinityLabelSet": compute_cb.AffinityLabelSetRequest{}, + "/restmachine/cloudbroker/compute/affinityRelations": compute_cb.AffinityRelationsRequest{}, + "/restmachine/cloudbroker/compute/affinityRuleAdd": compute_cb.AffinityRuleAddRequest{}, + "/restmachine/cloudbroker/compute/affinityRuleRemove": compute_cb.AffinityRuleRemoveRequest{}, + "/restmachine/cloudbroker/compute/affinityRulesClear": compute_cb.AffinityRulesClearRequest{}, + "/restmachine/cloudbroker/compute/antiAffinityRuleAdd": compute_cb.AntiAffinityRuleAddRequest{}, + "/restmachine/cloudbroker/compute/antiAffinityRuleRemove": compute_cb.AntiAffinityRuleRemoveRequest{}, + "/restmachine/cloudbroker/compute/antiAffinityRulesClear": compute_cb.AffinityRulesClearRequest{}, + "/restmachine/cloudbroker/compute/attachGpu": compute_cb.AttachGPURequest{}, + "/restmachine/cloudbroker/compute/attachPciDevice": compute_cb.AttachPCIDeviceRequest{}, + "/restmachine/cloudbroker/compute/audits": compute_cb.AuditsRequest{}, + "/restmachine/cloudbroker/compute/bootDiskSet": compute_cb.BootDiskSetRequest{}, + "/restmachine/cloudbroker/compute/bootOrderGet": compute_cb.BootOrderGetRequest{}, + "/restmachine/cloudbroker/compute/bootOrderSet": compute_cb.BootOrderSetRequest{}, + "/restmachine/cloudbroker/compute/cdEject": compute_cb.CDEjectRequest{}, + "/restmachine/cloudbroker/compute/cdInsert": compute_cb.CDInsertRequest{}, + "/restmachine/cloudbroker/compute/changeLinkState": compute_cb.ChangeLinkStateRequest{}, + "/restmachine/cloudbroker/compute/change_mtu": compute_cb.ChangeMTURequest{}, + "/restmachine/cloudbroker/compute/clone": compute_cb.CloneRequest{}, + "/restmachine/cloudbroker/compute/computeciSet": compute_cb.ComputeCISetRequest{}, + "/restmachine/cloudbroker/compute/computeciUnset": compute_cb.ComputeCIUnsetRequest{}, + "/restmachine/cloudbroker/compute/createTemplate": compute_cb.CreateTemplateRequest{}, + "/restmachine/cloudbroker/compute/createTemplateFromBlank": compute_cb.CreateTemplateFromBlankRequest{}, + "/restmachine/cloudbroker/compute/delete": compute_cb.DeleteRequest{}, + "/restmachine/cloudbroker/compute/deleteCustomFields": compute_cb.DeleteCustomFieldsRequest{}, + "/restmachine/cloudbroker/compute/detachGpu": compute_cb.DetachGPURequest{}, + "/restmachine/cloudbroker/compute/detachPciDevice": compute_cb.DetachPCIDeviceRequest{}, + "/restmachine/cloudbroker/compute/disable": compute_cb.DisableRequest{}, + "/restmachine/cloudbroker/compute/diskAdd": compute_cb.DiskAddRequest{}, + "/restmachine/cloudbroker/compute/diskAttach": compute_cb.DiskAttachRequest{}, + "/restmachine/cloudbroker/compute/diskDel": compute_cb.DiskDelRequest{}, + "/restmachine/cloudbroker/compute/diskDetach": compute_cb.DiskDetachRequest{}, + "/restmachine/cloudbroker/compute/diskMigrate": compute_cb.DiskMigrateRequest{}, + "/restmachine/cloudbroker/compute/diskResize": compute_cb.DiskResizeRequest{}, + "/restmachine/cloudbroker/compute/diskSwitchToReplication": compute_cb.DiskSwitchToReplicationRequest{}, + "/restmachine/cloudbroker/compute/diskQos": compute_cb.DiskQOSRequest{}, + "/restmachine/cloudbroker/compute/enable": compute_cb.EnableRequest{}, + "/restmachine/cloudbroker/compute/get": compute_cb.GetRequest{}, + "/restmachine/cloudbroker/compute/getAudits": compute_cb.GetAuditsRequest{}, + "/restmachine/cloudbroker/compute/getConsoleUrl": compute_cb.GetConsoleURLRequest{}, + "/restmachine/cloudbroker/compute/getCustomFields": compute_cb.GetCustomFieldsRequest{}, + "/restmachine/cloudbroker/compute/getLog": compute_cb.GetLogRequest{}, + "/restmachine/cloudbroker/compute/list": compute_cb.ListRequest{}, + "/restmachine/cloudbroker/compute/listDeleted": compute_cb.ListDeletedRequest{}, + "/restmachine/cloudbroker/compute/listPciDevice": compute_cb.ListPCIDeviceRequest{}, + "/restmachine/cloudbroker/compute/listVGpu": compute_cb.ListVGPURequest{}, + "/restmachine/cloudbroker/compute/massDelete": compute_cb.MassDeleteRequest{}, + "/restmachine/cloudbroker/compute/massStart": compute_cb.MassStartRequest{}, + "/restmachine/cloudbroker/compute/massStop": compute_cb.MassStopRequest{}, + "/restmachine/cloudbroker/compute/massReboot": compute_cb.MassRebootRequest{}, + "/restmachine/cloudbroker/compute/migrate": compute_cb.MigrateRequest{}, + "/restmachine/cloudbroker/compute/migrateStorage": compute_cb.MigrateStorageRequest{}, + "/restmachine/cloudbroker/compute/migrateStorageAbort": compute_cb.MigrateStorageAbortRequest{}, + "/restmachine/cloudbroker/compute/migrateStorageCleanup": compute_cb.MigrateStorageCleanUpRequest{}, + "/restmachine/cloudbroker/compute/migrateStorageInfo": compute_cb.MigrateStorageInfoRequest{}, + "/restmachine/cloudbroker/compute/moveToRg": compute_cb.MoveToRGRequest{}, + "/restmachine/cloudbroker/compute/netAttach": compute_cb.NetAttachRequest{}, + "/restmachine/cloudbroker/compute/netDetach": compute_cb.NetDetachRequest{}, + "/restmachine/cloudbroker/compute/netQos": compute_cb.NetQOSRequest{}, + "/restmachine/cloudbroker/compute/pfwAdd": compute_cb.PFWAddRequest{}, + "/restmachine/cloudbroker/compute/pfwDel": compute_cb.PFWDelRequest{}, + "/restmachine/cloudbroker/compute/pfwList": compute_cb.PFWListRequest{}, + "/restmachine/cloudbroker/compute/pause": compute_cb.PauseRequest{}, + "/restmachine/cloudbroker/compute/pinToStack": compute_cb.PinToStackRequest{}, + "/restmachine/cloudbroker/compute/powerCycle": compute_cb.PowerCycleRequest{}, + "/restmachine/cloudbroker/compute/raiseDown": EmptyStruct{}, + "/restmachine/cloudbroker/compute/reboot": compute_cb.RebootRequest{}, + "/restmachine/cloudbroker/compute/redeploy": compute_cb.RedeployRequest{}, + "/restmachine/cloudbroker/compute/reset": compute_cb.ResetRequest{}, + "/restmachine/cloudbroker/compute/resize": compute_cb.ResizeRequest{}, + "/restmachine/cloudbroker/compute/restore": compute_cb.RestoreRequest{}, + "/restmachine/cloudbroker/compute/resume": compute_cb.ResumeRequest{}, + "/restmachine/cloudbroker/compute/setCustomFields": compute_cb.SetCustomFieldsRequest{}, + "/restmachine/cloudbroker/compute/snapshotCreate": compute_cb.SnapshotCreateRequest{}, + "/restmachine/cloudbroker/compute/snapshotDelete": compute_cb.SnapshotDeleteRequest{}, + "/restmachine/cloudbroker/compute/snapshotEvictDisk": compute_cb.SnapshotEvictDiskRequest{}, + "/restmachine/cloudbroker/compute/snapshotList": compute_cb.SnapshotListRequest{}, + "/restmachine/cloudbroker/compute/snapshotRollback": compute_cb.SnapshotRollbackRequest{}, + "/restmachine/cloudbroker/compute/snapshotUsage": compute_cb.SnapshotUsageRequest{}, + "/restmachine/cloudbroker/compute/start": compute_cb.StartRequest{}, + "/restmachine/cloudbroker/compute/stop": compute_cb.StopRequest{}, + "/restmachine/cloudbroker/compute/tagAdd": compute_cb.TagAddRequest{}, + "/restmachine/cloudbroker/compute/tagRemove": compute_cb.TagRemoveRequest{}, + "/restmachine/cloudbroker/compute/unpinFromStack": compute_cb.UnpinFromStackRequest{}, + "/restmachine/cloudbroker/compute/update": compute_cb.UpdateRequest{}, + "/restmachine/cloudbroker/compute/userGrant": compute_cb.UserGrantRequest{}, + "/restmachine/cloudbroker/compute/userList": compute_cb.UserListRequest{}, + "/restmachine/cloudbroker/compute/userRevoke": compute_cb.UserRevokeRequest{}, + "/restmachine/cloudbroker/compute/userUpdate": compute_cb.UserUpdateRequest{}, + "/restmachine/cloudbroker/compute/changeIp": compute_cb.ChangeIPRequest{}, + "/restmachine/cloudbroker/compute/changeMac": compute_cb.ChangeMACRequest{}, + "/restmachine/cloudbroker/compute/setNetConfig": compute_cb.SetNetConfigRequest{}, + "/restmachine/cloudbroker/compute/guest_agent_disable": compute_cb.GuestAgentDisableRequest{}, + "/restmachine/cloudbroker/compute/guest_agent_enable": compute_cb.GuestAgentEnableRequest{}, + "/restmachine/cloudbroker/compute/guest_agent_execute": compute_cb.GuestAgentExecuteRequest{}, + "/restmachine/cloudbroker/compute/guest_agent_feature_get": compute_cb.GuestAgentFeatureGetRequest{}, + "/restmachine/cloudbroker/compute/guest_agent_feature_update": compute_cb.GuestAgentFeatureUpdateRequest{}, // disks "/restmachine/cloudbroker/disks/create": disks_cb.CreateRequest{}, @@ -643,6 +671,7 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/extnet/ntpApply": extnet_cb.NTPApplyRequest{}, "/restmachine/cloudbroker/extnet/raiseDown": EmptyStruct{}, "/restmachine/cloudbroker/extnet/setDefault": extnet_cb.SetDefaultRequest{}, + "/restmachine/cloudbroker/extnet/set_highly_available": extnet_cb.SetHAModeRequest{}, "/restmachine/cloudbroker/extnet/staticRouteAccessGrant": extnet_cb.StaticRouteAccessGrantRequest{}, "/restmachine/cloudbroker/extnet/staticRouteAccessRevoke": extnet_cb.StaticRouteAccessRevokeRequest{}, "/restmachine/cloudbroker/extnet/staticRouteAdd": extnet_cb.StaticRouteAddRequest{}, @@ -707,7 +736,6 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/image/rename": image_cb.RenameRequest{}, "/restmachine/cloudbroker/image/revokeAccess": image_cb.RevokeAccessRequest{}, "/restmachine/cloudbroker/image/share": image_cb.ShareRequest{}, - "/restmachine/cloudbroker/image/syncCreateImage": image_cb.SyncCreateRequest{}, "/restmachine/cloudbroker/image/updateNodes": image_cb.UpdateNodesRequest{}, // k8ci @@ -896,11 +924,23 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/tasks/get": tasks_cb.GetRequest{}, "/restmachine/cloudbroker/tasks/list": tasks_cb.ListRequest{}, + // trunk + "/restmachine/cloudbroker/trunk/get": trunk_cb.GetRequest{}, + "/restmachine/cloudbroker/trunk/list": trunk_cb.ListRequest{}, + "/restmachine/cloudbroker/trunk/create": trunk_cb.CreateRequest{}, + "/restmachine/cloudbroker/trunk/enable": trunk_cb.EnableRequest{}, + "/restmachine/cloudbroker/trunk/disable": trunk_cb.DisableRequest{}, + "/restmachine/cloudbroker/trunk/destroy": trunk_cb.DestroyRequest{}, + "/restmachine/cloudbroker/trunk/update": trunk_cb.UpdateRequest{}, + "/restmachine/cloudbroker/trunk/access_grant": trunk_cb.AccessGrantRequest{}, + "/restmachine/cloudbroker/trunk/access_revoke": trunk_cb.AccessRevokeRequest{}, + // user "/restmachine/cloudbroker/user/apiaccessJoin": user_cb.APIAccessJoinRequest{}, "/restmachine/cloudbroker/user/apiaccessLeave": user_cb.APIAccessLeaveRequest{}, "/restmachine/cloudbroker/user/apiaccessList": user_cb.APIAccessListRequest{}, "/restmachine/cloudbroker/user/apiList": user_cb.APIListRequest{}, + "/restmachine/cloudbroker/user/block": user_cb.BlockRequest{}, "/restmachine/cloudbroker/user/create": user_cb.CreateRequest{}, "/restmachine/cloudbroker/user/delete": user_cb.DeleteRequest{}, "/restmachine/cloudbroker/user/deleteByGuid": user_cb.DeleteByGUIDRequest{}, @@ -909,6 +949,7 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/user/getAudit": user_cb.GetAuditRequest{}, "/restmachine/cloudbroker/user/getMatchingUsernames": user_cb.GetMatchingUsernamesRequest{}, "/restmachine/cloudbroker/user/list": user_cb.ListRequest{}, + "/restmachine/cloudbroker/user/unblock": user_cb.UnblockRequest{}, // vfpool "/restmachine/cloudbroker/vfpool/create": vfpool_cb.CreateRequest{}, @@ -964,5 +1005,14 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/vins/vnfdevReset": vins_cb.VNFDevResetRequest{}, "/restmachine/cloudbroker/vins/vnfdevStart": vins_cb.VNFDevStartRequest{}, "/restmachine/cloudbroker/vins/vnfdevStop": vins_cb.VNFDevStopRequest{}, + + // zone + "/restmachine/cloudbroker/zone/get": zone_cb.GetRequest{}, + "/restmachine/cloudbroker/zone/list": zone_cb.ListRequest{}, + "/restmachine/cloudbroker/zone/create": zone_cb.CreateRequest{}, + "/restmachine/cloudbroker/zone/delete": zone_cb.DeleteRequest{}, + "/restmachine/cloudbroker/zone/update": zone_cb.UpdateRequest{}, + "/restmachine/cloudbroker/zone/addNode": zone_cb.AddNodeRequest{}, + "/restmachine/cloudbroker/zone/delNode": zone_cb.DelNodeRequest{}, } }