v1.16.1
This commit is contained in:
dayterr
2026-08-28 16:36:41 +03:00
parent eb195dd992
commit b3fccfb000
131 changed files with 3204 additions and 478 deletions

View File

@@ -1,3 +1,4 @@
version: "2"
linters: linters:
enable: enable:
- bodyclose - bodyclose
@@ -5,19 +6,20 @@ linters:
- dogsled - dogsled
- errorlint - errorlint
- exhaustive - exhaustive
- exportloopref
- exhaustive
#- gocognit
- goconst - goconst
#- gocyclo
- gosec - gosec
- makezero - makezero
#- nestif - musttag
- nilerr - nilerr
- noctx
- prealloc - prealloc
- revive
- staticcheck
- unconvert - unconvert
- unparam - unparam
- noctx - unused
exclusions:
presets:
- comments
issues: issues:
max-same-issues: 0 max-same-issues: 0

View File

@@ -1,144 +1,99 @@
## Version 1.16.0 ## Version 1.16.1
Метод `ConfigFieldEdit` в cloudbroker/sep стал deprecated и в следующих версиях будет удалён
### Deprecated
Перечисленные методы будут удалены в `v1.17`
| Метод | CloudAPI | CloudBroker |
| --- | --- | --- |
| `account/AddUser` | :heavy_check_mark: | :heavy_check_mark: |
| `account/DeleteUser` | :heavy_check_mark: | :heavy_check_mark: |
| `account/UpdateUser` | :heavy_check_mark: | :heavy_check_mark: |
| `compute/UserGrant` | :heavy_check_mark: | :heavy_check_mark: |
| `compute/UserList` | :heavy_check_mark: | :heavy_check_mark: |
| `compute/UserRevoke` | :heavy_check_mark: | :heavy_check_mark: |
| `compute/UserUpdate` | :heavy_check_mark: | :heavy_check_mark: |
| `rg/AccessGrant` | :heavy_check_mark: | :heavy_check_mark: |
| `rg/AccessRevoke` | :heavy_check_mark: | :heavy_check_mark: |
| `sep/ConfigFieldEdit` | :x: | :heavy_check_mark: |
### Добавлено ### Добавлено
#### Общее
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-991 | Допустимые значения `vgpu` и `pcidevice` в валидатор возможностей гипервизора ComputeFeatures |
#### account #### account
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-986 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVINS` в cloudbroker/account и cloudapi/account | | BGOS-1007 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/account и в cloudbroker/account |
| BGOS-989 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуры ответа `Computes` и `RGComputes` в cloudapi/account | | BGOS-1007 | Структура запроса `DelACLAccessRequest` и метод `DelACLAccess` в cloudapi/account и в cloudbroker/account |
| BGOS-989 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуру ответа `Computes` в cloudbroker/account | | BGOS-1007 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/account и в cloudbroker/account |
#### backup
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1012 | Методы `AbortDisksBackup`, `BackupDisksWithSpeed`, `Info` и `SetBackupSpeed` в cloudbroker/backup |
| BGOS-1012 | Структуры ответов `ListDisksWithSpeed` и `TotalBackupsInfo` в cloudbroker/backup |
| BGOS-1018 | Опциональное поле `Speed` в структуры запроса `CreateDiskBackupRequest` и `Disk` в cloudbroker/backup |
#### compute #### compute
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-977 | Вычисляемое поле `ImageID` в структуру ответа `InfoDisk` в cloudbroker/compute и cloudapi/compute | | BGOS-1009 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-978 | Вычисляемое поле `WatchdogAction` в структуры ответа `RecordCompute` и `ItemCompute` в cloudapi/compute | | BGOS-1009 | Структура запроса `DeleteACLAccessRequest` и метод `DeleteACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-978 | Вычисляемое поле `WatchdogAction` в структуры ответа `RecordCompute` и `InfoCompute` в cloudbroker/compute | | BGOS-1009 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-979 | Опциональное поле `WatchdogAction` в структуру запроса `UpdateRequest` в cloudapi/compute и cloudbroker/compute | | BGOS-1009 | Структура запроса `GetACLAccessRequest` и метод `GetACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-994 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemVNFInterface` в cloudapi/compute | | BGOS-1014 | Вычисляемое поле `MemoryBalloonMode` в структуры ответа `ItemCompute` и `RecordCompute` в cloudapi/compute |
| BGOS-994 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemInterface` в cloudbroker/compute | | BGOS-1014 | Вычисляемое поле `MemoryBalloonMode` в структуры ответа `InfoCompute` и `RecordCompute` в cloudbroker/compute |
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute | | BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуру запроса `UpdateRequest` в cloudbroker/compute и cloudapi/compute |
| BGOS-994 | Методы `ChangeQoSPolicies` и `ChangeQoSPoliciesAsync` в cloudbroker/compute и cloudapi/compute | | BGOS-1016 | Вычисляемое поле `ProfileName` в структуру ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
| BGOS-995 | Вычисляемые поля `ComputeID`, `BusNumber`, `DeviceReference`, `MdevUUID`, `ParentPCIAddress`, `ProfileReference` и `SplitMode` в структуру ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute | | BGOS-1019 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemShadowComputeInterface` в cloudbroker/compute |
| BGOS-999 | Вычисляемое поле `AccountIDs` в структуру ответа `ItemPCIDevice` в cloudbroker/compute и cloudapi/compute |
#### disks #### disks
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-976 | Метод `CreateAsync` в cloudapi/disks | | BGOS-1015 | Методы `DeleteAsync`, `DeleteDisksAsync`, `LimitIOAsync`, `RenameAsync`, `ReplicateAsync`, `ReplicationResumeAsync`, `ReplicationReverseAsync`, `ReplicationStartAsync`, `ReplicationStopAsync`, `ReplicationSuspendAsync`, `Resize2Async`, `RestoreAsync`, `ShareAsync`, `UnshareAsync`, `SnapshotDeleteAsync`, `SnapshotRollbackAsync`, `ChangeDiskStoragePolicyAsync` в cloudapi/disks |
| BGOS-976 | Методы `CreateAsync` и `MigrateAsync` в cloudbroker/disks | | BGOS-1015 | Методы `DeleteAsync`, `DeleteDisksAsync`, `DepresentAsync`, `LimitIOAsync`, `MigrateAbortAsync`, `PresentAsync`, `RenameAsync`, `ReplicateAsync`, `ReplicationResumeAsync`, `ReplicationReverseAsync`, `ReplicationStartAsync`, `ReplicationStopAsync`, `ReplicationSuspendAsync`, `Resize2Async`, `RestoreAsync`, `ShareAsync`, `UnshareAsync`, `SnapshotDeleteAsync`, `SnapshotRollbackAsync`, `ChangeDiskStoragePolicyAsync`, `UpdateAsync` в cloudbroker/disks |
#### grid #### extnet
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1000 | Вычисляемые поля `ReservedCPU` и `ReservedRAM` в структуру ответа `RecordSettingsGrid` в cloudbroker/grid | | BGOS-1013 | Опциональное поле `AutoAssignable` в структуру запроса `AddReserveIPRequest` в cloudbroker/extnet |
| BGOS-1013 | Опциональное поле `AutoAssignable` в структуру запроса `GetReservedIP` в cloudbroker/extnet и cloudapi/extnet |
| BGOS-1013 | Вычисляемое поле `AutoAssignable` в структуру ответа `Reservations` в cloudbroker/extnet и cloudapi/extnet |
#### kvmx86 #### kvmx86
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-979 | Опциональное поле `WatchdogAction` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 | | BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 |
| BGOS-979 | Опциональное поле `WatchdogAction` в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 | | BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 |
| BGOS-983 | Метод `CreateAsync` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
| BGOS-984 | Опциональное поле `ReadOnly` в структуру запроса `DataDisk` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `Interface` в cloudbroker/kvmx86 и cloudapi/kvmx86 |
| BGOS-994 | Опциональное поле `QoSPolicies` в структуру запроса `InterfaceMassCreate` в cloudbroker/kvmx86 |
#### locations
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-992 | Вычисляемое поле `Budget` в структуру ответа `ItemLocation` в cloudapi/locations |
#### network qos policy
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-993 | Группа ручек `QoSPolicy` в cloudbroker/qospolicy и cloudapi/qospolicy |
#### resmon
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-981 | Вычисляемое поле `TotalVCPUs` в структуру ответа `GetByNodePoint` в cloudbroker/resmon |
#### rg
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-998 | Опциональное поле `IPCIDR` в структуру запроса `CreateRequest` в cloudbroker/rg |
#### tasks
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-996 | Опицональные поля `CreatedTimeAt` и `CreatedTimeTo` в структуру запроса `ListRequest` в cloudapi/tasks и cloudbroker/tasks |
| BGOS-996 | Вычисляемое поле `CreatedTime` в структуру ответа `RecordAsyncTask` в cloudapi/tasks |
| BGOS-996 | Вычисляемое поле `CreatedTime` в структуру ответа `ItemTask` в cloudbroker/tasks |
#### user
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-988 | Вычисляемые поля `Destroying`, `Confirmed` и `Deleted` в структуру ответа `Accounts` в cloudapi/user |
| BGOS-988 | Вычисляемые поля `Starting`, `Stopping`, `Paused`, `Pausing`, `Merge`, `Migrating`, `MigratingIn`, `MigratingOut`, `Down`, `Scheduled`, `BackupStopped`, `BackupRunning`, `Snapcreate`, `Cloning` и `Rollback` в структуру ответа `Computes` в cloudapi/user |
| BGOS-988 | Вычисляемые поля `Modeled`, `Created`, `Deleted`, `Deleting`, `Destroying`, `Disabling`, `Enabling` и `Restoring` в структуру ответа `RGs` в cloudapi/user |
#### vins
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-986 | Вычисляемое поле `EnableDefaultGateway` в структуру ответа `ItemVINS` в cloudapi/vins |
#### vgpu
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-980 | Опциональные поля `AccountIDs`, `MDEVType` и `PCIAddress` в структуру запроса `CreateRequest` в cloudbroker/vgpu |
| BGOS-980 | Опциональное поле `SplitMode` в структуру запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Вычисляемые поля `ComputeID`, `DeviceReference`, `MdevUUID`, `ParentPCIAddress`, `ProfileReference` и `SplitMode` в структуру ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Вычисляемое поле `BusNumber` в структуру ответа `ItemVGPU` в cloudbroker/vgpu |
#### zone
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-997 | Вычисляемые поля `SDRS`, `SDRSMode` и `LoggingLevel` в структуры ответа `RecordZone` и `ItemZone` в cloudapi/zone и cloudbroker/zone |
### Изменено
#### bservice
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1003 | Тип опционального поля `UserData` в структуре запроса `GroupAddRequest` сo `string` на `interface{}` в cloudbroker/bservice и cloudapi/bservice |
#### compute
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-995 | Название вычисляемого поля `AccountID` на `AccountIDs` и тип с `uint64` на `[]uint64` в структуре ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
| BGOS-995 | Тип вычисляемого поля `VGPUs` с `[]VGPUItem` на `[]ItemVGPU` в структурах ответов `RecordCompute` и `SnapRecordCompute` в cloudbroker/compute и cloudapi/compute |
#### disks
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-987 | Тип опционального поля `Status` в структуре запроса `ListRequest` с `string` на `[]string` в cloudbroker/disks и cloudapi/disks |
#### k8s
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1002 | Тип опционального поля `UserData` в структурах запросов `CreateRequest` и `UpdateWorkerNodesMetaDataRequest` со `string` на `interface{}` в cloudbroker/k8s и cloudapi/k8s |
#### node #### node
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-982 | Тип вычисляемого поля `Total` с `ResourcesInfo` на `FreeResourcesInfo` в структуре ответа `ConsumptionInfo` в cloudbroker/node | | BGOS-1020 | Опциональное поле `Mode` в структуру запроса `PCIDeviceDriverToKernelRequest` в cloudbroker/node |
#### pcidevice
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-990 | Опциональное поле `AccountID` в структуру запроса `ListRequest` в cloudapi/pcidevice и в структуры запроса `CreateRequest` и `ListRequest` в cloudbroker/pcidevice |
| BGOS-990 | Вычисляемое поле `AccountID` в структуру ответа `ItemPCIDevice` в cloudapi/pcidevice и в структуру ответа `ItemPCIDevice` в cloudbroker/pcidevice |
| BGOS-990 | Метод `AccessGrant` и структура запроса `AccessGrantRequest` в cloudbroker/pcidevice |
| BGOS-990 | Метод `AccessRevoke` и структура запроса `AccessRevokeRequest` в cloudbroker/pcidevice |
#### rg
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1008 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `DeleteACLAccessRequest` и метод `DeleteACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `GetACLAccessRequest` и метод `GetACLAccess` в cloudapi/rg и в cloudbroker/rg |
#### vgpu #### vgpu
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-980 | Тип опционального поля `ProfileID` в структуре запроса `CreateRequest` с `uint64` на `string` в cloudbroker/vgpu | | BGOS-1011 | Вычисляемое поле `ProfileName` в структуру ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Название вычисляемого поля `AccountID` на `AccountIDs` и тип с `uint64` на `[]uint64` в структуре ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Название опционального поля `NID` на `NodeID` в структуре запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
### Удалено ### Удалено
@@ -146,64 +101,17 @@
#### account #### account
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-975 | Метод `Audits` из cloudapi/account и cloudbroker/account | | BGOS-1021 | Вычисляемое поле `CanBeDeleted` из структуры ответа `ListRecordACL` в cloudapi/account |
| BGOS-975 | Методы `Delete`, `Disable`, `Enable`, `GetConsumedCloudUnitsByType` и `GetReservedAccountUnits` из cloudapi/account |
| BGOS-975 | Методы `Disable` и `Enable` из cloudbroker/account |
#### compute #### network qos policy
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-975 | Метод `Audits` из cloudapi/compute и cloudbroker/compute | | BGOS-1017 | Вычисляемые поля `CreatedAt`, `UpdatedAt`, `CreatedBy` и `UpdatedBy` из структур ответа `ItemQoSPolicy` и `RecordQoSPolicy` в cloudapi/qospolicy и cloudbroker/qospolicy |
| BGOS-975 | Методы `ComputeCISet`, `ComputeCIUnset`, `GetLog` и `GetAudits` из cloudbroker/compute | | BGOS-1017 | Методы `FilterByCreatedBy` и `FilterByUpdatedBy` из cloudapi/qospolicy и cloudbroker/qospolicy |
| BGOS-975 | Метод `GetAudits` из cloudapi/compute | | BGOS-1017 | Методы `SortByCreatedAt` и `SortByUpdatedAt` из cloudapi/qospolicy и cloudbroker/qospolicy |
| BGOS-995 | Вычисляемые поля `LastClaimedBy`, `Mode`, `ProfileID`, `RAM`, `ReferenceID`, `RGID`, `Type` и `VMID` из структуры `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
| BGOS-995 | Cтруктура `VGPUItem` в cloudbroker/compute и cloudapi/compute |
| BGOS-999 | Вычисляемое поле `RGID` из структуры ответа `ItemPCIDevice` в cloudbroker/compute и cloudapi/compute |
| BGOS-999 | Опциональное поле `RGID` из структуры запроса `ListPCIDeviceRequest` в cloudbroker/compute и cloudapi/compute |
#### grid #### pcidevice
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-975 | Методы `ExecuteMaintenanceScript`, `ListEmails` и `ServicesRestart` из cloudbroker/grid | | BGOS-990 | Опциональное поле `RGID` из структуры запроса `ListRequest` в cloudapi/pcidevice и из структур запроса `CreateRequest` и `ListRequest` в cloudbroker/pcidevice |
| BGOS-990 | Вычисляемое поле `RGID` из структуры ответа `ItemPCIDevice` в cloudapi/pcidevice и из структуры ответа `ItemPCIDevice` в cloudbroker/pcidevice |
#### group
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Метод `Get` из cloudbroker/group |
#### image
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Методы `ComputeCISet` и `ComputeCIUnset` из cloudbroker/image |
#### rg
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Метод `Audits` из cloudapi/rg и cloudbroker/rg |
#### sep
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke` и `AccessRevokeToPool` из cloudbroker/sep |
#### user
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Метод `IsValidInviteUserToken` из cloudapi/user |
| BGOS-975 | Метод `GetAudit` из cloudapi/user и cloudbroker/user |
| BGOS-988 | Структуры `CSs` и `VMs` из структуры ответа `BriefResources` из cloudapi/user |
| BGOS-988 | Вычисляемое поле `Enabled` из структур ответов `Accounts` и `RGs` из cloudapi/user |
#### vins
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-975 | Метод `Audits` из cloudapi/vins и cloudbroker/vins |
#### vgpu
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-980 | Опциональные поля `RGID` и `Allocate` из структуры запроса `CreateRequest` в cloudbroker/vgpu |
| BGOS-980 | Опциональные поле `Force` из структуры запроса `DestroyRequest` в cloudbroker/vgpu |
| BGOS-980 | Опциональные поля `Type`, `Mode` и `RGID` из структуры запроса `ListRequest` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Вычисляемые поля `LastClaimedBy`, `Mode`, `ProfileID`, `RAM`, `ReferenceID`, `RGID`, `Type` и `VMID` из структуры ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
| BGOS-980 | Методы `Allocate` и `Deallocate` из cloudbroker/vgpu |

View File

@@ -492,5 +492,11 @@ func sepDescriptionValidator(fe validator.FieldLevel) bool {
func watchdogActionValidator(fe validator.FieldLevel) bool { func watchdogActionValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String() fieldValue := fe.Field().String()
return IsInSlice(fieldValue, watchdogActionVaues) return IsInSlice(fieldValue, watchdogActionValues)
}
func memoryBalloonModeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, memoryBalloonModeValues)
} }

View File

@@ -331,5 +331,10 @@ func registerAllValidators(validate *validator.Validate) error {
return err return err
} }
err = validate.RegisterValidation("memoryBalloonMode", memoryBalloonModeValidator)
if err != nil {
return err
}
return nil return nil
} }

View File

@@ -81,7 +81,9 @@ var (
sepTechStatusValues = []string{"ENABLED", "DISABLED"} sepTechStatusValues = []string{"ENABLED", "DISABLED"}
watchdogActionVaues = []string{"reset", "shutdown", "poweroff", "pause", "none"} watchdogActionValues = []string{"reset", "shutdown", "poweroff", "pause", "none"}
memoryBalloonModeValues = []string{"auto", "legacy", "none"}
) )
const ( const (

View File

@@ -0,0 +1,40 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddACLAccessRequest adds ACL access to an account
type AddACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// AddACLAccess adds ACL access to an account.
func (a Account) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/account/add_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -27,6 +27,8 @@ type AddUserRequest struct {
} }
// AddUser gives a user access rights. // AddUser gives a user access rights.
//
// Deprecated: will be removed in SDK v1.17
func (a Account) AddUser(ctx context.Context, req AddUserRequest) (bool, error) { func (a Account) AddUser(ctx context.Context, req AddUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,39 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DelACLAccessRequest deletes ACL access from an account
type DelACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// DelACLAccess deletes ACL access from an account.
func (a Account) DeleteACLAccess(ctx context.Context, req DelACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/account/del_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -20,6 +20,8 @@ type DeleteUserRequest struct {
} }
// DeleteUser revokes user access from the account // DeleteUser revokes user access from the account
//
// Deprecated: will be removed in SDK v1.17
func (a Account) DeleteUser(ctx context.Context, req DeleteUserRequest) (bool, error) { func (a Account) DeleteUser(ctx context.Context, req DeleteUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -19,9 +19,6 @@ type ListRecordACL struct {
// Account owner ID // Account owner ID
UgroupID string `json:"userGroupId"` UgroupID string `json:"userGroupId"`
// Is it possible to remove
CanBeDeleted bool `json:"canBeDeleted"`
} }
// Access Control List // Access Control List

View File

@@ -0,0 +1,40 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateACLAccessRequest updates ACL access in an account
type UpdateACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// UpdateACLAccess updates ACL access in an account.
func (a Account) UpdateACLAccess(ctx context.Context, req UpdateACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/account/update_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -27,6 +27,8 @@ type UpdateUserRequest struct {
} }
// UpdateUser updates user access rights // UpdateUser updates user access rights
//
// Deprecated: will be removed in SDK v1.17
func (a Account) UpdateUser(ctx context.Context, req UpdateUserRequest) (bool, error) { func (a Account) UpdateUser(ctx context.Context, req UpdateUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,40 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddACLAccessRequest adds ACL access to a vm
type AddACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// AddACLAccess adds ACL access to a vm.
func (c Compute) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/add_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,39 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DeleteACLAccessRequest deletes ACL access from a vm
type DeleteACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// DeleteACLAccess deletes ACL access from a vm.
func (c Compute) DeleteACLAccess(ctx context.Context, req DeleteACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/del_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,44 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetACLAccessRequest struct to get detailed information about ACL account in a vm
type GetACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
}
// Get gets current configuration of the ACL access in a vm as a RecordRGACLAccess struct
func (c Compute) GetACLAccess(ctx context.Context, req GetACLAccessRequest) (*RecordComputeACLAccess, error) {
res, err := c.GetACLAccessRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordComputeACLAccess{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetACLAccessRaw gets current configuration of the ACL access in a vm as an array of bytes
func (c Compute) GetACLAccessRaw(ctx context.Context, req GetACLAccessRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/get_acl_access"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -446,6 +446,9 @@ type RecordCompute struct {
// Manager type // Manager type
ManagerType string `json:"managerType"` ManagerType string `json:"managerType"`
// Memory balloon mode
MemoryBalloonMode string `json:"memory_balloon_mode"`
// Migration job // Migration job
MigrationJob uint64 `json:"migrationjob"` MigrationJob uint64 `json:"migrationjob"`
@@ -574,6 +577,58 @@ type RecordCompute struct {
ZoneID uint64 `json:"zoneId"` ZoneID uint64 `json:"zoneId"`
} }
// Detailed information about ACL Access in a compute
type RecordComputeACLAccess struct {
// Data
Data DataACL `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Data ACL
type DataACL struct {
// RG ACL list
RGACLList []RGACL `json:"rgACL"`
// Account ACL list
AccountACLList []AccountACL `json:"accountACL"`
// Compute ACL list
ComputeACLList []ComputeACL `json:"computeACL"`
}
// RG ACL info
type RGACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Account ACL info
type AccountACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Compute ACL info
type ComputeACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
type SnapRecordCompute struct { type SnapRecordCompute struct {
// Access Control List // Access Control List
ACL ListACL `json:"acl"` ACL ListACL `json:"acl"`
@@ -1396,6 +1451,9 @@ type ItemCompute struct {
// Manager type // Manager type
ManagerType string `json:"managerType"` ManagerType string `json:"managerType"`
// Memory balloon mode
MemoryBalloonMode string `json:"memory_balloon_mode"`
// Migration job // Migration job
MigrationJob uint64 `json:"migrationjob"` MigrationJob uint64 `json:"migrationjob"`
@@ -1591,6 +1649,9 @@ type ItemVGPU struct {
// Profile Reference // Profile Reference
ProfileReference string `json:"profile_reference"` ProfileReference string `json:"profile_reference"`
// Profile Name
ProfileName string `json:"profile_name"`
// Split Mode // Split Mode
SplitMode string `json:"split_mode"` SplitMode string `json:"split_mode"`

View File

@@ -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"
) )
@@ -95,7 +96,7 @@ type NetAttachRequest struct {
type wrapperNetAttachRequest struct { type wrapperNetAttachRequest struct {
NetAttachRequest NetAttachRequest
AsyncMode bool `url:"asyncMode"` AsyncMode bool `url:"asyncMode" json:"asyncMode"`
} }
// NetAttach attaches network to compute and gets info about network // NetAttach attaches network to compute and gets info about network
@@ -112,7 +113,7 @@ func (c Compute) NetAttach(ctx context.Context, req NetAttachRequest) (*RecordNe
url := "/cloudapi/compute/netAttach" url := "/cloudapi/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -141,7 +142,7 @@ func (c Compute) NetAttachAsync(ctx context.Context, req NetAttachRequest) (stri
url := "/cloudapi/compute/netAttach" url := "/cloudapi/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@@ -79,6 +79,11 @@ type UpdateRequest struct {
// Required: false // Required: false
// Default: reset // Default: reset
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"` WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
// Memory balloon mode. One of ["auto","legacy","none"]
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
} }
// Update updates some properties of the compute // Update updates some properties of the compute

View File

@@ -0,0 +1,40 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateACLAccessRequest updates ACL access in a vm
type UpdateACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// UpdateACLAccess updates ACL access in a vm.
func (c Compute) UpdateACLAccess(ctx context.Context, req UpdateACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/update_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -28,6 +28,8 @@ type UserGrantRequest struct {
} }
// UserGrant grants user access to the compute // UserGrant grants user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserGrant(ctx context.Context, req UserGrantRequest) (bool, error) { func (c Compute) UserGrant(ctx context.Context, req UserGrantRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -16,6 +16,8 @@ type UserListRequest struct {
} }
// UserList gets users list for compute // UserList gets users list for compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserList(ctx context.Context, req UserListRequest) (*ListUsers, error) { func (c Compute) UserList(ctx context.Context, req UserListRequest) (*ListUsers, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -20,6 +20,8 @@ type UserRevokeRequest struct {
} }
// UserRevoke revokes user access to the compute // UserRevoke revokes user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserRevoke(ctx context.Context, req UserRevokeRequest) (bool, error) { func (c Compute) UserRevoke(ctx context.Context, req UserRevokeRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -28,6 +28,8 @@ type UserUpdateRequest struct {
} }
// UserUpdate updates user access to the compute // UserUpdate updates user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserUpdate(ctx context.Context, req UserUpdateRequest) (bool, error) { func (c Compute) UserUpdate(ctx context.Context, req UserUpdateRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ChangeDiskStoragePolicyRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
} }
type wrapperChangeDiskStoragePolicyRequest struct {
ChangeDiskStoragePolicyRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ChangeDiskStoragePolicy changes storage policy for disk // ChangeDiskStoragePolicy changes storage policy for disk
func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) { func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
url := "/cloudapi/disks/change_disk_storage_policy" url := "/cloudapi/disks/change_disk_storage_policy"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperChangeDiskStoragePolicyRequest{
ChangeDiskStoragePolicyRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
return result, nil return result, nil
} }
// ChangeDiskStoragePolicyAsync changes storage policy for disk in async mode
func (d Disks) ChangeDiskStoragePolicyAsync(ctx context.Context, req ChangeDiskStoragePolicyRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/change_disk_storage_policy"
wrappedReq := wrapperChangeDiskStoragePolicyRequest{
ChangeDiskStoragePolicyRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -23,6 +24,12 @@ type DeleteRequest struct {
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
} }
type wrapperDeleteRequest struct {
DeleteRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Delete deletes disk by ID // Delete deletes disk by ID
func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) { func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -32,7 +39,12 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
url := "/cloudapi/disks/delete" url := "/cloudapi/disks/delete"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -44,3 +56,30 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
return result, nil return result, nil
} }
// DeleteAsync deletes disk by ID in async mode
func (d Disks) DeleteAsync(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/delete"
wrappedReq := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type DisksDeleteRequest struct {
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
} }
type wrapperDisksDeleteRequest struct {
DisksDeleteRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// DeleteDisks deletes multiple disks permanently // DeleteDisks deletes multiple disks permanently
func (d Disks) DeleteDisks(ctx context.Context, req DisksDeleteRequest) (bool, error) { func (d Disks) DeleteDisks(ctx context.Context, req DisksDeleteRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) DeleteDisks(ctx context.Context, req DisksDeleteRequest) (bool, e
url := "/cloudapi/disks/deleteDisks" url := "/cloudapi/disks/deleteDisks"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperDisksDeleteRequest{
DisksDeleteRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) DeleteDisks(ctx context.Context, req DisksDeleteRequest) (bool, e
return result, nil return result, nil
} }
// DeleteDisksAsync deletes multiple disks permanently in async mode
func (d Disks) DeleteDisksAsync(ctx context.Context, req DisksDeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/deleteDisks"
wrappedReq := wrapperDisksDeleteRequest{
DisksDeleteRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -25,4 +25,4 @@ func (lsd ListSearchDisks) IDs() []uint64 {
res = append(res, d.ID) res = append(res, d.ID)
} }
return res return res
} }

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -71,6 +72,12 @@ type LimitIORequest struct {
SizeIOPSSec uint64 `url:"size_iops_sec,omitempty" json:"size_iops_sec,omitempty"` SizeIOPSSec uint64 `url:"size_iops_sec,omitempty" json:"size_iops_sec,omitempty"`
} }
type wrapperLimitIORequest struct {
LimitIORequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// LimitIO limit IO for a certain disk // LimitIO limit IO for a certain disk
// total and read/write options are not allowed to be combined // total and read/write options are not allowed to be combined
// see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details // see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details
@@ -82,7 +89,12 @@ func (d Disks) LimitIO(ctx context.Context, req LimitIORequest) (bool, error) {
url := "/cloudapi/disks/limitIO" url := "/cloudapi/disks/limitIO"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperLimitIORequest{
LimitIORequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -94,3 +106,32 @@ func (d Disks) LimitIO(ctx context.Context, req LimitIORequest) (bool, error) {
return result, nil return result, nil
} }
// LimitIOAsync limits IO for a certain disk in async mode
// total and read/write options are not allowed to be combined
// see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details
func (d Disks) LimitIOAsync(ctx context.Context, req LimitIORequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/limitIO"
wrappedReq := wrapperLimitIORequest{
LimitIORequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type RenameRequest struct {
Name string `url:"name" json:"name" validate:"required"` Name string `url:"name" json:"name" validate:"required"`
} }
type wrapperRenameRequest struct {
RenameRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Rename renames disk // Rename renames disk
func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) { func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
url := "/cloudapi/disks/rename" url := "/cloudapi/disks/rename"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperRenameRequest{
RenameRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
return result, nil return result, nil
} }
// RenameAsync renames disk in async mode
func (d Disks) RenameAsync(ctx context.Context, req RenameRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/rename"
wrappedReq := wrapperRenameRequest{
RenameRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -31,6 +32,12 @@ type ReplicateRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
} }
type wrapperReplicateRequest struct {
ReplicateRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Replicate create an empty disk in chosen SEP and pool combination. // Replicate create an empty disk in chosen SEP and pool combination.
// Starts replication between chosen disk and newly created disk // Starts replication between chosen disk and newly created disk
// Note: only TATLIN type SEP are supported for replications between // Note: only TATLIN type SEP are supported for replications between
@@ -42,7 +49,12 @@ func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, err
url := "/cloudapi/disks/replicate" url := "/cloudapi/disks/replicate"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicateRequest{
ReplicateRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -54,3 +66,32 @@ func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, err
return result, nil return result, nil
} }
// ReplicateAsync creates an empty disk in chosen SEP and pool combination in async mode.
// Starts replication between chosen disk and newly created disk
// Note: only TATLIN type SEP are supported for replications between
func (d Disks) ReplicateAsync(ctx context.Context, req ReplicateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicate"
wrappedReq := wrapperReplicateRequest{
ReplicateRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationResumeRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationResumeRequest struct {
ReplicationResumeRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationResume resume suspended replication // ReplicationResume resume suspended replication
func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeRequest) (bool, error) { func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
url := "/cloudapi/disks/replicationResume" url := "/cloudapi/disks/replicationResume"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationResumeRequest{
ReplicationResumeRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
return result, nil return result, nil
} }
// ReplicationResumeAsync resumes suspended replication in async mode
func (d Disks) ReplicationResumeAsync(ctx context.Context, req ReplicationResumeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicationResume"
wrappedReq := wrapperReplicationResumeRequest{
ReplicationResumeRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationReverseRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationReverseRequest struct {
ReplicationReverseRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationReverse change role between disks replications // ReplicationReverse change role between disks replications
func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseRequest) (bool, error) { func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
url := "/cloudapi/disks/replicationReverse" url := "/cloudapi/disks/replicationReverse"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationReverseRequest{
ReplicationReverseRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
return result, nil return result, nil
} }
// ReplicationReverseAsync changes role between disks replications in async mode
func (d Disks) ReplicationReverseAsync(ctx context.Context, req ReplicationReverseRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicationReverse"
wrappedReq := wrapperReplicationReverseRequest{
ReplicationReverseRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ReplicationStartRequest struct {
TargetDiskID uint64 `url:"targetDiskId" json:"targetDiskId" validate:"required"` TargetDiskID uint64 `url:"targetDiskId" json:"targetDiskId" validate:"required"`
} }
type wrapperReplicationStartRequest struct {
ReplicationStartRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationStart starts replication between two chosen disks. It's required for both disks to have same size to avoid replication conflicts // ReplicationStart starts replication between two chosen disks. It's required for both disks to have same size to avoid replication conflicts
// Note: Source disk's SEP and target SEP supported only of TATLIN type. // Note: Source disk's SEP and target SEP supported only of TATLIN type.
func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest) (bool, error) { func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest) (bool, error) {
@@ -29,7 +36,12 @@ func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest
url := "/cloudapi/disks/replicationStart" url := "/cloudapi/disks/replicationStart"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationStartRequest{
ReplicationStartRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -41,3 +53,31 @@ func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest
return result, nil return result, nil
} }
// ReplicationStartAsync starts replication between two chosen disks in async mode. It's required for both disks to have same size to avoid replication conflicts
// Note: Source disk's SEP and target SEP supported only of TATLIN type.
func (d Disks) ReplicationStartAsync(ctx context.Context, req ReplicationStartRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicationStart"
wrappedReq := wrapperReplicationStartRequest{
ReplicationStartRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationStopRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationStopRequest struct {
ReplicationStopRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationStop remove replication between disks completely // ReplicationStop remove replication between disks completely
func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest) (bool, error) { func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
url := "/cloudapi/disks/replicationStop" url := "/cloudapi/disks/replicationStop"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationStopRequest{
ReplicationStopRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
return result, nil return result, nil
} }
// ReplicationStopAsync removes replication between disks completely in async mode
func (d Disks) ReplicationStopAsync(ctx context.Context, req ReplicationStopRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicationStop"
wrappedReq := wrapperReplicationStopRequest{
ReplicationStopRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationSuspendRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationSuspendRequest struct {
ReplicationSuspendRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationSuspend pause replication with possibility to resume from pause moment // ReplicationSuspend pause replication with possibility to resume from pause moment
func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendRequest) (bool, error) { func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
url := "/cloudapi/disks/replicationSuspend" url := "/cloudapi/disks/replicationSuspend"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationSuspendRequest{
ReplicationSuspendRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
return result, nil return result, nil
} }
// ReplicationSuspendAsync pauses replication with possibility to resume from pause moment in async mode
func (d Disks) ReplicationSuspendAsync(ctx context.Context, req ReplicationSuspendRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/replicationSuspend"
wrappedReq := wrapperReplicationSuspendRequest{
ReplicationSuspendRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ResizeRequest struct {
Size uint64 `url:"size" json:"size" validate:"required"` Size uint64 `url:"size" json:"size" validate:"required"`
} }
type wrapperResizeRequest struct {
ResizeRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Resize2 resize disk // Resize2 resize disk
// Returns 200 if disk is resized online, else will return 202, // Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected. // in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
@@ -31,7 +38,12 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
url := "/cloudapi/disks/resize2" url := "/cloudapi/disks/resize2"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -43,3 +55,33 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
return result, nil return result, nil
} }
// Resize2Async resizes disk in async mode
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
// This method will not be used for disks, assigned to "old" virtual machines. Only unassigned disks and disks, assigned with computes.
func (d Disks) Resize2Async(ctx context.Context, req ResizeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/resize2"
wrappedReq := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type RestoreRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperRestoreRequest struct {
RestoreRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Restore restores a deleted unattached disk from recycle bin // Restore restores a deleted unattached disk from recycle bin
func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) { func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
url := "/cloudapi/disks/restore" url := "/cloudapi/disks/restore"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
return result, nil return result, nil
} }
// RestoreAsync restores a deleted unattached disk from recycle bin in async mode
func (d Disks) RestoreAsync(ctx context.Context, req RestoreRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/restore"
wrappedReq := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ShareRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperShareRequest struct {
ShareRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Share shares data disk // Share shares data disk
func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) { func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
url := "/cloudapi/disks/share" url := "/cloudapi/disks/share"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperShareRequest{
ShareRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
return result, nil return result, nil
} }
// ShareAsync shares data disk in async mode
func (d Disks) ShareAsync(ctx context.Context, req ShareRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/share"
wrappedReq := wrapperShareRequest{
ShareRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type SnapshotDeleteRequest struct {
Label string `url:"label" json:"label" validate:"required"` Label string `url:"label" json:"label" validate:"required"`
} }
type wrapperSnapshotDeleteRequest struct {
SnapshotDeleteRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// SnapshotDelete deletes a snapshot // SnapshotDelete deletes a snapshot
func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (bool, error) { func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (b
url := "/cloudapi/disks/snapshotDelete" url := "/cloudapi/disks/snapshotDelete"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperSnapshotDeleteRequest{
SnapshotDeleteRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (b
return result, nil return result, nil
} }
// SnapshotDeleteAsync deletes a snapshot in async mode
func (d Disks) SnapshotDeleteAsync(ctx context.Context, req SnapshotDeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/snapshotDelete"
wrappedReq := wrapperSnapshotDeleteRequest{
SnapshotDeleteRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -23,6 +24,12 @@ type SnapshotRollbackRequest struct {
TimeStamp uint64 `url:"timestamp,omitempty" json:"timestamp,omitempty"` TimeStamp uint64 `url:"timestamp,omitempty" json:"timestamp,omitempty"`
} }
type wrapperSnapshotRollbackRequest struct {
SnapshotRollbackRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// SnapshotRollback rollbacks an individual disk snapshot // SnapshotRollback rollbacks an individual disk snapshot
func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest) (bool, error) { func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -32,7 +39,12 @@ func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest
url := "/cloudapi/disks/snapshotRollback" url := "/cloudapi/disks/snapshotRollback"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperSnapshotRollbackRequest{
SnapshotRollbackRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -43,5 +55,31 @@ func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest
} }
return result, nil return result, nil
}
// SnapshotRollbackAsync rollbacks an individual disk snapshot in async mode
func (d Disks) SnapshotRollbackAsync(ctx context.Context, req SnapshotRollbackRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/snapshotRollback"
wrappedReq := wrapperSnapshotRollbackRequest{
SnapshotRollbackRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
} }

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type UnshareRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperUnshareRequest struct {
UnshareRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Unshare unshares data disk // Unshare unshares data disk
func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) { func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
url := "/cloudapi/disks/unshare" url := "/cloudapi/disks/unshare"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperUnshareRequest{
UnshareRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
return result, nil return result, nil
} }
// UnshareAsync unshares data disk in async mode
func (d Disks) UnshareAsync(ctx context.Context, req UnshareRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/unshare"
wrappedReq := wrapperUnshareRequest{
UnshareRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -17,6 +17,11 @@ type GetReservedIP struct {
// Field for specifying the ID of extnet whose reservation information we want to receive // Field for specifying the ID of extnet whose reservation information we want to receive
// Required: false // Required: false
ExtNetID uint64 `url:"extnetId,omitempty" json:"extnetId,omitempty"` ExtNetID uint64 `url:"extnetId,omitempty" json:"extnetId,omitempty"`
// Flag indicating whether the reserved IP can be auto-assigned
// Required: false
// Default: null
AutoAssignable interface{} `url:"auto_assignable,omitempty" json:"auto_assignable,omitempty" validate:"omitempty,isBool"`
} }
// GetReservedIP gets information about reserved address or address poll as a slice of RecordReservedIP struct // GetReservedIP gets information about reserved address or address poll as a slice of RecordReservedIP struct

View File

@@ -269,12 +269,13 @@ type RecordReservedIP struct {
} }
type Reservations struct { type Reservations struct {
AccountID int `json:"account_id"` AccountID int `json:"account_id"`
ClientType string `json:"clientType"` ClientType string `json:"clientType"`
DomainName string `json:"domainname"` DomainName string `json:"domainname"`
Hostname string `json:"hostname"` Hostname string `json:"hostname"`
IP string `json:"ip"` IP string `json:"ip"`
Mac string `json:"mac"` Mac string `json:"mac"`
Type string `json:"type"` Type string `json:"type"`
VMID int `json:"vmId"` VMID int `json:"vmId"`
AutoAssignable bool `json:"auto_assignable"`
} }

View File

@@ -247,6 +247,11 @@ type CreateRequest struct {
// Required: false // Required: false
// Default: reset // Default: reset
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"` WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
// Memory balloon mode. One of ["auto","legacy","none"]
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
} }
// GetRAM returns RAM field values // GetRAM returns RAM field values

View File

@@ -129,6 +129,11 @@ type CreateBlankRequest struct {
// Required: false // Required: false
// Default: reset // Default: reset
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"` WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
// Memory balloon mode. One of ["auto","legacy","none"]
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
} }
// GetRAM returns RAM field values // GetRAM returns RAM field values

View File

@@ -22,9 +22,9 @@ type ListRequest struct {
// Required: false // Required: false
Name string `url:"name,omitempty" json:"name,omitempty"` Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by rgId // Find by account ID
// Required: false // Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
// Find by status // Find by status
// Required: false // Required: false

View File

@@ -26,8 +26,8 @@ type ItemPCIDevice struct {
// Name // Name
Name string `json:"name"` Name string `json:"name"`
// Resource group ID // Account IDs
RGID uint64 `json:"rgId"` AccountIDs []uint64 `json:"account_ids"`
// Node ID // Node ID
NodeID uint64 `json:"nodeId"` NodeID uint64 `json:"nodeId"`

View File

@@ -45,24 +45,6 @@ func (lqp ListQoSPolicies) FilterByDescription(description string) ListQoSPolici
return lqp.FilterFunc(predicate) return lqp.FilterFunc(predicate)
} }
// FilterByCreatedBy returns ListQoSPolicies with specified CreatedBy
func (lqp ListQoSPolicies) FilterByCreatedBy(createdBy string) ListQoSPolicies {
predicate := func(iqp ItemQoSPolicy) bool {
return iqp.CreatedBy == createdBy
}
return lqp.FilterFunc(predicate)
}
// FilterByUpdatedBy returns ListQoSPolicies with specified UpdatedBy
func (lqp ListQoSPolicies) FilterByUpdatedBy(updatedBy string) ListQoSPolicies {
predicate := func(iqp ItemQoSPolicy) bool {
return iqp.UpdatedBy == updatedBy
}
return lqp.FilterFunc(predicate)
}
// FilterFunc allows filtering ListQoSPolicies based on a user-specified predicate // FilterFunc allows filtering ListQoSPolicies based on a user-specified predicate
func (lqp ListQoSPolicies) FilterFunc(predicate func(ItemQoSPolicy) bool) ListQoSPolicies { func (lqp ListQoSPolicies) FilterFunc(predicate func(ItemQoSPolicy) bool) ListQoSPolicies {
var result ListQoSPolicies var result ListQoSPolicies

View File

@@ -10,7 +10,6 @@ var qosPolicies = ListQoSPolicies{
Name: "qos1", Name: "qos1",
Description: "some desc", Description: "some desc",
Status: "ENABLED", Status: "ENABLED",
CreatedBy: "user",
}, },
{ {
ID: 3, ID: 3,
@@ -18,7 +17,6 @@ var qosPolicies = ListQoSPolicies{
Name: "qos3", Name: "qos3",
Description: "some desc", Description: "some desc",
Status: "ENABLED", Status: "ENABLED",
CreatedBy: "anotheruser",
}, },
{ {
ID: 5, ID: 5,
@@ -26,8 +24,6 @@ var qosPolicies = ListQoSPolicies{
Name: "qos5", Name: "qos5",
Description: "some other desc", Description: "some other desc",
Status: "DISABLED", Status: "DISABLED",
CreatedBy: "anotheruser",
UpdatedBy: "user",
}, },
}, },
EntryCount: 3, EntryCount: 3,
@@ -74,24 +70,3 @@ func TestFilterByStatus(t *testing.T) {
t.Fatal("expected Status DISABLED, found: ", actual.Status) t.Fatal("expected Status DISABLED, found: ", actual.Status)
} }
} }
func TestFilterByCreatedBy(t *testing.T) {
actual := qosPolicies.FilterByCreatedBy("anotheruser")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.CreatedBy != "anotheruser" {
t.Fatal("expected CreatedBy 'anotheruser', found: ", item.CreatedBy)
}
}
}
func TestFilterByUpdatedBy(t *testing.T) {
actual := qosPolicies.FilterByUpdatedBy("user").FindOne()
if actual.UpdatedBy != "user" {
t.Fatal("expected UpdatedBy 'user', found: ", actual.UpdatedBy)
}
}

View File

@@ -27,18 +27,6 @@ type ItemQoSPolicy struct {
// Status of the QoS policy // Status of the QoS policy
Status string `json:"status"` Status string `json:"status"`
// Created at (unix timestamp)
CreatedAt uint64 `json:"created_at"`
// Updated at (unix timestamp)
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
// List of rules // List of rules
Rules Rules `json:"rules"` Rules Rules `json:"rules"`
} }
@@ -62,18 +50,6 @@ type RecordQoSPolicy struct {
// Status of the QoS policy // Status of the QoS policy
Status string `json:"status"` Status string `json:"status"`
// Created at (unix timestamp)
CreatedAt uint64 `json:"created_at"`
// Updated at (unix timestamp)
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
// List of rules // List of rules
Rules Rules `json:"rules"` Rules Rules `json:"rules"`
} }

View File

@@ -1,39 +0,0 @@
package qospolicy
import "sort"
// SortByCreatedAt sorts ListQosPolicies by the CreatedAt field in ascending order
// If inverse param is set to true, the order is reversed
func (lqp ListQoSPolicies) SortByCreatedAt(inverse bool) ListQoSPolicies {
if len(lqp.Data) < 2 {
return lqp
}
sort.Slice(lqp.Data, func(i, j int) bool {
if inverse {
return lqp.Data[i].CreatedAt > lqp.Data[j].CreatedAt
}
return lqp.Data[i].CreatedAt < lqp.Data[j].CreatedAt
})
return lqp
}
// SortByUpdatedAt sorts ListQosPolicies by the UpdatedAt field in ascending order
// If inverse param is set to true, the order is reversed
func (lqp ListQoSPolicies) SortByUpdatedAt(inverse bool) ListQoSPolicies {
if len(lqp.Data) < 2 {
return lqp
}
sort.Slice(lqp.Data, func(i, j int) bool {
if inverse {
return lqp.Data[i].UpdatedAt > lqp.Data[j].UpdatedAt
}
return lqp.Data[i].UpdatedAt < lqp.Data[j].UpdatedAt
})
return lqp
}

View File

@@ -27,6 +27,8 @@ type AccessGrantRequest struct {
} }
// AccessGrant grants user or group access to the resource group as specified // AccessGrant grants user or group access to the resource group as specified
//
// Deprecated: will be removed in SDK v1.17
func (r RG) AccessGrant(ctx context.Context, req AccessGrantRequest) (bool, error) { func (r RG) AccessGrant(ctx context.Context, req AccessGrantRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -20,6 +20,8 @@ type AccessRevokeRequest struct {
} }
// AccessRevoke revokes specified user or group access from the resource group // AccessRevoke revokes specified user or group access from the resource group
//
// Deprecated: will be removed in SDK v1.17
func (r RG) AccessRevoke(ctx context.Context, req AccessRevokeRequest) (bool, error) { func (r RG) AccessRevoke(ctx context.Context, req AccessRevokeRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,40 @@
package rg
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddACLAccessRequest adds ACL access to a resource group
type AddACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// AddACLAccess adds ACL access to a resource group.
func (r RG) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/rg/add_acl_access"
res, err := r.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,39 @@
package rg
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DeleteACLAccessRequest deletes ACL access from a resource group
type DeleteACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// DeleteACLAccess deletes ACL access from a resource group.
func (r RG) DeleteACLAccess(ctx context.Context, req DeleteACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/rg/del_acl_access"
res, err := r.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,44 @@
package rg
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetACLAccessRequest struct to get detailed information about ACL account in a resource group
type GetACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
}
// Get gets current configuration of the ACL access in a resource group as a RecordRGACLAccess struct
func (r RG) GetACLAccess(ctx context.Context, req GetACLAccessRequest) (*RecordRGACLAccess, error) {
res, err := r.GetACLAccessRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordRGACLAccess{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetACLAccessRaw gets current configuration of the ACL access in a resource group as an array of bytes
func (r RG) GetACLAccessRaw(ctx context.Context, req GetACLAccessRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/rg/get_acl_access"
res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -159,6 +159,44 @@ type RecordResourceGroup struct {
Computes []uint64 `json:"vms"` Computes []uint64 `json:"vms"`
} }
// Detailed information about ACL Access in a resource group
type RecordRGACLAccess struct {
// Data
Data DataACL `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Data ACL
type DataACL struct {
// RG ACL list
RGACLList []RGACL `json:"rgACL"`
// Account ACL list
AccountACL []AccountACL `json:"accountACL"`
}
// RG ACL info
type RGACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Account ACL info
type AccountACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Main information about resource group // Main information about resource group
type ItemResourceGroup struct { type ItemResourceGroup struct {
// //

View File

@@ -0,0 +1,40 @@
package rg
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateACLAccessRequest updates ACL access in a resource group
type UpdateACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// UpdateACLAccess updates ACL access in a resource group.
func (r RG) UpdateACLAccess(ctx context.Context, req UpdateACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/rg/update_acl_access"
res, err := r.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -46,6 +46,9 @@ type ItemVGPU struct {
// Profile Reference // Profile Reference
ProfileReference string `json:"profile_reference"` ProfileReference string `json:"profile_reference"`
// Profile Name
ProfileName string `json:"profile_name"`
// Split Mode // Split Mode
SplitMode string `json:"split_mode"` SplitMode string `json:"split_mode"`

View File

@@ -0,0 +1,40 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddACLAccessRequest adds ACL access to an account
type AddACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// AddACLAccess adds ACL access to an account.
func (a Account) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/account/add_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -27,6 +27,8 @@ type AddUserRequest struct {
} }
// AddUser gives a user access rights. // AddUser gives a user access rights.
//
// Deprecated: will be removed in SDK v1.17
func (a Account) AddUser(ctx context.Context, req AddUserRequest) (bool, error) { func (a Account) AddUser(ctx context.Context, req AddUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,39 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DelACLAccessRequest deletes ACL access from an account
type DelACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// DelACLAccess deletes ACL access from an account.
func (a Account) DeleteACLAccess(ctx context.Context, req DelACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/account/del_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -20,6 +20,8 @@ type DeleteUserRequest struct {
} }
// DeleteUser revokes user access from the account // DeleteUser revokes user access from the account
//
// Deprecated: will be removed in SDK v1.17
func (a Account) DeleteUser(ctx context.Context, req DeleteUserRequest) (bool, error) { func (a Account) DeleteUser(ctx context.Context, req DeleteUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,40 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateACLAccessRequest updates ACL access in an account
type UpdateACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// UpdateACLAccess updates ACL access in an account.
func (a Account) UpdateACLAccess(ctx context.Context, req UpdateACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/account/update_acl_access"
res, err := a.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -27,6 +27,8 @@ type UpdateUserRequest struct {
} }
// UpdateUser updates user access rights // UpdateUser updates user access rights
//
// Deprecated: will be removed in SDK v1.17
func (a Account) UpdateUser(ctx context.Context, req UpdateUserRequest) (bool, error) { func (a Account) UpdateUser(ctx context.Context, req UpdateUserRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -0,0 +1,38 @@
package backup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type AbortDisksBackupRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
// AbortDisksBackup aborts disks backup
func (b Backup) AbortDisksBackup(ctx context.Context, req AbortDisksBackupRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/backup/abort_disks_backup"
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,40 @@
package backup
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type BackupDisksWithSpeedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
// Get backup disk list and speeds for a compute
func (b Backup) BackupDisksWithSpeed(ctx context.Context, req BackupDisksWithSpeedRequest) (ListDisksWithSpeed, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/backup/backup_disks_with_speed"
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return nil, err
}
result := make(ListDisksWithSpeed, 0)
err = json.Unmarshal(res, &result)
if err != nil {
return nil, err
}
return result, nil
}

View File

@@ -22,6 +22,10 @@ type CreateDiskBackupRequest struct {
// Backup path // Backup path
// Required: true // Required: true
BackupPath string `url:"backupPath" json:"backupPath" validate:"required"` BackupPath string `url:"backupPath" json:"backupPath" validate:"required"`
// Backup speed in Mb/s. 0 means no limits. Applicable only for STARTED computes
// Required: false
Speed uint64 `url:"speed,omitempty" json:"speed,omitempty"`
} }
type wrapperCreateDiskBackupRequest struct { type wrapperCreateDiskBackupRequest struct {

View File

@@ -15,6 +15,10 @@ type Disk struct {
// Backup path // Backup path
BackupPath string `url:"backupPath" json:"backupPath" validate:"required"` BackupPath string `url:"backupPath" json:"backupPath" validate:"required"`
// Backup speed in Mb/s. 0 means no limits. Applicable only for STARTED computes
// Required: false
Speed uint64 `url:"speed,omitempty" json:"speed,omitempty"`
} }
// CreateDisksBackupRequest struct for creating disks backup // CreateDisksBackupRequest struct for creating disks backup

View File

@@ -0,0 +1,40 @@
package backup
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type InfoRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
// Information about all backups running on the machine
func (b Backup) Info(ctx context.Context, req InfoRequest) (*TotalBackupsInfo, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/backup/info"
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return nil, err
}
result := TotalBackupsInfo{}
err = json.Unmarshal(res, &result)
if err != nil {
return nil, err
}
return &result, nil
}

View File

@@ -29,3 +29,53 @@ type InfoRestoredDisk struct {
// RestoreDisksFromFile response // RestoreDisksFromFile response
type ListInfoRestoredDisk []InfoRestoredDisk type ListInfoRestoredDisk []InfoRestoredDisk
// Main info about all backups running on the machine
type TotalBackupsInfo struct {
// Backup type
Type uint64 `json:"type"`
// Time elapsed, ms
TimeElapsedMs uint64 `json:"time_elapsed_ms"`
// Time remaining, ms
TimeRemainingMs uint64 `json:"time_remaining_ms"`
// Total data size, bytes
DataTotalBytes uint64 `json:"data_total_bytes"`
// Processed data size, bytes
DataProcessedBytes uint64 `json:"data_processed_bytes"`
// Remaining data size, bytes
DataRemainingBytes uint64 `json:"data_remaining_bytes"`
// Total memory size, bytes
MemTotalBytes uint64 `json:"mem_total_bytes"`
// Processed memory size, bytes
MemProcessedBytes uint64 `json:"mem_processed_bytes"`
// Remaining memory size, bytes
MemRemainingBytes uint64 `json:"mem_remaining_bytes"`
// Total file size, bytes
FileTotalBytes uint64 `json:"file_total_bytes"`
// Processed file size, bytes
FileProcessedBytes uint64 `json:"file_processed_bytes"`
// Remaining file size, bytes
FileRemainingBytes uint64 `json:"file_remaining_bytes"`
}
// List of disk names and backup speed
type ListDisksWithSpeed []DiskWithSpeed
type DiskWithSpeed struct {
// Device name
Device string `json:"device"`
// Backup speed limit in MB/s; 0 means unlimited
Speed uint64 `json:"speed"`
}

View File

@@ -0,0 +1,46 @@
package backup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type SetBackupSpeedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Device to set backup speed ongit
// Required: true
Device string `url:"device" json:"device" validate:"required"`
// New backup speed in Mb/s. 0 means no limits
// Required: true
Speed uint64 `url:"speed" json:"speed" validate:"required"`
}
// Set speed limit for device backup on ruining machine
func (b Backup) SetBackupSpeed(ctx context.Context, req SetBackupSpeedRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/backup/set_backup_speed"
res, err := b.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,40 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddACLAccessRequest adds ACL access to a vm
type AddACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// AddACLAccess adds ACL access to a vm.
func (c Compute) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/add_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,39 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DeleteACLAccessRequest deletes ACL access from a vm
type DeleteACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// DeleteACLAccess deletes ACL access from a vm.
func (c Compute) DeleteACLAccess(ctx context.Context, req DeleteACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/del_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,44 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetACLAccessRequest struct to get detailed information about ACL account in a vm
type GetACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
}
// Get gets current configuration of the ACL access in a vm as a RecordRGACLAccess struct
func (c Compute) GetACLAccess(ctx context.Context, req GetACLAccessRequest) (*RecordComputeACLAccess, error) {
res, err := c.GetACLAccessRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordComputeACLAccess{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetACLAccessRaw gets current configuration of the ACL access in a vm as an array of bytes
func (c Compute) GetACLAccessRaw(ctx context.Context, req GetACLAccessRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/get_acl_access"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -816,6 +816,9 @@ type InfoCompute struct {
// Manager type // Manager type
ManagerType string `json:"managerType"` ManagerType string `json:"managerType"`
// Memory balloon mode
MemoryBalloonMode string `json:"memory_balloon_mode"`
// Migration job // Migration job
MigrationJob uint64 `json:"migrationjob"` MigrationJob uint64 `json:"migrationjob"`
@@ -1109,6 +1112,9 @@ type RecordCompute struct {
// Manager type // Manager type
ManagerType string `json:"managerType"` ManagerType string `json:"managerType"`
// Memory balloon mode
MemoryBalloonMode string `json:"memory_balloon_mode"`
// Migration job // Migration job
MigrationJob uint64 `json:"migrationjob"` MigrationJob uint64 `json:"migrationjob"`
@@ -1248,6 +1254,57 @@ type RecordCompute struct {
_ uint64 `json:"nodeId"` _ uint64 `json:"nodeId"`
} }
// Detailed information about ACL Access in a compute
type RecordComputeACLAccess struct {
// Data
Data DataACL `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Data ACL
type DataACL struct {
// RG ACL list
RGACLList []RGACL `json:"rgACL"`
// Account ACL list
AccountACLList []AccountACL `json:"accountACL"`
// Compute ACL list
ComputeACLList []ComputeACL `json:"computeACL"`
}
// RG ACL info
type RGACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Account ACL info
type AccountACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// Compute ACL info
type ComputeACL struct {
Right string `json:"right"`
GUID string `json:"guid"`
UserGroupID string `json:"userGroupId"`
Status string `json:"status"`
Type string `json:"type"`
Explicit bool `json:"explicit"`
}
// SnapRecordCompute is RecordCompute but without the SnapSets field // SnapRecordCompute is RecordCompute but without the SnapSets field
type SnapRecordCompute struct { type SnapRecordCompute struct {
// Account ID // Account ID
@@ -1705,6 +1762,9 @@ type ItemVGPU struct {
// Profile Reference // Profile Reference
ProfileReference string `json:"profile_reference"` ProfileReference string `json:"profile_reference"`
// Profile Name
ProfileName string `json:"profile_name"`
// Split Mode // Split Mode
SplitMode string `json:"split_mode"` SplitMode string `json:"split_mode"`
@@ -2123,6 +2183,9 @@ type ItemShadowComputeInterface struct {
// QOS // QOS
QOS QOS `json:"qos"` QOS QOS `json:"qos"`
// List of QoS Policy IDs
QoSPolicies []uint64 `json:"qos_policies"`
// Libvirt settings // Libvirt settings
LibvirtSettings LibvirtSettings `json:"libvirtSettings"` LibvirtSettings LibvirtSettings `json:"libvirtSettings"`

View File

@@ -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"
) )
@@ -95,7 +96,7 @@ type NetAttachRequest struct {
type wrapperNetAttachRequest struct { type wrapperNetAttachRequest struct {
NetAttachRequest NetAttachRequest
AsyncMode bool `url:"asyncMode"` AsyncMode bool `url:"asyncMode" json:"asyncMode"`
} }
// NetAttach attaches network to compute and gets info about network // NetAttach attaches network to compute and gets info about network
@@ -112,7 +113,7 @@ func (c Compute) NetAttach(ctx context.Context, req NetAttachRequest) (*RecordNe
url := "/cloudbroker/compute/netAttach" url := "/cloudbroker/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -141,7 +142,7 @@ func (c Compute) NetAttachAsync(ctx context.Context, req NetAttachRequest) (stri
url := "/cloudbroker/compute/netAttach" url := "/cloudbroker/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@@ -83,6 +83,11 @@ type UpdateRequest struct {
// Required: false // Required: false
// Default: reset // Default: reset
WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"` WatchdogAction string `url:"watchdog_action,omitempty" json:"watchdog_action,omitempty" validate:"omitempty,watchdogAction"`
// Memory balloon mode. One of ["auto","legacy","none"]
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
} }
// Update updates some properties of the compute // Update updates some properties of the compute

View File

@@ -0,0 +1,40 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateACLAccessRequest updates ACL access in a vm
type UpdateACLAccessRequest struct {
ID uint64 `url:"id" json:"id" validate:"required"`
AccessType string `url:"accesstype" json:"accesstype" validate:"required"`
Usernames []string `url:"usernames,omitempty" json:"usernames,omitempty"`
APIAccesses []uint64 `url:"apiaccesses,omitempty" json:"apiaccesses,omitempty"`
}
// UpdateACLAccess updates ACL access in a vm.
func (c Compute) UpdateACLAccess(ctx context.Context, req UpdateACLAccessRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/update_acl_access"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -28,6 +28,8 @@ type UserGrantRequest struct {
} }
// UserGrant grants user access to the compute // UserGrant grants user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserGrant(ctx context.Context, req UserGrantRequest) (bool, error) { func (c Compute) UserGrant(ctx context.Context, req UserGrantRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -16,6 +16,8 @@ type UserListRequest struct {
} }
// UserList gets users list for compute // UserList gets users list for compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserList(ctx context.Context, req UserListRequest) (*ListUsers, error) { func (c Compute) UserList(ctx context.Context, req UserListRequest) (*ListUsers, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -20,6 +20,8 @@ type UserRevokeRequest struct {
} }
// UserRevoke revokes user access to the compute // UserRevoke revokes user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserRevoke(ctx context.Context, req UserRevokeRequest) (bool, error) { func (c Compute) UserRevoke(ctx context.Context, req UserRevokeRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -28,6 +28,8 @@ type UserUpdateRequest struct {
} }
// UserUpdate updates user access to the compute // UserUpdate updates user access to the compute
//
// Deprecated: will be removed in SDK v1.17
func (c Compute) UserUpdate(ctx context.Context, req UserUpdateRequest) (bool, error) { func (c Compute) UserUpdate(ctx context.Context, req UserUpdateRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ChangeDiskStoragePolicyRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
} }
type wrapperChangeDiskStoragePolicyRequest struct {
ChangeDiskStoragePolicyRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ChangeDiskStoragePolicy changes storage policy for disk // ChangeDiskStoragePolicy changes storage policy for disk
func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) { func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
url := "/cloudbroker/disks/change_disk_storage_policy" url := "/cloudbroker/disks/change_disk_storage_policy"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperChangeDiskStoragePolicyRequest{
ChangeDiskStoragePolicyRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
return result, nil return result, nil
} }
// ChangeDiskStoragePolicyAsync changes storage policy for disk in async mode
func (d Disks) ChangeDiskStoragePolicyAsync(ctx context.Context, req ChangeDiskStoragePolicyRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/change_disk_storage_policy"
wrappedReq := wrapperChangeDiskStoragePolicyRequest{
ChangeDiskStoragePolicyRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -27,6 +28,12 @@ type DeleteRequest struct {
Name string `url:"name,omitempty" json:"name,omitempty"` Name string `url:"name,omitempty" json:"name,omitempty"`
} }
type wrapperDeleteRequest struct {
DeleteRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Delete deletes disk by ID // Delete deletes disk by ID
func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) { func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -36,7 +43,12 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
url := "/cloudbroker/disks/delete" url := "/cloudbroker/disks/delete"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -48,3 +60,30 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
return result, nil return result, nil
} }
// Delete deletes disk by ID in async mode
func (d Disks) DeleteAsync(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/delete"
wrappedReq := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type DeleteDisksRequest struct {
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"` Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
} }
type wrapperDeleteDisksRequest struct {
DeleteDisksRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// DeleteDisks deletes multiple disks permanently // DeleteDisks deletes multiple disks permanently
func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, error) { func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, e
url := "/cloudbroker/disks/deleteDisks" url := "/cloudbroker/disks/deleteDisks"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperDeleteDisksRequest{
DeleteDisksRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, e
return result, nil return result, nil
} }
// DeleteDisks deletes multiple disks permanently in async mode
func (d Disks) DeleteDisksAsync(ctx context.Context, req DeleteDisksRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/deleteDisks"
wrappedReq := wrapperDeleteDisksRequest{
DeleteDisksRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,9 +2,11 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv" "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
// DepresentRequest struct to depresent disk from node // DepresentRequest struct to depresent disk from node
@@ -18,6 +20,12 @@ type DepresentRequest struct {
NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"` NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"`
} }
type wrapperDepresentRequest struct {
DepresentRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Depresent depresents disk from node // Depresent depresents disk from node
func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error) { func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -27,7 +35,12 @@ func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error
url := "/cloudbroker/disks/depresent" url := "/cloudbroker/disks/depresent"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperDepresentRequest{
DepresentRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -39,3 +52,30 @@ func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error
return result, nil return result, nil
} }
// Depresent depresents disk from node in async mode
func (d Disks) DepresentAsync(ctx context.Context, req DepresentRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/depresent"
wrappedReq := wrapperDepresentRequest{
DepresentRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -17,4 +17,3 @@ func (ldu ListUnattachedDisks) IDs() []uint64 {
} }
return res return res
} }

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -71,6 +72,12 @@ type LimitIORequest struct {
SizeIOPSSec uint64 `url:"size_iops_sec,omitempty" json:"size_iops_sec,omitempty"` SizeIOPSSec uint64 `url:"size_iops_sec,omitempty" json:"size_iops_sec,omitempty"`
} }
type wrapperLimitIORequest struct {
LimitIORequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// LimitIO limits IO for a certain disk // LimitIO limits IO for a certain disk
// total and read/write options are not allowed to be combined // total and read/write options are not allowed to be combined
// see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details // see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details
@@ -82,7 +89,12 @@ func (d Disks) LimitIO(ctx context.Context, req LimitIORequest) (bool, error) {
url := "/cloudbroker/disks/limitIO" url := "/cloudbroker/disks/limitIO"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperLimitIORequest{
LimitIORequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -94,3 +106,32 @@ func (d Disks) LimitIO(ctx context.Context, req LimitIORequest) (bool, error) {
return result, nil return result, nil
} }
// LimitIOAsync limits IO for a certain disk in async mode
// total and read/write options are not allowed to be combined
// see http://libvirt.org/formatdomain.html#elementsDisks iotune section for more details
func (d Disks) LimitIOAsync(ctx context.Context, req LimitIORequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/limitIO"
wrappedReq := wrapperLimitIORequest{
LimitIORequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type MigrateAbortRequest struct {
DiskID uint64 `url:"disk_id" json:"disk_id" validate:"required"` DiskID uint64 `url:"disk_id" json:"disk_id" validate:"required"`
} }
type wrapperMigrateAbortRequest struct {
MigrateAbortRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// MigrateAbort aborts disk migration // MigrateAbort aborts disk migration
func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool, error) { func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool,
url := "/cloudbroker/disks/migrate_abort" url := "/cloudbroker/disks/migrate_abort"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperMigrateAbortRequest{
MigrateAbortRequest: req,
AsyncMode: false,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool,
return result, nil return result, nil
} }
// MigrateAbortAsync aborts disk migration in async mode
func (c Disks) MigrateAbortAsync(ctx context.Context, req MigrateAbortRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/migrate_abort"
wrappedReq := wrapperMigrateAbortRequest{
MigrateAbortRequest: req,
AsyncMode: true,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,9 +2,11 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv" "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
// PresentRequest struct to present disk to node // PresentRequest struct to present disk to node
@@ -18,6 +20,12 @@ type PresentRequest struct {
NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"` NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"`
} }
type wrapperPresentRequest struct {
PresentRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Present presents disk to node // Present presents disk to node
func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) { func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -27,7 +35,12 @@ func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
url := "/cloudbroker/disks/present" url := "/cloudbroker/disks/present"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperPresentRequest{
PresentRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -39,3 +52,30 @@ func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
return result, nil return result, nil
} }
// PresentAsync presents disk to node in async mode
func (d Disks) PresentAsync(ctx context.Context, req PresentRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/present"
wrappedReq := wrapperPresentRequest{
PresentRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type RenameRequest struct {
Name string `url:"name" json:"name" validate:"required"` Name string `url:"name" json:"name" validate:"required"`
} }
type wrapperRenameRequest struct {
RenameRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Rename renames disk // Rename renames disk
func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) { func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -28,7 +35,12 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
url := "/cloudbroker/disks/rename" url := "/cloudbroker/disks/rename"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperRenameRequest{
RenameRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -40,3 +52,30 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
return result, nil return result, nil
} }
// RenameAsync renames disk in async mode
func (d Disks) RenameAsync(ctx context.Context, req RenameRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/rename"
wrappedReq := wrapperRenameRequest{
RenameRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -31,6 +32,12 @@ type ReplicateRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
} }
type wrapperReplicateRequest struct {
ReplicateRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Replicate create an empty disk in chosen SEP and pool combination. // Replicate create an empty disk in chosen SEP and pool combination.
// Starts replication between chosen disk and newly created disk // Starts replication between chosen disk and newly created disk
// Note: only TATLIN type SEP are supported for replications between // Note: only TATLIN type SEP are supported for replications between
@@ -42,7 +49,12 @@ func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, err
url := "/cloudbroker/disks/replicate" url := "/cloudbroker/disks/replicate"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicateRequest{
ReplicateRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -54,3 +66,32 @@ func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, err
return result, nil return result, nil
} }
// ReplicateAsync creates an empty disk in chosen SEP and pool combination in async mode.
// Starts replication between chosen disk and newly created disk
// Note: only TATLIN type SEP are supported for replications between
func (d Disks) ReplicateAsync(ctx context.Context, req ReplicateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicate"
wrappedReq := wrapperReplicateRequest{
ReplicateRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationResumeRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationResumeRequest struct {
ReplicationResumeRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationResume resume suspended replication // ReplicationResume resume suspended replication
func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeRequest) (bool, error) { func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
url := "/cloudbroker/disks/replicationResume" url := "/cloudbroker/disks/replicationResume"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationResumeRequest{
ReplicationResumeRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
return result, nil return result, nil
} }
// ReplicationResumeAsync resumes suspended replication in async mode
func (d Disks) ReplicationResumeAsync(ctx context.Context, req ReplicationResumeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationResume"
wrappedReq := wrapperReplicationResumeRequest{
ReplicationResumeRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationReverseRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationReverseRequest struct {
ReplicationReverseRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationReverse change role between disks replications // ReplicationReverse change role between disks replications
func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseRequest) (bool, error) { func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
url := "/cloudbroker/disks/replicationReverse" url := "/cloudbroker/disks/replicationReverse"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationReverseRequest{
ReplicationReverseRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
return result, nil return result, nil
} }
// ReplicationReverseAsync changes role between disks replications in async mode
func (d Disks) ReplicationReverseAsync(ctx context.Context, req ReplicationReverseRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationReverse"
wrappedReq := wrapperReplicationReverseRequest{
ReplicationReverseRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ReplicationStartRequest struct {
TargetDiskID uint64 `url:"targetDiskId" json:"targetDiskId" validate:"required"` TargetDiskID uint64 `url:"targetDiskId" json:"targetDiskId" validate:"required"`
} }
type wrapperReplicationStartRequest struct {
ReplicationStartRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationStart starts replication between two chosen disks. It's required for both disks to have same size to avoid replication conflicts // ReplicationStart starts replication between two chosen disks. It's required for both disks to have same size to avoid replication conflicts
// Note: Source disk's SEP and target SEP supported only of TATLIN type. // Note: Source disk's SEP and target SEP supported only of TATLIN type.
func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest) (bool, error) { func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest) (bool, error) {
@@ -29,7 +36,12 @@ func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest
url := "/cloudbroker/disks/replicationStart" url := "/cloudbroker/disks/replicationStart"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationStartRequest{
ReplicationStartRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -41,3 +53,31 @@ func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest
return result, nil return result, nil
} }
// ReplicationStartAsync starts replication between two chosen disks in async mode. It's required for both disks to have same size to avoid replication conflicts
// Note: Source disk's SEP and target SEP supported only of TATLIN type.
func (d Disks) ReplicationStartAsync(ctx context.Context, req ReplicationStartRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationStart"
wrappedReq := wrapperReplicationStartRequest{
ReplicationStartRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationStopRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationStopRequest struct {
ReplicationStopRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationStop remove replication between disks completely // ReplicationStop remove replication between disks completely
func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest) (bool, error) { func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
url := "/cloudbroker/disks/replicationStop" url := "/cloudbroker/disks/replicationStop"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationStopRequest{
ReplicationStopRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
return result, nil return result, nil
} }
// ReplicationStopAsync removes replication between disks completely in async mode
func (d Disks) ReplicationStopAsync(ctx context.Context, req ReplicationStopRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationStop"
wrappedReq := wrapperReplicationStopRequest{
ReplicationStopRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type ReplicationSuspendRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperReplicationSuspendRequest struct {
ReplicationSuspendRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// ReplicationSuspend pause replication with possibility to resume from pause moment // ReplicationSuspend pause replication with possibility to resume from pause moment
func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendRequest) (bool, error) { func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
url := "/cloudbroker/disks/replicationSuspend" url := "/cloudbroker/disks/replicationSuspend"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperReplicationSuspendRequest{
ReplicationSuspendRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
return result, nil return result, nil
} }
// ReplicationSuspendAsync pauses replication with possibility to resume from pause moment in async mode
func (d Disks) ReplicationSuspendAsync(ctx context.Context, req ReplicationSuspendRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationSuspend"
wrappedReq := wrapperReplicationSuspendRequest{
ReplicationSuspendRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -19,6 +20,12 @@ type ResizeRequest struct {
Size uint64 `url:"size" json:"size" validate:"required"` Size uint64 `url:"size" json:"size" validate:"required"`
} }
type wrapperResizeRequest struct {
ResizeRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Resize2 resize disk // Resize2 resize disk
// Returns 200 if disk is resized online, else will return 202, // Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected. // in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
@@ -31,7 +38,12 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
url := "/cloudbroker/disks/resize2" url := "/cloudbroker/disks/resize2"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -43,3 +55,33 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
return result, nil return result, nil
} }
// Resize2Async resizes disk in async mode
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
// This method will not be used for disks, assigned to "old" virtual machines. Only unassigned disks and disks, assigned with computes.
func (d Disks) Resize2Async(ctx context.Context, req ResizeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/resize2"
wrappedReq := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

View File

@@ -2,6 +2,7 @@ package disks
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -15,6 +16,12 @@ type RestoreRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
} }
type wrapperRestoreRequest struct {
RestoreRequest
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// Restore restores a deleted unattached disk from recycle bin // Restore restores a deleted unattached disk from recycle bin
func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) { func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -24,7 +31,12 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
url := "/cloudbroker/disks/restore" url := "/cloudbroker/disks/restore"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) wrappedReq := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: false,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -36,3 +48,30 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
return result, nil return result, nil
} }
// RestoreAsync restores a deleted unattached disk from recycle bin in async mode
func (d Disks) RestoreAsync(ctx context.Context, req RestoreRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/restore"
wrappedReq := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: true,
}
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
if err != nil {
return "", err
}
var result string
if err := json.Unmarshal(res, &result); err != nil {
return "", err
}
return result, nil
}

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