v16.1.0
v16.1.0
This commit is contained in:
40
pkg/cloudbroker/account/add_acl_access.go
Normal file
40
pkg/cloudbroker/account/add_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -27,6 +27,8 @@ type AddUserRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
39
pkg/cloudbroker/account/del_acl_access.go
Normal file
39
pkg/cloudbroker/account/del_acl_access.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -20,6 +20,8 @@ type DeleteUserRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,9 +3,8 @@ package account
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// SetCPUAllocationParameterRequest struct for setting CPU allocation parameter
|
||||
|
||||
40
pkg/cloudbroker/account/update_acl_access.go
Normal file
40
pkg/cloudbroker/account/update_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -27,6 +27,8 @@ type UpdateUserRequest struct {
|
||||
}
|
||||
|
||||
// UpdateUser updates user access rights
|
||||
//
|
||||
// Deprecated: will be removed in SDK v1.17
|
||||
func (a Account) UpdateUser(ctx context.Context, req UpdateUserRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
38
pkg/cloudbroker/backup/abort_disks_backup.go
Normal file
38
pkg/cloudbroker/backup/abort_disks_backup.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package backup
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
40
pkg/cloudbroker/backup/backup_disks_with_speed.go
Normal file
40
pkg/cloudbroker/backup/backup_disks_with_speed.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package backup
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -22,6 +22,10 @@ type CreateDiskBackupRequest struct {
|
||||
// Backup path
|
||||
// Required: true
|
||||
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 {
|
||||
|
||||
@@ -15,6 +15,10 @@ type Disk struct {
|
||||
|
||||
// Backup path
|
||||
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
|
||||
|
||||
40
pkg/cloudbroker/backup/info.go
Normal file
40
pkg/cloudbroker/backup/info.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package backup
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -29,3 +29,53 @@ type InfoRestoredDisk struct {
|
||||
|
||||
// RestoreDisksFromFile response
|
||||
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"`
|
||||
}
|
||||
|
||||
46
pkg/cloudbroker/backup/set_backup_speed.go
Normal file
46
pkg/cloudbroker/backup/set_backup_speed.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package backup
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
40
pkg/cloudbroker/compute/add_acl_access.go
Normal file
40
pkg/cloudbroker/compute/add_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
39
pkg/cloudbroker/compute/del_acl_access.go
Normal file
39
pkg/cloudbroker/compute/del_acl_access.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
44
pkg/cloudbroker/compute/get_acl_access.go
Normal file
44
pkg/cloudbroker/compute/get_acl_access.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -816,6 +816,9 @@ type InfoCompute struct {
|
||||
// Manager type
|
||||
ManagerType string `json:"managerType"`
|
||||
|
||||
// Memory balloon mode
|
||||
MemoryBalloonMode string `json:"memory_balloon_mode"`
|
||||
|
||||
// Migration job
|
||||
MigrationJob uint64 `json:"migrationjob"`
|
||||
|
||||
@@ -1109,6 +1112,9 @@ type RecordCompute struct {
|
||||
// Manager type
|
||||
ManagerType string `json:"managerType"`
|
||||
|
||||
// Memory balloon mode
|
||||
MemoryBalloonMode string `json:"memory_balloon_mode"`
|
||||
|
||||
// Migration job
|
||||
MigrationJob uint64 `json:"migrationjob"`
|
||||
|
||||
@@ -1248,6 +1254,57 @@ type RecordCompute struct {
|
||||
_ 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
|
||||
type SnapRecordCompute struct {
|
||||
// Account ID
|
||||
@@ -1705,6 +1762,9 @@ type ItemVGPU struct {
|
||||
// Profile Reference
|
||||
ProfileReference string `json:"profile_reference"`
|
||||
|
||||
// Profile Name
|
||||
ProfileName string `json:"profile_name"`
|
||||
|
||||
// Split Mode
|
||||
SplitMode string `json:"split_mode"`
|
||||
|
||||
@@ -2123,6 +2183,9 @@ type ItemShadowComputeInterface struct {
|
||||
// QOS
|
||||
QOS QOS `json:"qos"`
|
||||
|
||||
// List of QoS Policy IDs
|
||||
QoSPolicies []uint64 `json:"qos_policies"`
|
||||
|
||||
// Libvirt settings
|
||||
LibvirtSettings LibvirtSettings `json:"libvirtSettings"`
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
)
|
||||
|
||||
@@ -95,7 +96,7 @@ type NetAttachRequest struct {
|
||||
type wrapperNetAttachRequest struct {
|
||||
NetAttachRequest
|
||||
|
||||
AsyncMode bool `url:"asyncMode"`
|
||||
AsyncMode bool `url:"asyncMode" json:"asyncMode"`
|
||||
}
|
||||
|
||||
// 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"
|
||||
|
||||
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 {
|
||||
return nil, err
|
||||
}
|
||||
@@ -141,7 +142,7 @@ func (c Compute) NetAttachAsync(ctx context.Context, req NetAttachRequest) (stri
|
||||
|
||||
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 {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@@ -83,6 +83,11 @@ type UpdateRequest struct {
|
||||
// Required: false
|
||||
// Default: reset
|
||||
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
|
||||
|
||||
40
pkg/cloudbroker/compute/update_acl_access.go
Normal file
40
pkg/cloudbroker/compute/update_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package compute
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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
|
||||
}
|
||||
@@ -28,6 +28,8 @@ type UserGrantRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -16,6 +16,8 @@ type UserListRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -20,6 +20,8 @@ type UserRevokeRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -28,6 +28,8 @@ type UserUpdateRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type ChangeDiskStoragePolicyRequest struct {
|
||||
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
|
||||
func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStorag
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -27,6 +28,12 @@ type DeleteRequest struct {
|
||||
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
|
||||
func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -36,7 +43,12 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -48,3 +60,30 @@ func (d Disks) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type DeleteDisksRequest struct {
|
||||
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
|
||||
func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, e
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) DeleteDisks(ctx context.Context, req DeleteDisksRequest) (bool, e
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type DepresentRequest struct {
|
||||
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
|
||||
func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -17,4 +17,3 @@ func (ldu ListUnattachedDisks) IDs() []uint64 {
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -71,6 +72,12 @@ type LimitIORequest struct {
|
||||
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
|
||||
// total and read/write options are not allowed to be combined
|
||||
// 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"
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -94,3 +106,32 @@ func (d Disks) LimitIO(ctx context.Context, req LimitIORequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type MigrateAbortRequest struct {
|
||||
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
|
||||
func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool,
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (c Disks) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (bool,
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type PresentRequest struct {
|
||||
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
|
||||
func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type RenameRequest struct {
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperRenameRequest struct {
|
||||
RenameRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// Rename renames disk
|
||||
func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) Rename(ctx context.Context, req RenameRequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -31,6 +32,12 @@ type ReplicateRequest struct {
|
||||
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.
|
||||
// Starts replication between chosen disk and newly created disk
|
||||
// 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"
|
||||
|
||||
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 {
|
||||
return 0, err
|
||||
}
|
||||
@@ -54,3 +66,32 @@ func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, err
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type ReplicationResumeRequest struct {
|
||||
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperReplicationResumeRequest struct {
|
||||
ReplicationResumeRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// ReplicationResume resume suspended replication
|
||||
func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) ReplicationResume(ctx context.Context, req ReplicationResumeReque
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type ReplicationReverseRequest struct {
|
||||
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
|
||||
func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) ReplicationReverse(ctx context.Context, req ReplicationReverseReq
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type ReplicationStartRequest struct {
|
||||
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
|
||||
// Note: Source disk's SEP and target SEP supported only of TATLIN type.
|
||||
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"
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -41,3 +53,31 @@ func (d Disks) ReplicationStart(ctx context.Context, req ReplicationStartRequest
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type ReplicationStopRequest struct {
|
||||
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
|
||||
func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) ReplicationStop(ctx context.Context, req ReplicationStopRequest)
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type ReplicationSuspendRequest struct {
|
||||
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
|
||||
func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) ReplicationSuspend(ctx context.Context, req ReplicationSuspendReq
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type ResizeRequest struct {
|
||||
Size uint64 `url:"size" json:"size" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperResizeRequest struct {
|
||||
ResizeRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// Resize2 resize disk
|
||||
// Returns 200 if disk is resized online, else will return 202,
|
||||
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
|
||||
@@ -31,7 +38,12 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -43,3 +55,33 @@ func (d Disks) Resize2(ctx context.Context, req ResizeRequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type RestoreRequest struct {
|
||||
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
|
||||
func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
|
||||
|
||||
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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type ShareRequest struct {
|
||||
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperShareRequest struct {
|
||||
ShareRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// Share shares data disk
|
||||
func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
|
||||
|
||||
url := "/cloudbroker/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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) Share(ctx context.Context, req ShareRequest) (bool, error) {
|
||||
|
||||
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 := "/cloudbroker/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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -19,6 +20,12 @@ type SnapshotDeleteRequest struct {
|
||||
Label string `url:"label" json:"label" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperSnapshotDeleteRequest struct {
|
||||
SnapshotDeleteRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// SnapshotDelete deletes a snapshot
|
||||
func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -28,7 +35,12 @@ func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (b
|
||||
|
||||
url := "/cloudbroker/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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -40,3 +52,30 @@ func (d Disks) SnapshotDelete(ctx context.Context, req SnapshotDeleteRequest) (b
|
||||
|
||||
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 := "/cloudbroker/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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -23,6 +24,12 @@ type SnapshotRollbackRequest struct {
|
||||
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
|
||||
func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -32,7 +39,12 @@ func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest
|
||||
|
||||
url := "/cloudbroker/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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -44,3 +56,30 @@ func (d Disks) SnapshotRollback(ctx context.Context, req SnapshotRollbackRequest
|
||||
|
||||
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 := "/cloudbroker/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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -15,6 +16,12 @@ type UnshareRequest struct {
|
||||
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
|
||||
}
|
||||
|
||||
type wrapperUnshareRequest struct {
|
||||
UnshareRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// Unshare unshares data disk
|
||||
func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -24,7 +31,12 @@ func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
|
||||
|
||||
url := "/cloudbroker/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 {
|
||||
return false, err
|
||||
}
|
||||
@@ -36,3 +48,30 @@ func (d Disks) Unshare(ctx context.Context, req UnshareRequest) (bool, error) {
|
||||
|
||||
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 := "/cloudbroker/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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package disks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -27,6 +28,12 @@ type UpdateRequest struct {
|
||||
BlockSize string `url:"block_size,omitempty" json:"block_size,omitempty"`
|
||||
}
|
||||
|
||||
type wrapperUpdateRequest struct {
|
||||
UpdateRequest
|
||||
|
||||
AsyncMode bool `url:"async_mode" json:"async_mode"`
|
||||
}
|
||||
|
||||
// Update updates disk
|
||||
func (d Disks) Update(ctx context.Context, req UpdateRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
@@ -36,7 +43,12 @@ func (d Disks) Update(ctx context.Context, req UpdateRequest) (bool, error) {
|
||||
|
||||
url := "/cloudbroker/disks/update"
|
||||
|
||||
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
wrappedReq := wrapperUpdateRequest{
|
||||
UpdateRequest: req,
|
||||
AsyncMode: false,
|
||||
}
|
||||
|
||||
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, wrappedReq)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@@ -48,3 +60,30 @@ func (d Disks) Update(ctx context.Context, req UpdateRequest) (bool, error) {
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// UpdateAsync updates disk in async mode
|
||||
func (d Disks) UpdateAsync(ctx context.Context, req UpdateRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/disks/update"
|
||||
|
||||
wrappedReq := wrapperUpdateRequest{
|
||||
UpdateRequest: 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
|
||||
}
|
||||
|
||||
@@ -25,6 +25,11 @@ type AddReserveIPRequest struct {
|
||||
// List of IPs for specifying the desired address
|
||||
// Required: false
|
||||
IPs []string `url:"ips,omitempty" json:"ips,omitempty"`
|
||||
|
||||
// Flag indicating whether the reserved IP can be auto-assigned
|
||||
// Required: false
|
||||
// Default: true
|
||||
AutoAssignable interface{} `url:"auto_assignable,omitempty" json:"auto_assignable,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
// AddReserveIP reserves address or address poll to external network for account ID
|
||||
|
||||
@@ -17,6 +17,11 @@ type GetReservedIP struct {
|
||||
// Field for specifying the ID of extnet whose reservation information we want to receive
|
||||
// Required: false
|
||||
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
|
||||
|
||||
@@ -293,12 +293,13 @@ type RecordReservedIP struct {
|
||||
}
|
||||
|
||||
type Reservations struct {
|
||||
AccountID int `json:"account_id"`
|
||||
ClientType string `json:"clientType"`
|
||||
DomainName string `json:"domainname"`
|
||||
Hostname string `json:"hostname"`
|
||||
IP string `json:"ip"`
|
||||
Mac string `json:"mac"`
|
||||
Type string `json:"type"`
|
||||
VMID int `json:"vmId"`
|
||||
AccountID int `json:"account_id"`
|
||||
ClientType string `json:"clientType"`
|
||||
DomainName string `json:"domainname"`
|
||||
Hostname string `json:"hostname"`
|
||||
IP string `json:"ip"`
|
||||
Mac string `json:"mac"`
|
||||
Type string `json:"type"`
|
||||
VMID int `json:"vmId"`
|
||||
AutoAssignable bool `json:"auto_assignable"`
|
||||
}
|
||||
|
||||
@@ -3,9 +3,8 @@ package grid
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// SetCPUAllocationParameterRequest for setting CPU allocation parameter
|
||||
|
||||
@@ -3,9 +3,8 @@ package grid
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// SetCPUAllocationRatioForVMRequest for setting CPU allocation ratio for computes
|
||||
|
||||
@@ -270,6 +270,11 @@ type CreateRequest struct {
|
||||
// Required: false
|
||||
// Default: reset
|
||||
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
|
||||
|
||||
@@ -142,6 +142,11 @@ type CreateBlankRequest struct {
|
||||
// Required: false
|
||||
// Default: reset
|
||||
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
|
||||
|
||||
@@ -192,6 +192,11 @@ type MassCreateRequest struct {
|
||||
// Required: false
|
||||
// Default: reset
|
||||
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
|
||||
|
||||
@@ -18,6 +18,11 @@ type PCIDeviceDriverToKernelRequest struct {
|
||||
// Hardware path of the PCI device, e.g. 0000:81:00.0
|
||||
// Required: true
|
||||
HWPath string `url:"hw_path" json:"hw_path" validate:"required,pciDeviceHWPath"`
|
||||
|
||||
// Mode of binding the PCI device driver to kernel
|
||||
// Default: safe
|
||||
// Required: false
|
||||
Mode string `url:"mode,omitempty" json:"mode,omitempty" validate:"omitempty,oneof=safe unsafe"`
|
||||
}
|
||||
|
||||
// PCIDeviceDriverToKernel binds PCI device driver to kernel
|
||||
|
||||
38
pkg/cloudbroker/pcidevice/access_grant.go
Normal file
38
pkg/cloudbroker/pcidevice/access_grant.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package pcidevice
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
)
|
||||
|
||||
// AccessGrant struct to grant access to a PCI device
|
||||
type AccessGrantRequest struct {
|
||||
DeviceID uint64 `url:"device_id" json:"device_id" validate:"required"`
|
||||
AccountIDs []uint64 `url:"account_ids" json:"account_ids" validate:"required"`
|
||||
}
|
||||
|
||||
// AccessGrant grants access to a PCI device
|
||||
func (p PCIDevice) AccessGrant(ctx context.Context, req AccessGrantRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/pcidevice/access_grant"
|
||||
|
||||
res, err := p.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
|
||||
}
|
||||
38
pkg/cloudbroker/pcidevice/access_revoke.go
Normal file
38
pkg/cloudbroker/pcidevice/access_revoke.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package pcidevice
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
)
|
||||
|
||||
// AccessRevoke struct to revoke access from a PCI device
|
||||
type AccessRevokeRequest struct {
|
||||
DeviceID uint64 `url:"device_id" json:"device_id" validate:"required"`
|
||||
AccountIDs []uint64 `url:"account_ids" json:"account_ids" validate:"required"`
|
||||
}
|
||||
|
||||
// AccessRevoke revokes access from a PCI device
|
||||
func (p PCIDevice) AccessRevoke(ctx context.Context, req AccessRevokeRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/pcidevice/access_revoke"
|
||||
|
||||
res, err := p.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
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
)
|
||||
|
||||
@@ -14,10 +15,6 @@ type CreateRequest struct {
|
||||
// Required: true
|
||||
NodeID uint64 `url:"node_id" json:"node_id" validate:"required"`
|
||||
|
||||
// Resource group ID
|
||||
// Required: true
|
||||
RGID uint64 `url:"rgId" json:"rgId" validate:"required"`
|
||||
|
||||
// Name of device
|
||||
// Required: true
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
@@ -30,6 +27,10 @@ type CreateRequest struct {
|
||||
// Description, just for information
|
||||
// Required: false
|
||||
Description string `url:"description,omitempty" json:"description,omitempty"`
|
||||
|
||||
// Account IDs
|
||||
// Required: false
|
||||
AccountIDs []uint64 `url:"account_ids,omitempty" json:"account_ids,omitempty"`
|
||||
}
|
||||
|
||||
// Create creates PCI Device
|
||||
@@ -41,7 +42,7 @@ func (p PCIDevice) Create(ctx context.Context, req CreateRequest) (uint64, error
|
||||
|
||||
url := "/cloudbroker/pcidevice/create"
|
||||
|
||||
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := p.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
@@ -3,9 +3,8 @@ package pcidevice
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// DeleteRequest struct to deleting PCI device
|
||||
|
||||
@@ -3,9 +3,8 @@ package pcidevice
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// DisableRequest struct for disabling PCI device
|
||||
|
||||
@@ -3,9 +3,8 @@ package pcidevice
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// EnableRequest struct for enabling PCI device
|
||||
|
||||
@@ -22,9 +22,9 @@ type ListRequest struct {
|
||||
// Required: false
|
||||
Name string `url:"name,omitempty" json:"name,omitempty"`
|
||||
|
||||
// Find by rgId
|
||||
// Find by account ID
|
||||
// Required: false
|
||||
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
|
||||
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
|
||||
|
||||
// Find by status
|
||||
// Required: false
|
||||
|
||||
@@ -26,8 +26,8 @@ type ItemPCIDevice struct {
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Resource group ID
|
||||
RGID uint64 `json:"rgId"`
|
||||
// Account IDs
|
||||
AccountIDs []uint64 `json:"account_ids"`
|
||||
|
||||
// Node ID
|
||||
NodeID uint64 `json:"nodeId"`
|
||||
|
||||
@@ -2,7 +2,6 @@ package pcidevice
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/serialization"
|
||||
)
|
||||
|
||||
|
||||
@@ -45,24 +45,6 @@ func (lqp ListQoSPolicies) FilterByDescription(description string) ListQoSPolici
|
||||
return lqp.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterByCreatedBy returns ListQoSPolicies with specified CreatedBy
|
||||
func (lqp ListQoSPolicies) FilterByCreatedBy(createdBy string) ListQoSPolicies {
|
||||
predicate := func(iqp ItemQoSPolicy) bool {
|
||||
return iqp.CreatedBy == createdBy
|
||||
}
|
||||
|
||||
return lqp.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterByUpdatedBy returns ListQoSPolicies with specified UpdatedBy
|
||||
func (lqp ListQoSPolicies) FilterByUpdatedBy(updatedBy string) ListQoSPolicies {
|
||||
predicate := func(iqp ItemQoSPolicy) bool {
|
||||
return iqp.UpdatedBy == updatedBy
|
||||
}
|
||||
|
||||
return lqp.FilterFunc(predicate)
|
||||
}
|
||||
|
||||
// FilterFunc allows filtering ListQoSPolicies based on a user-specified predicate
|
||||
func (lqp ListQoSPolicies) FilterFunc(predicate func(ItemQoSPolicy) bool) ListQoSPolicies {
|
||||
var result ListQoSPolicies
|
||||
|
||||
@@ -10,7 +10,6 @@ var qosPolicies = ListQoSPolicies{
|
||||
Name: "qos1",
|
||||
Description: "some desc",
|
||||
Status: "ENABLED",
|
||||
CreatedBy: "user",
|
||||
},
|
||||
{
|
||||
ID: 3,
|
||||
@@ -18,7 +17,6 @@ var qosPolicies = ListQoSPolicies{
|
||||
Name: "qos3",
|
||||
Description: "some desc",
|
||||
Status: "ENABLED",
|
||||
CreatedBy: "anotheruser",
|
||||
},
|
||||
{
|
||||
ID: 5,
|
||||
@@ -26,8 +24,6 @@ var qosPolicies = ListQoSPolicies{
|
||||
Name: "qos5",
|
||||
Description: "some other desc",
|
||||
Status: "DISABLED",
|
||||
CreatedBy: "anotheruser",
|
||||
UpdatedBy: "user",
|
||||
},
|
||||
},
|
||||
EntryCount: 3,
|
||||
@@ -74,24 +70,3 @@ func TestFilterByStatus(t *testing.T) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,18 +27,6 @@ type ItemQoSPolicy struct {
|
||||
// Status of the QoS policy
|
||||
Status string `json:"status"`
|
||||
|
||||
// Created at (unix timestamp)
|
||||
CreatedAt uint64 `json:"created_at"`
|
||||
|
||||
// Updated at (unix timestamp)
|
||||
UpdatedAt uint64 `json:"updated_at"`
|
||||
|
||||
// Created by
|
||||
CreatedBy string `json:"created_by"`
|
||||
|
||||
// Updated by
|
||||
UpdatedBy string `json:"updated_by"`
|
||||
|
||||
// List of rules
|
||||
Rules Rules `json:"rules"`
|
||||
}
|
||||
@@ -62,18 +50,6 @@ type RecordQoSPolicy struct {
|
||||
// Status of the QoS policy
|
||||
Status string `json:"status"`
|
||||
|
||||
// Created at (unix timestamp)
|
||||
CreatedAt uint64 `json:"created_at"`
|
||||
|
||||
// Updated at (unix timestamp)
|
||||
UpdatedAt uint64 `json:"updated_at"`
|
||||
|
||||
// Created by
|
||||
CreatedBy string `json:"created_by"`
|
||||
|
||||
// Updated by
|
||||
UpdatedBy string `json:"updated_by"`
|
||||
|
||||
// List of rules
|
||||
Rules Rules `json:"rules"`
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -28,6 +28,8 @@ type AccessGrantRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -20,6 +20,8 @@ type AccessRevokeRequest struct {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
40
pkg/cloudbroker/rg/add_acl_access.go
Normal file
40
pkg/cloudbroker/rg/add_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package rg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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 := "/cloudbroker/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
|
||||
}
|
||||
39
pkg/cloudbroker/rg/del_acl_access.go
Normal file
39
pkg/cloudbroker/rg/del_acl_access.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package rg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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 := "/cloudbroker/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
|
||||
}
|
||||
44
pkg/cloudbroker/rg/get_acl_access.go
Normal file
44
pkg/cloudbroker/rg/get_acl_access.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package rg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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 := "/cloudbroker/rg/get_acl_access"
|
||||
|
||||
res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
return res, err
|
||||
}
|
||||
@@ -134,6 +134,44 @@ type RecordRG struct {
|
||||
ItemRG
|
||||
}
|
||||
|
||||
// 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
|
||||
type ItemRG struct {
|
||||
// Account ID
|
||||
|
||||
@@ -3,9 +3,8 @@ package rg
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// SetCPUAllocationParameterRequest struct for setting CPU allocation parameter
|
||||
|
||||
@@ -3,9 +3,8 @@ package rg
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/validators"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// SetCPUAllocationRatioRequest struct for setting CPU allocation ratio
|
||||
|
||||
40
pkg/cloudbroker/rg/update_acl_access.go
Normal file
40
pkg/cloudbroker/rg/update_acl_access.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package rg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/internal/constants"
|
||||
"repository.basistech.ru/BASIS/dynamix-golang-sdk/v16/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 := "/cloudbroker/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
|
||||
}
|
||||
@@ -34,6 +34,8 @@ type ConfigFieldEditRequest struct {
|
||||
}
|
||||
|
||||
// ConfigFieldEdit edits SEP config field value
|
||||
//
|
||||
// Deprecated: will be removed in SDK v1.17
|
||||
func (s SEP) ConfigFieldEdit(ctx context.Context, req ConfigFieldEditRequest) (*RecordConfigFieldEdit, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -52,6 +52,9 @@ type ItemVGPU struct {
|
||||
// Profile Reference
|
||||
ProfileReference string `json:"profile_reference"`
|
||||
|
||||
// Profile Name
|
||||
ProfileName string `json:"profile_name"`
|
||||
|
||||
// Split Mode
|
||||
SplitMode string `json:"split_mode"`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user