Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eb195dd992 | |||
| d7b8f08b4d | |||
| bd2d22f456 | |||
|
|
416a6c4263 | ||
| 6ff4b83368 | |||
| 118b48c3bc | |||
|
|
cd5d1c9d0b | ||
| f5a632654b |
302
CHANGELOG.md
302
CHANGELOG.md
@@ -1,199 +1,209 @@
|
|||||||
## Version 1.15.0
|
## Version 1.16.0
|
||||||
|
|
||||||
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
|
Метод `ConfigFieldEdit` в cloudbroker/sep стал deprecated и в следующих версиях будет удалён
|
||||||
Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и в следующих версиях будут удалены
|
|
||||||
Методы `ComputeCISet`, `ComputeCIUnset`, `GetAudits` в cloudbroker/compute и `GetAudits` в cloudapi/compute стали deprecated и будут удалены в следующих версиях
|
|
||||||
Методы `ComputeCISet`, `ComputeCIUnset` в cloudbroker/image стали deprecated и будут удалены в следующих версиях
|
|
||||||
|
|
||||||
Все методы группы `.SDN()` находятся в альфа-версии.
|
|
||||||
|
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
|
#### Общее
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-991 | Допустимые значения `vgpu` и `pcidevice` в валидатор возможностей гипервизора ComputeFeatures |
|
||||||
|
|
||||||
|
#### account
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-986 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVINS` в cloudbroker/account и cloudapi/account |
|
||||||
|
| BGOS-989 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуры ответа `Computes` и `RGComputes` в cloudapi/account |
|
||||||
|
| BGOS-989 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуру ответа `Computes` в cloudbroker/account |
|
||||||
|
|
||||||
#### compute
|
#### compute
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-864 | Методы `GetCPUAlignmentProfile`, `SetCPUAlignmentProfile` и `DeleteCPUAlignmentProfile` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-977 | Вычисляемое поле `ImageID` в структуру ответа `InfoDisk` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-864 | Структуры запросов `GetCPUAlignmentProfileRequest`, `SetCPUAlignmentProfileRequest` и `DeleteCPUAlignmentProfileRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-978 | Вычисляемое поле `WatchdogAction` в структуры ответа `RecordCompute` и `ItemCompute` в cloudapi/compute |
|
||||||
| BGOS-865 | Вычисляемое поле `CPUAlignmentProfile` в структуру ответа `RecordCompute` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-978 | Вычисляемое поле `WatchdogAction` в структуры ответа `RecordCompute` и `InfoCompute` в cloudbroker/compute |
|
||||||
| BGOS-865 | Вычисляемое поле `CPUAlignmentProfile` в структуру ответа `ItemCompute` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-979 | Опциональное поле `WatchdogAction` в структуру запроса `UpdateRequest` в cloudapi/compute и cloudbroker/compute |
|
||||||
| BGOS-865 | Структура ответа `CPUAlignmentProfile` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-994 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemVNFInterface` в cloudapi/compute |
|
||||||
| BGOS-872 | Опциональное поле `WithMemory` в структуру запроса `SnapshotCreateRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-994 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemInterface` в cloudbroker/compute |
|
||||||
| BGOS-872 | Опциональное поле `WithMemory` в структуру запроса `SnapshotRollbackRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
|
||||||
| BGOS-872 | Вычисляемые поля `MemoryDumpImage` и `Compute` в структуру ответа `ItemSnapshot` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-994 | Методы `ChangeQoSPolicies` и `ChangeQoSPoliciesAsync` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-872 | Методы `SnapshotCreateAsync`, `SnapshotRollbackAsync` и `AbortSharedSnapshotMergeAsync` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-995 | Вычисляемые поля `ComputeID`, `BusNumber`, `DeviceReference`, `MdevUUID`, `ParentPCIAddress`, `ProfileReference` и `SplitMode` в структуру ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-872 | Опциональное поле `NodeID` в структуру запроса `SnapshotRollbackRequest` в cloudbroker/compute |
|
| BGOS-999 | Вычисляемое поле `AccountIDs` в структуру ответа `ItemPCIDevice` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-877 | Опциональное поле `Clock` в структуру запроса `UpdateRequest` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-877 | Вычисляемое поле `Clock` в структуры ответа `RecordCompute` и `ItemCompute` в cloudapi/compute|
|
|
||||||
| BGOS-877 | Вычисляемое поле `Clock` в структуры ответа `RecordCompute` и `InfoCompute` в cloudbroker/compute |
|
|
||||||
| BGOS-885 | Методы `CDEjectAsync`, `CDInsertAsync`, `ChangeIPAsync`, `ChangeLinkStateAsync`, `ChangeSecGroupsAsync`, `ChangeMTUAsync`, `CloneAsync`, `CreateTemplateAsync`, `DeleteAsync`, `DisableAsync`, `DiskAddAsync`, `DiskAttachAsync`, `DiskDelAsync`, `DiskDetachAsync`, `DiskQOSAsync`, `DiskResizeAsync`, `DiskSwitchToReplicationAsync`, `GuestAgentDisableAsync`, `GuestAgentEnableAsync`, `GuestAgentExecuteRequestAsync`, `GuestAgentFeatureUpdateAsync`, `MigrateToZoneAsync`, `MoveToRGAsync`, `NetAttachAsync`, `NetDetachAsync`, `PauseAsync`, `PFWAddAsync`, `PFWDelAsync`, `PinToNodeAsync`, `PowerCycleAsync`, `RebootAsync`, `RedeployAsync`, `ResetAsync`, `ResizeAsync`, `RestoreAsync`, `ResumeAsync`, `StartAsync`, `StopAsync`, `MassDeleteAsync`, `MassRebootAsync`, `MassStartAsync`, `MassStopAsync`, `MigrateAbortAsync`, `MigrateStorageAbortAsync`, `MigrateStorageCleanUpAsync`, `NetQOSAsync` и `RaiseDownAsync` в cloudbroker/compute |
|
|
||||||
| BGOS-885 | Методы `CDEjectAsync`, `CDInsertAsync`, `ChangeIPAsync`, `ChangeLinkStateAsync`, `ChangeMTUAsync`, `ChangeSecGroupsAsync`, `CloneAsync`, `DeleteAsync`, `DisableAsync`, `DiskAddAsync`, `DiskDelAsync`, `DiskAttachAsync`, `DiskDetachAsync`, `DiskQOSAsync`, `DiskResizeAsync`, `DiskSwitchToReplicationAsync`, `GuestAgentDisableAsync`, `GuestAgentEnableAsync`, `GuestAgentExecuteRequestAsync`, `GuestAgentFeatureUpdateAsync`, `MigrateToZoneAsync`, `MoveToRGAsync`, `NetAttachAsync`, `NetDetachAsync`, `PauseAsync`, `PFWAddAsync`, `PFWDelAsync`, `PinToNodeAsync`, `PowerCycleAsync`, `RebootAsync`, `RedeployAsync`, `ResetAsync`, `ResizeAsync`, `RestoreAsync`, `ResumeAsync`, `StartAsync` и `StopAsync` в cloudapi/compute |
|
|
||||||
| BGOS-894 | Опциональное поле `ReadOnly` в структуры запросов `DiskAddRequest` и `DiskAttachRequest` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-894 | Опциональное поле `ReadOnly` в структуры ответа `InfoDisk` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-894 | Опциональное поле `ReadOnly` в структуру ответа `ItemComputeDisk` в cloudapi/compute |
|
|
||||||
| BGOS-894 | Опциональное поле `ReadOnly` в структуру ответа `ItemDisk` в cloudbroker/compute |
|
|
||||||
|
|
||||||
#### disks
|
#### disks
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-895 | Вычисляемое поле `ComputesReadOnly` в структуру ответа `InfoDisk` в cloudbroker/disks |
|
| BGOS-976 | Метод `CreateAsync` в cloudapi/disks |
|
||||||
| BGOS-895 | Вычисляемое поле `ComputesReadOnly` в структуры ответа `ItemDisk` и `RecordDisk` в cloudapi/disks |
|
| BGOS-976 | Методы `CreateAsync` и `MigrateAsync` в cloudbroker/disks |
|
||||||
|
|
||||||
#### extnet
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-876 | Вычисляемое поле `FreeIPs` в структуру ответа `ItemExtNet` в cloudapi/extnet |
|
|
||||||
|
|
||||||
#### grid
|
#### grid
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-888 | Вычисляемые поля `CPUAllocationRatio`, `CPUAllocationRatioVM`, `CustomBackupPath`, `InterfaceGenerationScheme`, `MACAddressPrefix`, `NodeSelfStopTimerUptimeMonitor` и `NodeSelfStopUptimeMonitor` в структуру ответа `RecordSettingsGrid` в cloudbroker/grid |
|
| BGOS-1000 | Вычисляемые поля `ReservedCPU` и `ReservedRAM` в структуру ответа `RecordSettingsGrid` в cloudbroker/grid |
|
||||||
| BGOS-888 | Вычисляемое поле `ZeroAccessEnabled` в структуру ответа `RecordGrid` в cloudbroker/grid |
|
|
||||||
| BGOS-888 | Вычисляемое поле `Policies` в структуру ответа `RecordResource` и структура ответа `PolicyUsage` в cloudbroker/grid |
|
|
||||||
|
|
||||||
#### kvmx86
|
#### kvmx86
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-865 | Опциональное поле `CPUAlignmentProfile` в структуры запросов `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
| BGOS-979 | Опциональное поле `WatchdogAction` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 |
|
||||||
| BGOS-865 | Опциональное поле `CPUAlignmentProfile` в структуру запроса `MassCreateRequest` в cloudbroker/kvmx86 |
|
| BGOS-979 | Опциональное поле `WatchdogAction` в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 |
|
||||||
| BGOS-877 | Опциональное поле `Clock` в структуры запросов `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
| BGOS-983 | Метод `CreateAsync` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
|
||||||
| BGOS-877 | Опциональное поле `Clock` в структуру запроса `MassCreateRequest` в cloudbroker/kvmx86 |
|
| BGOS-984 | Опциональное поле `ReadOnly` в структуру запроса `DataDisk` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
|
||||||
|
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `Interface` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
|
||||||
|
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `InterfaceMassCreate` в cloudbroker/kvmx86 |
|
||||||
|
|
||||||
#### node
|
#### locations
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-866 | Вычисляемые поля `OneGAvailable`, `OneGFree`, `OneGReserved`, `OneGUsed`, `OneGDPDKReserved`, `TwoMAvailable`, `TwoMFree`, `TwoMReserved` и `TwoMUsed` в структуру ответа `ItemMemory` в cloudbroker/node |
|
| BGOS-992 | Вычисляемое поле `Budget` в структуру ответа `ItemLocation` в cloudapi/locations |
|
||||||
| BGOS-879 | Методы `GetPCIDevices`, `PCIDeviceDriverToVFIO` и `PCIDeviceDriverToKernel` в cloudbroker/node |
|
|
||||||
| BGOS-879 | Структуры запросов `GetPCIDevicesRequest`, `PCIDeviceDriverToVFIORequest` и `PCIDeviceDriverToKernelRequest` в cloudbroker/node |
|
|
||||||
| BGOS-879 | Структуры ответов `RecordPCIDeviceDriver`, `ListPCIDevices` и `ItemPCIDevice` в cloudbroker/node |
|
|
||||||
| BGOS-880 | Вычисляемое поле `PCIDevices` в структуру ответа `ItemNode` в cloudbroker/node |
|
|
||||||
| BGOS-882 | Метод `GetNetworkInfo` и структура запроса `GetNetworkInfoRequest` в cloudbroker/node |
|
|
||||||
| BGOS-882 | Структуры ответа `RecordNodeNetworkInfo`, `SystemNetworkInfo`, `OVSNetworkInfo`, `LibvirtNetworkInfo` и `NetworkTopology` в cloudbroker/node |
|
|
||||||
| BGOS-890 | Структура ответа `ItemNode` для методов `SetCpuAllocationRatio` и `SetMemAllocationRatio` в cloudbroker/node |
|
|
||||||
|
|
||||||
#### sep
|
#### network qos policy
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-873 | Метод `Update` и структура запроса `UpdateRequest` в cloudbroker/sep |
|
| BGOS-993 | Группа ручек `QoSPolicy` в cloudbroker/qospolicy и cloudapi/qospolicy |
|
||||||
|
|
||||||
|
#### resmon
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-981 | Вычисляемое поле `TotalVCPUs` в структуру ответа `GetByNodePoint` в cloudbroker/resmon |
|
||||||
|
|
||||||
|
#### rg
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-998 | Опциональное поле `IPCIDR` в структуру запроса `CreateRequest` в cloudbroker/rg |
|
||||||
|
|
||||||
|
#### tasks
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-996 | Опицональные поля `CreatedTimeAt` и `CreatedTimeTo` в структуру запроса `ListRequest` в cloudapi/tasks и cloudbroker/tasks |
|
||||||
|
| BGOS-996 | Вычисляемое поле `CreatedTime` в структуру ответа `RecordAsyncTask` в cloudapi/tasks |
|
||||||
|
| BGOS-996 | Вычисляемое поле `CreatedTime` в структуру ответа `ItemTask` в cloudbroker/tasks |
|
||||||
|
|
||||||
|
#### user
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-988 | Вычисляемые поля `Destroying`, `Confirmed` и `Deleted` в структуру ответа `Accounts` в cloudapi/user |
|
||||||
|
| BGOS-988 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуру ответа `Computes` в cloudapi/user |
|
||||||
|
| BGOS-988 | Вычисляемые поля `Modeled`, `Created`, `Deleted`, `Deleting`, `Destroying`, `Disabling`, `Enabling` и `Restoring` в структуру ответа `RGs` в cloudapi/user |
|
||||||
|
|
||||||
|
#### vins
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-986 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVINS` в cloudapi/vins |
|
||||||
|
|
||||||
|
#### vgpu
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-980 | Опциональные поля `AccountIDs`, `MDEVType` и `PCIAddress` в структуру запроса `CreateRequest` в cloudbroker/vgpu |
|
||||||
|
| BGOS-980 | Опциональное поле `SplitMode` в структуру запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
| BGOS-980 | Вычисляемые поля `ComputeID`, `DeviceReference`, `MdevUUID`, `ParentPCIAddress`, `ProfileReference` и `SplitMode` в структуру ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
| BGOS-980 | Вычисляемое поле `BusNumber` в структуру ответа `ItemVGPU` в cloudbroker/vgpu |
|
||||||
|
|
||||||
#### zone
|
#### zone
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-862 | Метод `AddCPUAlignmentProfile` и структура запроса `AddCPUAlignmentProfileRequest` в cloudbroker/zone |
|
| BGOS-997 | Вычисляемые поля `SDRS`, `SDRSMode` и `LoggingLevel` в структуры ответа `RecordZone` и `ItemZone` в cloudapi/zone и cloudbroker/zone |
|
||||||
| BGOS-862 | Метод `DeleteCPUAlignmentProfile` и структура запроса `DeleteCPUAlignmentProfileRequest` в cloudbroker/zone |
|
|
||||||
| BGOS-862 | Метод `GetCPUAlignmentProfile` и структура запроса `GetCPUAlignmentProfileRequest` в cloudbroker/zone |
|
|
||||||
| BGOS-862 | Метод `ListCPUAlignmentProfile` и структура запроса `ListCPUAlignmentProfileRequest` в cloudbroker/zone |
|
|
||||||
| BGOS-862 | Метод `TestCPUAlignmentProfile` и структура запроса `TestCPUAlignmentProfileRequest` в cloudbroker/zone |
|
|
||||||
| BGOS-862 | Структуры ответов `ListCPUAlignmentProfiles`, `ItemCPUAlignmentProfile`, `TestCPUAlignmentProfileResult` и `CpuAlignmentProfileCandidate` в cloudbroker/zone |
|
|
||||||
| BGOS-863 | Вычисляемое поле `CpuAlignmentProfiles` в структуры ответа `RecordZone` и `ItemZone` и структура `CpuAlignmentProfile` в cloudapi/zone и cloudbroker/zone |
|
|
||||||
|
|
||||||
#### SDN logicalports
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-896 | Обязательное поле `ID` в структуру запроса `UpdateAddress` в sdn/logical_port |
|
|
||||||
|
|
||||||
#### SDN netobjgroups
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-884 | Опциональное поле `Type` в структуру запроса `ListRequest` в sdn/netobjgroups |
|
|
||||||
|
|
||||||
### Изменено
|
### Изменено
|
||||||
|
|
||||||
#### account
|
#### bservice
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-887 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структуре ответа `RecordAccount` в cloudapi/account |
|
| BGOS-1003 | Тип опционального поля `UserData` в структуре запроса `GroupAddRequest` сo `string` на `interface{}` в cloudbroker/bservice и cloudapi/bservice |
|
||||||
| BGOS-887 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структуре ответа `InfoAccount` в cloudbroker/account |
|
|
||||||
|
|
||||||
#### compute
|
#### compute
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-874 | Поле `StoragePolicyID` с обязательного на опциональное в структуре запроса `RedeployRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-995 | Название вычисляемого поля `AccountID` на `AccountIDs` и тип с `uint64` на `[]uint64` в структуре ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре ответа `ItemComputeDisk` в cloudapi/compute |
|
| BGOS-995 | Тип вычисляемого поля `VGPUs` с `[]VGPUItem` на `[]ItemVGPU` в структурах ответов `RecordCompute` и `SnapRecordCompute` в cloudbroker/compute и cloudapi/compute |
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре ответа `ItemDisk` в cloudbroker/compute|
|
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре запроса `DiskAddRequest` в cloudbroker/compute|
|
|
||||||
| BGOS-885 | Тип возвращаемого значения с `string` на `bool` в методе `Restore` в cloudapi/compute |
|
|
||||||
| BGOS-885 | Тип возвращаемого значения с `string` на `bool` в методе `MigrateStorageAbort` в cloudbroker/compute |
|
|
||||||
| BGOS-885 | Тип возвращаемого значения с `string` на `bool` в методе `MigrateStorageCleanUp` в cloudbroker/compute |
|
|
||||||
| BGOS-885 | Название метода с `Validate` на `MoveToRG` в cloudbroker/compute |
|
|
||||||
| BGOS-893 | Тип поля `SDNObjectGroupID` с `string` на `[]string` и переименование в `SDNObjectGroupIDs` в структуре запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
|
|
||||||
|
|
||||||
#### disks
|
#### disks
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структурах ответа `RecordDisk`, `ItemDisk` и `ItemDiskUnattached` в cloudapi/disks |
|
| BGOS-987 | Тип опционального поля `Status` в структуре запроса `ListRequest` с `string` на `[]string` в cloudbroker/disks и cloudapi/disks |
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре ответа `InfoDisk` в cloudbroker/disks |
|
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структурах запросов `CreateRequest` и `UpdateRequest` в cloudbroker/disks |
|
|
||||||
| BGOS-881 | Поле `StoragePolicyID` c опционального на обязательное в структуре запроса `MigrateRequest` в cloudbroker/disks |
|
|
||||||
|
|
||||||
#### grid
|
#### k8s
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-888 | Тип поля `Ratio` с `float64` на `uint64` в структурах запросов `SetCPUAllocationRatioRequest`, `SetCPUAllocationRatioForVMRequest` и `SetMemAllocationRatioRequest` в cloudbroker/grid |
|
| BGOS-1002 | Тип опционального поля `UserData` в структурах запросов `CreateRequest` и `UpdateWorkerNodesMetaDataRequest` со `string` на `interface{}` в cloudbroker/k8s и cloudapi/k8s |
|
||||||
|
|
||||||
#### image
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-860 | Тип ответа метода `MultiImageExport` со `string` на `uint64` в cloudbroker/image |
|
|
||||||
| BGOS-869 | Тип вычисляемого поля `AccountID` с опционального на обязательный в структуре `CreateVirtualRequest` в cloudapi/image |
|
|
||||||
| BGOS-878 | Тип поля `TypeImage` в структуре запроса `ListRequest` с `string` на `[]string` в cloudbroker/image и cloudapi/image |
|
|
||||||
|
|
||||||
#### kvmx86
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре ответа `DataDisk` в cloudbroker/kvmx86 |
|
|
||||||
| BGOS-870 | Тип поля `BootDiskBLKDiscard` с `bool` на `string` и переименование в `BootDiskDiscard` в структурах запросов `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 |
|
|
||||||
| BGOS-893 | Тип поля `SDNObjectGroupID` с `string` на `[]string` и переименование в `SDNObjectGroupIDs` в структуре `Interface` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
|
||||||
| BGOS-893 | Тип поля `SDNObjectGroupID` с `string` на `[]string` и переименование в `SDNObjectGroupIDs` в структуре `InterfaceMassCreate` в cloudbroker/kvmx86 |
|
|
||||||
|
|
||||||
#### node
|
#### node
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-867 | Тип обязательного поля `Ratio` с `float64` на `uint64` в структурах запросов `SetMemAllocationRatioRequest` и `SetCpuAllocationRatioRequest` в cloudbroker/node |
|
| BGOS-982 | Тип вычисляемого поля `Total` с `ResourcesInfo` на `FreeResourcesInfo` в структуре ответа `ConsumptionInfo` в cloudbroker/node |
|
||||||
| BGOS-889 | Тип поля `VCPU` с `float64` на `uint64` в структуре ответа `FreeResourcesInfo` в cloudbroker/node |
|
|
||||||
| BGOS-889 | Тип полей `CPUAllocationRatio` и `MemAllocationRatio` с `float64` на `uint64` в структурах ответа `RecordNode` и `ItemNode` в cloudbroker/node |
|
|
||||||
|
|
||||||
#### resmon
|
#### vgpu
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-868 | Тип поля `EndTime` с обязательного на опциональное в структурах запроса `GetByNodeRequest`, `GetByNodesRequest` `GetByGRIDRequest`, `GetByComputeRequest` и `GetByComputesRequest` в cloudbroker/resmon |
|
| BGOS-980 | Тип опционального поля `ProfileID` в структуре запроса `CreateRequest` с `uint64` на `string` в cloudbroker/vgpu |
|
||||||
|
| BGOS-980 | Название вычисляемого поля `AccountID` на `AccountIDs` и тип с `uint64` на `[]uint64` в структуре ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
| BGOS-980 | Название опционального поля `NID` на `NodeID` в структуре запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
|
||||||
#### rg
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-886 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структурах ответа `RecordResourceGroup` и `ItemResourceGroup` в cloudapi/rg |
|
|
||||||
| BGOS-886 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структуре ответа `ItemRG` в cloudbroker/rg |
|
|
||||||
| BGOS-886 | Тип поля `Ratio` с `float64` на `uint64` в структуре запроса `SetCPUAllocationRatioRequest` в cloudbroker/rg |
|
|
||||||
|
|
||||||
#### user
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-891 | Тип поля `Password` с опционального на обязательный в структуре запроса `CreateRequest` в cloudbroker/user |
|
|
||||||
|
|
||||||
#### SDN logicalports
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-896 | Тип полей `IsDiscovered` и `MAC` с опционального на обязательный в структурах запроса `UpdateAddress` и `AddAddress` в sdn/logical_port |
|
|
||||||
| BGOS-896 | Тип поля `IsDiscovered` с опционального на обязательный в структуре запроса `LogicalPortAddressRequest` в sdn/logical_port
|
|
||||||
| BGOS-896 | Тип полей `IsDiscovered`, `MAC` с `interface` на `bool` в структурах запроса `UpdateAddress`, `AddAddress`, `LogicalPortAddressRequest` в sdn/logical_port/update |
|
|
||||||
|
|
||||||
### Исправлено
|
|
||||||
|
|
||||||
#### vfpool
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-871 | Тип поля `Config` в структуре запроса `wrapperUpdateRequest` с `[]string` на `string` в cloudbroker/vfpool |
|
|
||||||
|
|
||||||
### Удалено
|
### Удалено
|
||||||
|
|
||||||
#### grid
|
#### account
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-888 | Вычисляемые поля `CKey` и `Meta` из структуры ответа `RecordGrid` в cloudbroker/grid |
|
| BGOS-975 | Метод `Audits` из cloudapi/account и cloudbroker/account |
|
||||||
|
| BGOS-975 | Методы `Delete`, `Disable`, `Enable`, `GetConsumedCloudUnitsByType` и `GetReservedAccountUnits` из cloudapi/account |
|
||||||
|
| BGOS-975 | Методы `Disable` и `Enable` из cloudbroker/account |
|
||||||
|
|
||||||
|
#### compute
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Метод `Audits` из cloudapi/compute и cloudbroker/compute |
|
||||||
|
| BGOS-975 | Методы `ComputeCISet`, `ComputeCIUnset`, `GetLog` и `GetAudits` из cloudbroker/compute |
|
||||||
|
| BGOS-975 | Метод `GetAudits` из cloudapi/compute |
|
||||||
|
| BGOS-995 | Вычисляемые поля `LastClaimedBy`, `Mode`, `ProfileID`, `RAM`, `ReferenceID`, `RGID`, `Type` и `VMID` из структуры `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
|
||||||
|
| BGOS-995 | Cтруктура `VGPUItem` в cloudbroker/compute и cloudapi/compute |
|
||||||
|
| BGOS-999 | Вычисляемое поле `RGID` из структуры ответа `ItemPCIDevice` в cloudbroker/compute и cloudapi/compute |
|
||||||
|
| BGOS-999 | Опциональное поле `RGID` из структуры запроса `ListPCIDeviceRequest` в cloudbroker/compute и cloudapi/compute |
|
||||||
|
|
||||||
|
#### grid
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Методы `ExecuteMaintenanceScript`, `ListEmails` и `ServicesRestart` из cloudbroker/grid |
|
||||||
|
|
||||||
|
#### group
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Метод `Get` из cloudbroker/group |
|
||||||
|
|
||||||
|
#### image
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Методы `ComputeCISet` и `ComputeCIUnset` из cloudbroker/image |
|
||||||
|
|
||||||
|
#### rg
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Метод `Audits` из cloudapi/rg и cloudbroker/rg |
|
||||||
|
|
||||||
|
#### sep
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke` и `AccessRevokeToPool` из cloudbroker/sep |
|
||||||
|
|
||||||
#### user
|
#### user
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-861 | Значение по умолчанию опционального поля `Password` в структуре запроса `CreateRequest` в cloudbroker/user |
|
| BGOS-975 | Метод `IsValidInviteUserToken` из cloudapi/user |
|
||||||
| BGOS-875 | Опциональное поле `Password` из структуры ответа `ItemUser` в cloudbroker/user |
|
| BGOS-975 | Метод `GetAudit` из cloudapi/user и cloudbroker/user |
|
||||||
|
| BGOS-988 | Структуры `CSs` и `VMs` из структуры ответа `BriefResources` из cloudapi/user |
|
||||||
|
| BGOS-988 | Вычисляемое поле `Enabled` из структур ответов `Accounts` и `RGs` из cloudapi/user |
|
||||||
|
|
||||||
|
#### vins
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-975 | Метод `Audits` из cloudapi/vins и cloudbroker/vins |
|
||||||
|
|
||||||
|
#### vgpu
|
||||||
|
| Идентификатор задачи | Описание |
|
||||||
|
| --- | --- |
|
||||||
|
| BGOS-980 | Опциональные поля `RGID` и `Allocate` из структуры запроса `CreateRequest` в cloudbroker/vgpu |
|
||||||
|
| BGOS-980 | Опциональные поле `Force` из структуры запроса `DestroyRequest` в cloudbroker/vgpu |
|
||||||
|
| BGOS-980 | Опциональные поля `Type`, `Mode` и `RGID` из структуры запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
| BGOS-980 | Вычисляемые поля `LastClaimedBy`, `Mode`, `ProfileID`, `RAM`, `ReferenceID`, `RGID`, `Type` и `VMID` из структуры ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
|
||||||
|
| BGOS-980 | Методы `Allocate` и `Deallocate` из cloudbroker/vgpu |
|
||||||
@@ -20,6 +20,7 @@ Decort SDK - это библиотека, написанная на языке G
|
|||||||
- Версия 1.13.х Decort-SDK соответствует 4.5.0 версии платформы
|
- Версия 1.13.х Decort-SDK соответствует 4.5.0 версии платформы
|
||||||
- Версия 1.14.х Decort-SDK соответствует 4.6.0 версии платформы
|
- Версия 1.14.х Decort-SDK соответствует 4.6.0 версии платформы
|
||||||
- Версия 1.15.х Decort-SDK соответствует 4.7.0 версии платформы
|
- Версия 1.15.х Decort-SDK соответствует 4.7.0 версии платформы
|
||||||
|
- Версия 1.16.х Decort-SDK соответствует 4.8.0 версии платформы
|
||||||
|
|
||||||
## Оглавление
|
## Оглавление
|
||||||
|
|
||||||
@@ -125,6 +126,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
|||||||
- `LB` - управление балансировщиками нагрузки;
|
- `LB` - управление балансировщиками нагрузки;
|
||||||
- `Locations` - получение информации о grid площадки;
|
- `Locations` - получение информации о grid площадки;
|
||||||
- `Prometheus` - получение статистики prometheus;
|
- `Prometheus` - получение статистики prometheus;
|
||||||
|
- `QoS Policy` - управление политиками качества обслуживания сети;
|
||||||
- `RG` - управление ресурсными группами аккаунта;
|
- `RG` - управление ресурсными группами аккаунта;
|
||||||
- `Security group` – управление группами безопасности;
|
- `Security group` – управление группами безопасности;
|
||||||
- `SEP` - управление storage endpoint (sep);
|
- `SEP` - управление storage endpoint (sep);
|
||||||
@@ -161,6 +163,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
|||||||
- `Node` - управление нодами платформы;
|
- `Node` - управление нодами платформы;
|
||||||
- `PCIDevice` - управление устройствами;
|
- `PCIDevice` - управление устройствами;
|
||||||
- `Prometheus` - получение статистики prometheus;
|
- `Prometheus` - получение статистики prometheus;
|
||||||
|
- `QoS Policy` - управление политиками качества обслуживания сети;
|
||||||
- `Resmon` - получение статистики resource monitoring;
|
- `Resmon` - получение статистики resource monitoring;
|
||||||
- `RG` - управление ресурсными группами аккаунта;
|
- `RG` - управление ресурсными группами аккаунта;
|
||||||
- `Security group` – управление группами безопасности;
|
- `Security group` – управление группами безопасности;
|
||||||
@@ -338,6 +341,7 @@ func main() {
|
|||||||
- `pkg/cloudapi/lb` - для `LB`
|
- `pkg/cloudapi/lb` - для `LB`
|
||||||
- `pkg/cloudapi/locations` - для `Locations`
|
- `pkg/cloudapi/locations` - для `Locations`
|
||||||
- `pkg/cloudapi/prometheus` - для `Prometheus`
|
- `pkg/cloudapi/prometheus` - для `Prometheus`
|
||||||
|
- `pkg/cloudapi/qospolicy` - для `QoS Policy`
|
||||||
- `pkg/cloudapi/rg` - для `RG`
|
- `pkg/cloudapi/rg` - для `RG`
|
||||||
- `pkg/cloudapi/secgroup` - для `Security group`
|
- `pkg/cloudapi/secgroup` - для `Security group`
|
||||||
- `pkg/cloudapi/sep` - для `SEP`
|
- `pkg/cloudapi/sep` - для `SEP`
|
||||||
@@ -369,6 +373,7 @@ func main() {
|
|||||||
- `pkg/cloudbroker/node` - для `Node`
|
- `pkg/cloudbroker/node` - для `Node`
|
||||||
- `pkg/cloudbroker/pcidevice` - для `PCIDevice`
|
- `pkg/cloudbroker/pcidevice` - для `PCIDevice`
|
||||||
- `pkg/cloudbroker/prometheus` - для `Prometheus`
|
- `pkg/cloudbroker/prometheus` - для `Prometheus`
|
||||||
|
- `pkg/cloudbroker/qospolicy` - для `QoS Policy`
|
||||||
- `pkg/cloudbroker/resmon` - для `Resmon`
|
- `pkg/cloudbroker/resmon` - для `Resmon`
|
||||||
- `pkg/cloudbroker/rg` - для `RG`
|
- `pkg/cloudbroker/rg` - для `RG`
|
||||||
- `pkg/cloudbroker/secgroup` - для `Security group`
|
- `pkg/cloudbroker/secgroup` - для `Security group`
|
||||||
@@ -537,6 +542,7 @@ func main() {
|
|||||||
- `.LB()` - для работы с `LB`
|
- `.LB()` - для работы с `LB`
|
||||||
- `.Locations()` - для работы с `Locations`
|
- `.Locations()` - для работы с `Locations`
|
||||||
- `.Prometheus()` - для работы с `Prometheus`
|
- `.Prometheus()` - для работы с `Prometheus`
|
||||||
|
- `.QoSPolicy()` - для работы с `QoS Policy`
|
||||||
- `.RG()` - для работы с `RG`
|
- `.RG()` - для работы с `RG`
|
||||||
- `.SecurityGroup()` - для работы с `Security Group`
|
- `.SecurityGroup()` - для работы с `Security Group`
|
||||||
- `.SEP()` - для работы с `SEP`
|
- `.SEP()` - для работы с `SEP`
|
||||||
@@ -570,6 +576,7 @@ func main() {
|
|||||||
- `.Node()` - для работы с `Node`
|
- `.Node()` - для работы с `Node`
|
||||||
- `.PCIDevice()` - для работы с `PCIDevice`
|
- `.PCIDevice()` - для работы с `PCIDevice`
|
||||||
- `.Prometheus()` - для работы с `Prometheus`
|
- `.Prometheus()` - для работы с `Prometheus`
|
||||||
|
- `.QoSPolicy()` - для работы с `QoS Policy`
|
||||||
- `.Resmon()` - для работы с `Resmon`
|
- `.Resmon()` - для работы с `Resmon`
|
||||||
- `.RG()` - для работы с `RG`
|
- `.RG()` - для работы с `RG`
|
||||||
- `.SecurityGroup()` - для работы с `Security Group`
|
- `.SecurityGroup()` - для работы с `Security Group`
|
||||||
|
|||||||
@@ -34,8 +34,12 @@ type DecortClient struct {
|
|||||||
mutex *sync.Mutex
|
mutex *sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Сlient builder
|
// Client builder
|
||||||
func New(cfg config.Config) *DecortClient {
|
func New(cfg config.Config) *DecortClient {
|
||||||
|
if err := validators.ValidateConfig(cfg); err != nil {
|
||||||
|
panic(validators.ValidationErrors(validators.GetErrors(err)))
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.Retries == 0 {
|
if cfg.Retries == 0 {
|
||||||
cfg.Retries = 5
|
cfg.Retries = 5
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
|
||||||
@@ -38,6 +39,10 @@ type tokenJSON struct {
|
|||||||
|
|
||||||
// Сlient builder
|
// Сlient builder
|
||||||
func NewBVS(cfg config.BVSConfig) *BVSDecortClient {
|
func NewBVS(cfg config.BVSConfig) *BVSDecortClient {
|
||||||
|
if err := validators.ValidateConfig(cfg); err != nil {
|
||||||
|
panic(validators.ValidationErrors(validators.GetErrors(err)))
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.Retries == 0 {
|
if cfg.Retries == 0 {
|
||||||
cfg.Retries = 5
|
cfg.Retries = 5
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ var FileName = map[string]string{
|
|||||||
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
|
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
|
||||||
|
|
||||||
var VersionMap = map[string]string{
|
var VersionMap = map[string]string{
|
||||||
|
"4.8.0": "-",
|
||||||
"4.7.0": "-",
|
"4.7.0": "-",
|
||||||
"4.6.0": "-",
|
"4.6.0": "-",
|
||||||
"4.5.0": "-",
|
"4.5.0": "-",
|
||||||
|
|||||||
@@ -350,6 +350,10 @@ func isBoolTypeValidator(fe validator.FieldLevel) bool {
|
|||||||
return fe.Field().CanConvert(reflect.TypeOf(true))
|
return fe.Field().CanConvert(reflect.TypeOf(true))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isStringTypeValidator(fe validator.FieldLevel) bool {
|
||||||
|
return fe.Field().Kind() == reflect.String
|
||||||
|
}
|
||||||
|
|
||||||
func urlValidartor(fl validator.FieldLevel) bool {
|
func urlValidartor(fl validator.FieldLevel) bool {
|
||||||
fieldValues := fl.Field().String()
|
fieldValues := fl.Field().String()
|
||||||
|
|
||||||
@@ -484,3 +488,9 @@ func sepDescriptionValidator(fe validator.FieldLevel) bool {
|
|||||||
ok, _ := regexp.MatchString(`^[a-zA-Zа-яА-ЯёЁ0-9_.\[\]()\-]*$`, fe.Field().String())
|
ok, _ := regexp.MatchString(`^[a-zA-Zа-яА-ЯёЁ0-9_.\[\]()\-]*$`, fe.Field().String())
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func watchdogActionValidator(fe validator.FieldLevel) bool {
|
||||||
|
fieldValue := fe.Field().String()
|
||||||
|
|
||||||
|
return IsInSlice(fieldValue, watchdogActionVaues)
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
// Common Validators
|
// Common Validators
|
||||||
case "required":
|
case "required":
|
||||||
return fmt.Sprintf("%s %s is required", prefix, fe.Field())
|
return fmt.Sprintf("%s %s is required", prefix, fe.Field())
|
||||||
|
case "required_without_all":
|
||||||
|
return fmt.Sprintf("%s at least one of the following must be specified: %s",
|
||||||
|
prefix,
|
||||||
|
joinValues(append([]string{fe.Field()}, strings.Fields(fe.Param())...)))
|
||||||
case "gt":
|
case "gt":
|
||||||
return fmt.Sprintf("%s %s can't be less or equal to zero", prefix, fe.Field())
|
return fmt.Sprintf("%s %s can't be less or equal to zero", prefix, fe.Field())
|
||||||
case "min":
|
case "min":
|
||||||
@@ -25,8 +29,12 @@ func errorMessage(fe validator.FieldError) string {
|
|||||||
return fmt.Sprintf("%s %s: unexpected URL format", prefix, fe.Field())
|
return fmt.Sprintf("%s %s: unexpected URL format", prefix, fe.Field())
|
||||||
case "email":
|
case "email":
|
||||||
return fmt.Sprintf("%s %s: unexpected E-Mail format", prefix, fe.Field())
|
return fmt.Sprintf("%s %s: unexpected E-Mail format", prefix, fe.Field())
|
||||||
|
case "mac":
|
||||||
|
return fmt.Sprintf("%s %s: unexpected MAC address format", prefix, fe.Field())
|
||||||
case "isBool":
|
case "isBool":
|
||||||
return fmt.Sprintf("%s %s: must be bool type", prefix, fe.Field())
|
return fmt.Sprintf("%s %s: must be bool type", prefix, fe.Field())
|
||||||
|
case "isString":
|
||||||
|
return fmt.Sprintf("%s %s: must be string type", prefix, fe.Field())
|
||||||
|
|
||||||
case "accessType":
|
case "accessType":
|
||||||
return fmt.Sprintf("%s %s must be one of the following: %s",
|
return fmt.Sprintf("%s %s must be one of the following: %s",
|
||||||
|
|||||||
@@ -231,6 +231,11 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("isString", isStringTypeValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
err = validate.RegisterValidation("url", urlValidartor)
|
err = validate.RegisterValidation("url", urlValidartor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -321,5 +326,10 @@ func registerAllValidators(validate *validator.Validate) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = validate.RegisterValidation("watchdogAction", watchdogActionValidator)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ var (
|
|||||||
|
|
||||||
vmActionValues = []string{"stop", "move"}
|
vmActionValues = []string{"stop", "move"}
|
||||||
|
|
||||||
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}
|
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk", "vgpu", "pcidevice"}
|
||||||
|
|
||||||
networkInterfaceNamingValues = []string{"eth", "ens"}
|
networkInterfaceNamingValues = []string{"eth", "ens"}
|
||||||
|
|
||||||
@@ -80,6 +80,8 @@ var (
|
|||||||
ipTypeValues = []string{"v4, v6"}
|
ipTypeValues = []string{"v4, v6"}
|
||||||
|
|
||||||
sepTechStatusValues = []string{"ENABLED", "DISABLED"}
|
sepTechStatusValues = []string{"ENABLED", "DISABLED"}
|
||||||
|
|
||||||
|
watchdogActionVaues = []string{"reset", "shutdown", "poweroff", "pause", "none"}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
|
||||||
@@ -32,6 +33,10 @@ type LegacyDecortClient struct {
|
|||||||
|
|
||||||
// Legacy client builder
|
// Legacy client builder
|
||||||
func NewLegacy(cfg config.LegacyConfig) *LegacyDecortClient {
|
func NewLegacy(cfg config.LegacyConfig) *LegacyDecortClient {
|
||||||
|
if err := validators.ValidateConfig(cfg); err != nil {
|
||||||
|
panic(validators.ValidationErrors(validators.GetErrors(err)))
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.Retries == 0 {
|
if cfg.Retries == 0 {
|
||||||
cfg.Retries = 5
|
cfg.Retries = 5
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to give list of account audits
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// ID of the account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified account object
|
|
||||||
func (a Account) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/audits"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DeleteRequest struct to delete account
|
|
||||||
type DeleteRequest struct {
|
|
||||||
// ID of account to delete
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
|
|
||||||
// Whether to completely delete the account
|
|
||||||
// Required: false
|
|
||||||
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete completes delete an account from the system Returns true if account is deleted or was already deleted or never existed
|
|
||||||
func (a Account) Delete(ctx context.Context, req DeleteRequest) (string, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/delete"
|
|
||||||
|
|
||||||
result, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(result), nil
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DisableEnableRequest struct to change status of account
|
|
||||||
type DisableEnableRequest struct {
|
|
||||||
// ID of account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable disables an account
|
|
||||||
func (a Account) Disable(ctx context.Context, req DisableEnableRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/disable"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable enables an account
|
|
||||||
func (a Account) Enable(ctx context.Context, req DisableEnableRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/enable"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetConsumedCloudUnitsByTypeRequest struct to calculate the currently consumed cloud units of the specified type for all cloudspaces and resource groups in the account
|
|
||||||
type GetConsumedCloudUnitsByTypeRequest struct {
|
|
||||||
// ID an account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
|
|
||||||
// Cloud unit resource type
|
|
||||||
// Required: true
|
|
||||||
CUType string `url:"cutype" json:"cutype" validate:"required,accountCUType"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetConsumedCloudUnitsByType calculates the currently consumed cloud units of the specified type for all cloudspaces
|
|
||||||
// and resource groups in the account.
|
|
||||||
// Possible types of cloud units are include:
|
|
||||||
//
|
|
||||||
// - CU_M: returns consumed memory in MB
|
|
||||||
// - CU_C: returns number of virtual cpu cores
|
|
||||||
// - CU_D: returns consumed virtual disk storage in GB
|
|
||||||
// - CU_DM: returns consumed max virtual disk storage in GB
|
|
||||||
// - CU_I: returns number of public IPs
|
|
||||||
// - gpu_units: return number of GPU units
|
|
||||||
func (a Account) GetConsumedCloudUnitsByType(ctx context.Context, req GetConsumedCloudUnitsByTypeRequest) (float64, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/getConsumedCloudUnitsByType"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseFloat(string(res), 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetReservedAccountUnitsRequest struct to calculate the reserved units for all cloudspaces and resource groups in the account
|
|
||||||
type GetReservedAccountUnitsRequest struct {
|
|
||||||
// ID an account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReservedAccountUnits calculates the reserved units for all cloudspaces and resource groups in the account.
|
|
||||||
// Calculated cloud units are returned in a dict which includes:
|
|
||||||
//
|
|
||||||
// - CU_M: reserved memory in MB
|
|
||||||
// - CU_C: number of cpu cores
|
|
||||||
// - CU_D: reserved vdisk storage in GB
|
|
||||||
// - CU_DM: reserved max vdisk storage in GB
|
|
||||||
// - CU_I: number of public IPs
|
|
||||||
func (a Account) GetReservedAccountUnits(ctx context.Context, req GetReservedAccountUnitsRequest) (*ResourceLimits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/account/getReservedAccountUnits"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
info := ResourceLimits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &info)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &info, nil
|
|
||||||
}
|
|
||||||
@@ -203,11 +203,56 @@ type ListResourceConsumption struct {
|
|||||||
|
|
||||||
// Information about computes
|
// Information about computes
|
||||||
type Computes struct {
|
type Computes struct {
|
||||||
|
// Number of starting computes
|
||||||
|
Starting uint64 `json:"STARTING"`
|
||||||
|
|
||||||
// Number of started computes
|
// Number of started computes
|
||||||
Started uint64 `json:"started"`
|
Started uint64 `json:"STARTED"`
|
||||||
|
|
||||||
|
// Number of stopping computes
|
||||||
|
Stopping uint64 `json:"STOPPING"`
|
||||||
|
|
||||||
// Number of stopped computes
|
// Number of stopped computes
|
||||||
Stopped uint64 `json:"stopped"`
|
Stopped uint64 `json:"STOPPED"`
|
||||||
|
|
||||||
|
// Number of paused computes
|
||||||
|
Paused uint64 `json:"PAUSED"`
|
||||||
|
|
||||||
|
// Number of pausing computes
|
||||||
|
Pausing uint64 `json:"PAUSING"`
|
||||||
|
|
||||||
|
// Number of merging computes
|
||||||
|
Merge uint64 `json:"MERGE"`
|
||||||
|
|
||||||
|
// Number of migrating computes
|
||||||
|
Migrating uint64 `json:"MIGRATING"`
|
||||||
|
|
||||||
|
// Number of computes migrating in
|
||||||
|
MigratingIn uint64 `json:"MIGRATING_IN"`
|
||||||
|
|
||||||
|
// Number of computes migrating out
|
||||||
|
MigratingOut uint64 `json:"MIGRATING_OUT"`
|
||||||
|
|
||||||
|
// Number of computes in down status
|
||||||
|
Down uint64 `json:"DOWN"`
|
||||||
|
|
||||||
|
// Number of scheduled computes
|
||||||
|
Scheduled uint64 `json:"SCHEDULED"`
|
||||||
|
|
||||||
|
// Number of computes with stopped backup
|
||||||
|
BackupStopped uint64 `json:"BACKUP_STOPPED"`
|
||||||
|
|
||||||
|
// Number of computes with running backup
|
||||||
|
BackupRunning uint64 `json:"BACKUP_RUNNING"`
|
||||||
|
|
||||||
|
// Number of computes creating a snapshot
|
||||||
|
Snapcreate uint64 `json:"SNAPCREATE"`
|
||||||
|
|
||||||
|
// Number of cloning computes
|
||||||
|
Cloning uint64 `json:"CLONING"`
|
||||||
|
|
||||||
|
// Number of computes being rolled back
|
||||||
|
Rollback uint64 `json:"ROLLBACK"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Information about machines
|
// Information about machines
|
||||||
@@ -455,6 +500,9 @@ type ItemVINS struct {
|
|||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Enable Default Gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// External IP
|
// External IP
|
||||||
ExternalIP string `json:"externalIP"`
|
ExternalIP string `json:"externalIP"`
|
||||||
|
|
||||||
@@ -524,11 +572,56 @@ type ListAudits []ItemAudit
|
|||||||
|
|
||||||
// Information compute in resource group
|
// Information compute in resource group
|
||||||
type RGComputes struct {
|
type RGComputes struct {
|
||||||
|
// Number of starting computes
|
||||||
|
Starting uint64 `json:"STARTING"`
|
||||||
|
|
||||||
// Number of started computes
|
// Number of started computes
|
||||||
Started uint64 `json:"Started"`
|
Started uint64 `json:"STARTED"`
|
||||||
|
|
||||||
|
// Number of stopping computes
|
||||||
|
Stopping uint64 `json:"STOPPING"`
|
||||||
|
|
||||||
// Number of stopped computes
|
// Number of stopped computes
|
||||||
Stopped uint64 `json:"Stopped"`
|
Stopped uint64 `json:"STOPPED"`
|
||||||
|
|
||||||
|
// Number of paused computes
|
||||||
|
Paused uint64 `json:"PAUSED"`
|
||||||
|
|
||||||
|
// Number of pausing computes
|
||||||
|
Pausing uint64 `json:"PAUSING"`
|
||||||
|
|
||||||
|
// Number of merging computes
|
||||||
|
Merge uint64 `json:"MERGE"`
|
||||||
|
|
||||||
|
// Number of migrating computes
|
||||||
|
Migrating uint64 `json:"MIGRATING"`
|
||||||
|
|
||||||
|
// Number of computes migrating in
|
||||||
|
MigratingIn uint64 `json:"MIGRATING_IN"`
|
||||||
|
|
||||||
|
// Number of computes migrating out
|
||||||
|
MigratingOut uint64 `json:"MIGRATING_OUT"`
|
||||||
|
|
||||||
|
// Number of computes in down status
|
||||||
|
Down uint64 `json:"DOWN"`
|
||||||
|
|
||||||
|
// Number of scheduled computes
|
||||||
|
Scheduled uint64 `json:"SCHEDULED"`
|
||||||
|
|
||||||
|
// Number of computes with stopped backup
|
||||||
|
BackupStopped uint64 `json:"BACKUP_STOPPED"`
|
||||||
|
|
||||||
|
// Number of computes with running backup
|
||||||
|
BackupRunning uint64 `json:"BACKUP_RUNNING"`
|
||||||
|
|
||||||
|
// Number of computes creating a snapshot
|
||||||
|
Snapcreate uint64 `json:"SNAPCREATE"`
|
||||||
|
|
||||||
|
// Number of cloning computes
|
||||||
|
Cloning uint64 `json:"CLONING"`
|
||||||
|
|
||||||
|
// Number of computes being rolled back
|
||||||
|
Rollback uint64 `json:"ROLLBACK"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resources of Resource group
|
// Resources of Resource group
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -62,9 +63,9 @@ type GroupAddRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
TimeoutStart uint64 `url:"timeoutStart,omitempty" json:"timeoutStart,omitempty"`
|
TimeoutStart uint64 `url:"timeoutStart,omitempty" json:"timeoutStart,omitempty"`
|
||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format yaml string or json object
|
||||||
// Required: false
|
// Required: false
|
||||||
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
UserData interface{} `url:"userData,omitempty" json:"userData,omitempty"`
|
||||||
|
|
||||||
// Chipset "i440fx" or "Q35
|
// Chipset "i440fx" or "Q35
|
||||||
// Default value : Q35
|
// Default value : Q35
|
||||||
@@ -97,7 +98,7 @@ func (b BService) GroupAdd(ctx context.Context, req GroupAddRequest) (uint64, er
|
|||||||
|
|
||||||
url := "/cloudapi/bservice/groupAdd"
|
url := "/cloudapi/bservice/groupAdd"
|
||||||
|
|
||||||
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to get audit records
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// ID of the compute
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
|
||||||
|
|
||||||
// Find all audits after point in time
|
|
||||||
// Required: false
|
|
||||||
TimestampAT uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
|
|
||||||
|
|
||||||
// Find all audits before point in time
|
|
||||||
// Required: false
|
|
||||||
TimestampTO uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
|
|
||||||
|
|
||||||
// Find by user
|
|
||||||
// Required: false
|
|
||||||
User string `url:"user,omitempty" json:"user,omitempty"`
|
|
||||||
|
|
||||||
// Find by api endpoints
|
|
||||||
// Required: false
|
|
||||||
Call string `url:"call,omitempty" json:"call,omitempty"`
|
|
||||||
|
|
||||||
// Sort by one of supported fields, format ±<field>
|
|
||||||
// Required: false
|
|
||||||
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
|
||||||
|
|
||||||
// Page number
|
|
||||||
// Required: false
|
|
||||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
|
||||||
|
|
||||||
// Page size
|
|
||||||
// Required: false
|
|
||||||
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
|
||||||
|
|
||||||
// Find by HTTP min status code
|
|
||||||
// Required: false
|
|
||||||
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
|
|
||||||
|
|
||||||
// Find by HTTP max status code
|
|
||||||
// Required: false
|
|
||||||
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified compute object
|
|
||||||
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (*ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/compute/audits"
|
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &list, nil
|
|
||||||
}
|
|
||||||
84
pkg/cloudapi/compute/change_qos_policies.go
Normal file
84
pkg/cloudapi/compute/change_qos_policies.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChangeQoSPoliciesRequest struct {
|
||||||
|
// Compute ID
|
||||||
|
// Required: true
|
||||||
|
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||||
|
|
||||||
|
// Interface IP or MAC address
|
||||||
|
// Required: true
|
||||||
|
Interface string `url:"interface" json:"interface" validate:"required"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to assign to this interface
|
||||||
|
// Required: false
|
||||||
|
QoSPolicyIDs []uint64 `url:"qos_policy_ids,omitempty" json:"qos_policy_ids,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type wrapperChangeQoSPoliciesRequest struct {
|
||||||
|
ChangeQoSPoliciesRequest
|
||||||
|
|
||||||
|
AsyncMode bool `url:"asyncMode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeQoSPolicies change qos policies for compute
|
||||||
|
func (c Compute) ChangeQoSPolicies(ctx context.Context, req ChangeQoSPoliciesRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
reqWrapped := wrapperChangeQoSPoliciesRequest{
|
||||||
|
ChangeQoSPoliciesRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/compute/change_qos_policies"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeQoSPolicies change qos policies for compute with AsyncMode
|
||||||
|
func (c Compute) ChangeQoSPoliciesAsync(ctx context.Context, req ChangeQoSPoliciesRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
reqWrapped := wrapperChangeQoSPoliciesRequest{
|
||||||
|
ChangeQoSPoliciesRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/compute/change_qos_policies"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetAuditsRequest struct to get compute audits
|
|
||||||
type GetAuditsRequest struct {
|
|
||||||
// ID of compute instance
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAudits gets compute audits
|
|
||||||
func (c Compute) GetAudits(ctx context.Context, req GetAuditsRequest) (ListShortAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/compute/getAudits"
|
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListShortAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -14,10 +14,6 @@ type ListPCIDeviceRequest struct {
|
|||||||
// Required: true
|
// Required: true
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||||
|
|
||||||
// Find by resource group ID
|
|
||||||
// Required: false
|
|
||||||
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
|
|
||||||
|
|
||||||
// Find by device id
|
// Find by device id
|
||||||
// Required: false
|
// Required: false
|
||||||
DevID uint64 `url:"devId,omitempty" json:"devId,omitempty"`
|
DevID uint64 `url:"devId,omitempty" json:"devId,omitempty"`
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ type ItemSnapshot struct {
|
|||||||
// Compute info
|
// Compute info
|
||||||
Compute RecordCompute `json:"compute"`
|
Compute RecordCompute `json:"compute"`
|
||||||
|
|
||||||
// List disk ID
|
// List of disk IDs
|
||||||
Disks []uint64 `json:"disks"`
|
Disks []uint64 `json:"disks"`
|
||||||
|
|
||||||
// GUID
|
// GUID
|
||||||
@@ -182,6 +182,9 @@ type RecordNetAttach struct {
|
|||||||
// Enabled
|
// Enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
|
// Enable default gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// Enable security groups
|
// Enable security groups
|
||||||
EnableSecGroups bool `json:"enable_secgroups"`
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
@@ -509,6 +512,9 @@ type RecordCompute struct {
|
|||||||
// Registered or not
|
// Registered or not
|
||||||
Registered bool `json:"registered"`
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Whether a compute has been resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
// Resource name
|
// Resource name
|
||||||
ResName string `json:"resName"`
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
@@ -552,7 +558,265 @@ type RecordCompute struct {
|
|||||||
Userdata interface{} `json:"userdata"`
|
Userdata interface{} `json:"userdata"`
|
||||||
|
|
||||||
// vGPUs list
|
// vGPUs list
|
||||||
VGPUs []VGPUItem `json:"vgpus"`
|
VGPUs []ItemVGPU `json:"vgpus"`
|
||||||
|
|
||||||
|
// VNC password
|
||||||
|
VNCPassword string `json:"vncPasswd"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
WatchdogAction string `json:"watchdog_action"`
|
||||||
|
|
||||||
|
// Weight
|
||||||
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
// Required: false
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SnapRecordCompute struct {
|
||||||
|
// Access Control List
|
||||||
|
ACL ListACL `json:"acl"`
|
||||||
|
|
||||||
|
// Account ID
|
||||||
|
AccountID uint64 `json:"accountId"`
|
||||||
|
|
||||||
|
// Account name
|
||||||
|
AccountName string `json:"accountName"`
|
||||||
|
|
||||||
|
// Affinity label
|
||||||
|
AffinityLabel string `json:"affinityLabel"`
|
||||||
|
|
||||||
|
// List affinity rules
|
||||||
|
AffinityRules ListRules `json:"affinityRules"`
|
||||||
|
|
||||||
|
// Affinity weight
|
||||||
|
AffinityWeight uint64 `json:"affinityWeight"`
|
||||||
|
|
||||||
|
// List anti affinity rules
|
||||||
|
AntiAffinityRules ListRules `json:"antiAffinityRules"`
|
||||||
|
|
||||||
|
// Auto start when node restarted
|
||||||
|
AutoStart bool `json:"autoStart"`
|
||||||
|
|
||||||
|
// Architecture
|
||||||
|
Architecture string `json:"arch"`
|
||||||
|
|
||||||
|
// Boot image ID
|
||||||
|
BootImageID uint64 `json:"boot_image_id"`
|
||||||
|
|
||||||
|
// Boot order
|
||||||
|
BootOrder []string `json:"bootOrder"`
|
||||||
|
|
||||||
|
// Boot type
|
||||||
|
BootType string `json:"bootType"`
|
||||||
|
|
||||||
|
// Boot disk size
|
||||||
|
BootDiskSize uint64 `json:"bootdiskSize"`
|
||||||
|
|
||||||
|
// CD Image Id
|
||||||
|
CdImageId uint64 `json:"cdImageId"`
|
||||||
|
|
||||||
|
// Chipset
|
||||||
|
Chipset string `json:"chipset"`
|
||||||
|
|
||||||
|
// Clone reference
|
||||||
|
CloneReference uint64 `json:"cloneReference"`
|
||||||
|
|
||||||
|
// List clone IDs
|
||||||
|
Clones []uint64 `json:"clones"`
|
||||||
|
|
||||||
|
// Clock
|
||||||
|
Clock string `json:"clock"`
|
||||||
|
|
||||||
|
// Compute CI ID
|
||||||
|
ComputeCIID uint64 `json:"computeciId"`
|
||||||
|
|
||||||
|
// CPU Pin
|
||||||
|
CPUPin bool `json:"cpupin"`
|
||||||
|
|
||||||
|
// Number of cores
|
||||||
|
CPU uint64 `json:"cpus"`
|
||||||
|
|
||||||
|
// Created by
|
||||||
|
CreatedBy string `json:"createdBy"`
|
||||||
|
|
||||||
|
// Created time
|
||||||
|
CreatedTime uint64 `json:"createdTime"`
|
||||||
|
|
||||||
|
// Custom fields items
|
||||||
|
CustomFields map[string]interface{} `json:"customFields"`
|
||||||
|
|
||||||
|
// Deleted by
|
||||||
|
DeletedBy string `json:"deletedBy"`
|
||||||
|
|
||||||
|
// Deleted time
|
||||||
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
|
// Devices
|
||||||
|
Devices interface{} `json:"devices"`
|
||||||
|
|
||||||
|
// List disks in compute
|
||||||
|
Disks ListComputeDisks `json:"disks"`
|
||||||
|
|
||||||
|
// Driver
|
||||||
|
Driver string `json:"driver"`
|
||||||
|
|
||||||
|
// Grid ID
|
||||||
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// HPBacked
|
||||||
|
HPBacked bool `json:"hpBacked"`
|
||||||
|
|
||||||
|
// Hot resize
|
||||||
|
HotResize bool `json:"hotResize"`
|
||||||
|
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// Image ID
|
||||||
|
ImageID uint64 `json:"imageId"`
|
||||||
|
|
||||||
|
// Image name
|
||||||
|
ImageName string `json:"imageName"`
|
||||||
|
|
||||||
|
// List interfaces
|
||||||
|
Interfaces ListInterfaces `json:"interfaces"`
|
||||||
|
|
||||||
|
// Loader meta iso information
|
||||||
|
LoaderMetaIso LoaderMetaIso `json:"loaderMetaIso"`
|
||||||
|
|
||||||
|
// Live migration job ID
|
||||||
|
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
|
||||||
|
|
||||||
|
// Loader type
|
||||||
|
LoaderType string `json:"loaderType"`
|
||||||
|
|
||||||
|
// Lock status
|
||||||
|
LockStatus string `json:"lockStatus"`
|
||||||
|
|
||||||
|
// Manager ID
|
||||||
|
ManagerID uint64 `json:"managerId"`
|
||||||
|
|
||||||
|
// Manager type
|
||||||
|
ManagerType string `json:"managerType"`
|
||||||
|
|
||||||
|
// Migration job
|
||||||
|
MigrationJob uint64 `json:"migrationjob"`
|
||||||
|
|
||||||
|
// Milestones
|
||||||
|
Milestones uint64 `json:"milestones"`
|
||||||
|
|
||||||
|
// Name
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// NeedReboot
|
||||||
|
NeedReboot bool `json:"needReboot"`
|
||||||
|
|
||||||
|
// Network interface naming
|
||||||
|
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"node_id"`
|
||||||
|
|
||||||
|
// Numa Affinity
|
||||||
|
NumaAffinity string `json:"numaAffinity"`
|
||||||
|
|
||||||
|
//NumaNodeId
|
||||||
|
NumaNodeId int64 `json:"numaNodeId"`
|
||||||
|
|
||||||
|
// Natable VINS ID
|
||||||
|
NatableVINSID uint64 `json:"natableVinsId"`
|
||||||
|
|
||||||
|
// Natable VINS IP
|
||||||
|
NatableVINSIP string `json:"natableVinsIp"`
|
||||||
|
|
||||||
|
// Natable VINS Name
|
||||||
|
NatableVINSName string `json:"natableVinsName"`
|
||||||
|
|
||||||
|
// Natable VINS network
|
||||||
|
NatableVINSNetwork string `json:"natableVinsNetwork"`
|
||||||
|
|
||||||
|
// Natable VINS network name
|
||||||
|
NatableVINSNetworkName string `json:"natableVinsNetworkName"`
|
||||||
|
|
||||||
|
// Name of OS
|
||||||
|
OSVersion string `json:"os_version"`
|
||||||
|
|
||||||
|
// List OS Users
|
||||||
|
OSUsers ListOSUser `json:"osUsers"`
|
||||||
|
|
||||||
|
// Pinned to node
|
||||||
|
PinnedToNode int64 `json:"pinnedToNode"`
|
||||||
|
|
||||||
|
// PreferredCPU
|
||||||
|
PreferredCPU []int64 `json:"preferredCpu"`
|
||||||
|
|
||||||
|
// CPU alignment profile
|
||||||
|
CPUAlignmentProfile CPUAlignmentProfile `json:"cpu_alignment_profile"`
|
||||||
|
|
||||||
|
// Qemu_quest
|
||||||
|
QemuQuest QemuQuest `json:"qemu_guest"`
|
||||||
|
|
||||||
|
// ReadOnly indicates read-only mode state
|
||||||
|
ReadOnly bool `json:"read_only"`
|
||||||
|
|
||||||
|
// Number of RAM
|
||||||
|
RAM uint64 `json:"ram"`
|
||||||
|
|
||||||
|
// Reference ID
|
||||||
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
|
// Registered or not
|
||||||
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Resource name
|
||||||
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
|
// Reserved Node Cpus
|
||||||
|
ReservedNodeCpus []uint64 `json:"reservedNodeCpus"`
|
||||||
|
|
||||||
|
// Resource group ID
|
||||||
|
RGID uint64 `json:"rgId"`
|
||||||
|
|
||||||
|
// Resource group name
|
||||||
|
RGName string `json:"rgName"`
|
||||||
|
|
||||||
|
// Stateless SepID
|
||||||
|
StatelessSepID int64 `json:"statelessSepId"`
|
||||||
|
|
||||||
|
// Stateless SepType
|
||||||
|
StatelessSepType string `json:"statelessSepType"`
|
||||||
|
|
||||||
|
// Status
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
Tags map[string]string `json:"tags"`
|
||||||
|
|
||||||
|
// Tech status
|
||||||
|
TechStatus string `json:"techStatus"`
|
||||||
|
|
||||||
|
// Updated by
|
||||||
|
UpdatedBy string `json:"updatedBy"`
|
||||||
|
|
||||||
|
// Updated time
|
||||||
|
UpdatedTime uint64 `json:"updatedTime"`
|
||||||
|
|
||||||
|
// User Managed or not
|
||||||
|
UserManaged bool `json:"userManaged"`
|
||||||
|
|
||||||
|
// Userdata
|
||||||
|
Userdata interface{} `json:"userdata"`
|
||||||
|
|
||||||
|
// vGPUs list
|
||||||
|
VGPUs []ItemVGPU `json:"vgpus"`
|
||||||
|
|
||||||
// VNC password
|
// VNC password
|
||||||
VNCPassword string `json:"vncPasswd"`
|
VNCPassword string `json:"vncPasswd"`
|
||||||
@@ -587,65 +851,6 @@ type CPUAlignmentProfile struct {
|
|||||||
Vendor string `json:"vendor"`
|
Vendor string `json:"vendor"`
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
// Information about libvirt settings
|
||||||
type LibvirtSettings struct {
|
type LibvirtSettings struct {
|
||||||
// TX mode
|
// TX mode
|
||||||
@@ -690,7 +895,10 @@ type ListOSUser []ItemOSUser
|
|||||||
|
|
||||||
// Main information about snapsets
|
// Main information about snapsets
|
||||||
type ItemSnapSet struct {
|
type ItemSnapSet struct {
|
||||||
// List disk IDs
|
// Compute info
|
||||||
|
Compute SnapRecordCompute `json:"compute"`
|
||||||
|
|
||||||
|
// List disk ID
|
||||||
Disks []uint64 `json:"disks"`
|
Disks []uint64 `json:"disks"`
|
||||||
|
|
||||||
// GUID
|
// GUID
|
||||||
@@ -699,6 +907,9 @@ type ItemSnapSet struct {
|
|||||||
// Label
|
// Label
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Memory dump image ID
|
||||||
|
MemoryDumpImage uint64 `json:"memory_dump_image"`
|
||||||
|
|
||||||
// Timestamp
|
// Timestamp
|
||||||
Timestamp uint64 `json:"timestamp"`
|
Timestamp uint64 `json:"timestamp"`
|
||||||
}
|
}
|
||||||
@@ -723,6 +934,9 @@ type ItemVNFInterface struct {
|
|||||||
// Enabled
|
// Enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
|
// Enable default gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// Enable security groups
|
// Enable security groups
|
||||||
EnableSecGroups bool `json:"enable_secgroups"`
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
@@ -768,6 +982,9 @@ type ItemVNFInterface struct {
|
|||||||
// QOS
|
// QOS
|
||||||
QOS QOS `json:"qos"`
|
QOS QOS `json:"qos"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs
|
||||||
|
QoSPolicies []uint64 `json:"qos_policies"`
|
||||||
|
|
||||||
// List of security groups
|
// List of security groups
|
||||||
SecGroups []uint64 `json:"security_groups"`
|
SecGroups []uint64 `json:"security_groups"`
|
||||||
|
|
||||||
@@ -990,6 +1207,9 @@ type SnapshotExtend struct {
|
|||||||
// Label
|
// Label
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Pool name
|
||||||
|
PoolName string `json:"poolName"`
|
||||||
|
|
||||||
// Reference ID
|
// Reference ID
|
||||||
ReferenceID string `json:"referenceId"`
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
@@ -1185,6 +1405,9 @@ type ItemCompute struct {
|
|||||||
// Name
|
// Name
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"node_id"`
|
||||||
|
|
||||||
// NeedReboot
|
// NeedReboot
|
||||||
NeedReboot bool `json:"needReboot"`
|
NeedReboot bool `json:"needReboot"`
|
||||||
|
|
||||||
@@ -1224,6 +1447,9 @@ type ItemCompute struct {
|
|||||||
// Registered
|
// Registered
|
||||||
Registered bool `json:"registered"`
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Whether a compute has been resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
// Resource name
|
// Resource name
|
||||||
ResName string `json:"resName"`
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
@@ -1272,6 +1498,9 @@ type ItemCompute struct {
|
|||||||
// VINS connected
|
// VINS connected
|
||||||
VINSConnected uint64 `json:"vinsConnected"`
|
VINSConnected uint64 `json:"vinsConnected"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
WatchdogAction string `json:"watchdog_action"`
|
||||||
|
|
||||||
// Weight
|
// Weight
|
||||||
Weight uint64 `json:"weight"`
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
@@ -1290,6 +1519,9 @@ type InfoDisk struct {
|
|||||||
// SEP ID
|
// SEP ID
|
||||||
SepID int64 `json:"sepId"`
|
SepID int64 `json:"sepId"`
|
||||||
|
|
||||||
|
// Image ID
|
||||||
|
ImageID uint64 `json:"imageId"`
|
||||||
|
|
||||||
// Read-only
|
// Read-only
|
||||||
ReadOnly bool `json:"read_only"`
|
ReadOnly bool `json:"read_only"`
|
||||||
}
|
}
|
||||||
@@ -1314,59 +1546,56 @@ type ListVGPUs struct {
|
|||||||
|
|
||||||
// Main information about vgpu device
|
// Main information about vgpu device
|
||||||
type ItemVGPU struct {
|
type ItemVGPU struct {
|
||||||
// Account ID
|
// Account IDs
|
||||||
AccountID uint64 `json:"accountId"`
|
AccountIDs []uint64 `json:"account_ids"`
|
||||||
|
|
||||||
// Created Time
|
// Bus number
|
||||||
CreatedTime uint64 `json:"createdTime"`
|
BusNumber int `json:"bus_number"`
|
||||||
|
|
||||||
// Deleted Time
|
// ComputeID
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
ComputeID uint64 `json:"compute_id"`
|
||||||
|
|
||||||
// GID
|
// Created time
|
||||||
|
CreatedTime uint64 `json:"created_time"`
|
||||||
|
|
||||||
|
// Deleted time
|
||||||
|
DeletedTime uint64 `json:"deleted_time"`
|
||||||
|
|
||||||
|
// Device Reference
|
||||||
|
DeviceReference string `json:"device_reference"`
|
||||||
|
|
||||||
|
//Grid ID
|
||||||
GID uint64 `json:"gid"`
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
// GUID
|
// GUID
|
||||||
GUID uint64 `json:"guid"`
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
// ID
|
// VGPU ID
|
||||||
ID uint64 `json:"id"`
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
// Last Claimed By
|
// Last Update time
|
||||||
LastClaimedBy uint64 `json:"lastClaimedBy"`
|
LastUpdateTime uint64 `json:"last_update_time"`
|
||||||
|
|
||||||
// Last Update Time
|
// Mdev UUID
|
||||||
LastUpdateTime uint64 `json:"lastUpdateTime"`
|
MdevUUID string `json:"mdev_uuid"`
|
||||||
|
|
||||||
// Mode
|
// Parent PCI Address
|
||||||
Mode string `json:"mode"`
|
ParentPCIAddress string `json:"parent_pci_address"`
|
||||||
|
|
||||||
// PCI Slot
|
// PCI Slot
|
||||||
PCISlot uint64 `json:"pciSlot"`
|
PCISlot uint64 `json:"pci_slot"`
|
||||||
|
|
||||||
// PGPUID
|
// PGPU ID
|
||||||
PGPUID uint64 `json:"pgpuid"`
|
PGPUID uint64 `json:"pgpu_id"`
|
||||||
|
|
||||||
// Profile ID
|
// Profile Reference
|
||||||
ProfileID uint64 `json:"profileId"`
|
ProfileReference string `json:"profile_reference"`
|
||||||
|
|
||||||
// RAM
|
// Split Mode
|
||||||
RAM uint64 `json:"ram"`
|
SplitMode string `json:"split_mode"`
|
||||||
|
|
||||||
// Reference ID
|
|
||||||
ReferenceID string `json:"referenceId"`
|
|
||||||
|
|
||||||
// RG ID
|
|
||||||
RGID uint64 `json:"rgId"`
|
|
||||||
|
|
||||||
// Status
|
// Status
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
|
||||||
// Type
|
|
||||||
Type string `json:"type"`
|
|
||||||
|
|
||||||
// VM ID
|
|
||||||
VMID uint64 `json:"vmid"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information about PCI device
|
// Main information about PCI device
|
||||||
@@ -1389,8 +1618,8 @@ type ItemPCIDevice struct {
|
|||||||
// Name
|
// Name
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
||||||
// Resource group ID
|
// Account IDs
|
||||||
RGID uint64 `json:"rgId"`
|
AccountIDs []uint64 `json:"account_ids"`
|
||||||
|
|
||||||
// Node ID
|
// Node ID
|
||||||
NodeID uint64 `json:"nodeId"`
|
NodeID uint64 `json:"nodeId"`
|
||||||
|
|||||||
@@ -81,6 +81,15 @@ type NetAttachRequest struct {
|
|||||||
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
||||||
// Required: false
|
// Required: false
|
||||||
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway is enabled for this interface
|
||||||
|
// Required: false
|
||||||
|
// Default: true
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to apply to this interface (default: []), Allow used only with netType VINS, EXTNET and DPDK
|
||||||
|
// Required: false
|
||||||
|
QoSPolicies []uint64 `url:"qos_policies,omitempty" json:"qos_policies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperNetAttachRequest struct {
|
type wrapperNetAttachRequest struct {
|
||||||
|
|||||||
@@ -74,6 +74,11 @@ type UpdateRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: null
|
// Default: null
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update updates some properties of the compute
|
// Update updates some properties of the compute
|
||||||
|
|||||||
@@ -39,7 +39,13 @@ type CreateRequest struct {
|
|||||||
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
|
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create creates a disk
|
type wrapperCreateRequest struct {
|
||||||
|
CreateRequest
|
||||||
|
|
||||||
|
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates a disk in sync mode
|
||||||
func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -48,7 +54,12 @@ func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
|
|
||||||
url := "/cloudapi/disks/create"
|
url := "/cloudapi/disks/create"
|
||||||
|
|
||||||
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
wrappedReq := wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@@ -60,3 +71,25 @@ func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create creates a disk in async mode
|
||||||
|
func (d Disks) CreateAsync(ctx context.Context, req CreateRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/disks/create"
|
||||||
|
|
||||||
|
wrappedReq := wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(res), nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ type ListRequest struct {
|
|||||||
|
|
||||||
// Find by status
|
// Find by status
|
||||||
// Required: false
|
// Required: false
|
||||||
Status string `url:"status,omitempty" json:"status,omitempty"`
|
Status []string `url:"status,omitempty" json:"status,omitempty"`
|
||||||
|
|
||||||
// Find by shared, true or false
|
// Find by shared, true or false
|
||||||
// Required: false
|
// Required: false
|
||||||
|
|||||||
@@ -331,6 +331,10 @@ type ItemSnapshot struct {
|
|||||||
// Label
|
// Label
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Pool name
|
||||||
|
PoolName string `json:"poolName"`
|
||||||
|
|
||||||
|
// Reference ID
|
||||||
ReferenceID string `json:"referenceId"`
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
// Resource ID
|
// Resource ID
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -102,6 +103,6 @@ func (i Image) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
|||||||
|
|
||||||
url := "/cloudapi/image/list"
|
url := "/cloudapi/image/list"
|
||||||
|
|
||||||
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := i.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ type CreateRequest struct {
|
|||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format YAML "user_data": 1111
|
||||||
// Required: false
|
// Required: false
|
||||||
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
UserData interface{} `url:"userData,omitempty" json:"userData,omitempty"`
|
||||||
|
|
||||||
// Use only selected ExtNet for infrastructure connections
|
// Use only selected ExtNet for infrastructure connections
|
||||||
// Required: false
|
// Required: false
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type UpdateWorkerNodesMetaDataRequest struct {
|
|||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format YAML "user_data": 1111
|
||||||
// Required: true
|
// Required: true
|
||||||
UserData string `url:"userData" json:"userData" validate:"required"`
|
UserData interface{} `url:"userData" json:"userData" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateWorkerNodesMetaData adds worker nodes to a kubernetes cluster
|
// UpdateWorkerNodesMetaData adds worker nodes to a kubernetes cluster
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -76,6 +77,15 @@ type Interface struct {
|
|||||||
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
||||||
// Required: false
|
// Required: false
|
||||||
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway are enabled for this interface, not applicable to netType EXTNET, VFNIC, TRUNK, or SDN
|
||||||
|
// Default: true
|
||||||
|
// Required: false
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to apply to this interface (default: []), Allow used only with netType VINS, EXTNET and DPDK
|
||||||
|
// Required: false
|
||||||
|
QoSPolicies []uint64 `url:"qos_policies,omitempty" json:"qos_policies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
|
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
|
||||||
@@ -109,6 +119,11 @@ type DataDisk struct {
|
|||||||
// Specify image id for create disk from template
|
// Specify image id for create disk from template
|
||||||
// Required: false
|
// Required: false
|
||||||
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
|
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
|
||||||
|
|
||||||
|
// Attach disk in read-only mode
|
||||||
|
// Required: false
|
||||||
|
// Default: false
|
||||||
|
ReadOnly bool `url:"read_only,omitempty" json:"read_only,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateRequest struct to create KVM x86 VM
|
// CreateRequest struct to create KVM x86 VM
|
||||||
@@ -194,12 +209,12 @@ type CreateRequest struct {
|
|||||||
// loose (use NUMA affinity if possible)
|
// loose (use NUMA affinity if possible)
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: none
|
// Default: none
|
||||||
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
|
NumaAffinity string `url:"numa_affinity,omitempty" json:"numa_affinity,omitempty" validate:"omitempty,numaAffinity"`
|
||||||
|
|
||||||
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
|
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
CPUPin bool `url:"cpupin" json:"cpupin"`
|
CPUPin bool `url:"cpu_pin" json:"cpu_pin"`
|
||||||
|
|
||||||
// Type of the emulated system, Q35 or i440fx
|
// Type of the emulated system, Q35 or i440fx
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -209,7 +224,7 @@ type CreateRequest struct {
|
|||||||
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
|
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
HPBacked bool `url:"hpBacked" json:"hpBacked"`
|
HPBacked bool `url:"hp_backed" json:"hp_backed"`
|
||||||
|
|
||||||
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -227,11 +242,15 @@ type CreateRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: default
|
// Default: default
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
func (r CreateRequest) GetRAM() map[string]uint64 {
|
func (r CreateRequest) GetRAM() map[string]uint64 {
|
||||||
|
|
||||||
res := make(map[string]uint64, 1)
|
res := make(map[string]uint64, 1)
|
||||||
|
|
||||||
res["RAM"] = r.RAM
|
res["RAM"] = r.RAM
|
||||||
@@ -241,8 +260,7 @@ func (r CreateRequest) GetRAM() map[string]uint64 {
|
|||||||
|
|
||||||
type wrapperCreateRequest struct {
|
type wrapperCreateRequest struct {
|
||||||
CreateRequest
|
CreateRequest
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
AsyncMode bool `json:"asyncMode"`
|
||||||
DataDisks []string `url:"dataDisks,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create creates KVM x86 VM based on specified OS image
|
// Create creates KVM x86 VM based on specified OS image
|
||||||
@@ -252,55 +270,42 @@ func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
url := "/cloudapi/kvmx86/create"
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperCreateRequest{
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateRequest{
|
|
||||||
CreateRequest: req,
|
CreateRequest: req,
|
||||||
Interfaces: interfaces,
|
AsyncMode: false,
|
||||||
DataDisks: dataDisks,
|
})
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseUint(string(res), 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateAsync creates KVM x86 VM based on specified OS image in async mode
|
||||||
|
func (k KVMX86) CreateAsync(ctx context.Context, req CreateRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
url := "/cloudapi/kvmx86/create"
|
url := "/cloudapi/kvmx86/create"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
var taskID string
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &taskID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return taskID, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package kvmx86
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -124,6 +124,11 @@ type CreateBlankRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: default
|
// Default: default
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
@@ -136,12 +141,6 @@ func (r CreateBlankRequest) GetRAM() map[string]uint64 {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperCreateBlankRequest struct {
|
|
||||||
CreateBlankRequest
|
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
|
||||||
DataDisks []string `url:"dataDisks,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateBlank creates KVM x86 VM from scratch
|
// CreateBlank creates KVM x86 VM from scratch
|
||||||
func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
|
func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
@@ -149,55 +148,12 @@ func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateBlankRequest{
|
|
||||||
CreateBlankRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/kvmx86/createBlank"
|
url := "/cloudapi/kvmx86/createBlank"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
return strconv.ParseUint(string(res), 10, 64)
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ type ItemLocation struct {
|
|||||||
// AuthBroker
|
// AuthBroker
|
||||||
AuthBroker []string `json:"authBroker"`
|
AuthBroker []string `json:"authBroker"`
|
||||||
|
|
||||||
|
// Budget
|
||||||
|
Budget bool `json:"budget"`
|
||||||
|
|
||||||
// Grid ID
|
// Grid ID
|
||||||
GID uint64 `json:"gid"`
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
|
|||||||
10
pkg/cloudapi/network_qos_policy.go
Normal file
10
pkg/cloudapi/network_qos_policy.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package cloudapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
qospolicy "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/qospolicy"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Accessing the QoS Policy method group
|
||||||
|
func (ca *CloudAPI) QoSPolicy() *qospolicy.QoSPolicy {
|
||||||
|
return qospolicy.New(ca.client)
|
||||||
|
}
|
||||||
46
pkg/cloudapi/qospolicy/create.go
Normal file
46
pkg/cloudapi/qospolicy/create.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateRequest struct {
|
||||||
|
// Account ID that owns QoS policy
|
||||||
|
// Required: true
|
||||||
|
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
|
||||||
|
|
||||||
|
// QoS policy name
|
||||||
|
// Required: true
|
||||||
|
Name string `url:"name" json:"name" validate:"required"`
|
||||||
|
|
||||||
|
// QoS policy description
|
||||||
|
// Required: false
|
||||||
|
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates a new QoS policy
|
||||||
|
func (qp QoSPolicy) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/create"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseUint(string(res), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
93
pkg/cloudapi/qospolicy/create_rule.go
Normal file
93
pkg/cloudapi/qospolicy/create_rule.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateRuleRequest struct {
|
||||||
|
// ID of the parent QoS policy this rule belongs to
|
||||||
|
// Required: true
|
||||||
|
QoSPolicyID uint64 `url:"qos_policy_id" json:"qos_policy_id" validate:"required"`
|
||||||
|
|
||||||
|
// QoS policy rule description
|
||||||
|
// Default: ""
|
||||||
|
// Required: false
|
||||||
|
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||||
|
|
||||||
|
// Rule priority in OVS (higher number = higher priority)
|
||||||
|
// Possible values: [0, 65535]
|
||||||
|
// Required: true
|
||||||
|
Priority *uint64 `url:"priority" json:"priority" validate:"required,min=0,max=65535"`
|
||||||
|
|
||||||
|
// Traffic direction
|
||||||
|
// Required: true
|
||||||
|
Direction string `url:"direction" json:"direction" validate:"required,oneof=outbound"`
|
||||||
|
|
||||||
|
// IP protocol to match
|
||||||
|
// Possible values: tcp, udp, icmp
|
||||||
|
// Required: true
|
||||||
|
Protocol string `url:"protocol" json:"protocol" validate:"required,oneof=tcp udp icmp"`
|
||||||
|
|
||||||
|
// Priority Code Point. L2 marking
|
||||||
|
// Possible values: [0, 7]
|
||||||
|
// Required: false
|
||||||
|
PCPTag *uint64 `url:"pcp_tag,omitempty" json:"pcp_tag,omitempty" validate:"required_without_all=DSCPValue,omitempty,min=0,max=7"`
|
||||||
|
|
||||||
|
// DSCP value (0-63). L3 marking
|
||||||
|
// Possible values: [0, 63]
|
||||||
|
// Required: false
|
||||||
|
DSCPValue *uint64 `url:"dscp_value,omitempty" json:"dscp_value,omitempty" validate:"required_without_all=PCPTag,omitempty,min=0,max=63"`
|
||||||
|
|
||||||
|
// Source IP address for traffic filtering
|
||||||
|
// Required: false
|
||||||
|
SrcIP string `url:"src_ip,omitempty" json:"src_ip,omitempty"`
|
||||||
|
|
||||||
|
// Destination IP address for traffic filtering
|
||||||
|
// Required: false
|
||||||
|
DstIP string `url:"dst_ip,omitempty" json:"dst_ip,omitempty"`
|
||||||
|
|
||||||
|
// Source MAC address for traffic filtering
|
||||||
|
// Required: false
|
||||||
|
SrcMAC string `url:"src_mac,omitempty" json:"src_mac,omitempty" validate:"omitempty,mac"`
|
||||||
|
|
||||||
|
// Destination MAC address for traffic filtering
|
||||||
|
// Required: false
|
||||||
|
DstMAC string `url:"dst_mac,omitempty" json:"dst_mac,omitempty" validate:"omitempty,mac"`
|
||||||
|
|
||||||
|
// Source port for traffic filtering (TCP/UDP only)
|
||||||
|
// Possible values: [1, 65535]
|
||||||
|
// Required: false
|
||||||
|
SrcPort uint64 `url:"src_port,omitempty" json:"src_port,omitempty" validate:"omitempty,min=1,max=65535"`
|
||||||
|
|
||||||
|
// Destination port for traffic filtering (TCP/UDP only)
|
||||||
|
// Possible values: [1, 65535]
|
||||||
|
// Required: false
|
||||||
|
DstPort uint64 `url:"dst_port,omitempty" json:"dst_port,omitempty" validate:"omitempty,min=1,max=65535"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateRule creates a new rule for a QoS policy
|
||||||
|
func (qp QoSPolicy) CreateRule(ctx context.Context, req CreateRuleRequest) (uint64, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/create_rule"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseUint(string(res), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
37
pkg/cloudapi/qospolicy/delete.go
Normal file
37
pkg/cloudapi/qospolicy/delete.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteRequest struct {
|
||||||
|
// QoS policy ID
|
||||||
|
// Required: true
|
||||||
|
QoSPolicyID uint64 `url:"qos_policy_id" json:"qos_policy_id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/delete"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
41
pkg/cloudapi/qospolicy/delete_rule.go
Normal file
41
pkg/cloudapi/qospolicy/delete_rule.go
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteRuleRequest struct {
|
||||||
|
// ID of the QoS policy
|
||||||
|
// Required: true
|
||||||
|
QoSPolicyID uint64 `url:"qos_policy_id" json:"qos_policy_id" validate:"required"`
|
||||||
|
|
||||||
|
// ID of the rule to delete
|
||||||
|
// Required: true
|
||||||
|
RuleID uint64 `url:"rule_id" json:"rule_id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) DeleteRule(ctx context.Context, req DeleteRuleRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/delete_rule"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
89
pkg/cloudapi/qospolicy/filter.go
Normal file
89
pkg/cloudapi/qospolicy/filter.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
// FilterByID returns ListQoSPolicies with specified ID
|
||||||
|
func (lqp ListQoSPolicies) FilterByID(id uint64) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.ID == id
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByName returns ListQoSPolicies with specified Name
|
||||||
|
func (lqp ListQoSPolicies) FilterByName(name string) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.Name == name
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByAccountID returns ListQoSPolicies with specified AccountID
|
||||||
|
func (lqp ListQoSPolicies) FilterByAccountID(accountID uint64) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.AccountID == accountID
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByStatus returns ListQoSPolicies with specified Status
|
||||||
|
func (lqp ListQoSPolicies) FilterByStatus(status string) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.Status == status
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByDescription returns ListQoSPolicies with specified Description
|
||||||
|
func (lqp ListQoSPolicies) FilterByDescription(description string) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.Description == description
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByCreatedBy returns ListQoSPolicies with specified CreatedBy
|
||||||
|
func (lqp ListQoSPolicies) FilterByCreatedBy(createdBy string) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.CreatedBy == createdBy
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterByUpdatedBy returns ListQoSPolicies with specified UpdatedBy
|
||||||
|
func (lqp ListQoSPolicies) FilterByUpdatedBy(updatedBy string) ListQoSPolicies {
|
||||||
|
predicate := func(iqp ItemQoSPolicy) bool {
|
||||||
|
return iqp.UpdatedBy == updatedBy
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.FilterFunc(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterFunc allows filtering ListQoSPolicies based on a user-specified predicate
|
||||||
|
func (lqp ListQoSPolicies) FilterFunc(predicate func(ItemQoSPolicy) bool) ListQoSPolicies {
|
||||||
|
var result ListQoSPolicies
|
||||||
|
|
||||||
|
for _, item := range lqp.Data {
|
||||||
|
if predicate(item) {
|
||||||
|
result.Data = append(result.Data, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.EntryCount = uint64(len(result.Data))
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindOne returns first found ListQoSPolicies
|
||||||
|
// If none was found, returns an empty struct
|
||||||
|
func (lqp ListQoSPolicies) FindOne() ItemQoSPolicy {
|
||||||
|
if len(lqp.Data) == 0 {
|
||||||
|
return ItemQoSPolicy{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.Data[0]
|
||||||
|
}
|
||||||
97
pkg/cloudapi/qospolicy/filter_test.go
Normal file
97
pkg/cloudapi/qospolicy/filter_test.go
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
var qosPolicies = ListQoSPolicies{
|
||||||
|
Data: []ItemQoSPolicy{
|
||||||
|
{
|
||||||
|
ID: 1,
|
||||||
|
AccountID: 1,
|
||||||
|
Name: "qos1",
|
||||||
|
Description: "some desc",
|
||||||
|
Status: "ENABLED",
|
||||||
|
CreatedBy: "user",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 3,
|
||||||
|
AccountID: 3,
|
||||||
|
Name: "qos3",
|
||||||
|
Description: "some desc",
|
||||||
|
Status: "ENABLED",
|
||||||
|
CreatedBy: "anotheruser",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 5,
|
||||||
|
AccountID: 3,
|
||||||
|
Name: "qos5",
|
||||||
|
Description: "some other desc",
|
||||||
|
Status: "DISABLED",
|
||||||
|
CreatedBy: "anotheruser",
|
||||||
|
UpdatedBy: "user",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
EntryCount: 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByID(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByID(1).FindOne()
|
||||||
|
if actual.ID != 1 {
|
||||||
|
t.Fatal("expected ID 1, found: ", actual.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByName(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByName("qos3").FindOne()
|
||||||
|
if actual.Name != "qos3" {
|
||||||
|
t.Fatal("expected Name qos3, found: ", actual.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByDescription(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByDescription("some desc")
|
||||||
|
|
||||||
|
if len(actual.Data) != 2 {
|
||||||
|
t.Fatal("expected 2 found, actual: ", len(actual.Data))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range actual.Data {
|
||||||
|
if item.Description != "some desc" {
|
||||||
|
t.Fatal("expected Description 'some desc', found: ", item.Description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByAccountID(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByAccountID(1).FindOne()
|
||||||
|
if actual.AccountID != 1 {
|
||||||
|
t.Fatal("expected AccountID 1, found: ", actual.AccountID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByStatus(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByStatus("DISABLED").FindOne()
|
||||||
|
if actual.Status != "DISABLED" {
|
||||||
|
t.Fatal("expected Status DISABLED, found: ", actual.Status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByCreatedBy(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByCreatedBy("anotheruser")
|
||||||
|
|
||||||
|
if len(actual.Data) != 2 {
|
||||||
|
t.Fatal("expected 2 found, actual: ", len(actual.Data))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range actual.Data {
|
||||||
|
if item.CreatedBy != "anotheruser" {
|
||||||
|
t.Fatal("expected CreatedBy 'anotheruser', found: ", item.CreatedBy)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilterByUpdatedBy(t *testing.T) {
|
||||||
|
actual := qosPolicies.FilterByUpdatedBy("user").FindOne()
|
||||||
|
if actual.UpdatedBy != "user" {
|
||||||
|
t.Fatal("expected UpdatedBy 'user', found: ", actual.UpdatedBy)
|
||||||
|
}
|
||||||
|
}
|
||||||
43
pkg/cloudapi/qospolicy/get.go
Normal file
43
pkg/cloudapi/qospolicy/get.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetRequest struct {
|
||||||
|
// QoS policy ID
|
||||||
|
// Required: true
|
||||||
|
QoSPolicyID uint64 `url:"qos_policy_id" json:"qos_policy_id" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) Get(ctx context.Context, req GetRequest) (*RecordQoSPolicy, error) {
|
||||||
|
res, err := qp.GetRaw(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := RecordQoSPolicy{}
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &info)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/get"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
89
pkg/cloudapi/qospolicy/list.go
Normal file
89
pkg/cloudapi/qospolicy/list.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ListRequest 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 QoS policy by id
|
||||||
|
// Required: false
|
||||||
|
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by account id
|
||||||
|
// Required: false
|
||||||
|
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
|
||||||
|
|
||||||
|
// Find by QoS policy name
|
||||||
|
// Required: false
|
||||||
|
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||||
|
|
||||||
|
// Find by QoS policy description
|
||||||
|
// Required: false
|
||||||
|
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||||
|
|
||||||
|
// Find by QoS policy status
|
||||||
|
// Possible values: ENABLED, DISABLED, DESTROYED
|
||||||
|
// Required: false
|
||||||
|
Status string `url:"status,omitempty" json:"status,omitempty"`
|
||||||
|
|
||||||
|
// Find by created after time (unix timestamp)
|
||||||
|
// Required: false
|
||||||
|
CreatedMin uint64 `url:"created_min,omitempty" json:"created_min,omitempty"`
|
||||||
|
|
||||||
|
// Find by created before time (unix timestamp)
|
||||||
|
// Required: false
|
||||||
|
CreatedMax uint64 `url:"created_max,omitempty" json:"created_max,omitempty"`
|
||||||
|
|
||||||
|
// Find by updated after time (unix timestamp)
|
||||||
|
// Required: false
|
||||||
|
UpdatedMin uint64 `url:"updated_min,omitempty" json:"updated_min,omitempty"`
|
||||||
|
|
||||||
|
// Find by updated before time (unix timestamp)
|
||||||
|
// Required: false
|
||||||
|
UpdatedMax uint64 `url:"updated_max,omitempty" json:"updated_max,omitempty"`
|
||||||
|
|
||||||
|
// Sort by one of supported fields, format ±<field>
|
||||||
|
// Required: false
|
||||||
|
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// List gets list of QoS policies as a ListQosPolicies struct
|
||||||
|
func (qp QoSPolicy) List(ctx context.Context, req ListRequest) (*ListQoSPolicies, error) {
|
||||||
|
res, err := qp.ListRaw(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
list := ListQoSPolicies{}
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &list)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &list, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListRaw gets list of QoS policies as an array of bytes
|
||||||
|
func (qp QoSPolicy) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
||||||
|
if err := validators.ValidateRequest(req); err != nil {
|
||||||
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/list"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
122
pkg/cloudapi/qospolicy/models.go
Normal file
122
pkg/cloudapi/qospolicy/models.go
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
type ListQoSPolicies struct {
|
||||||
|
// List
|
||||||
|
Data []ItemQoSPolicy `json:"data"`
|
||||||
|
|
||||||
|
// Entry count
|
||||||
|
EntryCount uint64 `json:"entryCount"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ItemQoSPolicy struct {
|
||||||
|
// ID of the QoS policy
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// Account ID that owns the QoS policy
|
||||||
|
AccountID uint64 `json:"account_id"`
|
||||||
|
|
||||||
|
// Name of the QoS policy
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Description of the QoS policy
|
||||||
|
Description string `json:"description"`
|
||||||
|
|
||||||
|
// Status of the QoS policy
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Created at (unix timestamp)
|
||||||
|
CreatedAt uint64 `json:"created_at"`
|
||||||
|
|
||||||
|
// Updated at (unix timestamp)
|
||||||
|
UpdatedAt uint64 `json:"updated_at"`
|
||||||
|
|
||||||
|
// Created by
|
||||||
|
CreatedBy string `json:"created_by"`
|
||||||
|
|
||||||
|
// Updated by
|
||||||
|
UpdatedBy string `json:"updated_by"`
|
||||||
|
|
||||||
|
// List of rules
|
||||||
|
Rules Rules `json:"rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type RecordQoSPolicy struct {
|
||||||
|
// ID of the QoS policy
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// Account ID that owns the QoS policy
|
||||||
|
AccountID uint64 `json:"account_id"`
|
||||||
|
|
||||||
|
// Name of the QoS policy
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Description of the QoS policy
|
||||||
|
Description string `json:"description"`
|
||||||
|
|
||||||
|
// Status of the QoS policy
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Created at (unix timestamp)
|
||||||
|
CreatedAt uint64 `json:"created_at"`
|
||||||
|
|
||||||
|
// Updated at (unix timestamp)
|
||||||
|
UpdatedAt uint64 `json:"updated_at"`
|
||||||
|
|
||||||
|
// Created by
|
||||||
|
CreatedBy string `json:"created_by"`
|
||||||
|
|
||||||
|
// Updated by
|
||||||
|
UpdatedBy string `json:"updated_by"`
|
||||||
|
|
||||||
|
// List of rules
|
||||||
|
Rules Rules `json:"rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Rules []Rule
|
||||||
|
|
||||||
|
type Rule struct {
|
||||||
|
// ID of the rule
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// Description of the rule
|
||||||
|
Description string `json:"description"`
|
||||||
|
|
||||||
|
// Rule priority in OVS (higher number = higher priority)
|
||||||
|
Priority uint64 `json:"priority"`
|
||||||
|
|
||||||
|
// Traffic direction
|
||||||
|
Direction string `json:"direction"`
|
||||||
|
|
||||||
|
// IP protocol
|
||||||
|
Protocol string `json:"protocol"`
|
||||||
|
|
||||||
|
// Priority Code Point (0-7). L2 marking
|
||||||
|
PCPTag uint64 `json:"pcp_tag"`
|
||||||
|
|
||||||
|
// DSCP value (0-63). L3 marking
|
||||||
|
DSCPValue uint64 `json:"dscp_value"`
|
||||||
|
|
||||||
|
// Source IP address
|
||||||
|
SrcIP string `json:"src_ip"`
|
||||||
|
|
||||||
|
// Destination IP address
|
||||||
|
DstIP string `json:"dst_ip"`
|
||||||
|
|
||||||
|
// Source MAC address
|
||||||
|
SrcMAC string `json:"src_mac"`
|
||||||
|
|
||||||
|
// Destination MAC address
|
||||||
|
DstMAC string `json:"dst_mac"`
|
||||||
|
|
||||||
|
// Source port
|
||||||
|
SrcPort uint64 `json:"src_port"`
|
||||||
|
|
||||||
|
// Destination port
|
||||||
|
DstPort uint64 `json:"dst_port"`
|
||||||
|
}
|
||||||
15
pkg/cloudapi/qospolicy/qos_policy.go
Normal file
15
pkg/cloudapi/qospolicy/qos_policy.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||||
|
|
||||||
|
// Structure for creating request to QoS policy
|
||||||
|
type QoSPolicy struct {
|
||||||
|
client interfaces.Caller
|
||||||
|
}
|
||||||
|
|
||||||
|
// Builder for QoS policy endpoint
|
||||||
|
func New(client interfaces.Caller) *QoSPolicy {
|
||||||
|
return &QoSPolicy{
|
||||||
|
client: client,
|
||||||
|
}
|
||||||
|
}
|
||||||
39
pkg/cloudapi/qospolicy/sorting.go
Normal file
39
pkg/cloudapi/qospolicy/sorting.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import "sort"
|
||||||
|
|
||||||
|
// SortByCreatedAt sorts ListQosPolicies by the CreatedAt field in ascending order
|
||||||
|
// If inverse param is set to true, the order is reversed
|
||||||
|
func (lqp ListQoSPolicies) SortByCreatedAt(inverse bool) ListQoSPolicies {
|
||||||
|
if len(lqp.Data) < 2 {
|
||||||
|
return lqp
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(lqp.Data, func(i, j int) bool {
|
||||||
|
if inverse {
|
||||||
|
return lqp.Data[i].CreatedAt > lqp.Data[j].CreatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.Data[i].CreatedAt < lqp.Data[j].CreatedAt
|
||||||
|
})
|
||||||
|
|
||||||
|
return lqp
|
||||||
|
}
|
||||||
|
|
||||||
|
// SortByUpdatedAt sorts ListQosPolicies by the UpdatedAt field in ascending order
|
||||||
|
// If inverse param is set to true, the order is reversed
|
||||||
|
func (lqp ListQoSPolicies) SortByUpdatedAt(inverse bool) ListQoSPolicies {
|
||||||
|
if len(lqp.Data) < 2 {
|
||||||
|
return lqp
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(lqp.Data, func(i, j int) bool {
|
||||||
|
if inverse {
|
||||||
|
return lqp.Data[i].UpdatedAt > lqp.Data[j].UpdatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
return lqp.Data[i].UpdatedAt < lqp.Data[j].UpdatedAt
|
||||||
|
})
|
||||||
|
|
||||||
|
return lqp
|
||||||
|
}
|
||||||
52
pkg/cloudapi/qospolicy/update.go
Normal file
52
pkg/cloudapi/qospolicy/update.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package qospolicy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UpdateRequest struct {
|
||||||
|
// QoS policy ID
|
||||||
|
// Required: true
|
||||||
|
QoSPolicyID uint64 `url:"qos_policy_id" json:"qos_policy_id" validate:"required"`
|
||||||
|
|
||||||
|
// New QoS policy name
|
||||||
|
// Required: false
|
||||||
|
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||||
|
|
||||||
|
// New QoS policy description
|
||||||
|
// Required: false
|
||||||
|
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) Update(ctx context.Context, req UpdateRequest) (*RecordQoSPolicy, error) {
|
||||||
|
res, err := qp.UpdateRaw(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := RecordQoSPolicy{}
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &info)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (qp QoSPolicy) UpdateRaw(ctx context.Context, req UpdateRequest) ([]byte, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudapi/network_qos_policy/update"
|
||||||
|
|
||||||
|
res, err := qp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package rg
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to get audit
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// Resource group ID
|
|
||||||
// Required: true
|
|
||||||
RGID uint64 `url:"rgId" json:"rgId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified resource group object
|
|
||||||
func (r RG) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/rg/audits"
|
|
||||||
|
|
||||||
res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -76,6 +76,10 @@ type CreateRequest struct {
|
|||||||
// SDN access group id
|
// SDN access group id
|
||||||
// Required: false
|
// Required: false
|
||||||
SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"`
|
SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"`
|
||||||
|
|
||||||
|
// Enabling default gateway
|
||||||
|
// Required: false
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoragePolicy struct {
|
type StoragePolicy struct {
|
||||||
|
|||||||
@@ -38,6 +38,14 @@ type ListRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
UpdateTimeTo uint64 `url:"updateTimeTo,omitempty" json:"updateTimeTo,omitempty"`
|
UpdateTimeTo uint64 `url:"updateTimeTo,omitempty" json:"updateTimeTo,omitempty"`
|
||||||
|
|
||||||
|
// Find all tasks created after point in time (unixtime)
|
||||||
|
// Required: false
|
||||||
|
CreatedTimeAt uint64 `url:"createdTimeAt,omitempty" json:"createdTimeAt,omitempty"`
|
||||||
|
|
||||||
|
// Find all tasks created before point in time (unixtime)
|
||||||
|
// Required: false
|
||||||
|
CreatedTimeTo uint64 `url:"createdTimeTo,omitempty" json:"createdTimeTo,omitempty"`
|
||||||
|
|
||||||
// Page number
|
// Page number
|
||||||
// Default: 0
|
// Default: 0
|
||||||
// Default: 0
|
// Default: 0
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ type RecordAsyncTask struct {
|
|||||||
|
|
||||||
// Updated time
|
// Updated time
|
||||||
UpdatedTime uint64 `json:"updatedTime"`
|
UpdatedTime uint64 `json:"updatedTime"`
|
||||||
|
|
||||||
|
// Time of creation
|
||||||
|
CreatedTime uint64 `json:"createdTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detailed information about task
|
// Detailed information about task
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
package user
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetAuditRequest struct for getting user's audits.
|
|
||||||
type GetAuditRequest struct {
|
|
||||||
// Find by api call.
|
|
||||||
// Required: false
|
|
||||||
Call string `url:"call,omitempty" json:"call,omitempty"`
|
|
||||||
|
|
||||||
// Find all audits after point in time (unixtime)
|
|
||||||
// Required: false
|
|
||||||
TimestampAt uint64 `url:"timestampAt,omitempty" json:"timestampAt,omitempty"`
|
|
||||||
|
|
||||||
// Find all audits before point in time (unixtime)
|
|
||||||
// Required: false
|
|
||||||
TimestampTo uint64 `url:"timestampTo,omitempty" json:"timestampTo,omitempty"`
|
|
||||||
|
|
||||||
// find by HTTP max status code
|
|
||||||
// Required: false
|
|
||||||
MaxStatusCode uint64 `url:"maxStatusCode,omitempty" json:"maxStatusCode,omitempty"`
|
|
||||||
|
|
||||||
// find by HTTP min status code
|
|
||||||
// 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"`
|
|
||||||
|
|
||||||
// Page size, maximum - 100.
|
|
||||||
// Required: false
|
|
||||||
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAudit gets user's audits.
|
|
||||||
func (u User) GetAudit(ctx context.Context, req GetAuditRequest) (ListAudits, error) {
|
|
||||||
url := "/cloudapi/user/getAudit"
|
|
||||||
|
|
||||||
res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return ListAudits{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return ListAudits{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
package user
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetRequest struct to check if the inviteusertoken and emailaddress pair are valid and matching.
|
|
||||||
type IsValidInviteUserTokenRequest struct {
|
|
||||||
// InviteUserToken
|
|
||||||
// The token that was previously sent to the invited user email
|
|
||||||
// Required: true
|
|
||||||
InviteUserToken string `url:"inviteusertoken" json:"inviteusertoken" validate:"required"`
|
|
||||||
|
|
||||||
// EmailAddress
|
|
||||||
// Email address for the user
|
|
||||||
// Required: true
|
|
||||||
EmailAddress string `url:"emailaddress" json:"emailaddress" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsValidInviteUserToken checks if the inviteusertoken and emailaddress pair are valid and matching.
|
|
||||||
func (u User) IsValidInviteUserToken(ctx context.Context, req IsValidInviteUserTokenRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/user/isValidInviteUserToken"
|
|
||||||
|
|
||||||
res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -78,35 +78,47 @@ func (s *StatusCode) UnmarshalJSON(b []byte) error {
|
|||||||
|
|
||||||
type BriefResources struct {
|
type BriefResources struct {
|
||||||
Accounts Accounts `json:"Accounts,omitempty"`
|
Accounts Accounts `json:"Accounts,omitempty"`
|
||||||
CSs CSs `json:"CSs,omitempty"`
|
|
||||||
Computes Computes `json:"Computes,omitempty"`
|
Computes Computes `json:"Computes,omitempty"`
|
||||||
RGs RGs `json:"RGs,omitempty"`
|
RGs RGs `json:"RGs,omitempty"`
|
||||||
VMs VMs `json:"VMs,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Accounts struct {
|
type Accounts struct {
|
||||||
Disabled uint64 `json:"DISABLED,omitempty"`
|
Destroying uint64 `json:"DESTROYING,omitempty"`
|
||||||
Enabled uint64 `json:"ENABLED,omitempty"`
|
Confirmed uint64 `json:"CONFIRMED,omitempty"`
|
||||||
}
|
Disabled uint64 `json:"DISABLED,omitempty"`
|
||||||
|
Deleted uint64 `json:"DELETED,omitempty"`
|
||||||
type CSs struct {
|
|
||||||
Disabled uint64 `json:"DISABLED,omitempty"`
|
|
||||||
Enabled uint64 `json:"ENABLED,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Computes struct {
|
type Computes struct {
|
||||||
Started uint64 `json:"Started,omitempty"`
|
Starting uint64 `json:"STARTING,omitempty"`
|
||||||
Stopped uint64 `json:"Stopped,omitempty"`
|
Started uint64 `json:"STARTED,omitempty"`
|
||||||
|
Stopping uint64 `json:"STOPPING,omitempty"`
|
||||||
|
Stopped uint64 `json:"STOPPED,omitempty"`
|
||||||
|
Paused uint64 `json:"PAUSED,omitempty"`
|
||||||
|
Pausing uint64 `json:"PAUSING,omitempty"`
|
||||||
|
Merge uint64 `json:"MERGE,omitempty"`
|
||||||
|
Migrating uint64 `json:"MIGRATING,omitempty"`
|
||||||
|
MigratingIn uint64 `json:"MIGRATING_IN,omitempty"`
|
||||||
|
MigratingOut uint64 `json:"MIGRATING_OUT,omitempty"`
|
||||||
|
Down uint64 `json:"DOWN,omitempty"`
|
||||||
|
Scheduled uint64 `json:"SCHEDULED,omitempty"`
|
||||||
|
BackupStopped uint64 `json:"BACKUP_STOPPED,omitempty"`
|
||||||
|
BackupRunning uint64 `json:"BACKUP_RUNNING,omitempty"`
|
||||||
|
SnapСreate uint64 `json:"SNAPCREATE,omitempty"`
|
||||||
|
Cloning uint64 `json:"CLONING,omitempty"`
|
||||||
|
Rollback uint64 `json:"ROLLBACK,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type RGs struct {
|
type RGs struct {
|
||||||
Disabled uint64 `json:"DISABLED,omitempty"`
|
Modeled uint64 `json:"MODELED,omitempty"`
|
||||||
Enabled uint64 `json:"ENABLED,omitempty"`
|
Created uint64 `json:"CREATED,omitempty"`
|
||||||
}
|
Deleted uint64 `json:"DELETED,omitempty"`
|
||||||
|
Deleting uint64 `json:"DELETING,omitempty"`
|
||||||
type VMs struct {
|
Destroying uint64 `json:"DESTROYING,omitempty"`
|
||||||
Halted uint64 `json:"Halted,omitempty"`
|
Disabled uint64 `json:"DISABLED,omitempty"`
|
||||||
Running uint64 `json:"Running,omitempty"`
|
Disabling uint64 `json:"DISABLING,omitempty"`
|
||||||
|
Enabling uint64 `json:"ENABLING,omitempty"`
|
||||||
|
Restoring uint64 `json:"RESTORING,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type APIsEndpoints struct {
|
type APIsEndpoints struct {
|
||||||
|
|||||||
@@ -18,33 +18,29 @@ type ListRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
Status string `url:"status,omitempty" json:"status,omitempty"`
|
Status string `url:"status,omitempty" json:"status,omitempty"`
|
||||||
|
|
||||||
// Find by vgpu type
|
// Find by mode
|
||||||
// Required: false
|
// Required: false
|
||||||
Type string `url:"type,omitempty" json:"type,omitempty"`
|
SplitMode string `url:"split_mode,omitempty" json:"split_mode,omitempty"`
|
||||||
|
|
||||||
// Find by vgpu mode
|
// Find by id node
|
||||||
// Required: false
|
// Required: false
|
||||||
Mode string `url:"mode,omitempty" json:"mode,omitempty"`
|
NodeID uint64 `url:"node_id,omitempty" json:"node_id,omitempty"`
|
||||||
|
|
||||||
// Find by id resgroup
|
|
||||||
// Required: false
|
|
||||||
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
|
|
||||||
|
|
||||||
// Find by account id
|
// Find by account id
|
||||||
// Required: false
|
// Required: false
|
||||||
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
|
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
|
||||||
|
|
||||||
// Find by compute id
|
// Find by compute id
|
||||||
// Required: false
|
// Required: false
|
||||||
ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"`
|
ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"`
|
||||||
|
|
||||||
// Find by pgpu id
|
// Find by pgpu id
|
||||||
// Required: false
|
// Required: false
|
||||||
PGPUID uint64 `url:"pgpuId,omitempty" json:"pgpuId,omitempty"`
|
PGPUID uint64 `url:"pgpu_id,omitempty" json:"pgpu_id,omitempty"`
|
||||||
|
|
||||||
// Sort by one of supported fields, format +|-(field)
|
// Sort by one of supported fields, format +|-(field)
|
||||||
// Required: false
|
// Required: false
|
||||||
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
|
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty" validate:"omitempty,sortBy"`
|
||||||
|
|
||||||
// Page number
|
// Page number
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -83,6 +79,6 @@ func (v VGPU) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
|||||||
|
|
||||||
url := "/cloudapi/vgpu/list"
|
url := "/cloudapi/vgpu/list"
|
||||||
|
|
||||||
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := v.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
package vgpu
|
package vgpu
|
||||||
|
|
||||||
type ItemVGPU struct {
|
type ItemVGPU struct {
|
||||||
// Account ID
|
// Account IDs
|
||||||
AccountID uint64 `json:"accountId"`
|
AccountIDs []uint64 `json:"account_ids"`
|
||||||
|
|
||||||
|
// Bus number
|
||||||
|
BusNumber int `json:"bus_number"`
|
||||||
|
|
||||||
|
// ComputeID
|
||||||
|
ComputeID uint64 `json:"compute_id"`
|
||||||
|
|
||||||
// Created time
|
// Created time
|
||||||
CreatedTime uint64 `json:"createdTime"`
|
CreatedTime uint64 `json:"created_time"`
|
||||||
|
|
||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deleted_time"`
|
||||||
|
|
||||||
|
// Device Reference
|
||||||
|
DeviceReference string `json:"device_reference"`
|
||||||
|
|
||||||
//Grid ID
|
//Grid ID
|
||||||
GID uint64 `json:"gid"`
|
GID uint64 `json:"gid"`
|
||||||
@@ -19,44 +28,29 @@ type ItemVGPU struct {
|
|||||||
// VGPU ID
|
// VGPU ID
|
||||||
ID uint64 `json:"id"`
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
// Last claimed by
|
// Last Update time
|
||||||
LastClaimedBy uint64 `json:"lastClaimedBy"`
|
LastUpdateTime uint64 `json:"last_update_time"`
|
||||||
|
|
||||||
// Last update time
|
// Mdev UUID
|
||||||
LastUpdateTime uint64 `json:"lastUpdateTime"`
|
MdevUUID string `json:"mdev_uuid"`
|
||||||
|
|
||||||
// Mode
|
// Parent PCI Address
|
||||||
Mode string `json:"mode"`
|
ParentPCIAddress string `json:"parent_pci_address"`
|
||||||
|
|
||||||
// Bus number
|
|
||||||
BusNumber int `json:"bus_number"`
|
|
||||||
|
|
||||||
// PCI Slot
|
// PCI Slot
|
||||||
PCISlot int `json:"pciSlot"`
|
PCISlot uint64 `json:"pci_slot"`
|
||||||
|
|
||||||
// PGPUID
|
// PGPU ID
|
||||||
PGPUID uint64 `json:"pgpuid"`
|
PGPUID uint64 `json:"pgpu_id"`
|
||||||
|
|
||||||
// Profile ID
|
// Profile Reference
|
||||||
ProfileID uint64 `json:"profileId"`
|
ProfileReference string `json:"profile_reference"`
|
||||||
|
|
||||||
// RAM
|
// Split Mode
|
||||||
RAM uint64 `json:"ram"`
|
SplitMode string `json:"split_mode"`
|
||||||
|
|
||||||
// Reference ID
|
|
||||||
ReferenceID string `json:"referenceId"`
|
|
||||||
|
|
||||||
// RGID
|
|
||||||
RGID uint64 `json:"rgId"`
|
|
||||||
|
|
||||||
// Status
|
// Status
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
|
||||||
// Type
|
|
||||||
Type string `json:"type"`
|
|
||||||
|
|
||||||
// VMID
|
|
||||||
VMID uint64 `json:"vmid"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of VGPU
|
// List of VGPU
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package vins
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to get audits
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// ID of the VINS
|
|
||||||
// Required: true
|
|
||||||
VINSID uint64 `url:"vinsId" json:"vinsId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified VINS object
|
|
||||||
func (v VINS) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/vins/audits"
|
|
||||||
|
|
||||||
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -2,10 +2,10 @@ package vins
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -62,11 +62,11 @@ type CreateInAccountRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
|
||||||
|
|
||||||
type wrapperCreateRequestInAcc struct {
|
// Flag indicating whether default gateway is enabled for this VINS
|
||||||
CreateInAccountRequest
|
// Required: false
|
||||||
Routes []string `url:"routes,omitempty"`
|
// Default: true
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateInAccount creates VINS in account level
|
// CreateInAccount creates VINS in account level
|
||||||
@@ -76,31 +76,9 @@ func (v VINS) CreateInAccount(ctx context.Context, req CreateInAccountRequest) (
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var routes []string
|
|
||||||
|
|
||||||
if len(req.Routes) != 0 {
|
|
||||||
routes = make([]string, 0, len(req.Routes))
|
|
||||||
|
|
||||||
for r := range req.Routes {
|
|
||||||
b, err := json.Marshal(req.Routes[r])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
routes = append(routes, string(b))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
routes = []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateRequestInAcc{
|
|
||||||
CreateInAccountRequest: req,
|
|
||||||
Routes: routes,
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/vins/createInAccount"
|
url := "/cloudapi/vins/createInAccount"
|
||||||
|
|
||||||
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package vins
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,11 +56,11 @@ type CreateInRGRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
|
||||||
|
|
||||||
type wrapperCreateRequestInRG struct {
|
// Flag indicating whether default gateway is enabled for this VINS
|
||||||
CreateInRGRequest
|
// Required: false
|
||||||
Routes []string `url:"routes,omitempty"`
|
// Default: true
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateInRG creates VINS in resource group level
|
// CreateInRG creates VINS in resource group level
|
||||||
@@ -70,31 +70,9 @@ func (v VINS) CreateInRG(ctx context.Context, req CreateInRGRequest) (uint64, er
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var routes []string
|
|
||||||
|
|
||||||
if len(req.Routes) != 0 {
|
|
||||||
routes = make([]string, 0, len(req.Routes))
|
|
||||||
|
|
||||||
for r := range req.Routes {
|
|
||||||
b, err := json.Marshal(req.Routes[r])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
routes = append(routes, string(b))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
routes = []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateRequestInRG{
|
|
||||||
CreateInRGRequest: req,
|
|
||||||
Routes: routes,
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudapi/vins/createInRG"
|
url := "/cloudapi/vins/createInRG"
|
||||||
|
|
||||||
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ type ItemVINS struct {
|
|||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Enable Default Gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// External IP
|
// External IP
|
||||||
ExternalIP string `json:"externalIP"`
|
ExternalIP string `json:"externalIP"`
|
||||||
|
|
||||||
@@ -694,6 +697,9 @@ type RecordVINS struct {
|
|||||||
// Description
|
// Description
|
||||||
Description string `json:"desc"`
|
Description string `json:"desc"`
|
||||||
|
|
||||||
|
// Enable Default Gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// Enable Security Groups
|
// Enable Security Groups
|
||||||
EnableSecGroups bool `json:"enable_secgroups"`
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,21 @@ type RecordZone struct {
|
|||||||
|
|
||||||
// CPU alignment profiles
|
// CPU alignment profiles
|
||||||
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
|
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
|
// Storage Distributed Resource Scheduler
|
||||||
|
SDRS bool `json:"sdrs"`
|
||||||
|
|
||||||
|
// Mode of SDRS
|
||||||
|
SDRSMode string `json:"sdrs_mode"`
|
||||||
|
|
||||||
|
// Minimal level of logs
|
||||||
|
LoggingLevel string `json:"logging_level"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A zone item from a list
|
// A zone item from a list
|
||||||
@@ -183,4 +198,19 @@ type ItemZone struct {
|
|||||||
|
|
||||||
// CPU alignment profiles
|
// CPU alignment profiles
|
||||||
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
|
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
|
// Storage Distributed Resource Scheduler
|
||||||
|
SDRS bool `json:"sdrs"`
|
||||||
|
|
||||||
|
// Mode of SDRS
|
||||||
|
SDRSMode string `json:"sdrs_mode"`
|
||||||
|
|
||||||
|
// Minimal level of logs
|
||||||
|
LoggingLevel string `json:"logging_level"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to give list of account audits
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// ID of the account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified account object
|
|
||||||
func (a Account) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/account/audits"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DisableRequest struct to disable account
|
|
||||||
type DisableRequest struct {
|
|
||||||
// ID of account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable disables an account
|
|
||||||
func (a Account) Disable(ctx context.Context, req DisableRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/account/disable"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package account
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EnableRequest struct to enable account
|
|
||||||
type EnableRequest struct {
|
|
||||||
// ID of account
|
|
||||||
// Required: true
|
|
||||||
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable enables an account
|
|
||||||
func (a Account) Enable(ctx context.Context, req EnableRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/account/enable"
|
|
||||||
|
|
||||||
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -456,11 +456,56 @@ type ItemFLIPGroup struct {
|
|||||||
|
|
||||||
// Computes info
|
// Computes info
|
||||||
type Computes struct {
|
type Computes struct {
|
||||||
|
// Starting
|
||||||
|
Starting uint64 `json:"STARTING"`
|
||||||
|
|
||||||
// Started
|
// Started
|
||||||
Started uint64 `json:"Started"`
|
Started uint64 `json:"STARTED"`
|
||||||
|
|
||||||
|
// Stopping
|
||||||
|
Stopping uint64 `json:"STOPPING"`
|
||||||
|
|
||||||
// Stopped
|
// Stopped
|
||||||
Stopped uint64 `json:"Stopped"`
|
Stopped uint64 `json:"STOPPED"`
|
||||||
|
|
||||||
|
// Paused
|
||||||
|
Paused uint64 `json:"PAUSED"`
|
||||||
|
|
||||||
|
// Pausing
|
||||||
|
Pausing uint64 `json:"PAUSING"`
|
||||||
|
|
||||||
|
// Merge
|
||||||
|
Merge uint64 `json:"MERGE"`
|
||||||
|
|
||||||
|
// Migrating
|
||||||
|
Migrating uint64 `json:"MIGRATING"`
|
||||||
|
|
||||||
|
// Migrating in
|
||||||
|
MigratingIn uint64 `json:"MIGRATING_IN"`
|
||||||
|
|
||||||
|
// Migrating out
|
||||||
|
MigratingOut uint64 `json:"MIGRATING_OUT"`
|
||||||
|
|
||||||
|
// Down
|
||||||
|
Down uint64 `json:"DOWN"`
|
||||||
|
|
||||||
|
// Scheduled
|
||||||
|
Scheduled uint64 `json:"SCHEDULED"`
|
||||||
|
|
||||||
|
// Backup stopped
|
||||||
|
BackupStopped uint64 `json:"BACKUP_STOPPED"`
|
||||||
|
|
||||||
|
// Backup running
|
||||||
|
BackupRunning uint64 `json:"BACKUP_RUNNING"`
|
||||||
|
|
||||||
|
// Snapcreate
|
||||||
|
Snapcreate uint64 `json:"SNAPCREATE"`
|
||||||
|
|
||||||
|
// Cloning
|
||||||
|
Cloning uint64 `json:"CLONING"`
|
||||||
|
|
||||||
|
// Rollback
|
||||||
|
Rollback uint64 `json:"ROLLBACK"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Limits
|
// Limits
|
||||||
@@ -579,6 +624,9 @@ type ItemVINS struct {
|
|||||||
// Deleted time
|
// Deleted time
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Enable Default Gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// External IP
|
// External IP
|
||||||
ExternalIP string `json:"externalIP"`
|
ExternalIP string `json:"externalIP"`
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ type SetCPUAllocationRatioRequest struct {
|
|||||||
|
|
||||||
// CPU allocation ratio, i.e. one pCPU = ratio*vCPU
|
// CPU allocation ratio, i.e. one pCPU = ratio*vCPU
|
||||||
// Required: true
|
// Required: true
|
||||||
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
|
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCPUAllocationRatio sets CPU allocation ratio
|
// SetCPUAllocationRatio sets CPU allocation ratio
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -62,9 +63,9 @@ type GroupAddRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
TimeoutStart uint64 `url:"timeoutStart,omitempty" json:"timeoutStart,omitempty"`
|
TimeoutStart uint64 `url:"timeoutStart,omitempty" json:"timeoutStart,omitempty"`
|
||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format yaml string or json object
|
||||||
// Required: false
|
// Required: false
|
||||||
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
UserData interface{} `url:"userData,omitempty" json:"userData,omitempty"`
|
||||||
|
|
||||||
// Chipset "i440fx" or "Q35
|
// Chipset "i440fx" or "Q35
|
||||||
// Default value : Q35
|
// Default value : Q35
|
||||||
@@ -97,7 +98,7 @@ func (b BService) GroupAdd(ctx context.Context, req GroupAddRequest) (uint64, er
|
|||||||
|
|
||||||
url := "/cloudbroker/bservice/groupAdd"
|
url := "/cloudbroker/bservice/groupAdd"
|
||||||
|
|
||||||
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuditsRequest struct to get audit records
|
|
||||||
type AuditsRequest struct {
|
|
||||||
// ID of the compute
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
|
||||||
|
|
||||||
// Find all audits after point in time
|
|
||||||
// Required: false
|
|
||||||
TimestampAT uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
|
|
||||||
|
|
||||||
// Find all audits before point in time
|
|
||||||
// Required: false
|
|
||||||
TimestampTO uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
|
|
||||||
|
|
||||||
// Find by user
|
|
||||||
// Required: false
|
|
||||||
User string `url:"user,omitempty" json:"user,omitempty"`
|
|
||||||
|
|
||||||
// Find by api endpoints
|
|
||||||
// Required: false
|
|
||||||
Call string `url:"call,omitempty" json:"call,omitempty"`
|
|
||||||
|
|
||||||
// Sort by one of supported fields, format ±<field>
|
|
||||||
// Required: false
|
|
||||||
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
|
||||||
|
|
||||||
// Page number
|
|
||||||
// Required: false
|
|
||||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
|
||||||
|
|
||||||
// Page size
|
|
||||||
// Required: false
|
|
||||||
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
|
|
||||||
|
|
||||||
// Find by HTTP min status code
|
|
||||||
// Required: false
|
|
||||||
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
|
|
||||||
|
|
||||||
// Find by HTTP max status code
|
|
||||||
// Required: false
|
|
||||||
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Audits gets audit records for the specified compute object
|
|
||||||
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (*ListDetailedAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/compute/audits"
|
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListDetailedAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &list, nil
|
|
||||||
}
|
|
||||||
84
pkg/cloudbroker/compute/change_qos_policies.go
Normal file
84
pkg/cloudbroker/compute/change_qos_policies.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChangeQoSPoliciesRequest struct {
|
||||||
|
// Compute ID
|
||||||
|
// Required: true
|
||||||
|
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
|
||||||
|
|
||||||
|
// Interface IP or MAC address
|
||||||
|
// Required: true
|
||||||
|
Interface string `url:"interface" json:"interface" validate:"required"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to assign to this interface
|
||||||
|
// Required: false
|
||||||
|
QoSPolicyIDs []uint64 `url:"qos_policy_ids,omitempty" json:"qos_policy_ids,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type wrapperChangeQoSPoliciesRequest struct {
|
||||||
|
ChangeQoSPoliciesRequest
|
||||||
|
|
||||||
|
AsyncMode bool `url:"asyncMode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeQoSPolicies change qos policies for compute
|
||||||
|
func (c Compute) ChangeQoSPolicies(ctx context.Context, req ChangeQoSPoliciesRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
reqWrapped := wrapperChangeQoSPoliciesRequest{
|
||||||
|
ChangeQoSPoliciesRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/compute/change_qos_policies"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeQoSPolicies change qos policies for compute with AsyncMode
|
||||||
|
func (c Compute) ChangeQoSPoliciesAsync(ctx context.Context, req ChangeQoSPoliciesRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
reqWrapped := wrapperChangeQoSPoliciesRequest{
|
||||||
|
ChangeQoSPoliciesRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/compute/change_qos_policies"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := strconv.ParseBool(string(res))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ComputeCISetRequest struct to set compute CI
|
|
||||||
type ComputeCISetRequest struct {
|
|
||||||
// ID of compute instance
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
|
||||||
|
|
||||||
// ID of the Compute CI
|
|
||||||
// Required: true
|
|
||||||
ComputeCIID uint64 `url:"computeciId" json:"computeciId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComputeCISet sets compute CI ID for compute
|
|
||||||
func (c Compute) ComputeCISet(ctx context.Context, req ComputeCISetRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/compute/computeciSet"
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ComputeCIUnsetRequest struct to unset compute CI
|
|
||||||
type ComputeCIUnsetRequest struct {
|
|
||||||
// ID of compute instance
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComputeCIUnset unsets compute CI ID from compute
|
|
||||||
func (c Compute) ComputeCIUnset(ctx context.Context, req ComputeCIUnsetRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/compute/computeciUnset"
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetAuditsRequest struct to get compute audits
|
|
||||||
type GetAuditsRequest struct {
|
|
||||||
// ID of compute instance
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAudits gets compute audits
|
|
||||||
func (c Compute) GetAudits(ctx context.Context, req GetAuditsRequest) (ListAudits, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/compute/getAudits"
|
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListAudits{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package compute
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetLogRequest struct to get compute logs
|
|
||||||
type GetLogRequest struct {
|
|
||||||
// ID of compute instance to get log for
|
|
||||||
// Required: true
|
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
|
||||||
|
|
||||||
// Path to log file
|
|
||||||
// Required: true
|
|
||||||
Path string `url:"path" json:"path" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLog gets compute's log file by path
|
|
||||||
func (c Compute) GetLog(ctx context.Context, req GetLogRequest) (string, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/compute/getLog"
|
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(res), nil
|
|
||||||
}
|
|
||||||
@@ -14,10 +14,6 @@ type ListPCIDeviceRequest struct {
|
|||||||
// Required: true
|
// Required: true
|
||||||
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
|
||||||
|
|
||||||
// Find by resource group ID
|
|
||||||
// Required: false
|
|
||||||
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
|
|
||||||
|
|
||||||
// Find by device id
|
// Find by device id
|
||||||
// Required: false
|
// Required: false
|
||||||
DevID uint64 `url:"devId,omitempty" json:"devId,omitempty"`
|
DevID uint64 `url:"devId,omitempty" json:"devId,omitempty"`
|
||||||
|
|||||||
@@ -18,11 +18,6 @@ type MigrateRequest struct {
|
|||||||
// Particular Node ID to migrate this compute to
|
// Particular Node ID to migrate this compute to
|
||||||
// Required: false
|
// Required: false
|
||||||
TargetNodeID uint64 `url:"targetNodeId,omitempty" json:"targetNodeId,omitempty"`
|
TargetNodeID uint64 `url:"targetNodeId,omitempty" json:"targetNodeId,omitempty"`
|
||||||
|
|
||||||
// If live migration fails, destroy compute
|
|
||||||
// on source node and recreate on the target
|
|
||||||
// Required: false
|
|
||||||
Force bool `url:"force,omitempty" json:"force,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type AsyncWrapperMigrateRequest struct {
|
type AsyncWrapperMigrateRequest struct {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package compute
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
@@ -16,20 +16,35 @@ type MigrateStorageInfoRequest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MigrateStorageInfo gets info about last (include ongoing) storage migration
|
// MigrateStorageInfo gets info about last (include ongoing) storage migration
|
||||||
func (c Compute) MigrateStorageInfo(ctx context.Context, req MigrateStorageInfoRequest) (string, error) {
|
func (c Compute) MigrateStorageInfo(ctx context.Context, req MigrateStorageInfoRequest) (*RecordMigrateStorageInfo, error) {
|
||||||
|
res, err := c.MigrateStorageInfoRaw(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info := RecordMigrateStorageInfo{}
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &info)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MigrateStorageInfoRaw gets info about last (include ongoing) storage migration as an array of bytes
|
||||||
|
func (c Compute) MigrateStorageInfoRaw(ctx context.Context, req MigrateStorageInfoRequest) ([]byte, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
url := "/cloudbroker/compute/migrateStorageInfo"
|
url := "/cloudbroker/compute/migrateStorageInfo"
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result := strings.ReplaceAll(string(res), "\"", "")
|
return res, nil
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ type ListACL []ItemACL
|
|||||||
// Main information about snapshot
|
// Main information about snapshot
|
||||||
type ItemSnapshot struct {
|
type ItemSnapshot struct {
|
||||||
// Compute info
|
// Compute info
|
||||||
Compute RecordCompute `json:"compute"`
|
Compute SnapRecordCompute `json:"compute"`
|
||||||
|
|
||||||
// List of disk IDs
|
// List of disk IDs
|
||||||
Disks []uint64 `json:"disks"`
|
Disks []uint64 `json:"disks"`
|
||||||
@@ -148,6 +148,9 @@ type RecordNetAttach struct {
|
|||||||
// Enabled
|
// Enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
|
// Enable default gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// Enable security groups
|
// Enable security groups
|
||||||
EnableSecGroups bool `json:"enable_secgroups"`
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
@@ -367,6 +370,9 @@ type ItemSnapshotDetailed struct {
|
|||||||
// Label
|
// Label
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Pool name
|
||||||
|
PoolName string `json:"poolName"`
|
||||||
|
|
||||||
// Resource ID
|
// Resource ID
|
||||||
ResID string `json:"resId"`
|
ResID string `json:"resId"`
|
||||||
|
|
||||||
@@ -597,6 +603,9 @@ type ItemInterface struct {
|
|||||||
// Enabled
|
// Enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
|
// Enable default gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
// Enable security groups
|
// Enable security groups
|
||||||
EnableSecGroups bool `json:"enable_secgroups"`
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
@@ -642,6 +651,9 @@ type ItemInterface struct {
|
|||||||
// QOS
|
// QOS
|
||||||
QOS QOS `json:"qos"`
|
QOS QOS `json:"qos"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs
|
||||||
|
QoSPolicies []uint64 `json:"qos_policies"`
|
||||||
|
|
||||||
// List of security groups
|
// List of security groups
|
||||||
SecGroups []uint64 `json:"security_groups"`
|
SecGroups []uint64 `json:"security_groups"`
|
||||||
|
|
||||||
@@ -855,6 +867,9 @@ type InfoCompute struct {
|
|||||||
// Registered
|
// Registered
|
||||||
Registered bool `json:"registered"`
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Whether a compute has been resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
// Resource name
|
// Resource name
|
||||||
ResName string `json:"resName"`
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
@@ -912,6 +927,9 @@ type InfoCompute struct {
|
|||||||
// VINS connected
|
// VINS connected
|
||||||
VINSConnected uint64 `json:"vinsConnected"`
|
VINSConnected uint64 `json:"vinsConnected"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
WatchdogAction string `json:"watchdog_action"`
|
||||||
|
|
||||||
// Weight
|
// Weight
|
||||||
Weight uint64 `json:"weight"`
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
@@ -1157,6 +1175,9 @@ type RecordCompute struct {
|
|||||||
// Registered
|
// Registered
|
||||||
Registered bool `json:"registered"`
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Whether a compute has been resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
// Resource name
|
// Resource name
|
||||||
ResName string `json:"resName"`
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
@@ -1209,11 +1230,14 @@ type RecordCompute struct {
|
|||||||
Userdata interface{} `json:"userdata"`
|
Userdata interface{} `json:"userdata"`
|
||||||
|
|
||||||
// List VGPU
|
// List VGPU
|
||||||
VGPUs []VGPUItem `json:"vgpus"`
|
VGPUs []ItemVGPU `json:"vgpus"`
|
||||||
|
|
||||||
// VNC password
|
// VNC password
|
||||||
VNCPassword string `json:"vncPasswd"`
|
VNCPassword string `json:"vncPasswd"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
WatchdogAction string `json:"watchdog_action"`
|
||||||
|
|
||||||
// Weight
|
// Weight
|
||||||
Weight uint64 `json:"weight"`
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
@@ -1224,6 +1248,270 @@ type RecordCompute struct {
|
|||||||
_ uint64 `json:"nodeId"`
|
_ uint64 `json:"nodeId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SnapRecordCompute is RecordCompute but without the SnapSets field
|
||||||
|
type SnapRecordCompute struct {
|
||||||
|
// Account ID
|
||||||
|
AccountID uint64 `json:"accountId"`
|
||||||
|
|
||||||
|
// Account name
|
||||||
|
AccountName string `json:"accountName"`
|
||||||
|
|
||||||
|
// Access Control List
|
||||||
|
ACL []interface{} `json:"acl"`
|
||||||
|
|
||||||
|
// Affinity label
|
||||||
|
AffinityLabel string `json:"affinityLabel"`
|
||||||
|
|
||||||
|
// Affinity rules
|
||||||
|
AffinityRules ListRules `json:"affinityRules"`
|
||||||
|
|
||||||
|
// Affinity weight
|
||||||
|
AffinityWeight uint64 `json:"affinityWeight"`
|
||||||
|
|
||||||
|
// Anti affinity rules
|
||||||
|
AntiAffinityRules ListRules `json:"antiAffinityRules"`
|
||||||
|
|
||||||
|
// Auto start when node restarted
|
||||||
|
AutoStart bool `json:"autoStart"`
|
||||||
|
|
||||||
|
// Architecture
|
||||||
|
Arch string `json:"arch"`
|
||||||
|
|
||||||
|
// Boot image ID
|
||||||
|
BootImageID uint64 `json:"boot_image_id"`
|
||||||
|
|
||||||
|
// Boot order
|
||||||
|
BootOrder []string `json:"bootOrder"`
|
||||||
|
|
||||||
|
// Boot type
|
||||||
|
BootType string `json:"bootType"`
|
||||||
|
|
||||||
|
// Boot disk size
|
||||||
|
BootDiskSize uint64 `json:"bootdiskSize"`
|
||||||
|
|
||||||
|
// CD Image Id
|
||||||
|
CdImageId uint64 `json:"cdImageId"`
|
||||||
|
|
||||||
|
// Chipset
|
||||||
|
Chipset string `json:"chipset"`
|
||||||
|
|
||||||
|
// Clone reference
|
||||||
|
CloneReference uint64 `json:"cloneReference"`
|
||||||
|
|
||||||
|
// Clock
|
||||||
|
Clock string `json:"clock"`
|
||||||
|
|
||||||
|
// List clone IDs
|
||||||
|
Clones []uint64 `json:"clones"`
|
||||||
|
|
||||||
|
// Compute CI ID
|
||||||
|
ComputeCIID uint64 `json:"computeciId"`
|
||||||
|
|
||||||
|
// CPU Pin
|
||||||
|
CPUPin bool `json:"cpupin"`
|
||||||
|
|
||||||
|
// Number of CPU
|
||||||
|
CPUs uint64 `json:"cpus"`
|
||||||
|
|
||||||
|
// Created by
|
||||||
|
CreatedBy string `json:"createdBy"`
|
||||||
|
|
||||||
|
// Created time
|
||||||
|
CreatedTime uint64 `json:"createdTime"`
|
||||||
|
|
||||||
|
// Custom fields
|
||||||
|
CustomFields map[string]interface{} `json:"customFields"`
|
||||||
|
|
||||||
|
// Deleted by
|
||||||
|
DeletedBy string `json:"deletedBy"`
|
||||||
|
|
||||||
|
// Deleted time
|
||||||
|
DeletedTime uint64 `json:"deletedTime"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
|
// Devices
|
||||||
|
Devices interface{} `json:"devices"`
|
||||||
|
|
||||||
|
// List disks
|
||||||
|
Disks ListDisks `json:"disks"`
|
||||||
|
|
||||||
|
// Driver
|
||||||
|
Driver string `json:"driver"`
|
||||||
|
|
||||||
|
// Grid ID
|
||||||
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// HPBacked
|
||||||
|
HPBacked bool `json:"hpBacked"`
|
||||||
|
|
||||||
|
// Hot resize
|
||||||
|
HotResize bool `json:"hotResize"`
|
||||||
|
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// Image ID
|
||||||
|
ImageID uint64 `json:"imageId"`
|
||||||
|
|
||||||
|
// Image name
|
||||||
|
ImageName string `json:"imageName"`
|
||||||
|
|
||||||
|
// List interfaces
|
||||||
|
Interfaces ListInterfaces `json:"interfaces"`
|
||||||
|
|
||||||
|
// Loader meta iso information
|
||||||
|
LoaderMetaIso LoaderMetaIso `json:"loaderMetaIso"`
|
||||||
|
|
||||||
|
// Live migration job ID
|
||||||
|
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
|
||||||
|
|
||||||
|
// Loader type
|
||||||
|
LoaderType string `json:"loaderType"`
|
||||||
|
|
||||||
|
// Lock status
|
||||||
|
LockStatus string `json:"lockStatus"`
|
||||||
|
|
||||||
|
// Manager ID
|
||||||
|
ManagerID uint64 `json:"managerId"`
|
||||||
|
|
||||||
|
// Manager type
|
||||||
|
ManagerType string `json:"managerType"`
|
||||||
|
|
||||||
|
// Migration job
|
||||||
|
MigrationJob uint64 `json:"migrationjob"`
|
||||||
|
|
||||||
|
// Milestones
|
||||||
|
Milestones uint64 `json:"milestones"`
|
||||||
|
|
||||||
|
// Name
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Natable VINS ID
|
||||||
|
NatableVINSID uint64 `json:"natableVinsId"`
|
||||||
|
|
||||||
|
// Natable VINS IP
|
||||||
|
NatableVINSIP string `json:"natableVinsIp"`
|
||||||
|
|
||||||
|
// Natable VINS Name
|
||||||
|
NatableVINSName string `json:"natableVinsName"`
|
||||||
|
|
||||||
|
// Natable VINS network
|
||||||
|
NatableVINSNetwork string `json:"natableVinsNetwork"`
|
||||||
|
|
||||||
|
// Natable VINS network name
|
||||||
|
NatableVINSNetworkName string `json:"natableVinsNetworkName"`
|
||||||
|
|
||||||
|
// Need reboot
|
||||||
|
NeedReboot bool `json:"needReboot"`
|
||||||
|
|
||||||
|
// network interface naming
|
||||||
|
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
|
||||||
|
|
||||||
|
// NumaAffinity
|
||||||
|
NumaAffinity string `json:"numaAffinity"`
|
||||||
|
|
||||||
|
//NumaNodeId
|
||||||
|
NumaNodeId int64 `json:"numaNodeId"`
|
||||||
|
|
||||||
|
// List OS users
|
||||||
|
OSUsers ListOSUsers `json:"osUsers"`
|
||||||
|
|
||||||
|
// Name of OS
|
||||||
|
OSVersion string `json:"os_version"`
|
||||||
|
|
||||||
|
// Pinned to node
|
||||||
|
PinnedToNode int64 `json:"pinnedToNode"`
|
||||||
|
|
||||||
|
// PreferredCPU
|
||||||
|
PreferredCPU []int64 `json:"preferredCpu"`
|
||||||
|
|
||||||
|
// CPU alignment profile
|
||||||
|
CPUAlignmentProfile CPUAlignmentProfile `json:"cpu_alignment_profile"`
|
||||||
|
|
||||||
|
// Qemu_quest
|
||||||
|
QemuQuest QemuQuest `json:"qemu_guest"`
|
||||||
|
|
||||||
|
// ReadOnly indicates read-only mode state
|
||||||
|
ReadOnly bool `json:"read_only"`
|
||||||
|
|
||||||
|
// Number of RAM
|
||||||
|
RAM uint64 `json:"ram"`
|
||||||
|
|
||||||
|
// Reference ID
|
||||||
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
|
// Registered
|
||||||
|
Registered bool `json:"registered"`
|
||||||
|
|
||||||
|
// Whether a compute has been resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
|
// Resource name
|
||||||
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
|
// Reserved Node Cpus
|
||||||
|
ReservedNodeCpus []uint64 `json:"reservedNodeCpus"`
|
||||||
|
|
||||||
|
// Resource group ID
|
||||||
|
RGID uint64 `json:"rgId"`
|
||||||
|
|
||||||
|
// Resource group name
|
||||||
|
RGName string `json:"rgName"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"node_id"`
|
||||||
|
|
||||||
|
// Node name
|
||||||
|
NodeName string `json:"nodeName"`
|
||||||
|
|
||||||
|
// Stateless SEP ID
|
||||||
|
StatelessSEPID int64 `json:"statelessSepId"`
|
||||||
|
|
||||||
|
// Stateless SEP Type
|
||||||
|
StatelessSEPType string `json:"statelessSepType"`
|
||||||
|
|
||||||
|
// Status
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
Tags map[string]interface{} `json:"tags"`
|
||||||
|
|
||||||
|
// Tech status
|
||||||
|
TechStatus string `json:"techStatus"`
|
||||||
|
|
||||||
|
// Total disk size
|
||||||
|
TotalDiskSize uint64 `json:"totalDisksSize"`
|
||||||
|
|
||||||
|
// Updated by
|
||||||
|
UpdatedBy string `json:"updatedBy"`
|
||||||
|
|
||||||
|
// Updated time
|
||||||
|
UpdatedTime uint64 `json:"updatedTime"`
|
||||||
|
|
||||||
|
// User managed
|
||||||
|
UserManaged bool `json:"userManaged"`
|
||||||
|
|
||||||
|
// Userdata
|
||||||
|
Userdata interface{} `json:"userdata"`
|
||||||
|
|
||||||
|
// List VGPU
|
||||||
|
VGPUs []ItemVGPU `json:"vgpus"`
|
||||||
|
|
||||||
|
// VNC password
|
||||||
|
VNCPassword string `json:"vncPasswd"`
|
||||||
|
|
||||||
|
// Weight
|
||||||
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
|
}
|
||||||
|
|
||||||
type LoaderMetaIso struct {
|
type LoaderMetaIso struct {
|
||||||
// Name
|
// Name
|
||||||
DeviceName string `json:"devicename"`
|
DeviceName string `json:"devicename"`
|
||||||
@@ -1232,65 +1520,6 @@ type LoaderMetaIso struct {
|
|||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
}
|
}
|
||||||
|
|
||||||
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 of disk IDs
|
// Information about of disk IDs
|
||||||
type ListInfoDisks []InfoDisk
|
type ListInfoDisks []InfoDisk
|
||||||
|
|
||||||
@@ -1335,6 +1564,9 @@ type InfoDisk struct {
|
|||||||
// SEP ID
|
// SEP ID
|
||||||
SepID int64 `json:"sepId"`
|
SepID int64 `json:"sepId"`
|
||||||
|
|
||||||
|
// Image ID
|
||||||
|
ImageID uint64 `json:"imageId"`
|
||||||
|
|
||||||
// Read-only
|
// Read-only
|
||||||
ReadOnly bool `json:"read_only"`
|
ReadOnly bool `json:"read_only"`
|
||||||
}
|
}
|
||||||
@@ -1395,8 +1627,8 @@ type ItemPCIDevice struct {
|
|||||||
// Name
|
// Name
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
||||||
// Resource group ID
|
// Account IDs
|
||||||
RGID uint64 `json:"rgId"`
|
AccountIDs []uint64 `json:"account_ids"`
|
||||||
|
|
||||||
// Node ID
|
// Node ID
|
||||||
NodeID uint64 `json:"nodeId"`
|
NodeID uint64 `json:"nodeId"`
|
||||||
@@ -1428,59 +1660,56 @@ type ListVGPUs struct {
|
|||||||
|
|
||||||
// Main information about vgpu device
|
// Main information about vgpu device
|
||||||
type ItemVGPU struct {
|
type ItemVGPU struct {
|
||||||
// Account ID
|
// Account IDs
|
||||||
AccountID uint64 `json:"accountId"`
|
AccountIDs []uint64 `json:"account_ids"`
|
||||||
|
|
||||||
// Created Time
|
// Bus number
|
||||||
CreatedTime uint64 `json:"createdTime"`
|
BusNumber int `json:"bus_number"`
|
||||||
|
|
||||||
// Deleted Time
|
// ComputeID
|
||||||
DeletedTime uint64 `json:"deletedTime"`
|
ComputeID uint64 `json:"compute_id"`
|
||||||
|
|
||||||
// GID
|
// Created time
|
||||||
|
CreatedTime uint64 `json:"created_time"`
|
||||||
|
|
||||||
|
// Deleted time
|
||||||
|
DeletedTime uint64 `json:"deleted_time"`
|
||||||
|
|
||||||
|
// Device Reference
|
||||||
|
DeviceReference string `json:"device_reference"`
|
||||||
|
|
||||||
|
//Grid ID
|
||||||
GID uint64 `json:"gid"`
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
// GUID
|
// GUID
|
||||||
GUID uint64 `json:"guid"`
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
// ID
|
// VGPU ID
|
||||||
ID uint64 `json:"id"`
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
// Last Claimed By
|
// Last Update time
|
||||||
LastClaimedBy uint64 `json:"lastClaimedBy"`
|
LastUpdateTime uint64 `json:"last_update_time"`
|
||||||
|
|
||||||
// Last Update Time
|
// Mdev UUID
|
||||||
LastUpdateTime uint64 `json:"lastUpdateTime"`
|
MdevUUID string `json:"mdev_uuid"`
|
||||||
|
|
||||||
// Mode
|
// Parent PCI Address
|
||||||
Mode string `json:"mode"`
|
ParentPCIAddress string `json:"parent_pci_address"`
|
||||||
|
|
||||||
// PCI Slot
|
// PCI Slot
|
||||||
PCISlot uint64 `json:"pciSlot"`
|
PCISlot uint64 `json:"pci_slot"`
|
||||||
|
|
||||||
// PGPUID
|
// PGPU ID
|
||||||
PGPUID uint64 `json:"pgpuid"`
|
PGPUID uint64 `json:"pgpu_id"`
|
||||||
|
|
||||||
// Profile ID
|
// Profile Reference
|
||||||
ProfileID uint64 `json:"profileId"`
|
ProfileReference string `json:"profile_reference"`
|
||||||
|
|
||||||
// RAM
|
// Split Mode
|
||||||
RAM uint64 `json:"ram"`
|
SplitMode string `json:"split_mode"`
|
||||||
|
|
||||||
// Reference ID
|
|
||||||
ReferenceID string `json:"referenceId"`
|
|
||||||
|
|
||||||
// RG ID
|
|
||||||
RGID uint64 `json:"rgId"`
|
|
||||||
|
|
||||||
// Status
|
// Status
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
|
||||||
// Type
|
|
||||||
Type string `json:"type"`
|
|
||||||
|
|
||||||
// VM ID
|
|
||||||
VMID uint64 `json:"vmid"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ListMigrateStorage struct {
|
type ListMigrateStorage struct {
|
||||||
@@ -1511,6 +1740,420 @@ type MigrateStorageItem struct {
|
|||||||
TargetNodeID uint64 `json:"targetNodeId"`
|
TargetNodeID uint64 `json:"targetNodeId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Info about last (including ongoing) storage migration
|
||||||
|
type RecordMigrateStorageInfo struct {
|
||||||
|
// Migration completion status
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
|
||||||
|
// CPU set
|
||||||
|
CPUSet string `json:"cpu_set"`
|
||||||
|
|
||||||
|
// Daemon address
|
||||||
|
DaemonAddr string `json:"daemonAddr"`
|
||||||
|
|
||||||
|
// Domain name
|
||||||
|
DomainName string `json:"domainName"`
|
||||||
|
|
||||||
|
// Domain UUID
|
||||||
|
DomainUUID string `json:"domainUUID"`
|
||||||
|
|
||||||
|
// Elapsed time
|
||||||
|
ElapsedTime uint64 `json:"elapsedTime"`
|
||||||
|
|
||||||
|
// GID
|
||||||
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// List interfaces
|
||||||
|
Interfaces []ItemShadowComputeInterface `json:"interfaces"`
|
||||||
|
|
||||||
|
// Log
|
||||||
|
Log []string `json:"log"`
|
||||||
|
|
||||||
|
// New disk XMLs
|
||||||
|
NewDiskXmls []string `json:"newDiskXmls"`
|
||||||
|
|
||||||
|
// New disks
|
||||||
|
NewDisks []uint64 `json:"newDisks"`
|
||||||
|
|
||||||
|
// Old disks
|
||||||
|
OldDisks []uint64 `json:"oldDisks"`
|
||||||
|
|
||||||
|
// PID
|
||||||
|
PID uint64 `json:"pid"`
|
||||||
|
|
||||||
|
// Source node ID
|
||||||
|
SourceNodeID uint64 `json:"sourceNodeId"`
|
||||||
|
|
||||||
|
// Source numa node ID
|
||||||
|
SourceNumaNodeID int64 `json:"sourceNumaNodeId"`
|
||||||
|
|
||||||
|
// Source reserved node CPUs
|
||||||
|
SourceReservedNodeCpus []uint64 `json:"sourceReservedNodeCpus"`
|
||||||
|
|
||||||
|
// Source URL
|
||||||
|
SourceURL string `json:"sourceURL"`
|
||||||
|
|
||||||
|
// Status
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Target shadow compute
|
||||||
|
TargetShadowCompute ShadowCompute `json:"target_shadow_compute"`
|
||||||
|
|
||||||
|
// Target node ID
|
||||||
|
TargetNodeID uint64 `json:"targetNodeId"`
|
||||||
|
|
||||||
|
// Target URL
|
||||||
|
TargetURL string `json:"targetURL"`
|
||||||
|
|
||||||
|
// VM log directory
|
||||||
|
VMLogDir string `json:"vmlogDir"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shadow compute created for the duration of a storage migration
|
||||||
|
type ShadowCompute struct {
|
||||||
|
// Account ID
|
||||||
|
AccountID uint64 `json:"accountId"`
|
||||||
|
|
||||||
|
// Access Control List
|
||||||
|
ACL []interface{} `json:"acl"`
|
||||||
|
|
||||||
|
// Affinity label
|
||||||
|
AffinityLabel string `json:"affinityLabel"`
|
||||||
|
|
||||||
|
// Affinity rules
|
||||||
|
AffinityRules ListShadowComputeRules `json:"affinityRules"`
|
||||||
|
|
||||||
|
// Affinity weight
|
||||||
|
AffinityWeight uint64 `json:"affinityWeight"`
|
||||||
|
|
||||||
|
// Anti affinity rules
|
||||||
|
AntiAffinityRules ListShadowComputeRules `json:"antiAffinityRules"`
|
||||||
|
|
||||||
|
// Architecture
|
||||||
|
Arch string `json:"arch"`
|
||||||
|
|
||||||
|
// Auto start when node restarted
|
||||||
|
AutoStart bool `json:"autoStart"`
|
||||||
|
|
||||||
|
// Boot image ID
|
||||||
|
BootImageID uint64 `json:"boot_image_id"`
|
||||||
|
|
||||||
|
// Boot order
|
||||||
|
BootOrder []string `json:"bootOrder"`
|
||||||
|
|
||||||
|
// Boot type
|
||||||
|
BootType string `json:"bootType"`
|
||||||
|
|
||||||
|
// Boot disk size
|
||||||
|
BootDiskSize uint64 `json:"bootdiskSize"`
|
||||||
|
|
||||||
|
// CD Image ID
|
||||||
|
CDImageID uint64 `json:"cdImageId"`
|
||||||
|
|
||||||
|
// Chipset
|
||||||
|
Chipset string `json:"chipset"`
|
||||||
|
|
||||||
|
// Clock
|
||||||
|
Clock string `json:"clock"`
|
||||||
|
|
||||||
|
// Clone reference
|
||||||
|
CloneReference uint64 `json:"cloneReference"`
|
||||||
|
|
||||||
|
// List clone IDs
|
||||||
|
Clones []uint64 `json:"clones"`
|
||||||
|
|
||||||
|
// Compute CI ID
|
||||||
|
ComputeCIID uint64 `json:"computeciId"`
|
||||||
|
|
||||||
|
// CPU alignment profile
|
||||||
|
CPUAlignmentProfile CPUAlignmentProfile `json:"cpu_alignment_profile"`
|
||||||
|
|
||||||
|
// CPU pin
|
||||||
|
CPUPin bool `json:"cpupin"`
|
||||||
|
|
||||||
|
// Number of CPU
|
||||||
|
CPUs uint64 `json:"cpus"`
|
||||||
|
|
||||||
|
// Custom fields
|
||||||
|
CustomFields map[string]interface{} `json:"customFields"`
|
||||||
|
|
||||||
|
// Description
|
||||||
|
Description string `json:"desc"`
|
||||||
|
|
||||||
|
// Devices
|
||||||
|
Devices interface{} `json:"devices"`
|
||||||
|
|
||||||
|
// List disks
|
||||||
|
Disks []ItemShadowComputeDisk `json:"disks"`
|
||||||
|
|
||||||
|
// Driver
|
||||||
|
Driver string `json:"driver"`
|
||||||
|
|
||||||
|
// GID
|
||||||
|
GID uint64 `json:"gid"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID uint64 `json:"guid"`
|
||||||
|
|
||||||
|
// HPBacked
|
||||||
|
HPBacked bool `json:"hpBacked"`
|
||||||
|
|
||||||
|
// Hot resize
|
||||||
|
HotResize bool `json:"hotResize"`
|
||||||
|
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// List interfaces
|
||||||
|
Interfaces []ItemShadowComputeInterface `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"`
|
||||||
|
|
||||||
|
// Manager ID
|
||||||
|
ManagerID uint64 `json:"managerId"`
|
||||||
|
|
||||||
|
// Manager type
|
||||||
|
ManagerType string `json:"managerType"`
|
||||||
|
|
||||||
|
// Migration job
|
||||||
|
MigrationJob uint64 `json:"migrationjob"`
|
||||||
|
|
||||||
|
// Milestones
|
||||||
|
Milestones uint64 `json:"milestones"`
|
||||||
|
|
||||||
|
// Name
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Need reboot
|
||||||
|
NeedReboot bool `json:"needReboot"`
|
||||||
|
|
||||||
|
// Network interface naming
|
||||||
|
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"node_id"`
|
||||||
|
|
||||||
|
// NumaAffinity
|
||||||
|
NumaAffinity string `json:"numaAffinity"`
|
||||||
|
|
||||||
|
// NumaNodeId
|
||||||
|
NumaNodeID int64 `json:"numaNodeId"`
|
||||||
|
|
||||||
|
// List OS users
|
||||||
|
OSUsers ListOSUsers `json:"osUsers"`
|
||||||
|
|
||||||
|
// Name of OS
|
||||||
|
OSVersion string `json:"os_version"`
|
||||||
|
|
||||||
|
// Pinned to node
|
||||||
|
PinnedToNode int64 `json:"pinnedToNode"`
|
||||||
|
|
||||||
|
// Preferred CPU
|
||||||
|
PreferredCPU []int64 `json:"preferredCpu"`
|
||||||
|
|
||||||
|
// Qemu guest
|
||||||
|
QemuGuest QemuQuest `json:"qemu_guest"`
|
||||||
|
|
||||||
|
// ReadOnly indicates read-only mode state
|
||||||
|
ReadOnly bool `json:"read_only"`
|
||||||
|
|
||||||
|
// Number of RAM
|
||||||
|
RAM uint64 `json:"ram"`
|
||||||
|
|
||||||
|
// Reference ID
|
||||||
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
|
// Reserved node CPUs
|
||||||
|
ReservedNodeCpus []uint64 `json:"reservedNodeCpus"`
|
||||||
|
|
||||||
|
// Resized online
|
||||||
|
ResizedOnline bool `json:"resizedOnline"`
|
||||||
|
|
||||||
|
// Resource name
|
||||||
|
ResName string `json:"resName"`
|
||||||
|
|
||||||
|
// Resource group ID
|
||||||
|
RGID uint64 `json:"rgId"`
|
||||||
|
|
||||||
|
// SnapSets
|
||||||
|
SnapSets ListShadowComputeSnapshots `json:"snapSets"`
|
||||||
|
|
||||||
|
// Stateless SEP ID
|
||||||
|
StatelessSEPID int64 `json:"statelessSepId"`
|
||||||
|
|
||||||
|
// Stateless SEP type
|
||||||
|
StatelessSEPType string `json:"statelessSepType"`
|
||||||
|
|
||||||
|
// Status
|
||||||
|
Status string `json:"status"`
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
Tags map[string]interface{} `json:"tags"`
|
||||||
|
|
||||||
|
// Tech status
|
||||||
|
TechStatus string `json:"techStatus"`
|
||||||
|
|
||||||
|
// User managed
|
||||||
|
UserManaged bool `json:"userManaged"`
|
||||||
|
|
||||||
|
// Userdata
|
||||||
|
Userdata interface{} `json:"userdata"`
|
||||||
|
|
||||||
|
// List VGPU IDs
|
||||||
|
VGPUs []uint64 `json:"vgpus"`
|
||||||
|
|
||||||
|
// VNC password
|
||||||
|
VNCPassword string `json:"vncPasswd"`
|
||||||
|
|
||||||
|
// Weight
|
||||||
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disk of a shadow compute
|
||||||
|
type ItemShadowComputeDisk struct {
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affinity/anti-affinity rule of a shadow compute
|
||||||
|
type ItemShadowComputeRule struct {
|
||||||
|
// Key
|
||||||
|
Key string `json:"key"`
|
||||||
|
|
||||||
|
// Mode
|
||||||
|
Mode string `json:"mode"`
|
||||||
|
|
||||||
|
// Policy
|
||||||
|
Policy string `json:"policy"`
|
||||||
|
|
||||||
|
// Topology
|
||||||
|
Topology string `json:"topology"`
|
||||||
|
|
||||||
|
// Value
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// List of shadow compute affinity/anti-affinity rules
|
||||||
|
type ListShadowComputeRules []ItemShadowComputeRule
|
||||||
|
|
||||||
|
// Snapshot of a shadow compute
|
||||||
|
type ItemShadowComputeSnapshot struct {
|
||||||
|
// List of disk IDs
|
||||||
|
Disks []uint64 `json:"disks"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID string `json:"guid"`
|
||||||
|
|
||||||
|
// Label
|
||||||
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Timestamp
|
||||||
|
Timestamp uint64 `json:"timestamp"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// List of shadow compute snapshots
|
||||||
|
type ListShadowComputeSnapshots []ItemShadowComputeSnapshot
|
||||||
|
|
||||||
|
// Network interface of a shadow compute
|
||||||
|
type ItemShadowComputeInterface struct {
|
||||||
|
// Name
|
||||||
|
Name string `json:"name"`
|
||||||
|
|
||||||
|
// Target
|
||||||
|
Target string `json:"target"`
|
||||||
|
|
||||||
|
// PCI slot
|
||||||
|
PCISlot int64 `json:"pciSlot"`
|
||||||
|
|
||||||
|
// Bus number
|
||||||
|
BusNumber int64 `json:"bus_number"`
|
||||||
|
|
||||||
|
// MAC
|
||||||
|
MAC string `json:"mac"`
|
||||||
|
|
||||||
|
// Maximum transmission unit
|
||||||
|
MTU int64 `json:"mtu"`
|
||||||
|
|
||||||
|
// Type
|
||||||
|
Type string `json:"type"`
|
||||||
|
|
||||||
|
// Connection type
|
||||||
|
ConnType string `json:"connType"`
|
||||||
|
|
||||||
|
// Connection ID
|
||||||
|
ConnID uint64 `json:"connId"`
|
||||||
|
|
||||||
|
// FLIPGroup ID
|
||||||
|
FLIPGroupID uint64 `json:"flipgroupId"`
|
||||||
|
|
||||||
|
// Network type
|
||||||
|
NetType string `json:"netType"`
|
||||||
|
|
||||||
|
// Network ID
|
||||||
|
NetID uint64 `json:"netId"`
|
||||||
|
|
||||||
|
// IP address
|
||||||
|
IPAddress string `json:"ipAddress"`
|
||||||
|
|
||||||
|
// Network mask
|
||||||
|
NetMask int64 `json:"netMask"`
|
||||||
|
|
||||||
|
// Default GW
|
||||||
|
DefGW string `json:"defGw"`
|
||||||
|
|
||||||
|
// List of VNF IDs
|
||||||
|
VNFs []uint64 `json:"vnfs"`
|
||||||
|
|
||||||
|
// QOS
|
||||||
|
QOS QOS `json:"qos"`
|
||||||
|
|
||||||
|
// Libvirt settings
|
||||||
|
LibvirtSettings LibvirtSettings `json:"libvirtSettings"`
|
||||||
|
|
||||||
|
// GUID
|
||||||
|
GUID string `json:"guid"`
|
||||||
|
|
||||||
|
// Listen SSH or not
|
||||||
|
ListenSSH bool `json:"listenSsh"`
|
||||||
|
|
||||||
|
// Enabled
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
|
// Enable default gateway
|
||||||
|
EnableDefaultGateway bool `json:"enable_default_gateway"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"nodeId"`
|
||||||
|
|
||||||
|
// SDN interface ID
|
||||||
|
SDNInterfaceID string `json:"sdn_interface_id"`
|
||||||
|
|
||||||
|
// List of security groups
|
||||||
|
SecGroups []uint64 `json:"security_groups"`
|
||||||
|
|
||||||
|
// Enable security groups
|
||||||
|
EnableSecGroups bool `json:"enable_secgroups"`
|
||||||
|
|
||||||
|
// Trunk tags
|
||||||
|
TrunkTags []int64 `json:"trunk_tags"`
|
||||||
|
}
|
||||||
|
|
||||||
type RecordCloneAbort struct {
|
type RecordCloneAbort struct {
|
||||||
// Disk ID
|
// Disk ID
|
||||||
DiskID uint64 `json:"disk_id"`
|
DiskID uint64 `json:"disk_id"`
|
||||||
|
|||||||
@@ -81,6 +81,15 @@ type NetAttachRequest struct {
|
|||||||
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
|
||||||
// Required: false
|
// Required: false
|
||||||
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway is enabled for this interface
|
||||||
|
// Required: false
|
||||||
|
// Default: true
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to apply to this interface (default: []), Allow used only with netType VINS, EXTNET and DPDK
|
||||||
|
// Required: false
|
||||||
|
QoSPolicies []uint64 `url:"qos_policies,omitempty" json:"qos_policies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperNetAttachRequest struct {
|
type wrapperNetAttachRequest struct {
|
||||||
|
|||||||
@@ -12,15 +12,19 @@ import (
|
|||||||
// Must be provided if NewVMUUID is provided.
|
// Must be provided if NewVMUUID is provided.
|
||||||
type OSUser struct {
|
type OSUser struct {
|
||||||
// Login of a user
|
// Login of a user
|
||||||
Login string `url:"login,omitempty" json:"login,omitempty"`
|
// Required: true
|
||||||
|
Login string `url:"login" json:"login" validate:"required"`
|
||||||
|
|
||||||
// Password of a user
|
// Password of a user
|
||||||
Password string `url:"password,omitempty" json:"password,omitempty"`
|
// Required: true
|
||||||
|
Password string `url:"password" json:"password" validate:"required"`
|
||||||
|
|
||||||
// GUID
|
// GUID
|
||||||
|
// Required: false
|
||||||
GUID string `url:"guid,omitempty" json:"guid,omitempty"`
|
GUID string `url:"guid,omitempty" json:"guid,omitempty"`
|
||||||
|
|
||||||
// Pubkey
|
// Pubkey
|
||||||
|
// Required: false
|
||||||
Pubkey string `url:"pubkey,omitempty" json:"pubkey,omitempty"`
|
Pubkey string `url:"pubkey,omitempty" json:"pubkey,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +40,7 @@ type StopMigrationINRequest struct {
|
|||||||
|
|
||||||
// OS user data for Guest OS
|
// OS user data for Guest OS
|
||||||
// Required: false
|
// Required: false
|
||||||
OSUsers []OSUser `url:"os_users,omitempty" json:"os_users,omitempty"`
|
OSUsers []OSUser `url:"os_users,omitempty" json:"os_users,omitempty" validate:"omitempty,dive"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// StopMigrationIN stops compute for external migration in
|
// StopMigrationIN stops compute for external migration in
|
||||||
|
|||||||
@@ -78,6 +78,11 @@ type UpdateRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: null
|
// Default: null
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update updates some properties of the compute
|
// Update updates some properties of the compute
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ type CreateRequest struct {
|
|||||||
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
|
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type wrapperCreateRequest struct {
|
||||||
|
CreateRequest
|
||||||
|
|
||||||
|
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||||
|
}
|
||||||
|
|
||||||
// Create creates a disk
|
// Create creates a disk
|
||||||
func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
@@ -56,7 +62,12 @@ func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
|
|
||||||
url := "/cloudbroker/disks/create"
|
url := "/cloudbroker/disks/create"
|
||||||
|
|
||||||
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
wrappedReq := wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@@ -68,3 +79,25 @@ func (d Disks) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create creates a disk in async mode
|
||||||
|
func (d Disks) CreateAsync(ctx context.Context, req CreateRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/disks/create"
|
||||||
|
|
||||||
|
wrappedReq := wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(res), nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ type ListRequest struct {
|
|||||||
|
|
||||||
// Find by status
|
// Find by status
|
||||||
// Required: false
|
// Required: false
|
||||||
Status string `url:"status,omitempty" json:"status,omitempty"`
|
Status []string `url:"status,omitempty" json:"status,omitempty"`
|
||||||
|
|
||||||
// Find by shared, true or false
|
// Find by shared, true or false
|
||||||
// Required: false
|
// Required: false
|
||||||
|
|||||||
@@ -26,16 +26,51 @@ type MigrateRequest struct {
|
|||||||
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
|
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move moves disk to another sep, pool and storage policy
|
type wrapperMigrateRequest struct {
|
||||||
|
MigrateRequest
|
||||||
|
|
||||||
|
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move moves disk to another sep, pool and storage policy in sync mode
|
||||||
func (c Disks) Migrate(ctx context.Context, req MigrateRequest) (string, error) {
|
func (c Disks) Migrate(ctx context.Context, req MigrateRequest) (string, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wrappedReq := wrapperMigrateRequest{
|
||||||
|
MigrateRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
}
|
||||||
|
|
||||||
url := "/cloudbroker/disks/migrate"
|
url := "/cloudbroker/disks/migrate"
|
||||||
|
|
||||||
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
result := string(res)
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move moves disk to another sep, pool and storage policy in async mode
|
||||||
|
func (c Disks) MigrateAsync(ctx context.Context, req MigrateRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
wrappedReq := wrapperMigrateRequest{
|
||||||
|
MigrateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/disks/migrate"
|
||||||
|
|
||||||
|
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -309,6 +309,9 @@ type ItemSnapshot struct {
|
|||||||
// Label
|
// Label
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
|
|
||||||
|
// Pool name
|
||||||
|
PoolName string `json:"poolName"`
|
||||||
|
|
||||||
// Reference ID
|
// Reference ID
|
||||||
ReferenceID string `json:"referenceId"`
|
ReferenceID string `json:"referenceId"`
|
||||||
|
|
||||||
@@ -343,4 +346,7 @@ type MigrateStatus struct {
|
|||||||
|
|
||||||
// Progress percent
|
// Progress percent
|
||||||
ProgressPercent int `json:"progress_percent"`
|
ProgressPercent int `json:"progress_percent"`
|
||||||
|
|
||||||
|
// Operation status
|
||||||
|
Ready bool `json:"ready"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
package grid
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ExecuteMaintenanceScriptRequest struct to execute script
|
|
||||||
type ExecuteMaintenanceScriptRequest struct {
|
|
||||||
// Grid (platform) ID
|
|
||||||
// Required: true
|
|
||||||
GID uint64 `url:"gid" json:"gid" validate:"required"`
|
|
||||||
|
|
||||||
// Type of nodes you want to apply the action on
|
|
||||||
// Required: true
|
|
||||||
NodesType string `url:"nodestype" json:"nodestype" validate:"required"`
|
|
||||||
|
|
||||||
// The script you want to run
|
|
||||||
// Required: true
|
|
||||||
Script string `url:"script" json:"script" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExecuteMaintenanceScript executes maintenance script
|
|
||||||
func (g Grid) ExecuteMaintenanceScript(ctx context.Context, req ExecuteMaintenanceScriptRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/grid/executeMaintenanceScript"
|
|
||||||
|
|
||||||
res, err := g.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
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package grid
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListEmailsRequest struct for getting list of email addresses of users
|
|
||||||
type ListEmailsRequest 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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEmails returns list of email addresses of users
|
|
||||||
func (g Grid) ListEmails(ctx context.Context, req ListEmailsRequest) (*ListEmails, error) {
|
|
||||||
url := "/cloudbroker/grid/listEmails"
|
|
||||||
|
|
||||||
res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list := ListEmails{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &list)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &list, nil
|
|
||||||
}
|
|
||||||
@@ -100,6 +100,12 @@ type RecordGrid struct {
|
|||||||
// Network modes
|
// Network modes
|
||||||
NetworkModes []string `json:"network_modes"`
|
NetworkModes []string `json:"network_modes"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
// SDN support
|
// SDN support
|
||||||
SDNSupport bool `json:"sdn_support"`
|
SDNSupport bool `json:"sdn_support"`
|
||||||
|
|
||||||
@@ -139,6 +145,12 @@ type ItemGridList struct {
|
|||||||
// Network modes
|
// Network modes
|
||||||
NetworkModes []string `json:"network_modes"`
|
NetworkModes []string `json:"network_modes"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
// SDN support
|
// SDN support
|
||||||
SDNSupport bool `json:"sdn_support"`
|
SDNSupport bool `json:"sdn_support"`
|
||||||
|
|
||||||
@@ -175,15 +187,6 @@ type RecordSettingsGrid struct {
|
|||||||
//Cleanup retention period
|
//Cleanup retention period
|
||||||
CleanupRetentionPeriod uint64 `json:"cleanupRetentionPeriod"`
|
CleanupRetentionPeriod uint64 `json:"cleanupRetentionPeriod"`
|
||||||
|
|
||||||
// CPU allocation ratio
|
|
||||||
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
|
|
||||||
|
|
||||||
// CPU allocation ratio for VMs
|
|
||||||
CPUAllocationRatioVM uint64 `json:"cpu_allocation_ratio_vm"`
|
|
||||||
|
|
||||||
// Custom backup path
|
|
||||||
CustomBackupPath []string `json:"custom_backup_path"`
|
|
||||||
|
|
||||||
//Docker registry
|
//Docker registry
|
||||||
DockerRegistry DockerRegistry `json:"docker_registry"`
|
DockerRegistry DockerRegistry `json:"docker_registry"`
|
||||||
|
|
||||||
@@ -214,9 +217,6 @@ type RecordSettingsGrid struct {
|
|||||||
//Net QOS
|
//Net QOS
|
||||||
NetQOS NetQOS `json:"net_qos"`
|
NetQOS NetQOS `json:"net_qos"`
|
||||||
|
|
||||||
//Networks
|
|
||||||
Networks string `json:"networks"`
|
|
||||||
|
|
||||||
// Node self stop timer uptime monitor
|
// Node self stop timer uptime monitor
|
||||||
NodeSelfStopTimerUptimeMonitor uint64 `json:"nodeSelfStopTimerUptimeMonitor"`
|
NodeSelfStopTimerUptimeMonitor uint64 `json:"nodeSelfStopTimerUptimeMonitor"`
|
||||||
|
|
||||||
@@ -226,6 +226,12 @@ type RecordSettingsGrid struct {
|
|||||||
//Prometheus
|
//Prometheus
|
||||||
Prometheus Prometheus `json:"prometheus"`
|
Prometheus Prometheus `json:"prometheus"`
|
||||||
|
|
||||||
|
//Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
//Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
//Vins max prereservation num
|
//Vins max prereservation num
|
||||||
VinsMaxPreReservationsNum int `json:"vinsMaxPreReservationsNum"`
|
VinsMaxPreReservationsNum int `json:"vinsMaxPreReservationsNum"`
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
package grid
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ServicesRestartRequest struct to restart services
|
|
||||||
type ServicesRestartRequest struct {
|
|
||||||
// Grid (platform) ID
|
|
||||||
// Required: true
|
|
||||||
GID uint64 `url:"gid" json:"gid" validate:"required"`
|
|
||||||
|
|
||||||
// Node ID
|
|
||||||
// Required: true
|
|
||||||
NID uint64 `url:"nid" json:"nid" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServicesRestart restarts decort services on the node
|
|
||||||
func (g Grid) ServicesRestart(ctx context.Context, req ServicesRestartRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/grid/servicesRestart"
|
|
||||||
|
|
||||||
res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
44
pkg/cloudbroker/grid/set_resources_limit.go
Normal file
44
pkg/cloudbroker/grid/set_resources_limit.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package grid
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SetResourcesLimitRequest struct to set resources limit
|
||||||
|
type SetResourcesLimitRequest struct {
|
||||||
|
// ID of the grid
|
||||||
|
// Required: true
|
||||||
|
GID uint64 `url:"grid_id" json:"grid_id" validate:"required"`
|
||||||
|
|
||||||
|
// Number of CPU cores reserved
|
||||||
|
// Default: 0
|
||||||
|
// Required: true
|
||||||
|
ReservedCPU uint64 `url:"reserved_cpu" json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Amount of RAM in MB reserved
|
||||||
|
// Default: 0
|
||||||
|
// Required: true
|
||||||
|
ReservedRAM uint64 `url:"reserved_ram" json:"reserved_ram"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetResourcesLimit sets reserved CPU and RAM limits for the grid
|
||||||
|
func (g Grid) SetResourcesLimit(ctx context.Context, req SetResourcesLimitRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/grid/set_resources_limit"
|
||||||
|
|
||||||
|
res, err := g.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseBool(string(res))
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package group
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetRequest struct to get details of the specified group.
|
|
||||||
type GetRequest struct {
|
|
||||||
// Group ID
|
|
||||||
// Required: true
|
|
||||||
GroupID string `url:"groupId" json:"groupId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get gets details of the specified group as an ItemGroup struct
|
|
||||||
func (g Group) Get(ctx context.Context, req GetRequest) (*ItemGroup, error) {
|
|
||||||
res, err := g.GetRaw(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
info := ItemGroup{}
|
|
||||||
|
|
||||||
err = json.Unmarshal(res, &info)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &info, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRaw gets details of the specified group as an array of bytes
|
|
||||||
func (g Group) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/group/get"
|
|
||||||
|
|
||||||
res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
package image
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ComputeCISetRequest struct to set compute CI
|
|
||||||
type ComputeCISetRequest struct {
|
|
||||||
// ID of the image
|
|
||||||
// Required: true
|
|
||||||
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
|
|
||||||
|
|
||||||
// ID of the compute CI
|
|
||||||
// Required: true
|
|
||||||
ComputeCIID uint64 `url:"computeciId" json:"computeciId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComputeCISet sets compute CI ID for image
|
|
||||||
func (i Image) ComputeCISet(ctx context.Context, req ComputeCISetRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/image/computeciSet"
|
|
||||||
|
|
||||||
res, err := i.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
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package image
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ComputeCIUnsetRequest struct to unset compute CI
|
|
||||||
type ComputeCIUnsetRequest struct {
|
|
||||||
// ID of the image
|
|
||||||
// Required: true
|
|
||||||
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComputeCIUnset unsets compute CI ID from image
|
|
||||||
func (i Image) ComputeCIUnset(ctx context.Context, req ComputeCIUnsetRequest) (bool, error) {
|
|
||||||
err := validators.ValidateRequest(req)
|
|
||||||
if err != nil {
|
|
||||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/image/computeciUnset"
|
|
||||||
|
|
||||||
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := strconv.ParseBool(string(res))
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -102,6 +103,6 @@ func (i Image) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
|||||||
|
|
||||||
url := "/cloudbroker/image/list"
|
url := "/cloudbroker/image/list"
|
||||||
|
|
||||||
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
res, err := i.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ type CreateRequest struct {
|
|||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format YAML "user_data": 1111
|
||||||
// Required: false
|
// Required: false
|
||||||
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
|
UserData interface{} `url:"userData,omitempty" json:"userData,omitempty"`
|
||||||
|
|
||||||
// Use only selected ExtNet for infrastructure connections
|
// Use only selected ExtNet for infrastructure connections
|
||||||
// Required: false
|
// Required: false
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type UpdateWorkerNodesMetaDataRequest struct {
|
|||||||
|
|
||||||
// Meta data for working group computes, format YAML "user_data": 1111
|
// Meta data for working group computes, format YAML "user_data": 1111
|
||||||
// Required: true
|
// Required: true
|
||||||
UserData string `url:"userData" json:"userData" validate:"required"`
|
UserData interface{} `url:"userData" json:"userData" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateWorkerNodesMetaData adds worker nodes to a kubernetes cluster
|
// UpdateWorkerNodesMetaData adds worker nodes to a kubernetes cluster
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -59,6 +60,11 @@ type Interface struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway are enabled for this interface, not applicable to netType EXTNET, VFNIC, TRUNK, or SDN
|
||||||
|
// Default: true
|
||||||
|
// Required: false
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
// SDN Segment ID
|
// SDN Segment ID
|
||||||
// Required: false
|
// Required: false
|
||||||
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
|
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
|
||||||
@@ -74,6 +80,10 @@ type Interface struct {
|
|||||||
// SDN Logical Port Description
|
// SDN Logical Port Description
|
||||||
// Required: false
|
// Required: false
|
||||||
SDNLogicalPortDescription string `url:"sdn_logical_port_description,omitempty" json:"sdn_logical_port_description,omitempty"`
|
SDNLogicalPortDescription string `url:"sdn_logical_port_description,omitempty" json:"sdn_logical_port_description,omitempty"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to apply to this interface (default: []), Allow used only with netType VINS, EXTNET and DPDK
|
||||||
|
// Required: false
|
||||||
|
QoSPolicies []uint64 `url:"qos_policies,omitempty" json:"qos_policies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataDisk detailed struct for DataDisks field in CreateRequest, CreateBlankRequest and MassCreateRequest
|
// DataDisk detailed struct for DataDisks field in CreateRequest, CreateBlankRequest and MassCreateRequest
|
||||||
@@ -115,6 +125,11 @@ type DataDisk struct {
|
|||||||
// Discard
|
// Discard
|
||||||
// Required: false
|
// Required: false
|
||||||
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
|
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
|
||||||
|
|
||||||
|
// Attach disk in read-only mode
|
||||||
|
// Required: false
|
||||||
|
// Default: false
|
||||||
|
ReadOnly bool `url:"read_only,omitempty" json:"read_only,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateRequest struct to create KVM x86 VM
|
// CreateRequest struct to create KVM x86 VM
|
||||||
@@ -204,12 +219,12 @@ type CreateRequest struct {
|
|||||||
// loose (use NUMA affinity if possible)
|
// loose (use NUMA affinity if possible)
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: none
|
// Default: none
|
||||||
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
|
NumaAffinity string `url:"numa_affinity,omitempty" json:"numa_affinity,omitempty" validate:"omitempty,numaAffinity"`
|
||||||
|
|
||||||
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
|
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
CPUPin bool `url:"cpupin" json:"cpupin"`
|
CPUPin bool `url:"cpu_pin" json:"cpu_pin"`
|
||||||
|
|
||||||
// Type of the emulated system, Q35 or i440fx
|
// Type of the emulated system, Q35 or i440fx
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -219,7 +234,7 @@ type CreateRequest struct {
|
|||||||
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
|
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
|
||||||
// Required: false
|
// Required: false
|
||||||
// Default: false
|
// Default: false
|
||||||
HPBacked bool `url:"hpBacked" json:"hpBacked"`
|
HPBacked bool `url:"hp_backed" json:"hp_backed"`
|
||||||
|
|
||||||
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
|
||||||
// Required: false
|
// Required: false
|
||||||
@@ -250,11 +265,15 @@ type CreateRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: default
|
// Default: default
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
func (r CreateRequest) GetRAM() map[string]uint64 {
|
func (r CreateRequest) GetRAM() map[string]uint64 {
|
||||||
|
|
||||||
res := make(map[string]uint64, 1)
|
res := make(map[string]uint64, 1)
|
||||||
|
|
||||||
res["RAM"] = r.RAM
|
res["RAM"] = r.RAM
|
||||||
@@ -264,8 +283,7 @@ func (r CreateRequest) GetRAM() map[string]uint64 {
|
|||||||
|
|
||||||
type wrapperCreateRequest struct {
|
type wrapperCreateRequest struct {
|
||||||
CreateRequest
|
CreateRequest
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
AsyncMode bool `json:"asyncMode"`
|
||||||
DataDisks []string `url:"dataDisks,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create creates KVM PowerPC VM based on specified OS image
|
// Create creates KVM PowerPC VM based on specified OS image
|
||||||
@@ -275,55 +293,42 @@ func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
url := "/cloudbroker/kvmx86/create"
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperCreateRequest{
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateRequest{
|
|
||||||
CreateRequest: req,
|
CreateRequest: req,
|
||||||
Interfaces: interfaces,
|
AsyncMode: false,
|
||||||
DataDisks: dataDisks,
|
})
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseUint(string(res), 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateAsync creates KVM x86 VM based on specified OS image in async mode
|
||||||
|
func (k KVMX86) CreateAsync(ctx context.Context, req CreateRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
url := "/cloudbroker/kvmx86/create"
|
url := "/cloudbroker/kvmx86/create"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperCreateRequest{
|
||||||
|
CreateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
var taskID string
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &taskID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return taskID, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package kvmx86
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -137,6 +137,11 @@ type CreateBlankRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: default
|
// Default: default
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
|
|
||||||
|
// Watchdog action
|
||||||
|
// Required: false
|
||||||
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
@@ -149,12 +154,6 @@ func (r CreateBlankRequest) GetRAM() map[string]uint64 {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperCreateBlankRequest struct {
|
|
||||||
CreateBlankRequest
|
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
|
||||||
DataDisks []string `url:"dataDisks,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateBlank creates KVM x86 VM from scratch
|
// CreateBlank creates KVM x86 VM from scratch
|
||||||
func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
|
func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
@@ -162,56 +161,12 @@ func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
|
|||||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperCreateBlankRequest{
|
|
||||||
CreateBlankRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
url := "/cloudbroker/kvmx86/createBlank"
|
url := "/cloudbroker/kvmx86/createBlank"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
return strconv.ParseUint(string(res), 10, 64)
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,11 @@ package kvmx86
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -53,6 +56,11 @@ type InterfaceMassCreate struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway are enabled for this interface, not applicable to netType EXTNET, VFNIC, TRUNK, or SDN
|
||||||
|
// Default: true
|
||||||
|
// Required: false
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
|
|
||||||
// SDN Segment ID
|
// SDN Segment ID
|
||||||
// Required: false
|
// Required: false
|
||||||
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
|
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
|
||||||
@@ -68,6 +76,10 @@ type InterfaceMassCreate struct {
|
|||||||
// SDN Logical Port Description
|
// SDN Logical Port Description
|
||||||
// Required: false
|
// Required: false
|
||||||
SDNLogicalPortDescription string `url:"sdn_logical_port_description,omitempty" json:"sdn_logical_port_description,omitempty"`
|
SDNLogicalPortDescription string `url:"sdn_logical_port_description,omitempty" json:"sdn_logical_port_description,omitempty"`
|
||||||
|
|
||||||
|
// List of QoS Policy IDs to apply to this interface (default: []), Allow used only with netType VINS, EXTNET and DPDK
|
||||||
|
// Required: false
|
||||||
|
QoSPolicies []uint64 `url:"qos_policies,omitempty" json:"qos_policies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MassCreateRequest struct to mass create KVM x86
|
// MassCreateRequest struct to mass create KVM x86
|
||||||
@@ -175,16 +187,15 @@ type MassCreateRequest struct {
|
|||||||
// Required: false
|
// Required: false
|
||||||
// Default: default
|
// Default: default
|
||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
}
|
|
||||||
|
|
||||||
type asyncWrapperMassCreateRequest struct {
|
// Watchdog action
|
||||||
wrapperMassCreateRequest
|
// Required: false
|
||||||
AsyncMode bool `url:"asyncMode"`
|
// Default: reset
|
||||||
|
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRAM returns RAM field values
|
// GetRAM returns RAM field values
|
||||||
func (r MassCreateRequest) GetRAM() map[string]uint64 {
|
func (r MassCreateRequest) GetRAM() map[string]uint64 {
|
||||||
|
|
||||||
res := make(map[string]uint64, 1)
|
res := make(map[string]uint64, 1)
|
||||||
|
|
||||||
res["RAM"] = r.RAM
|
res["RAM"] = r.RAM
|
||||||
@@ -194,8 +205,24 @@ func (r MassCreateRequest) GetRAM() map[string]uint64 {
|
|||||||
|
|
||||||
type wrapperMassCreateRequest struct {
|
type wrapperMassCreateRequest struct {
|
||||||
MassCreateRequest
|
MassCreateRequest
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
AsyncMode bool `json:"asyncMode"`
|
||||||
DataDisks []string `url:"dataDisks,omitempty"`
|
}
|
||||||
|
|
||||||
|
type massCreateResponse struct {
|
||||||
|
Created []uint64 `json:"created"`
|
||||||
|
Errors map[string]string `json:"errors"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MassCreateError struct {
|
||||||
|
Errors map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *MassCreateError) Error() string {
|
||||||
|
errs := make([]error, 0, len(e.Errors))
|
||||||
|
for k, v := range e.Errors {
|
||||||
|
errs = append(errs, fmt.Errorf("%s: %s", k, v))
|
||||||
|
}
|
||||||
|
return errors.Join(errs...).Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MassCreate creates KVM x86 computes based on specified OS image
|
// MassCreate creates KVM x86 computes based on specified OS image
|
||||||
@@ -205,113 +232,42 @@ func (k KVMX86) MassCreate(ctx context.Context, req MassCreateRequest) ([]uint64
|
|||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperMassCreateRequest{
|
|
||||||
MassCreateRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
finalReq := asyncWrapperMassCreateRequest{wrapperMassCreateRequest: reqWrapped, AsyncMode: false}
|
|
||||||
|
|
||||||
url := "/cloudbroker/kvmx86/massCreate"
|
url := "/cloudbroker/kvmx86/massCreate"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, finalReq)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperMassCreateRequest{
|
||||||
|
MassCreateRequest: req,
|
||||||
|
AsyncMode: false,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
computes := make([]uint64, 0)
|
var result massCreateResponse
|
||||||
|
|
||||||
err = json.Unmarshal(res, &computes)
|
if err = json.Unmarshal(res, &result); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return computes, nil
|
if len(result.Errors) > 0 {
|
||||||
|
return result.Created, &MassCreateError{Errors: result.Errors}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Created, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MassCreate creates KVM x86 computes based on specified OS image in async mode
|
// MassCreateAsync creates KVM x86 computes based on specified OS image in async mode
|
||||||
func (k KVMX86) MassCreateAsync(ctx context.Context, req MassCreateRequest) (string, error) {
|
func (k KVMX86) MassCreateAsync(ctx context.Context, req MassCreateRequest) (string, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
var interfaces []string
|
|
||||||
|
|
||||||
if len(req.Interfaces) != 0 {
|
|
||||||
interfaces = make([]string, 0, len(req.Interfaces))
|
|
||||||
|
|
||||||
for i := range req.Interfaces {
|
|
||||||
b, err := json.Marshal(req.Interfaces[i])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces = append(interfaces, string(b))
|
|
||||||
}
|
|
||||||
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
|
|
||||||
interfaces = []string{"[]"}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataDisks []string
|
|
||||||
|
|
||||||
if len(req.DataDisks) != 0 {
|
|
||||||
dataDisks = make([]string, 0, len(req.DataDisks))
|
|
||||||
|
|
||||||
for i := range req.DataDisks {
|
|
||||||
b, err := json.Marshal(req.DataDisks[i])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
dataDisks = append(dataDisks, string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reqWrapped := wrapperMassCreateRequest{
|
|
||||||
MassCreateRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
finalReq := asyncWrapperMassCreateRequest{wrapperMassCreateRequest: reqWrapped, AsyncMode: true}
|
|
||||||
|
|
||||||
url := "/cloudbroker/kvmx86/massCreate"
|
url := "/cloudbroker/kvmx86/massCreate"
|
||||||
|
|
||||||
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, finalReq)
|
res, err := k.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, wrapperMassCreateRequest{
|
||||||
|
MassCreateRequest: req,
|
||||||
|
AsyncMode: true,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
10
pkg/cloudbroker/network_qos_policy.go
Normal file
10
pkg/cloudbroker/network_qos_policy.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package cloudbroker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/qospolicy"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Accessing the QoS Policy method group
|
||||||
|
func (cb *CloudBroker) QoSPolicy() *qospolicy.QoSPolicy {
|
||||||
|
return qospolicy.New(cb.client)
|
||||||
|
}
|
||||||
76
pkg/cloudbroker/node/install.go
Normal file
76
pkg/cloudbroker/node/install.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package node
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InstallRequest struct to install a node
|
||||||
|
type InstallRequest struct {
|
||||||
|
// Node name
|
||||||
|
// Required: true
|
||||||
|
Name string `url:"name" json:"name" validate:"required"`
|
||||||
|
|
||||||
|
// Node roles
|
||||||
|
// Required: true
|
||||||
|
Roles []string `url:"roles" json:"roles" validate:"required"`
|
||||||
|
|
||||||
|
// OS version
|
||||||
|
// Required: true
|
||||||
|
OSVersion string `url:"os_version" json:"os_version" validate:"required"`
|
||||||
|
|
||||||
|
// OS user
|
||||||
|
// Required: false
|
||||||
|
OSUser string `url:"os_user,omitempty" json:"os_user,omitempty"`
|
||||||
|
|
||||||
|
// OS user password
|
||||||
|
// Required: true
|
||||||
|
OSUserPassword string `url:"os_user_password" json:"os_user_password" validate:"required"`
|
||||||
|
|
||||||
|
// Backplane IP address
|
||||||
|
// Required: true
|
||||||
|
BackplaneIP string `url:"backplane_ip" json:"backplane_ip" validate:"required"`
|
||||||
|
|
||||||
|
// Management IP address
|
||||||
|
// Required: true
|
||||||
|
ManagementIP string `url:"management_ip" json:"management_ip" validate:"required"`
|
||||||
|
|
||||||
|
// VX backend IP address
|
||||||
|
// Required: true
|
||||||
|
VXBackendIP string `url:"vxbackend_ip" json:"vxbackend_ip" validate:"required"`
|
||||||
|
|
||||||
|
// Gateway management IP address
|
||||||
|
// Required: true
|
||||||
|
GWMgmtIP string `url:"gw_mgmt_ip" json:"gw_mgmt_ip" validate:"required"`
|
||||||
|
|
||||||
|
// IPMI address
|
||||||
|
// Required: true
|
||||||
|
IPMIAddress string `url:"ipmi_address" json:"ipmi_address" validate:"required"`
|
||||||
|
|
||||||
|
// IPMI user
|
||||||
|
// Required: true
|
||||||
|
IPMIUser string `url:"ipmi_user" json:"ipmi_user" validate:"required"`
|
||||||
|
|
||||||
|
// IPMI password
|
||||||
|
// Required: true
|
||||||
|
IPMIPassword string `url:"ipmi_password" json:"ipmi_password" validate:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install installs a node
|
||||||
|
func (n Node) Install(ctx context.Context, req InstallRequest) (string, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/node/install"
|
||||||
|
|
||||||
|
res, err := n.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(res), nil
|
||||||
|
}
|
||||||
@@ -50,6 +50,12 @@ type RecordNode struct {
|
|||||||
// ReservedCPUs
|
// ReservedCPUs
|
||||||
ReservedCPUs []interface{} `json:"reservedCpus"`
|
ReservedCPUs []interface{} `json:"reservedCpus"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
// Roles
|
// Roles
|
||||||
Roles []string `json:"roles"`
|
Roles []string `json:"roles"`
|
||||||
|
|
||||||
@@ -111,7 +117,7 @@ type ConsumptionInfo struct {
|
|||||||
Reserved ResourcesInfo `json:"reserved"`
|
Reserved ResourcesInfo `json:"reserved"`
|
||||||
|
|
||||||
// Total resources
|
// Total resources
|
||||||
Total ResourcesInfo `json:"total"`
|
Total FreeResourcesInfo `json:"total"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free Resources Info
|
// Free Resources Info
|
||||||
@@ -161,8 +167,11 @@ type CpuInfo struct {
|
|||||||
// Flags
|
// Flags
|
||||||
Flags []string `json:"flags"`
|
Flags []string `json:"flags"`
|
||||||
|
|
||||||
// Mddel name
|
// Model name
|
||||||
ModelName string `json:"model_name"`
|
ModelName string `json:"model_name"`
|
||||||
|
|
||||||
|
// Max supported generation
|
||||||
|
MaxSupportedGeneration string `json:"max_supported_generation"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information about node
|
// Main information about node
|
||||||
@@ -200,6 +209,9 @@ type ItemNode struct {
|
|||||||
// Last check
|
// Last check
|
||||||
LastCheck uint64 `json:"lastcheck"`
|
LastCheck uint64 `json:"lastcheck"`
|
||||||
|
|
||||||
|
// Machine ID
|
||||||
|
MachineID string `json:"machine_id"`
|
||||||
|
|
||||||
// Machine GUID
|
// Machine GUID
|
||||||
MachineGUID string `json:"machineguid"`
|
MachineGUID string `json:"machineguid"`
|
||||||
|
|
||||||
@@ -257,6 +269,12 @@ type ItemNode struct {
|
|||||||
// ReservedCPUs
|
// ReservedCPUs
|
||||||
ReservedCPUs []interface{} `json:"reservedCpus"`
|
ReservedCPUs []interface{} `json:"reservedCpus"`
|
||||||
|
|
||||||
|
// Reserved CPU
|
||||||
|
ReservedCPU uint64 `json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Reserved RAM
|
||||||
|
ReservedRAM uint64 `json:"reserved_ram"`
|
||||||
|
|
||||||
// Roles
|
// Roles
|
||||||
Roles []string `json:"roles"`
|
Roles []string `json:"roles"`
|
||||||
|
|
||||||
@@ -459,11 +477,11 @@ type DPDK struct {
|
|||||||
// Bridges
|
// Bridges
|
||||||
Bridges Bridges `json:"bridges"`
|
Bridges Bridges `json:"bridges"`
|
||||||
|
|
||||||
|
// ovs dpdk cores
|
||||||
|
OVSDPDKCores []uint64 `json:"ovs_dpdk_cores"`
|
||||||
|
|
||||||
// hp memory
|
// hp memory
|
||||||
HPMemory map[string]uint64 `json:"hp_memory"`
|
HPMemory map[string]uint64 `json:"hp_memory"`
|
||||||
|
|
||||||
// pmd cpu
|
|
||||||
PMDCPU []uint64 `json:"pmd_cpu"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bridges
|
// Bridges
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user