Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 118b48c3bc | |||
|
|
cd5d1c9d0b | ||
| f5a632654b |
203
CHANGELOG.md
203
CHANGELOG.md
@@ -1,9 +1,15 @@
|
|||||||
## Version 1.15.0
|
## Version 1.15.3
|
||||||
|
|
||||||
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
|
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и будут удалены в версии 1.16, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
|
||||||
Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и в следующих версиях будут удалены
|
Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и будут удалены в версии 1.16
|
||||||
Методы `ComputeCISet`, `ComputeCIUnset`, `GetAudits` в cloudbroker/compute и `GetAudits` в cloudapi/compute стали deprecated и будут удалены в следующих версиях
|
Методы `ComputeCISet`, `ComputeCIUnset`, `GetAudits` в cloudbroker/compute и `GetAudits` в cloudapi/compute стали deprecated и будут удалены в версии 1.16
|
||||||
Методы `ComputeCISet`, `ComputeCIUnset` в cloudbroker/image стали deprecated и будут удалены в следующих версиях
|
Методы `ComputeCISet`, `ComputeCIUnset` в cloudbroker/image стали deprecated и будут удалены в версии 1.16
|
||||||
|
Методы `Delete`, `Disable`, `Enable`, `GetConsumedCloudUnitsByType`, `GetReservedAccountUnits` в cloudapi/account стали deprecated и будут удалены в версии 1.16
|
||||||
|
Методы `Disable`, `Enable` в cloudbroker/account стали deprecated и будут удалены в версии 1.16
|
||||||
|
Метод `IsValidInviteUserToken` в cloudapi/user стал deprecated и будет удален в версии 1.16
|
||||||
|
Метод `GetLog` в cloudbroker/compute стал deprecated и будет удален в версии 1.16
|
||||||
|
Методы `ExecuteMaintenanceScript`, `ListEmails`, `ServicesRestart` в cloudbroker/grid стали deprecated и будут удалены в версии 1.16
|
||||||
|
Метод `Get` в cloudbroker/group стал deprecated и будет удален в версии 1.16
|
||||||
|
|
||||||
Все методы группы `.SDN()` находятся в альфа-версии.
|
Все методы группы `.SDN()` находятся в альфа-версии.
|
||||||
|
|
||||||
@@ -13,187 +19,46 @@
|
|||||||
#### compute
|
#### compute
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-864 | Методы `GetCPUAlignmentProfile`, `SetCPUAlignmentProfile` и `DeleteCPUAlignmentProfile` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-922 | Опциональное поле `EnableDefaultGateway` в структуру запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute |
|
||||||
| BGOS-864 | Структуры запросов `GetCPUAlignmentProfileRequest`, `SetCPUAlignmentProfileRequest` и `DeleteCPUAlignmentProfileRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-922 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `RecordNetAttach` в cloudapi/compute и cloudbroker/compute |
|
||||||
| BGOS-865 | Вычисляемое поле `CPUAlignmentProfile` в структуру ответа `RecordCompute` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-922 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemInterface` в cloudbroker/compute |
|
||||||
| BGOS-865 | Вычисляемое поле `CPUAlignmentProfile` в структуру ответа `ItemCompute` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-922 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVNFInterface` в cloudapi/compute |
|
||||||
| BGOS-865 | Структура ответа `CPUAlignmentProfile` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-931 | Структура ответа `SnapRecordCompute` в cloudapi/compute |
|
||||||
| BGOS-872 | Опциональное поле `WithMemory` в структуру запроса `SnapshotCreateRequest` в cloudapi/compute и cloudbroker/compute |
|
| BGOS-936 | Вычисляемое поле `NodeID` в структуры ответа `RecordCompute` и `ItemCompute` в cloudapi/compute |
|
||||||
| BGOS-872 | Опциональное поле `WithMemory` в структуру запроса `SnapshotRollbackRequest` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-872 | Вычисляемые поля `MemoryDumpImage` и `Compute` в структуру ответа `ItemSnapshot` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-872 | Методы `SnapshotCreateAsync`, `SnapshotRollbackAsync` и `AbortSharedSnapshotMergeAsync` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-872 | Опциональное поле `NodeID` в структуру запроса `SnapshotRollbackRequest` в cloudbroker/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-924 | Вычисляемое поле `Ready` в структуру ответа `MigrateStatus` в cloudbroker/disks |
|
||||||
| BGOS-895 | Вычисляемое поле `ComputesReadOnly` в структуры ответа `ItemDisk` и `RecordDisk` в cloudapi/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-926 | Метод `SetResourcesLimit` и структура запроса `SetResourcesLimitRequest` в 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-937 | Опциональное поле `EnableDefaultGateway` в структуру `Interface` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
||||||
| BGOS-865 | Опциональное поле `CPUAlignmentProfile` в структуру запроса `MassCreateRequest` в cloudbroker/kvmx86 |
|
| BGOS-937 | Опциональное поле `EnableDefaultGateway` в структуру `InterfaceMassCreate` в cloudbroker/kvmx86 |
|
||||||
| BGOS-877 | Опциональное поле `Clock` в структуры запросов `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 |
|
|
||||||
| BGOS-877 | Опциональное поле `Clock` в структуру запроса `MassCreateRequest` в cloudbroker/kvmx86 |
|
|
||||||
|
|
||||||
#### node
|
#### node
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-866 | Вычисляемые поля `OneGAvailable`, `OneGFree`, `OneGReserved`, `OneGUsed`, `OneGDPDKReserved`, `TwoMAvailable`, `TwoMFree`, `TwoMReserved` и `TwoMUsed` в структуру ответа `ItemMemory` в cloudbroker/node |
|
| BGOS-927 | Вычисляемые поля `ReservedCPU` и `ReservedRAM` в структуры ответа `ItemNode` и `RecordNode` в cloudbroker/node |
|
||||||
| BGOS-879 | Методы `GetPCIDevices`, `PCIDeviceDriverToVFIO` и `PCIDeviceDriverToKernel` в cloudbroker/node |
|
| BGOS-928 | Метод `SetResourcesLimit` и структура запроса `SetResourcesLimitRequest` в 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
|
#### vins
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-873 | Метод `Update` и структура запроса `UpdateRequest` в cloudbroker/sep |
|
| BGOS-923 | Опциональное поле `EnableDefaultGateway` в структуры запросов `CreateInAccountRequest` и `CreateInRGRequest` в cloudapi/vins и cloudbroker/vins |
|
||||||
|
| BGOS-923 | Опциональное поле `EnableDefaultGateway` в структуру запроса `UpdateRequest` в cloudbroker/vins |
|
||||||
|
| BGOS-923 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `RecordVINS` в cloudapi/vins и cloudbroker/vins |
|
||||||
|
| BGOS-923 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVINS` в cloudbroker/vins |
|
||||||
|
|
||||||
#### zone
|
#### zone
|
||||||
| Идентификатор задачи | Описание |
|
| Идентификатор задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BGOS-862 | Метод `AddCPUAlignmentProfile` и структура запроса `AddCPUAlignmentProfileRequest` в cloudbroker/zone |
|
| BGOS-929 | Вычисляемые поля `ReservedCPU` и `ReservedRAM` в структуры ответа `RecordZone` и `ItemZone` в cloudapi/zone и в cloudbroker/zone |
|
||||||
| BGOS-862 | Метод `DeleteCPUAlignmentProfile` и структура запроса `DeleteCPUAlignmentProfileRequest` в cloudbroker/zone |
|
| BGOS-930 | Метод `SetResourcesLimit` и структура запроса `SetResourcesLimitRequest` в cloudbroker/zone |
|
||||||
| BGOS-862 | Метод `GetCPUAlignmentProfile` и структура запроса `GetCPUAlignmentProfileRequest` в cloudbroker/zone |
|
| BGOS-930 | Метод `UpdateCPUAlignmentProfile` и структура запроса `UpdateCPUAlignmentProfileRequest` в 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-887 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структуре ответа `RecordAccount` в cloudapi/account |
|
|
||||||
| BGOS-887 | Тип поля `CPUAllocationRatio` с `float64` на `uint64` в структуре ответа `InfoAccount` в cloudbroker/account |
|
|
||||||
|
|
||||||
#### compute
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-874 | Поле `StoragePolicyID` с обязательного на опциональное в структуре запроса `RedeployRequest` в cloudapi/compute и cloudbroker/compute |
|
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структуре ответа `ItemComputeDisk` в 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-870 | Тип поля `BLKDiscard` с `bool` на `string` и переименование в `Discard` в структурах ответа `RecordDisk`, `ItemDisk` и `ItemDiskUnattached` в 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-888 | Тип поля `Ratio` с `float64` на `uint64` в структурах запросов `SetCPUAllocationRatioRequest`, `SetCPUAllocationRatioForVMRequest` и `SetMemAllocationRatioRequest` в cloudbroker/grid |
|
|
||||||
|
|
||||||
#### 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-867 | Тип обязательного поля `Ratio` с `float64` на `uint64` в структурах запросов `SetMemAllocationRatioRequest` и `SetCpuAllocationRatioRequest` в cloudbroker/node |
|
|
||||||
| BGOS-889 | Тип поля `VCPU` с `float64` на `uint64` в структуре ответа `FreeResourcesInfo` в cloudbroker/node |
|
|
||||||
| BGOS-889 | Тип полей `CPUAllocationRatio` и `MemAllocationRatio` с `float64` на `uint64` в структурах ответа `RecordNode` и `ItemNode` в cloudbroker/node |
|
|
||||||
|
|
||||||
#### resmon
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-868 | Тип поля `EndTime` с обязательного на опциональное в структурах запроса `GetByNodeRequest`, `GetByNodesRequest` `GetByGRIDRequest`, `GetByComputeRequest` и `GetByComputesRequest` в cloudbroker/resmon |
|
|
||||||
|
|
||||||
#### 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-888 | Вычисляемые поля `CKey` и `Meta` из структуры ответа `RecordGrid` в cloudbroker/grid |
|
|
||||||
|
|
||||||
#### user
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BGOS-861 | Значение по умолчанию опционального поля `Password` в структуре запроса `CreateRequest` в cloudbroker/user |
|
|
||||||
| BGOS-875 | Опциональное поле `Password` из структуры ответа `ItemUser` в cloudbroker/user |
|
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ type DecortClient struct {
|
|||||||
|
|
||||||
// Сlient builder
|
// Сlient 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|
||||||
@@ -479,6 +482,9 @@ type RecordCompute struct {
|
|||||||
// Natable VINS network name
|
// Natable VINS network name
|
||||||
NatableVINSNetworkName string `json:"natableVinsNetworkName"`
|
NatableVINSNetworkName string `json:"natableVinsNetworkName"`
|
||||||
|
|
||||||
|
// Node ID
|
||||||
|
NodeID uint64 `json:"node_id"`
|
||||||
|
|
||||||
// Name of OS
|
// Name of OS
|
||||||
OSVersion string `json:"os_version"`
|
OSVersion string `json:"os_version"`
|
||||||
|
|
||||||
@@ -565,6 +571,261 @@ type RecordCompute struct {
|
|||||||
ZoneID uint64 `json:"zoneId"`
|
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"`
|
||||||
|
|
||||||
|
// 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"`
|
||||||
|
|
||||||
|
// List snapsets
|
||||||
|
SnapSets ListSnapSets `json:"snapSets"`
|
||||||
|
|
||||||
|
// 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 []VGPUItem `json:"vgpus"`
|
||||||
|
|
||||||
|
// VNC password
|
||||||
|
VNCPassword string `json:"vncPasswd"`
|
||||||
|
|
||||||
|
// Weight
|
||||||
|
Weight uint64 `json:"weight"`
|
||||||
|
|
||||||
|
// Zone ID
|
||||||
|
// Required: false
|
||||||
|
ZoneID uint64 `json:"zoneId"`
|
||||||
|
}
|
||||||
|
|
||||||
type LoaderMetaIso struct {
|
type LoaderMetaIso struct {
|
||||||
// Name
|
// Name
|
||||||
DeviceName string `json:"devicename"`
|
DeviceName string `json:"devicename"`
|
||||||
@@ -690,7 +951,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 +963,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 +990,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"`
|
||||||
|
|
||||||
@@ -1185,6 +1455,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"`
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,11 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperNetAttachRequest struct {
|
type wrapperNetAttachRequest struct {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -76,6 +76,11 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
|
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
|
||||||
@@ -231,7 +236,6 @@ type CreateRequest struct {
|
|||||||
|
|
||||||
// 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
|
||||||
@@ -239,12 +243,6 @@ func (r CreateRequest) GetRAM() map[string]uint64 {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperCreateRequest struct {
|
|
||||||
CreateRequest
|
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
|
||||||
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
|
||||||
func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
@@ -252,55 +250,12 @@ 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
|
|
||||||
|
|
||||||
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 := wrapperCreateRequest{
|
|
||||||
CreateRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
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, 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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -136,12 +136,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 +143,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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -694,6 +694,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,12 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A zone item from a list
|
// A zone item from a list
|
||||||
@@ -183,4 +189,10 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|
||||||
@@ -597,6 +600,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"`
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,11 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -343,4 +343,7 @@ type MigrateStatus struct {
|
|||||||
|
|
||||||
// Progress percent
|
// Progress percent
|
||||||
ProgressPercent int `json:"progress_percent"`
|
ProgressPercent int `json:"progress_percent"`
|
||||||
|
|
||||||
|
// Operation status
|
||||||
|
Ready bool `json:"ready"`
|
||||||
}
|
}
|
||||||
|
|||||||
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))
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -59,6 +59,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"`
|
||||||
@@ -254,7 +259,6 @@ type CreateRequest struct {
|
|||||||
|
|
||||||
// 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
|
||||||
@@ -262,12 +266,6 @@ func (r CreateRequest) GetRAM() map[string]uint64 {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapperCreateRequest struct {
|
|
||||||
CreateRequest
|
|
||||||
Interfaces []string `url:"interfaces,omitempty"`
|
|
||||||
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
|
||||||
func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
@@ -275,55 +273,12 @@ 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
|
|
||||||
|
|
||||||
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 := wrapperCreateRequest{
|
|
||||||
CreateRequest: req,
|
|
||||||
Interfaces: interfaces,
|
|
||||||
DataDisks: dataDisks,
|
|
||||||
}
|
|
||||||
|
|
||||||
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, 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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -149,12 +149,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 +156,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"`
|
||||||
@@ -177,14 +185,8 @@ type MassCreateRequest struct {
|
|||||||
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type asyncWrapperMassCreateRequest struct {
|
|
||||||
wrapperMassCreateRequest
|
|
||||||
AsyncMode bool `url:"asyncMode"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 +196,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 +223,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}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MassCreate creates KVM x86 computes based on specified OS image in async mode
|
return result.Created, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
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"`
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -257,6 +266,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"`
|
||||||
|
|
||||||
|
|||||||
42
pkg/cloudbroker/node/set_resources_limit.go
Normal file
42
pkg/cloudbroker/node/set_resources_limit.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package node
|
||||||
|
|
||||||
|
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 for node
|
||||||
|
type SetResourcesLimitRequest struct {
|
||||||
|
// Node ID
|
||||||
|
// Required: true
|
||||||
|
NodeID uint64 `url:"node_id" json:"node_id" validate:"required"`
|
||||||
|
|
||||||
|
// Number of CPU cores reserved
|
||||||
|
// Required: true
|
||||||
|
ReservedCPU uint64 `url:"reserved_cpu" json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Amount of RAM in MB reserved
|
||||||
|
// Required: true
|
||||||
|
ReservedRAM uint64 `url:"reserved_ram" json:"reserved_ram"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetResourcesLimit sets reserved CPU and RAM limits for the node
|
||||||
|
func (n Node) SetResourcesLimit(ctx context.Context, req SetResourcesLimitRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/node/set_resources_limit"
|
||||||
|
|
||||||
|
res, err := n.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseBool(string(res))
|
||||||
|
}
|
||||||
@@ -11,12 +11,12 @@ import (
|
|||||||
// ConsumptionRequest struct to get consumption info
|
// ConsumptionRequest struct to get consumption info
|
||||||
type ConsumptionRequest struct {
|
type ConsumptionRequest struct {
|
||||||
// Storage endpoint provider ID
|
// Storage endpoint provider ID
|
||||||
// Required: true
|
// Required: false
|
||||||
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
|
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Consumption gets SEP consumption info
|
// Consumption gets SEP consumption info
|
||||||
func (s SEP) Consumption(ctx context.Context, req ConsumptionRequest) (*RecordConsumption, error) {
|
func (s SEP) Consumption(ctx context.Context, req ConsumptionRequest) (*ListConsumption, error) {
|
||||||
err := validators.ValidateRequest(req)
|
err := validators.ValidateRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
@@ -29,7 +29,7 @@ func (s SEP) Consumption(ctx context.Context, req ConsumptionRequest) (*RecordCo
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := RecordConsumption{}
|
info := ListConsumption{}
|
||||||
|
|
||||||
err = json.Unmarshal(res, &info)
|
err = json.Unmarshal(res, &info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -47,8 +47,22 @@ type ByPool struct {
|
|||||||
UsageLimit uint64 `json:"usage_limit"`
|
UsageLimit uint64 `json:"usage_limit"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List of Resource groups
|
||||||
|
type ListConsumption struct {
|
||||||
|
// Data
|
||||||
|
Data []RecordConsumption `json:"data"`
|
||||||
|
|
||||||
|
// Enrtry count
|
||||||
|
EntryCount uint64 `json:"entryCount"`
|
||||||
|
}
|
||||||
|
|
||||||
// Main information about consumption
|
// Main information about consumption
|
||||||
type RecordConsumption struct {
|
type RecordConsumption struct {
|
||||||
|
// ID
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
|
||||||
|
// Name
|
||||||
|
Name string `json:"name"`
|
||||||
// By pool
|
// By pool
|
||||||
ByPool map[string]ByPool `json:"byPool"`
|
ByPool map[string]ByPool `json:"byPool"`
|
||||||
|
|
||||||
@@ -57,6 +71,9 @@ type RecordConsumption struct {
|
|||||||
|
|
||||||
// Type
|
// Type
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
|
|
||||||
|
// Consumed by
|
||||||
|
ConsumedBy []uint64 `json:"consumedBy"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main information about URI
|
// Main information about URI
|
||||||
|
|||||||
@@ -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 := "/cloudbroker/vins/createInAccount"
|
url := "/cloudbroker/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
|
||||||
@@ -69,31 +69,10 @@ func (v VINS) CreateInRG(ctx context.Context, req CreateInRGRequest) (uint64, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
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 := "/cloudbroker/vins/createInRG"
|
url := "/cloudbroker/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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -523,6 +523,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"`
|
||||||
|
|
||||||
@@ -736,6 +739,9 @@ type ItemVINS 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"`
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ type UpdateRequest struct {
|
|||||||
// Flag indicating whether security groups are enabled for this network
|
// Flag indicating whether security groups are enabled for this network
|
||||||
// Required: false
|
// Required: 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"`
|
||||||
|
|
||||||
|
// Flag indicating whether default gateway is enabled for this VINS
|
||||||
|
// Required: false
|
||||||
|
EnableDefaultGateway interface{} `url:"enable_default_gateway,omitempty" json:"enable_default_gateway,omitempty" validate:"omitempty,isBool"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update updates a vins parameters
|
// Update updates a vins parameters
|
||||||
|
|||||||
@@ -12,6 +12,21 @@ type CpuAlignmentProfile struct {
|
|||||||
Model string `json:"model"`
|
Model string `json:"model"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Supported CPU model
|
||||||
|
type SupportedCpuModel struct {
|
||||||
|
// Vendor
|
||||||
|
Vendor string `json:"vendor"`
|
||||||
|
|
||||||
|
// Model
|
||||||
|
Model string `json:"model"`
|
||||||
|
|
||||||
|
// Count
|
||||||
|
Count uint64 `json:"count"`
|
||||||
|
|
||||||
|
// Percentage
|
||||||
|
Percentage float64 `json:"percentage"`
|
||||||
|
}
|
||||||
|
|
||||||
// CPU alignment profile candidate
|
// CPU alignment profile candidate
|
||||||
type CpuAlignmentProfileCandidate struct {
|
type CpuAlignmentProfileCandidate struct {
|
||||||
// Profile name
|
// Profile name
|
||||||
@@ -27,7 +42,7 @@ type CpuAlignmentProfileCandidate struct {
|
|||||||
Count uint64 `json:"count"`
|
Count uint64 `json:"count"`
|
||||||
|
|
||||||
// Percentage
|
// Percentage
|
||||||
Percentage uint64 `json:"percentage"`
|
Percentage float64 `json:"percentage"`
|
||||||
|
|
||||||
// Required count
|
// Required count
|
||||||
RequiredCount uint64 `json:"required_count"`
|
RequiredCount uint64 `json:"required_count"`
|
||||||
@@ -40,6 +55,9 @@ type TestCPUAlignmentProfileResult struct {
|
|||||||
|
|
||||||
// Candidates
|
// Candidates
|
||||||
Candidates []CpuAlignmentProfileCandidate `json:"candidates"`
|
Candidates []CpuAlignmentProfileCandidate `json:"candidates"`
|
||||||
|
|
||||||
|
// Supported CPU models
|
||||||
|
SupportedCpuModels []SupportedCpuModel `json:"supported_cpu_models"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Item for list_cpu_alignment_profile response
|
// Item for list_cpu_alignment_profile response
|
||||||
@@ -159,6 +177,12 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A zone item from a list
|
// A zone item from a list
|
||||||
@@ -231,4 +255,10 @@ 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"`
|
||||||
}
|
}
|
||||||
|
|||||||
42
pkg/cloudbroker/zone/set_resources_limit.go
Normal file
42
pkg/cloudbroker/zone/set_resources_limit.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package zone
|
||||||
|
|
||||||
|
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 zone
|
||||||
|
// Required: true
|
||||||
|
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
|
||||||
|
|
||||||
|
// Number of CPU cores reserved
|
||||||
|
// Required: true
|
||||||
|
ReservedCPU uint64 `url:"reserved_cpu" json:"reserved_cpu"`
|
||||||
|
|
||||||
|
// Amount of RAM in MB reserved
|
||||||
|
// Required: true
|
||||||
|
ReservedRAM uint64 `url:"reserved_ram" json:"reserved_ram"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetResourcesLimit sets reserved CPU and RAM limits for the zone
|
||||||
|
func (e Zone) SetResourcesLimit(ctx context.Context, req SetResourcesLimitRequest) (bool, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/zone/set_resources_limit"
|
||||||
|
|
||||||
|
res, err := e.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseBool(string(res))
|
||||||
|
}
|
||||||
46
pkg/cloudbroker/zone/update_cpu_alignment_profile.go
Normal file
46
pkg/cloudbroker/zone/update_cpu_alignment_profile.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package zone
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||||
|
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UpdateCPUAlignmentProfileRequest struct to update CPU alignment profile of zone
|
||||||
|
type UpdateCPUAlignmentProfileRequest struct {
|
||||||
|
// ID of zone
|
||||||
|
// Required: true
|
||||||
|
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
|
||||||
|
|
||||||
|
// Minimum percentage of hypervisors that must support the selected CPU model for the balanced profile
|
||||||
|
// Default: 70
|
||||||
|
// Required: false
|
||||||
|
HypervisorSimilarityInPercentage uint64 `url:"hypervisor_similarity_in_percentage,omitempty" json:"hypervisor_similarity_in_percentage,omitempty" validate:"omitempty,max=100"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateCPUAlignmentProfile updates CPU alignment profile of zone
|
||||||
|
func (e Zone) UpdateCPUAlignmentProfile(ctx context.Context, req UpdateCPUAlignmentProfileRequest) ([]CpuAlignmentProfile, error) {
|
||||||
|
err := validators.ValidateRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "/cloudbroker/zone/update_cpu_alignment_profile"
|
||||||
|
|
||||||
|
res, err := e.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var profiles []CpuAlignmentProfile
|
||||||
|
|
||||||
|
err = json.Unmarshal(res, &profiles)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return profiles, nil
|
||||||
|
}
|
||||||
@@ -116,8 +116,8 @@ type AddAddress struct {
|
|||||||
IsPrimary interface{} `url:"is_primary" json:"is_primary" validate:"required,isBool"`
|
IsPrimary interface{} `url:"is_primary" json:"is_primary" validate:"required,isBool"`
|
||||||
|
|
||||||
// MAC address
|
// MAC address
|
||||||
// Required: false
|
// Required: true
|
||||||
MAC string `url:"mac,omitempty" json:"mac,omitempty"`
|
MAC string `url:"mac" json:"mac" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update updates a logical port
|
// Update updates a logical port
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ func (m *migrator) Migrate(ctxOrigin context.Context, dxVMID, nodeID uint64) (bo
|
|||||||
req := compute.MigrateRequest{
|
req := compute.MigrateRequest{
|
||||||
ComputeID: dxVMID,
|
ComputeID: dxVMID,
|
||||||
TargetNodeID: nodeID,
|
TargetNodeID: nodeID,
|
||||||
Force: false,
|
|
||||||
}
|
}
|
||||||
ctx, cancel := context.WithTimeout(ctxOrigin, m.cfg.QueryTimeout)
|
ctx, cancel := context.WithTimeout(ctxOrigin, m.cfg.QueryTimeout)
|
||||||
ok, err := m.client.CloudBroker().Compute().Migrate(ctx, req)
|
ok, err := m.client.CloudBroker().Compute().Migrate(ctx, req)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ func TestGetListCloudAPI(t *testing.T) {
|
|||||||
getResult("Compute list", bytes, compute.ListComputes{}, t)
|
getResult("Compute list", bytes, compute.ListComputes{}, t)
|
||||||
// Get
|
// Get
|
||||||
listComp, _ := client.CloudAPI().Compute().List(context.Background(), compute.ListRequest{})
|
listComp, _ := client.CloudAPI().Compute().List(context.Background(), compute.ListRequest{})
|
||||||
if len(listComp.Data) > 0 {
|
if listComp != nil && len(listComp.Data) > 0 {
|
||||||
id := listComp.Data[0].ID
|
id := listComp.Data[0].ID
|
||||||
bytes, err = client.CloudAPI().Compute().GetRaw(context.Background(), compute.GetRequest{ComputeID: id})
|
bytes, err = client.CloudAPI().Compute().GetRaw(context.Background(), compute.GetRequest{ComputeID: id})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -711,7 +711,7 @@ func TestGetListCloudbroker(t *testing.T) {
|
|||||||
getResult("Node list", bytes, node_cb.ListNodes{}, t)
|
getResult("Node list", bytes, node_cb.ListNodes{}, t)
|
||||||
// Get
|
// Get
|
||||||
listNode, _ := client.CloudBroker().Node().List(context.Background(), node_cb.ListRequest{})
|
listNode, _ := client.CloudBroker().Node().List(context.Background(), node_cb.ListRequest{})
|
||||||
if len(listLB.Data) > 0 {
|
if listNode != nil && len(listNode.Data) > 0 {
|
||||||
id := listNode.Data[0].ID
|
id := listNode.Data[0].ID
|
||||||
bytes, err = client.CloudBroker().Node().GetRaw(context.Background(), node_cb.GetRequest{NID: id})
|
bytes, err = client.CloudBroker().Node().GetRaw(context.Background(), node_cb.GetRequest{NID: id})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -725,11 +725,11 @@ func TestGetListCloudbroker(t *testing.T) {
|
|||||||
}
|
}
|
||||||
getResult("Node get_network_info", bytes, node_cb.RecordNodeNetworkInfo{}, t)
|
getResult("Node get_network_info", bytes, node_cb.RecordNodeNetworkInfo{}, t)
|
||||||
} else {
|
} else {
|
||||||
t.Errorf("Can not test Node get because LB list is empty")
|
t.Errorf("Can not test Node get because node list is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Node GetPCIDevices
|
// Node GetPCIDevices
|
||||||
if len(listNode.Data) > 0 {
|
if listNode != nil && len(listNode.Data) > 0 {
|
||||||
id := listNode.Data[0].ID
|
id := listNode.Data[0].ID
|
||||||
bytes, err = client.CloudBroker().Node().GetPCIDevicesRaw(context.Background(), node_cb.GetPCIDevicesRequest{NodeID: id})
|
bytes, err = client.CloudBroker().Node().GetPCIDevicesRaw(context.Background(), node_cb.GetPCIDevicesRequest{NodeID: id})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -780,6 +780,7 @@ func getRequestsMapCloudbroker() map[string]interface{} {
|
|||||||
"/restmachine/cloudbroker/grid/setPasswordPolicy": grid_cb.SetPasswordPolicyRequest{},
|
"/restmachine/cloudbroker/grid/setPasswordPolicy": grid_cb.SetPasswordPolicyRequest{},
|
||||||
"/restmachine/cloudbroker/grid/status": EmptyStruct{},
|
"/restmachine/cloudbroker/grid/status": EmptyStruct{},
|
||||||
"/restmachine/cloudbroker/grid/getSettings": grid_cb.GetSettingsRequest{},
|
"/restmachine/cloudbroker/grid/getSettings": grid_cb.GetSettingsRequest{},
|
||||||
|
"/restmachine/cloudbroker/grid/set_resources_limit": grid_cb.SetResourcesLimitRequest{},
|
||||||
|
|
||||||
// group
|
// group
|
||||||
"/restmachine/cloudbroker/group/get": group_cb.GetRequest{},
|
"/restmachine/cloudbroker/group/get": group_cb.GetRequest{},
|
||||||
@@ -907,11 +908,13 @@ func getRequestsMapCloudbroker() map[string]interface{} {
|
|||||||
"/restmachine/cloudbroker/node/get_logical_cores_count": node_cb.GetLogicalCoresCountRequest{},
|
"/restmachine/cloudbroker/node/get_logical_cores_count": node_cb.GetLogicalCoresCountRequest{},
|
||||||
"/restmachine/cloudbroker/node/set_cpu_allocation_ratio": node_cb.SetCpuAllocationRatioRequest{},
|
"/restmachine/cloudbroker/node/set_cpu_allocation_ratio": node_cb.SetCpuAllocationRatioRequest{},
|
||||||
"/restmachine/cloudbroker/node/set_mem_allocation_ratio": node_cb.SetMemAllocationRatioRequest{},
|
"/restmachine/cloudbroker/node/set_mem_allocation_ratio": node_cb.SetMemAllocationRatioRequest{},
|
||||||
|
"/restmachine/cloudbroker/node/set_resources_limit": node_cb.SetResourcesLimitRequest{},
|
||||||
"/restmachine/cloudbroker/node/autostart": node_cb.AutoStartRequest{},
|
"/restmachine/cloudbroker/node/autostart": node_cb.AutoStartRequest{},
|
||||||
"/restmachine/cloudbroker/node/get_network_info": node_cb.GetNetworkInfoRequest{},
|
"/restmachine/cloudbroker/node/get_network_info": node_cb.GetNetworkInfoRequest{},
|
||||||
"/restmachine/cloudbroker/node/get_pci_devices": node_cb.GetPCIDevicesRequest{},
|
"/restmachine/cloudbroker/node/get_pci_devices": node_cb.GetPCIDevicesRequest{},
|
||||||
"/restmachine/cloudbroker/node/pci_device_driver_to_vfio": node_cb.PCIDeviceDriverToVFIORequest{},
|
"/restmachine/cloudbroker/node/pci_device_driver_to_vfio": node_cb.PCIDeviceDriverToVFIORequest{},
|
||||||
"/restmachine/cloudbroker/node/pci_device_driver_to_kernel": node_cb.PCIDeviceDriverToKernelRequest{},
|
"/restmachine/cloudbroker/node/pci_device_driver_to_kernel": node_cb.PCIDeviceDriverToKernelRequest{},
|
||||||
|
"/restmachine/cloudbroker/node/install": node_cb.InstallRequest{},
|
||||||
|
|
||||||
// pcidevice
|
// pcidevice
|
||||||
"/restmachine/cloudbroker/pcidevice/create": pcidevice_cb.CreateRequest{},
|
"/restmachine/cloudbroker/pcidevice/create": pcidevice_cb.CreateRequest{},
|
||||||
@@ -1123,6 +1126,8 @@ func getRequestsMapCloudbroker() map[string]interface{} {
|
|||||||
"/restmachine/cloudbroker/zone/get_cpu_alignment_profile": zone_cb.GetCPUAlignmentProfileRequest{},
|
"/restmachine/cloudbroker/zone/get_cpu_alignment_profile": zone_cb.GetCPUAlignmentProfileRequest{},
|
||||||
"/restmachine/cloudbroker/zone/list_cpu_alignment_profile": zone_cb.ListCPUAlignmentProfileRequest{},
|
"/restmachine/cloudbroker/zone/list_cpu_alignment_profile": zone_cb.ListCPUAlignmentProfileRequest{},
|
||||||
"/restmachine/cloudbroker/zone/test_cpu_alignment_profile": zone_cb.TestCPUAlignmentProfileRequest{},
|
"/restmachine/cloudbroker/zone/test_cpu_alignment_profile": zone_cb.TestCPUAlignmentProfileRequest{},
|
||||||
|
"/restmachine/cloudbroker/zone/set_resources_limit": zone_cb.SetResourcesLimitRequest{},
|
||||||
|
"/restmachine/cloudbroker/zone/update_cpu_alignment_profile": zone_cb.UpdateCPUAlignmentProfileRequest{},
|
||||||
|
|
||||||
// security policy
|
// security policy
|
||||||
"/sdn/security_policy/create": secpolicies.CreateRequest{},
|
"/sdn/security_policy/create": secpolicies.CreateRequest{},
|
||||||
|
|||||||
@@ -183,6 +183,9 @@ func GetMapFromBytes(bytes []byte) (map[string]interface{}, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if len(unmarshalSlice) == 0 {
|
||||||
|
return map[string]interface{}{}, nil
|
||||||
|
}
|
||||||
t, ok := unmarshalSlice[0].(map[string]interface{})
|
t, ok := unmarshalSlice[0].(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -228,10 +231,20 @@ func getMapBytes(value map[string]interface{}) map[string]interface{} {
|
|||||||
func GetMapFromStructure(structure any) map[string]interface{} {
|
func GetMapFromStructure(structure any) map[string]interface{} {
|
||||||
typ := reflect.TypeOf(structure)
|
typ := reflect.TypeOf(structure)
|
||||||
|
|
||||||
return getMapStruct(typ)
|
for typ.Kind() == reflect.Slice || typ.Kind() == reflect.Ptr {
|
||||||
|
typ = typ.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMapStruct(t reflect.Type) map[string]interface{} {
|
return getMapStruct(typ, make(map[reflect.Type]bool))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getMapStruct(t reflect.Type, visited map[reflect.Type]bool) map[string]interface{} {
|
||||||
|
if visited[t] {
|
||||||
|
return map[string]interface{}{}
|
||||||
|
}
|
||||||
|
visited[t] = true
|
||||||
|
defer func() { visited[t] = false }()
|
||||||
|
|
||||||
temporary := make(map[string]interface{})
|
temporary := make(map[string]interface{})
|
||||||
for i := 0; i < t.NumField(); i++ {
|
for i := 0; i < t.NumField(); i++ {
|
||||||
tag := t.Field(i).Tag.Get("json")
|
tag := t.Field(i).Tag.Get("json")
|
||||||
@@ -243,16 +256,16 @@ func getMapStruct(t reflect.Type) map[string]interface{} {
|
|||||||
elem := t.Field(i).Type.Elem()
|
elem := t.Field(i).Type.Elem()
|
||||||
switch elem.Kind() {
|
switch elem.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
temporary[tag] = getMapStruct(elem)
|
temporary[tag] = getMapStruct(elem, visited)
|
||||||
default:
|
default:
|
||||||
temporary[tag] = map[string]interface{}{}
|
temporary[tag] = map[string]interface{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
if tag == "" {
|
if tag == "" {
|
||||||
return getMapStruct(t.Field(i).Type)
|
return getMapStruct(t.Field(i).Type, visited)
|
||||||
} else {
|
} else {
|
||||||
temporary[tag] = getMapStruct(t.Field(i).Type)
|
temporary[tag] = getMapStruct(t.Field(i).Type, visited)
|
||||||
}
|
}
|
||||||
// в этом месте работает некорректно для вложенных структур без json тегов (scope - все в cloudbroker)
|
// в этом месте работает некорректно для вложенных структур без json тегов (scope - все в cloudbroker)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user