Compare commits

..

1 Commits

Author SHA1 Message Date
asteam
aee072c194 v1.9.3 2025-03-11 11:06:21 +03:00
331 changed files with 1551 additions and 10423 deletions

1
.gitignore vendored
View File

@@ -6,5 +6,4 @@ cmd/
tests/platform_upgrade/.env
tests/platform_upgrade/input.json
tests/platform_upgrade/*.txt
tests/platform_upgrade/*.log
*.env

View File

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

View File

@@ -14,9 +14,6 @@ Decort SDK - это библиотека, написанная на языке G
- Версия 1.7.х Decort-SDK соответствует 3.8.9 версии платформы
- Версия 1.8.х Decort-SDK соответствует 4.0.0 версии платформы
- Версия 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 версии платформы
## Оглавление
@@ -80,8 +77,6 @@ Decort SDK - это библиотека, написанная на языке G
- [Создание универсального клиента](#создание-универсального-клиента)
- [Пример создания универсального клиента](#пример-создания-универсального-клиента)
- [Пример выполнения запроса](#пример-выполнения-запроса-4)
- [Проверка соответствия версии платформы и версии dynamix](#проверка-соответствия-версии-платформы-и-версии-dynamix)
- [Пример выполнения запроса](#пример-выполнения-запроса-5)
## Установка
@@ -117,14 +112,11 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `KVMx86` - создание виртуальной машины x86;
- `LB` - управление балансировщиками нагрузки;
- `Locations` - получение информации о grid площадки;
- `Prometheus` - получение статистики prometheus;
- `RG` - управление ресурсными группами аккаунта;
- `SEP` - управление storage endpoint (sep);
- `Stack` - получение информации о вычислительных узлах;
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
- `VFPool` - управление пулом виртуальных сетевых функций;
- `VINS` - управление виртуальными изолированными сетями;
- `Zone` - управление зонами.
- `VINS` - управление виртуальными изолированными сетями.
### Cloudbroker
@@ -135,7 +127,6 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `Audit` - получение информации о событиях системы;
- `APIAccess` - управление доступом к API и его объектам;
- `Backup` - управление резервным копированием;
- `BService` - управление группами виртуальных машин (computes);
- `Compute` - управление виртуальными машинами (индивидуально);
- `Disks` - управление виртуальными дисками;
- `DPDK` - управление виртуальными сетями DPDK;
@@ -160,7 +151,6 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `VGPU` - управление виртуальными графическими процессорами;
- `VFPool` - управление пулом виртуальных сетевых функций;
- `VINS` - управление виртуальными изолированными сетями.
- `Zone` - управление зонами.
## Работа с библиотекой
@@ -306,21 +296,16 @@ func main() {
- `pkg/cloudapi/kvmx86` - для `KVMX86`
- `pkg/cloudapi/lb` - для `LB`
- `pkg/cloudapi/locations` - для `Locations`
- `pkg/cloudapi/prometheus` - для `Prometheus`
- `pkg/cloudapi/rg` - для `RG`
- `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`
@@ -341,12 +326,10 @@ 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`
Все поля структуры имеют описание, в которых содержится:
@@ -499,15 +482,12 @@ func main() {
- `.KVMx86()` - для работы с `KVMX86`
- `.LB()` - для работы с `LB`
- `.Locations()` - для работы с `Locations`
- `.Prometheus()` - для работы с `Prometheus`
- `.RG()` - для работы с `RG`
- `.SEP()` - для работы с `SEP`
- `.Resmon()` - для работы с `Resmon`
- `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.VFPool()` - для работы с `VFPool`
- `.VINS()` - для работы с `VINS`
- `.Zone()` - для работы с `Zone`
Доступные методы для `.CloudBroker()`:
@@ -515,7 +495,6 @@ func main() {
- `.Audit()` - для работы с `Audit`
- `.APIAccess()` - для работы с `APIAccess`
- `.Backup()` - для работы с `Backup`
- `.BService()` - для работы с `BService`
- `.Compute()` - для работы с `Compute`
- `.Disks()` - для работы с `Disks`
- `.DPDKNet()` - для работы с `DPDK`
@@ -536,12 +515,10 @@ func main() {
- `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.User()` - для работы с `User`
- `.VGPU()` - для работы с `VGPU`
- `.VFPool()` - для работы с `VFPool`
- `.VINS()` - для работы с `VINS`
- `.Zone()` - для работы с `Zone`
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
@@ -1620,36 +1597,4 @@ func main() {
fmt.Println(res)
}
```
## Проверка соответствия версии платформы и версии dynamix
С версии 1.11.5 для каждого клиента добавлен метод `Check` для проверки соответствия decort-sdk и платформы dynamix.
В случае соответсвия decort-sdk и платформы dynamix возвращается структура, содержащая информацию о версии и актуальном билде платформы.
#### Пример выполнения запроса
```go
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
)
func main(){
// Настройка конфигурации
config := config.Config{
AppID: "<APP_ID>",
AppSecret: "<APP_SECRET>",
SSOURL: "https://sso.digitalenergy.online",
DecortURL: "https://mr4.digitalenergy.online",
Retries: 5,
SSLSkipVerify: true,
}
// Создание клиента
client := decort.New(config)
// Проверка соответствия версии
checkInfo, err := client.Check()
}
```

View File

@@ -1,88 +0,0 @@
package decortsdk
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
)
type CheckInfo struct {
Version string `json:"version"`
Build uint64 `json:"build"`
}
const versionURL = "/system/info/version"
func (de DecortClient) Check() (*CheckInfo, error) {
res, err := de.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
if err != nil {
return nil, err
}
info := CheckInfo{}
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
if err != nil {
return nil, err
}
if v, ok := constants.VersionMap[info.Version]; ok {
if v == "-" {
return &info, nil
}
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
}
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
}
func (bvs BVSDecortClient) Check() (*CheckInfo, error) {
res, err := bvs.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
if err != nil {
return nil, err
}
info := CheckInfo{}
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
if err != nil {
return nil, err
}
if v, ok := constants.VersionMap[info.Version]; ok {
if v == "-" {
return &info, nil
}
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
}
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
}
func (ldc LegacyDecortClient) Check() (*CheckInfo, error) {
res, err := ldc.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil)
if err != nil {
return nil, err
}
info := CheckInfo{}
err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info)
if err != nil {
return nil, err
}
if v, ok := constants.VersionMap[info.Version]; ok {
if v == "-" {
return &info, nil
}
return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v))
}
return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version))
}

View File

@@ -12,7 +12,3 @@ var FileName = map[string]string{
}
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
var VersionMap = map[string]string{
"4.3.0": "-",
}

View File

@@ -6,7 +6,6 @@ import (
"net/url"
"reflect"
"regexp"
"strconv"
"strings"
"github.com/go-playground/validator/v10"
@@ -28,13 +27,6 @@ func protoValidator(fe validator.FieldLevel) bool {
return IsInSlice(fieldValue, protoValues)
}
// apiGroupValidator is used to validate APIGroup fields
func apiGroupValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, apiGroupValues)
}
// accessTypeValidator is used to validate AccessType fields.
func accessTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
@@ -382,59 +374,11 @@ func urlValidartor(fl validator.FieldLevel) bool {
func chipsetValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
fieldValue = strings.ToLower(fieldValue)
return IsInSlice(fieldValue, chipsetValues)
}
func preferredCPUValidator(fe validator.FieldLevel) bool {
fieldSlice, ok := fe.Field().Interface().([]int64)
if !ok {
return false
}
for _, value := range fieldSlice {
if value < -1 {
return false
}
}
return true
}
// loaderTypeValidator is used to validate loaderType fields
func loaderTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, loaderTypeValues)
}
// languageValidator is used to validate language fields
func languageValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, languageValues)
}
func userProviderValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, userProviders)
}
// sepTypeValidator is used to validate sepType fields
func sepTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, sepTypeValues)
}
// deviceValidator is used to validate extnet device fields
func deviceValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, deviceValues)
}
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {
@@ -456,13 +400,3 @@ 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)
}

View File

@@ -52,13 +52,6 @@ func errorMessage(fe validator.FieldError) string {
fe.Field(),
joinValues(protoValues))
// apiGroup Validators
case "apiGroup":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(apiGroupValues))
// Account Validators
case "accountCUType":
return fmt.Sprintf("%s %s must be one of the following: %s",
@@ -101,9 +94,6 @@ func errorMessage(fe validator.FieldError) string {
case "mtu":
return fmt.Sprint(prefix, fe.Field(), "must be ", mtuMin, "-", mtuMax)
case "preferredCPU":
return fmt.Sprint(prefix, fe.Field(), "must be equal to or greater than", -1)
case "computex86NetType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
@@ -315,43 +305,6 @@ func errorMessage(fe validator.FieldError) string {
prefix,
fe.Field(),
joinValues(chipsetValues))
case "loaderType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(loaderTypeValues))
case "language":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(languageValues))
case "sepType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(sepTypeValues))
// user validators
case "userProvider":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(userProviders))
// 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()

View File

@@ -36,11 +36,6 @@ func registerAllValidators(validate *validator.Validate) error {
return err
}
err = validate.RegisterValidation("apiGroup", apiGroupValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("accessType", accessTypeValidator)
if err != nil {
return err
@@ -266,40 +261,5 @@ func registerAllValidators(validate *validator.Validate) error {
return err
}
err = validate.RegisterValidation("preferredCPU", preferredCPUValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("loaderType", loaderTypeValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("language", languageValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("userProvider", userProviderValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("sepType", sepTypeValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("device", deviceValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("trunkTags", trunkTagsValidator)
if err != nil {
return err
}
return nil
}

View File

@@ -1,8 +1,6 @@
package validators
var (
apiGroupValues = []string{"cloudapi", "cloudbroker", "system"}
driverValues = []string{"KVM_X86"}
accessTypeValues = []string{"R", "RCX", "ARCXDU"}
resTypesValues = []string{"compute", "vins", "k8s", "openshift", "lb", "flipgroup"}
@@ -17,17 +15,17 @@ var (
computeModeValues = []string{"EQ", "EN", "ANY"}
computeDiskTypeValues = []string{"D", "B"}
computeNetTypeValues = []string{"EXTNET", "VINS"}
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "EMPTY", "TRUNK"}
computex86NetTypeValues = []string{"EXTNET", "VINS", "VFNIC", "DPDK"}
computeOrderValues = []string{"cdrom", "network", "hd"}
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
computeDriverValues = []string{"KVM_X86"}
computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"}
diskTypeValues = []string{"B", "T", "D"}
flipgroupClientTypeValues = []string{"compute", "vins"}
kvmNetTypeValues = []string{"EXTNET", "VINS", "NONE"}
kvmx86NetTypeValues = []string{"EXTNET", "VINS", "EMPTY", "VFNIC", "DPDK", "SDN", "TRUNK"}
kvmx86NetTypeValues = []string{"EXTNET", "VINS", "NONE", "VFNIC", "DPDK"}
lbAlgorithmValues = []string{"roundrobin", "static-rr", "leastconn"}
@@ -37,7 +35,7 @@ var (
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDED"}
imageBootTypeValues = []string{"uefi", "bios"}
imageTypeValues = []string{"windows", "linux", "unknown"}
imageTypeValues = []string{"windows", "linux", "other"}
imageDriversValues = []string{"KVM_X86"}
imageArchitectureValues = []string{"X86_64"}
@@ -49,11 +47,11 @@ var (
interfaceStateValues = []string{"on", "off"}
actionValues = []string{"is_powered", "power_on", "shutdown", "force_shutdown", "reboot"}
actionValues = []string{"power_on", "shutdown", "force_shutdown", "reboot"}
vmActionValues = []string{"stop", "move"}
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic"}
networkInterfaceNamingValues = []string{"eth", "ens"}
@@ -66,22 +64,10 @@ var (
eventIDxValues = []string{"on", "off", "selected by hypervisor"}
chipsetValues = []string{"i440fx", "Q35"}
loaderTypeValues = []string{"linux", "windows", "unknown"}
sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"}
languageValues = []string{"ru", "en"}
userProviders = []string{"bvs", "decs3o"}
deviceValues = []string{"primary", "secondary"}
)
const (
mtuMin = 1
mtuMax = 9216
trunkTagsMin = 1
trunkTagsMax = 4095
mtuMax = 9216
)

View File

@@ -0,0 +1,75 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// CreateRequest struct for creating account
type CreateRequest struct {
// Display name
// Required: true
Name string `url:"name" json:"name" validate:"required"`
// Name of the account
// Required: true
Username string `url:"username" json:"username" validate:"required"`
// Email
// Required: false
EmailAddress string `url:"emailaddress,omitempty" json:"emailaddress,omitempty" validate:"omitempty,email"`
// Max size of memory in MB
// Required: false
MaxMemoryCapacity int64 `url:"maxMemoryCapacity,omitempty" json:"maxMemoryCapacity,omitempty"`
// Max size of aggregated vdisks in GB
// Required: false
MaxVDiskCapacity int64 `url:"maxVDiskCapacity,omitempty" json:"maxVDiskCapacity,omitempty"`
// Max number of CPU cores
// Required: false
MaxCPUCapacity int64 `url:"maxCPUCapacity,omitempty" json:"maxCPUCapacity,omitempty"`
// Max sent/received network transfer peering
// Required: false
MaxNetworkPeerTransfer int64 `url:"maxNetworkPeerTransfer,omitempty" json:"maxNetworkPeerTransfer,omitempty"`
// Max number of assigned public IPs
// Required: false
MaxNumPublicIP int64 `url:"maxNumPublicIP,omitempty" json:"maxNumPublicIP,omitempty"`
// If true send emails when a user is granted access to resources
// Required: false
SendAccessEmails bool `url:"sendAccessEmails" json:"sendAccessEmails"`
// Limit (positive) or disable (0) GPU resources
// Required: false
GPUUnits int64 `url:"gpu_units,omitempty" json:"gpu_units,omitempty"`
}
// Create creates account
// Setting a cloud unit maximum to -1 or empty will not put any restrictions on the resource
func (a Account) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/account/create"
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return 0, err
}
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return 0, err
}
return result, nil
}

View File

@@ -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) (string, error) {
func (a Account) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/account/delete"
result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
_, err = a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return "", err
return false, err
}
return string(result), nil
return true, nil
}

View File

@@ -62,9 +62,6 @@ type ItemAccount struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// ID
ID uint64 `json:"id"`
@@ -165,15 +162,6 @@ 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
@@ -209,9 +197,6 @@ type RecordAccount struct {
// Created time
CreatedTime uint64 `json:"createdTime"`
// Description
Description string `json:"desc"`
// Deactivation time
DeactivationTime float64 `json:"deactivationTime"`
@@ -262,12 +247,6 @@ type RecordAccount struct {
// VINSes
VINSes uint64 `json:"vinses"`
// Zone
ZoneIDs []ZoneID
// Zones
DefaultZoneID uint64 `json:"defaultZoneId"`
}
// Main information about compute
@@ -533,9 +512,6 @@ type ItemRG struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// Resource group ID
RGID uint64 `json:"id"`

View File

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

View File

@@ -14,10 +14,6 @@ type UpdateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Description
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Name of the account
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
@@ -54,10 +50,6 @@ 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

View File

@@ -12,7 +12,7 @@ import (
type GetRequest struct {
// Audit GUID
// Required: true
AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"`
AuditGuid string `url:"auditGuid" json:"auditGuid" validate:"required"`
}
// Get gets information about audit as a RecordAudit struct

View File

@@ -25,10 +25,6 @@ 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

View File

@@ -16,7 +16,6 @@ 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"`
}

View File

@@ -71,10 +71,6 @@ type GroupAddRequest struct {
// Meta data for working group computes, format YAML "user_data": 1111
// Required: false
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
//Chipset "i440fx" or "Q35
//Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -22,12 +22,6 @@ type GroupResizeRequest struct {
// Required: true
Count int64 `url:"count" json:"count" validate:"required"`
//Chipset for new computes, either i440fx or Q35 (i440fx by default)
//Available values : i440fx, Q35
//Default value : i440fx
//Required: true
Chipset string `url:"chipset" json:"chipset" validate:"required,chipset"`
// Either delta or absolute value of computes
// Should be one of:
// - ABSOLUTE

View File

@@ -1,42 +0,0 @@
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
}

View File

@@ -88,9 +88,6 @@ type RecordBasicService struct {
// Whether user controlled
UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// Main information about Compute
@@ -298,9 +295,6 @@ type ItemGroupCompute struct {
// List of information about OS Users
OSUsers ListOSUsers `json:"osUsers"`
//Chipset
Chipset string `json:"chipset"`
}
// List of Group Computes
@@ -385,9 +379,6 @@ type ItemBasicService struct {
// User Managed or not
UserManaged bool `json:"userManaged"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// List of BasicServices

View File

@@ -1,42 +0,0 @@
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
}

View File

@@ -12,23 +12,23 @@ import (
type ChangeIPRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Network type
// 'EXTNET' for connect to external network directly
// 'VINS' for connect to ViNS
// Required: true
NetType string `url:"net_type" json:"net_type" validate:"computeNetType"`
NetType string `url:"netType" json:"netType" validate:"computeNetType"`
// Network ID for connect to
// For EXTNET - external network ID
// For VINS - VINS ID
// Required: true
NetID uint64 `url:"net_id" json:"net_id" validate:"required"`
NetID uint64 `url:"netId" json:"netId" validate:"required"`
// IP address to which we will change the existing one, it must be from the same subnet
// Required: true
IPAddr string `url:"ip_addr" json:"ip_addr" validate:"required"`
IPAddr string `url:"ipAddr" json:"ipAddr" validate:"required"`
}
// ChangeIP change reserved IP for compute instance

View File

@@ -1,46 +0,0 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ChangeMACRequest struct to change MAC for network
type ChangeMACRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Current mac address
// Required: true
СurrentMAC string `url:"current_mac_address" json:"current_mac_address" validate:"required"`
// the MAC address to which we will change the existing one
// Required: true
NewMAC string `url:"new_mac_address" json:"new_mac_address" validate:"required"`
}
// ChangeMAC change MAC for compute instance
func (c Compute) ChangeMAC(ctx context.Context, req ChangeMACRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/changeMac"
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
}

View File

@@ -1,46 +0,0 @@
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
}

View File

@@ -39,6 +39,10 @@ type CreateTemplateFromBlankRequest struct {
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// SEP ID
// Required: false
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Pool for image create
// Required: false
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`

View File

@@ -48,7 +48,8 @@ var computes = ListComputes{
Devices: nil,
Disks: []InfoDisk{
{
ID: 65191,
ID: 65191,
PCISlot: 6,
},
},
Driver: "KVM_X86",
@@ -63,7 +64,7 @@ var computes = ListComputes{
MigrationJob: 0,
Milestones: 363500,
Name: "test",
PinnedToStack: true,
Pinned: false,
RAM: 4096,
ReferenceID: "c7cb19ac-af4a-4067-852f-c5572949207e",
Registered: true,
@@ -110,7 +111,8 @@ var computes = ListComputes{
Devices: nil,
Disks: []InfoDisk{
{
ID: 65248,
ID: 65248,
PCISlot: 6,
},
},
Driver: "KVM_X86",
@@ -125,10 +127,10 @@ var computes = ListComputes{
MigrationJob: 0,
Milestones: 363853,
Name: "compute_2",
Pinned: false,
RAM: 4096,
ReferenceID: "a542c449-5b1c-4f90-88c5-7bb5f8ae68ff",
Registered: true,
PinnedToStack: true,
ResName: "compute-48556",
RGID: 79727,
RGName: "sdk_negative_fields_test",

View File

@@ -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.MethodGet, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return "", err
}
@@ -42,7 +42,7 @@ func (c Compute) GetLogGet(ctx context.Context, req GetLogRequest) (string, erro
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/getLog"
url := "/cloudapi//compute/getLog"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {

View File

@@ -1,38 +0,0 @@
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
}

View File

@@ -1,48 +0,0 @@
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
}

View File

@@ -1,40 +0,0 @@
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
}

View File

@@ -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 {
@@ -299,18 +299,12 @@ type RecordCompute struct {
// List anti affinity rules
AntiAffinityRules ListRules `json:"antiAffinityRules"`
// Auto start when node restarted
AutoStart bool `json:"autoStart"`
// Architecture
Architecture string `json:"arch"`
// Boot order
BootOrder []string `json:"bootOrder"`
// Boot type
BootType string `json:"bootType"`
// Boot disk size
BootDiskSize uint64 `json:"bootdiskSize"`
@@ -371,9 +365,6 @@ type RecordCompute struct {
// HPBacked
HPBacked bool `json:"hpBacked"`
// Hot resize
HotResize bool `json:"hotResize"`
// ID
ID uint64 `json:"id"`
@@ -386,12 +377,6 @@ 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"`
// Lock status
LockStatus string `json:"lockStatus"`
@@ -413,9 +398,6 @@ type RecordCompute struct {
// NeedReboot
NeedReboot bool `json:"needReboot"`
// Network interface naming
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
// Numa Affinity
NumaAffinity string `json:"numaAffinity"`
@@ -440,14 +422,8 @@ type RecordCompute struct {
// List OS Users
OSUsers ListOSUser `json:"osUsers"`
// Pinned to stack
PinnedToStack bool `json:"pinnedToStack"`
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Pinned or not
Pinned bool `json:"pinned"`
// Number of RAM
RAM uint64 `json:"ram"`
@@ -500,88 +476,14 @@ type RecordCompute struct {
// Userdata
Userdata interface{} `json:"userdata"`
// vGPUs list
VGPUs []VGPUItem `json:"vgpus"`
// vGPU IDs
VGPUs []uint64 `json:"vgpus"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// Virtual image name
VirtualImageName string `json:"virtualImageName"`
// VNC password
VNCPassword string `json:"vncPasswd"`
// Zone ID
// Required: false
ZoneID uint64 `json:"zoneId"`
}
type QemuQuest struct {
Enabled bool `json:"enabled"`
EnabledAgentFeatures []string `json:"enabled_agent_features"`
GUID string `json:"guid"`
LastUpdate uint64 `json:"last_update"`
User string `json:"user"`
}
type VGPUItem struct {
// ID
ID uint64 `json:"id"`
// GID
GID uint64 `json:"gid"`
// Type
Type string `json:"type"`
// Mode
Mode string `json:"mode"`
// Status
Status string `json:"status"`
// ProfileID
ProfileID uint64 `json:"profileId"`
// RAM
RAM uint64 `json:"ram"`
// LastUpdateTime
LastUpdateTime uint64 `json:"lastUpdateTime"`
// CreatedTime
CreatedTime uint64 `json:"createdTime"`
// DeletedTime
DeletedTime uint64 `json:"deletedTime"`
// VMID
VMID uint64 `json:"vmid"`
// PGPuid
PGPuid uint64 `json:"pgpuid"`
// ReferenceID
ReferenceID string `json:"referenceId"`
// AccountID
AccountID uint64 `json:"accountId"`
// RgID
RgID uint64 `json:"rgId"`
// LastClaimedBy
LastClaimedBy uint64 `json:"lastClaimedBy"`
// PCISlot
PCISlot uint64 `json:"pciSlot"`
// BusNumber
BusNumber uint64 `json:"bus_number"`
// GUID
GUID uint64 `json:"guid"`
}
// Information about libvirt settings
@@ -703,9 +605,6 @@ type ItemVNFInterface struct {
// QOS
QOS QOS `json:"qos"`
// SDN interface ID
SDNInterfaceID string `json:"sdn_interface_id"`
// Target
Target string `json:"target"`
@@ -791,6 +690,9 @@ type ItemComputeDisk struct {
// Name
Name string `json:"name"`
// Order
Order uint64 `json:"order"`
// Params
Params string `json:"params"`
@@ -801,13 +703,13 @@ type ItemComputeDisk struct {
Passwd string `json:"passwd"`
// PCI slot
PCISlot int64 `json:"pci_slot"`
PCISlot int64 `json:"pciSlot"`
// Pool
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@@ -830,9 +732,6 @@ type ItemComputeDisk struct {
// Shareable
Shareable bool `json:"shareable"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@@ -851,11 +750,8 @@ type ItemComputeDisk struct {
// Type
Type string `json:"type"`
// Updated by
UpdatedBy string `json:"updatedBy"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
// Virtual machine ID
VMID uint64 `json:"vmid"`
}
type ItemReplication struct {
@@ -970,18 +866,12 @@ type ItemCompute struct {
// List anti affinity rules
AntiAffinityRules ListRules `json:"antiAffinityRules"`
// Auto start when node restarted
AutoStart bool `json:"autoStart"`
// Architecture
Architecture string `json:"arch"`
// Boot order
BootOrder []string `json:"bootOrder"`
// Boot type
BootType string `json:"bootType"`
// Boot disk size
BootDiskSize uint64 `json:"bootdiskSize"`
@@ -1039,9 +929,6 @@ type ItemCompute struct {
// GUID
GUID uint64 `json:"guid"`
// Hot resize
HotResize bool `json:"hotResize"`
// HPBacked
HPBacked bool `json:"hpBacked"`
@@ -1054,12 +941,6 @@ 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"`
// Lock status
LockStatus string `json:"lockStatus"`
@@ -1081,27 +962,18 @@ type ItemCompute struct {
// NeedReboot
NeedReboot bool `json:"needReboot"`
// network interface naming
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
// Numa Affinity
NumaAffinity string `json:"numaAffinity"`
//NumaNodeId
NumaNodeId int64 `json:"numaNodeId"`
// Pinned to stack
PinnedToStack bool `json:"pinnedToStack"`
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// Pinned or not
Pinned bool `json:"pinned"`
// Number of RAM
RAM uint64 `json:"ram"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
// Reference ID
ReferenceID string `json:"referenceId"`
@@ -1167,6 +1039,12 @@ type ListInfoDisks []InfoDisk
type InfoDisk struct {
// ID
ID uint64 `json:"id"`
// PCISlot
PCISlot int64 `json:"pciSlot"`
// Bus number
BusNumber uint64 `json:"bus_number"`
}
// List information about computes

View File

@@ -19,9 +19,6 @@ 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"`
@@ -35,19 +32,9 @@ type NetAttachRequest struct {
// Required: false
IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"`
// MAC address
// Used only for DPDK type, must be 1-9216
// Required: false
MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"`
// 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

View File

@@ -13,30 +13,25 @@ type PinToStackRequest struct {
// ID of the compute instance
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Auto start when node restarted
// Required: false
// Default: false
AutoStart bool `url:"autoStart" json:"autoStart"`
}
// PinToStack pin compute to current stack
func (c Compute) PinToStack(ctx context.Context, req PinToStackRequest) (bool, error) {
func (c Compute) PinToStack(ctx context.Context, req PinToStackRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/pinToStack"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
return 0, err
}
result, err := strconv.ParseBool(string(res))
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return false, err
return 0, err
}
return result, nil

View File

@@ -27,10 +27,6 @@ type ResizeRequest struct {
// Force compute resize
// Required: false
Force bool `url:"force,omitempty" json:"force,omitempty"`
// 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"`
}
// GetRAM returns RAM field values

View File

@@ -1,33 +0,0 @@
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
}

View File

@@ -30,41 +30,19 @@ type UpdateRequest struct {
// Default: none
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node, true or false
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
// Required: false
CPUPin interface{} `url:"cpupin,omitempty" json:"cpupin,omitempty" validate:"omitempty,isBool"`
// Default: false
CPUPin bool `url:"cpupin" json:"cpupin"`
// Type of the emulated system, Q35 or i440fx
// Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"`
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node, true or false
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
// Required: false
HPBacked interface{} `url:"hpBacked,omitempty" json:"hpBacked,omitempty" validate:"omitempty,isBool"`
// Auto start when node restarted, true or false
// Required: false
AutoStart interface{} `url:"autoStart,omitempty" json:"autoStart,omitempty" validate:"omitempty,isBool"`
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
// Boot type of image bios or uefi
// Required: false
BootType string `url:"bootType,omitempty" json:"bootType,omitempty" validate:"omitempty,imageBootType"`
// Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming.
// Required: false
NetworkInterfaceNaming string `url:"networkInterfaceNaming,omitempty" json:"networkInterfaceNaming,omitempty" validate:"omitempty,networkInterfaceNaming"`
// Does this machine supports hot resize, true or false
// Required: false
HotResize interface{} `url:"hotResize,omitempty" json:"hotResize,omitempty" validate:"omitempty,isBool"`
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
}
// Update updates some properties of the compute

View File

@@ -3,9 +3,8 @@ package disks
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv"
)
// CreateRequest struct to create disk
@@ -14,6 +13,10 @@ type CreateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// ID of the grid (platform)
// Required: true
GID uint64 `url:"gid" json:"gid" validate:"required"`
// Name of disk
// Required: true
Name string `url:"name" json:"name" validate:"required"`
@@ -26,6 +29,17 @@ type CreateRequest struct {
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Type of disk
// - B=Boot
// - D=Data
// - T=Temp
// Required: true
Type string `url:"type" json:"type" validate:"diskType"`
// Size in GB default is 0
// Required: false
SSDSize uint64 `url:"ssdSize,omitempty" json:"ssdSize,omitempty"`
// Max IOPS disk can perform defaults to 2000
// Required: false
IOPS uint64 `url:"iops,omitempty" json:"iops,omitempty"`

View File

@@ -35,9 +35,9 @@ var disks = ListDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
//},
PresentTo: []uint64{
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@@ -78,10 +78,10 @@ var disks = ListDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@@ -211,9 +211,9 @@ var searchDisks = ListSearchDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
//},
PresentTo: []uint64{
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@@ -254,10 +254,10 @@ var searchDisks = ListSearchDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@@ -393,7 +393,7 @@ var unattachedDisks = ListDisksUnattached{
Password: "",
PCISlot: -1,
Pool: "data05",
PresentTo: map[string]uint64{},
PresentTo: []uint64{},
PurgeAttempts: 0,
PurgeTime: 0,
RealityDeviceNumber: 0,
@@ -445,10 +445,10 @@ var unattachedDisks = ListDisksUnattached{
Password: "",
PCISlot: -1,
Pool: "data05",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeAttempts: 0,
PurgeTime: 0,
RealityDeviceNumber: 0,

View File

@@ -27,6 +27,12 @@ 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"`
@@ -39,6 +45,10 @@ type FromPlatformDiskRequest struct {
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// SEP ID
// Required: false
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Pool for image create
// Required: false
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`

View File

@@ -14,15 +14,9 @@ type ItemDisk struct {
// Computes
Computes map[string]string `json:"computes"`
//Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@@ -56,9 +50,6 @@ type ItemDisk struct {
// Machine name
MachineName string `json:"machineName"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
@@ -78,7 +69,7 @@ type ItemDisk struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@@ -104,9 +95,6 @@ type ItemDisk struct {
// SepID
SepID uint64 `json:"sepId"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@@ -127,12 +115,6 @@ type ItemDisk struct {
// Virtual machine ID
VMID uint64 `json:"vmid"`
// Update time
UpdatedTime uint64 `json:"updatedTime"`
// Updated by
UpdatedBy string `json:"updatedBy"`
}
type ItemDiskUnattached struct {
@@ -218,7 +200,7 @@ type ItemDiskUnattached struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge attempts
PurgeAttempts uint64 `json:"purgeAttempts"`
@@ -372,15 +354,9 @@ type RecordDisk struct {
// Computes
Computes map[string]string `json:"computes"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@@ -408,15 +384,6 @@ type RecordDisk struct {
// IOTune
IOTune IOTune `json:"iotune"`
// Machine ID
MachineID uint64 `json:"machineId"`
// Machine name
MachineName string `json:"machineName"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
@@ -436,7 +403,7 @@ type RecordDisk struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@@ -462,9 +429,6 @@ type RecordDisk struct {
// Shareable
Shareable bool `json:"shareable"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@@ -485,12 +449,6 @@ type RecordDisk struct {
// Virtual machine ID
VMID uint64 `json:"vmid"`
// Update time
UpdatedTime uint64 `json:"updatedTime"`
// Updated by
UpdatedBy string `json:"updatedBy"`
}
type ItemReplication struct {

View File

@@ -19,6 +19,31 @@ type ResizeRequest struct {
Size uint64 `url:"size" json:"size" validate:"required"`
}
// Resize resizes disk
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
// This method will not be used for disks, assigned to computes. Only unassigned disks and disks, assigned with "old" virtual machines.
func (d Disks) Resize(ctx context.Context, req ResizeRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/resize"
res, err := d.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
}
// Resize2 resize disk
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.

View File

@@ -1,50 +0,0 @@
package extnet
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetRequest struct to get information about reserved address or address poll
type GetReservedIP struct {
// AccountID of the account whose reservation information we want to receive
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Field for specifying the ID of extnet whose reservation information we want to receive
// Required: false
ExtNetID uint64 `url:"extnetId,omitempty" json:"extnetId,omitempty"`
}
// GetReservedIP gets information about reserved address or address poll as a slice of RecordReservedIP struct
func (e ExtNet) GetReservedIP(ctx context.Context, req GetReservedIP) ([]RecordReservedIP, error) {
res, err := e.GetReservedIPRaw(ctx, req)
if err != nil {
return nil, err
}
reservedIP := make([]RecordReservedIP, 0)
err = json.Unmarshal(res, &reservedIP)
if err != nil {
return nil, err
}
return reservedIP, nil
}
// GetRaw gets detailed information about external network as an array of bytes
func (e ExtNet) GetReservedIPRaw(ctx context.Context, req GetReservedIP) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/extnet/getReservedIp"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -49,10 +49,6 @@ type ListRequest struct {
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
//openVswitch bridge name
//Required: false
OVSBridge string `url:"ovsBridge,omitempty" json:"ovsBridge,omitempty"`
}
// List gets list of all available external networks as a ListExtNets struct

View File

@@ -87,9 +87,6 @@ type QOS struct {
// Main information about reservations
type ItemReservation struct {
// Account ID
AccountID uint64 `json:"account_id"`
// ClientType
ClientType string `json:"clientType"`
@@ -193,20 +190,14 @@ type RecordExtNet struct {
// Milestones
Milestones uint64 `json:"milestones"`
// MTU
MTU uint64 `json:"mtu"`
// Name
Name string `json:"name"`
// Network
Network string `json:"network"`
// Network IDs
NetworkIDs NetworkIDs `json:"networkIds"`
// NTP
NTP []string `json:"ntp"`
// Network ID
NetworkID uint64 `json:"networkId"`
// OVS Bridge
OVSBridge string `json:"ovsBridge"`
@@ -220,18 +211,9 @@ 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"`
@@ -243,32 +225,4 @@ 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
type RecordReservedIP struct {
ExtnetID int `json:"extnet_id"`
Reservations []Reservations `json:"reservations"`
}
type Reservations struct {
AccountID int `json:"account_id"`
ClientType string `json:"clientType"`
DomainName string `json:"domainname"`
Hostname string `json:"hostname"`
IP string `json:"ip"`
Mac string `json:"mac"`
Type string `json:"type"`
VMID int `json:"vmId"`
}

View File

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

View File

@@ -2,7 +2,6 @@ package image
import (
"context"
"encoding/json"
"net/http"
"strconv"
@@ -70,17 +69,18 @@ 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,29 +102,3 @@ 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
}

View File

@@ -26,6 +26,10 @@ 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"`

View File

@@ -162,7 +162,7 @@ type RecordImage struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// ProviderName
ProviderName string `json:"provider_name"`
@@ -185,9 +185,6 @@ type RecordImage struct {
// Size
Size uint64 `json:"size"`
// snapshot ID
SnapshotID string `json:"snapshotId"`
// Status
Status string `json:"status"`

View File

@@ -166,10 +166,6 @@ 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

View File

@@ -1,42 +0,0 @@
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
}

View File

@@ -89,9 +89,6 @@ type RecordK8S struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// Only external network
ExtnetOnly bool `json:"extnetOnly"`
@@ -139,9 +136,6 @@ type RecordK8S struct {
// With LB
WithLB bool `json:"withLB"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// Detailed information about address of the Virtual Internet Protocol
@@ -308,9 +302,6 @@ type ItemK8SCluster struct {
// List workers group
WorkersGroup ListK8SGroups `json:"workersGroups"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// Information about service account

View File

@@ -16,9 +16,6 @@ type Interface struct {
// - EXTNET
// - VFNIC
// - DPDK
// - EMPTY
// - SDN
// - TRUNK
NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"`
// Network ID for connect to,
@@ -34,14 +31,6 @@ type Interface struct {
// Used only to DPDK net type
// Required: false
MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"`
// 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
@@ -175,14 +164,6 @@ type CreateRequest struct {
// Required: false
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
// 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

View File

@@ -68,30 +68,6 @@ type CreateBlankRequest struct {
// Text description of this VM
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// 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"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
// Boot type of image bios or uefi
// Required: false
BootType string `url:"bootType,omitempty" json:"bootType,omitempty" validate:"omitempty,imageBootType"`
// Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming.
// 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"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -38,16 +38,12 @@ type CreateRequest struct {
HighlyAvailable bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"`
// Start now Load balancer
// Required: true
Start bool `url:"start" json:"start" validate:"required"`
// Required: false
Start bool `url:"start" json:"start"`
// 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 {

View File

@@ -1,42 +0,0 @@
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
}

View File

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

View File

@@ -1,71 +0,0 @@
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
}

View File

@@ -20,9 +20,6 @@ type ItemLocation struct {
// Name
Name string `json:"name"`
// Network Modes
NetworkModes []string `json:"network_modes"`
// Flag
Flag string `json:"flag"`
@@ -31,9 +28,6 @@ type ItemLocation struct {
// CKey
CKey string `json:"_ckey"`
// Support of SDN
SDNSupport bool `json:"sdn_support"`
}
// List of locations

View File

@@ -1,8 +0,0 @@
package cloudapi
import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/prometheus"
// Accessing the Resmon method group
func (ca *CloudAPI) Prometheus() *prometheus.Prometheus {
return prometheus.New(ca.client)
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeCPULoadRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Per-second CPU time consumed by Compute in percent, average over the time step specified
func (p Prometheus) ComputeCPULoad(ctx context.Context, req ComputeCPULoadRequest) (*PrometheusData, error) {
res, err := p.ComputeCPULoadRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeCPULoadRaw(ctx context.Context, req ComputeCPULoadRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeCPUload"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryAvailableRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Available Memory
func (p Prometheus) ComputeMemoryAvailable(ctx context.Context, req ComputeMemoryAvailableRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryAvailableRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryAvailableRaw(ctx context.Context, req ComputeMemoryAvailableRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryAvailable"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUnusedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Unused Memory
func (p Prometheus) ComputeMemoryUnused(ctx context.Context, req ComputeMemoryUnusedRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUnusedRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUnusedRaw(ctx context.Context, req ComputeMemoryUnusedRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUnused"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsableRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Usable Memory
func (p Prometheus) ComputeMemoryUsable(ctx context.Context, req ComputeMemoryUsableRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsableRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsableRaw(ctx context.Context, req ComputeMemoryUsableRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsable"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsageRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Memory Usage
func (p Prometheus) ComputeMemoryUsage(ctx context.Context, req ComputeMemoryUsageRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsageRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsageRaw(ctx context.Context, req ComputeMemoryUsageRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsage"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Used Memory
func (p Prometheus) ComputeMemoryUsed(ctx context.Context, req ComputeMemoryUsedRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsedRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsedRaw(ctx context.Context, req ComputeMemoryUsedRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsed"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReadBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Read Bytes
func (p Prometheus) ComputeReadBytes(ctx context.Context, req ComputeReadBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeReadBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReadBytesRaw(ctx context.Context, req ComputeReadBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReadBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReadRequestsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Read Requests
func (p Prometheus) ComputeReadRequests(ctx context.Context, req ComputeReadRequestsRequest) (*PrometheusData, error) {
res, err := p.ComputeReadRequestsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReadRequestsRaw(ctx context.Context, req ComputeReadRequestsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReadRequests"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReceiveBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Receive Bytes
func (p Prometheus) ComputeReceiveBytes(ctx context.Context, req ComputeReceiveBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeReceiveBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReceiveBytesRaw(ctx context.Context, req ComputeReceiveBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReceiveBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReceivePacketsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Receive Packets
func (p Prometheus) ComputeReceivePackets(ctx context.Context, req ComputeReceivePacketsRequest) (*PrometheusData, error) {
res, err := p.ComputeReceivePacketsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReceivePacketsRaw(ctx context.Context, req ComputeReceivePacketsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReceivePackets"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeTransmitBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Transmit Bytes
func (p Prometheus) ComputeTransmitBytes(ctx context.Context, req ComputeTransmitBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeTransmitBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeTransmitBytesRaw(ctx context.Context, req ComputeTransmitBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeTransmitBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeTransmitPacketsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Transmit Packets
func (p Prometheus) ComputeTransmitPackets(ctx context.Context, req ComputeTransmitPacketsRequest) (*PrometheusData, error) {
res, err := p.ComputeTransmitPacketsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeTransmitPacketsRaw(ctx context.Context, req ComputeTransmitPacketsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeTransmitPackets"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeWriteBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Write Bytes
func (p Prometheus) ComputeWriteBytes(ctx context.Context, req ComputeWriteBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeWriteBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeWriteBytesRaw(ctx context.Context, req ComputeWriteBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeWriteBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeWriteRequestsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Write Requests
func (p Prometheus) ComputeWriteRequests(ctx context.Context, req ComputeWriteRequestsRequest) (*PrometheusData, error) {
res, err := p.ComputeWriteRequestsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeWriteRequestsRaw(ctx context.Context, req ComputeWriteRequestsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeWriteRequests"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,77 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
const (
ComputeCPULoad = "computeCPUload"
ComputeMemoryUsage = "computeMemoryUsage"
ComputeMemoryUsable = "computeMemoryUsable"
ComputeMemoryUnused = "computeMemoryUnused"
ComputeMemoryUsed = "computeMemoryUsed"
ComputeMemoryAvailable = "computeMemoryAvailable"
ComputeReadBytes = "computeReadBytes"
ComputeReadRequests = "computeReadRequests"
ComputeReceiveBytes = "computeReceiveBytes"
ComputeTransmitBytes = "computeTransmitBytes"
ComputeTransmitPackets = "computeTransmitPackets"
ComputeWriteBytes = "computeWriteBytes"
ComputeWriteRequests = "computeWriteRequests"
)
type ComputesRequest struct {
// List of compute IDs to fetch metrics for
// Required: true
ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"required"`
// List of compute IDs to fetch metrics for
// Required: true
MetricIDs []string `url:"metricIds" json:"metricIds" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Get multiple metrics for multiple compute instances
func (p Prometheus) Computes(ctx context.Context, req ComputesRequest) (*ComputesData, error) {
res, err := p.ComputesRaw(ctx, req)
if err != nil {
return nil, err
}
info := ComputesData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputesRaw(ctx context.Context, req ComputesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,40 +0,0 @@
package prometheus
// PrometheusData represents an array of data points
type PrometheusData []PrometheusPoint
// PrometheusPoint represents a single data point
type PrometheusPoint struct {
// Value of the metric at a specific point in time
Value float64 `json:"value"`
// Timestamp the Unix timestamp.
Timestamp uint64 `json:"timestamp"`
}
// ComputesData represents an array of data points for computes
type ComputesData []ItemCompute
// ItemCompute represents a single data of compute
type ItemCompute struct {
// Compute ID
ComputeID uint64 `json:"computeId"`
// Array of metrics
Metrics []ItemMetric `json:"metrics"`
// Error
Error string `json:"error"`
}
// ItemMetric represents a single data point of metric
type ItemMetric struct {
// Metric ID
MetricID string `json:"metricId"`
// Data represents an array of data points
Data PrometheusData `json:"data"`
// Error
Error string `json:"error"`
}

View File

@@ -1,15 +0,0 @@
package prometheus
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
type Prometheus struct {
client interfaces.Caller
}
func New(client interfaces.Caller) *Prometheus {
return &Prometheus{
client: client,
}
}

View File

@@ -72,9 +72,9 @@ type CreateRequest struct {
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
// SDN access group id
// Register computes in registration system
// Required: false
SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"`
RegisterComputes bool `url:"registerComputes,omitempty" json:"registerComputes,omitempty"`
}
// Create creates resource group

View File

@@ -17,19 +17,20 @@ var rgs = ListResourceGroups{
UserGroupID: "sample_user_1@decs3o",
},
},
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1676645305,
DefNetID: 1,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7971,
ID: 7971,
LockStatus: "UNLOCKED",
Milestones: 363459,
Name: "rg_1",
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1676645305,
DefNetID: 1,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7971,
ID: 7971,
LockStatus: "UNLOCKED",
Milestones: 363459,
Name: "rg_1",
RegisterComputes: false,
ResourceLimits: ResourceLimits{
CUC: -1,
CUI: -1,
@@ -59,19 +60,20 @@ var rgs = ListResourceGroups{
UserGroupID: "sample_user_1@decs3o",
},
},
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1676645461,
DefNetID: 2,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7972,
ID: 7972,
LockStatus: "UNLOCKED",
Milestones: 363468,
Name: "rg_2",
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1676645461,
DefNetID: 2,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7972,
ID: 7972,
LockStatus: "UNLOCKED",
Milestones: 363468,
Name: "rg_2",
RegisterComputes: false,
ResourceLimits: ResourceLimits{
CUC: -1,
CUI: -1,
@@ -101,19 +103,20 @@ var rgs = ListResourceGroups{
UserGroupID: "sample_user_2@decs3o",
},
},
CreatedBy: "sample_user_2@decs3o",
CreatedTime: 1676645548,
DefNetID: 3,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7973,
ID: 7973,
LockStatus: "kjLOCKED",
Milestones: 363471,
Name: "rg_3",
CreatedBy: "sample_user_2@decs3o",
CreatedTime: 1676645548,
DefNetID: 3,
DefNetType: "NONE",
DeletedBy: "",
DeletedTime: 0,
Description: "",
GID: 212,
GUID: 7973,
ID: 7973,
LockStatus: "kjLOCKED",
Milestones: 363471,
Name: "rg_3",
RegisterComputes: false,
ResourceLimits: ResourceLimits{
CUC: -1,
CUI: -1,

View File

@@ -128,15 +128,15 @@ type RecordResourceGroup struct {
// Name
Name string `json:"name"`
// RegisterComputes
RegisterComputes bool `json:"registerComputes"`
// Resource limits
ResourceLimits ResourceLimits `json:"resourceLimits"`
// List of resource types
ResTypes []string `json:"resourceTypes"`
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
// Secret
Secret string `json:"secret"`
@@ -224,15 +224,15 @@ type ItemResourceGroup struct {
// Name
Name string `json:"name"`
// RegisterComputes
RegisterComputes bool `json:"registerComputes"`
// Resource limits
ResourceLimits ResourceLimits `json:"resourceLimits"`
// List of resource types
ResTypes []string `json:"resourceTypes"`
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
// Secret
Secret string `json:"secret"`

View File

@@ -42,6 +42,10 @@ type UpdateRequest struct {
// Required: false
MaxNumPublicIP int64 `url:"maxNumPublicIP,omitempty" json:"maxNumPublicIP,omitempty"`
// Register computes in registration system
// Required: false
RegisterComputes bool `url:"registerComputes,omitempty" json:"registerComputes,omitempty"`
// List of strings with pools i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
// Required: false
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`

View File

@@ -1,8 +0,0 @@
package cloudapi
import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/sep"
// Accessing the SEP method group
func (cb *CloudAPI) SEP() *sep.SEP {
return sep.New(cb.client)
}

View File

@@ -1,83 +0,0 @@
package sep
// FilterBySEPID returns ListAvailableSEP with the specified SEPID.
func (sl ListAvailableSEP) FilterBySEPID(sepID uint64) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPID == sepID
}
return sl.FilterFunc(predicate)
}
// FilterBySEPName returns ListAvailableSEP with the specified SEPName.
func (sl ListAvailableSEP) FilterBySEPName(SEPName string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPName == SEPName
}
return sl.FilterFunc(predicate)
}
// FilterBySEPType returns ListAvailableSEP with the specified SEPType.
func (sl ListAvailableSEP) FilterBySEPType(SEPType string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPType == SEPType
}
return sl.FilterFunc(predicate)
}
// FilterByPoolType returns ListAvailableSEP where at least one pool has the specified type.
func (sl ListAvailableSEP) FilterByPoolType(poolType string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
for _, pool := range sd.Pools {
for _, pt := range pool.Types {
if pt == poolType {
return true
}
}
}
return false
}
return sl.FilterFunc(predicate)
}
// FilterBySystemPool returns ListAvailableSEP where at least one pool is a system pool.
func (sl ListAvailableSEP) FilterBySystemPool(isSystem bool) ListAvailableSEP {
predicate := func(sd SEPData) bool {
for _, pool := range sd.Pools {
if pool.System == isSystem {
return true
}
}
return false
}
return sl.FilterFunc(predicate)
}
// FilterFunc allows filtering ListAvailableSEP based on a user-defined predicate.
func (sl ListAvailableSEP) FilterFunc(predicate func(SEPData) bool) ListAvailableSEP {
var result ListAvailableSEP
for _, item := range sl.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns the first found SEPData.
// If nothing is found, returns an empty struct.
func (sl ListAvailableSEP) FindOne() SEPData {
if len(sl.Data) == 0 {
return SEPData{}
}
return sl.Data[0]
}

View File

@@ -1,134 +0,0 @@
package sep
import (
"testing"
)
var seps = ListAvailableSEP{
EntryCount: 3,
Data: []SEPData{
{
SEPID: 1,
SEPName: "sep_1",
SEPType: "TATLIN",
Pools: []Pool{
{
Name: "pool_1",
Types: []string{"DES"},
System: false,
},
},
},
{
SEPID: 2,
SEPName: "sep_2",
SEPType: "SHARED",
Pools: []Pool{
{
Name: "pool_2",
Types: []string{"DES"},
System: true,
},
},
},
{
SEPID: 3,
SEPName: "sep_3",
SEPType: "DES",
Pools: []Pool{
{
Name: "pool_3",
Types: []string{"DES"},
System: false,
},
},
},
},
}
func TestFilterBySEPID(t *testing.T) {
actual := seps.FilterBySEPID(1).FindOne()
if actual.SEPID != 1 {
t.Fatal("expected SEPID 1, found: ", actual.SEPID)
}
}
func TestFilterBySEPName(t *testing.T) {
actual := seps.FilterBySEPName("sep_2").FindOne()
if actual.SEPName != "sep_2" {
t.Fatal("expected SEPName 'sep_2', found: ", actual.SEPName)
}
}
func TestFilterBySEPType(t *testing.T) {
actual := seps.FilterBySEPType("TATLIN").FindOne()
if actual.SEPType != "TATLIN" {
t.Fatal("expected SEPType 'TATLIN', found: ", actual.SEPType)
}
}
func TestFilterByPoolType(t *testing.T) {
actual := seps.FilterByPoolType("DES")
if len(actual.Data) != 3 {
t.Fatal("expected 3 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
found := false
for _, pool := range item.Pools {
for _, poolType := range pool.Types {
if poolType == "DES" {
found = true
break
}
}
if found {
break
}
}
if !found {
t.Fatal("expected Pool type 'DES', not found in SEP: ", item.SEPID)
}
}
}
func TestFilterBySystemPool(t *testing.T) {
actual := seps.FilterBySystemPool(true)
if len(actual.Data) != 1 {
t.Fatal("expected 1 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
found := false
for _, pool := range item.Pools {
if pool.System {
found = true
break
}
}
if !found {
t.Fatal("expected System pool, not found in SEP: ", item.SEPID)
}
}
}
func TestFilterFunc(t *testing.T) {
actual := seps.FilterFunc(func(sd SEPData) bool {
return len(sd.Pools) > 0
})
if len(actual.Data) != 3 {
t.Fatal("expected 3 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if len(item.Pools) == 0 {
t.Fatal("expected Pools to contain at least 1 element, found: ", len(item.Pools))
}
}
}

View File

@@ -1,10 +0,0 @@
package sep
// IDs gets array of SEPIDs from ListSEP struct
func (ls ListAvailableSEP) IDs() []uint64 {
res := make([]uint64, 0, len(ls.Data))
for _, s := range ls.Data {
res = append(res, s.SEPID)
}
return res
}

View File

@@ -1,52 +0,0 @@
package sep
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListAvailableSEPAndPoolsRequest struct to get dict with entry count and list of dict with SEPs and pools details accessible by the Account and RG
type ListAvailableSEPAndPoolsRequest struct {
// Account ID
// Required: true
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
// RG ID
// Required: false
RGID uint64 `url:"rg_id,omitempty" json:"rg_id,omitempty"`
}
// ListAvailableSEPAndPools get dict with entry count and list of dict with SEPs and pools details accessible by the Account and RG
func (s SEP) ListAvailableSEPAndPools(ctx context.Context, req ListAvailableSEPAndPoolsRequest) (*ListAvailableSEP, error) {
res, err := s.ListAvailableSEPAndPoolsRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListAvailableSEP{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list as an array of bytes
func (s SEP) ListAvailableSEPAndPoolsRaw(ctx context.Context, req ListAvailableSEPAndPoolsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/sep/listAvailableSepAndPools"
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,34 +0,0 @@
package sep
type Pool struct {
// Pool name
Name string `json:"name"`
// Pool types
Types []string `json:"types"`
// System
System bool `json:"system"`
}
type SEPData struct {
// SEP ID
SEPID uint64 `json:"sepId"`
// SEP name
SEPName string `json:"sepName"`
// Sep type
SEPType string `json:"sepType"`
// Pools
Pools []Pool `json:"pools"`
}
type ListAvailableSEP struct {
// Entry count
EntryCount uint64 `json:"entryCount"`
// Data
Data []SEPData `json:"data"`
}

View File

@@ -1,18 +0,0 @@
// Operator actions for handling interventions on a storage endpoint provider
package sep
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
// Structure for creating request to storage endpoint provider
type SEP struct {
client interfaces.Caller
}
// Builder for SEP endpoints
func New(client interfaces.Caller) *SEP {
return &SEP{
client: client,
}
}

View File

@@ -1,43 +0,0 @@
package sep
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 (lsep ListAvailableSEP) Serialize(params ...string) (serialization.Serialized, error) {
if len(lsep.Data) == 0 {
return []byte{}, nil
}
if len(params) > 1 {
prefix := params[0]
indent := params[1]
return json.MarshalIndent(lsep, prefix, indent)
}
return json.Marshal(lsep)
}
// 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 (rsep SEPData) Serialize(params ...string) (serialization.Serialized, error) {
if len(params) > 1 {
prefix := params[0]
indent := params[1]
return json.MarshalIndent(rsep, prefix, indent)
}
return json.Marshal(rsep)
}

View File

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

View File

@@ -1,10 +0,0 @@
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)
}

View File

@@ -1,46 +0,0 @@
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
}

View File

@@ -1,61 +0,0 @@
package trunk
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListRequest struct to get list of trunks
type ListRequest struct {
// Account access ID to filter by
AccountIDs []uint64 `url:"account_ids,omitempty" json:"account_ids,omitempty"`
// ID of the trunk to filter by
IDs []uint64 `url:"ids,omitempty" json:"ids,omitempty"`
// Sort by one of supported fields, format ±<field>
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
// Trunk tags to filter by
TrunkTags string `url:"trunk_tags,omitempty" json:"trunk_tags,omitempty" validate:"omitempty,trunkTags"`
// Page number
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// List gets list of all trunks as a ListTrunks struct
func (t Trunk) List(ctx context.Context, req ListRequest) (*ListTrunks, error) {
res, err := t.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListTrunks{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of all trunks as an array of bytes
func (t Trunk) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/trunk/list"
res, err := t.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -1,59 +0,0 @@
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"`
}

View File

@@ -1,18 +0,0 @@
// 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,
}
}

View File

@@ -28,10 +28,6 @@ type GetAuditRequest struct {
// Required: false
MinStatusCode uint64 `url:"minStatusCode,omitempty" json:"minStatusCode,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"`

View File

@@ -53,10 +53,6 @@ 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 {

View File

@@ -47,10 +47,6 @@ 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 {

View File

@@ -18,10 +18,6 @@ type ListRequest struct {
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`

View File

@@ -1,42 +0,0 @@
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
}

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