This commit is contained in:
2026-06-05 17:14:39 +03:00
parent e9adcfec1c
commit fea00bbb42
157 changed files with 4837 additions and 251 deletions

View File

@@ -165,7 +165,7 @@ type InfoAccount struct {
CPUAllocationParameter string `json:"cpu_allocation_parameter"`
// CPU allocation ratio
CPUAllocationRatio float64 `json:"cpu_allocation_ratio"`
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
// Created by
CreatedBy string `json:"createdBy"`

View File

@@ -18,6 +18,11 @@ type AbortSharedSnapshotMergeRequest struct {
Label string `url:"label" json:"label" validate:"required"`
}
type wrapperAbortSharedSnapshotMergeRequest struct {
AbortSharedSnapshotMergeRequest
AsyncMode bool `url:"asyncMode"`
}
// AbortSharedSnapshotMerge shared snapshots merge abort
func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (string, error) {
err := validators.ValidateRequest(req)
@@ -25,9 +30,36 @@ func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSn
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperAbortSharedSnapshotMergeRequest{
AbortSharedSnapshotMergeRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/abort_shared_snapshot_merge"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}
// AbortSharedSnapshotMergeAsync shared snapshots merge abort in async mode
func (c Compute) AbortSharedSnapshotMergeAsync(ctx context.Context, req AbortSharedSnapshotMergeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperAbortSharedSnapshotMergeRequest{
AbortSharedSnapshotMergeRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/abort_shared_snapshot_merge"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}

View File

@@ -15,6 +15,12 @@ type CDEjectRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperCDEjectRequest struct {
CDEjectRequest
AsyncMode bool `url:"asyncMode"`
}
// CDEject ejects CD image to compute's CD-ROM
func (c Compute) CDEject(ctx context.Context, req CDEjectRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) CDEject(ctx context.Context, req CDEjectRequest) (bool, error)
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCDEjectRequest{
CDEjectRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/cdEject"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) CDEject(ctx context.Context, req CDEjectRequest) (bool, error)
return result, err
}
// CDEjectAsync ejects CD image to compute's CD-ROM with AsyncMode
func (c Compute) CDEjectAsync(ctx context.Context, req CDEjectRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCDEjectRequest{
CDEjectRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/cdEject"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -18,6 +18,12 @@ type CDInsertRequest struct {
CDROMID uint64 `url:"cdromId" json:"cdromId" validate:"required"`
}
type wrapperCDInsertRequest struct {
CDInsertRequest
AsyncMode bool `url:"asyncMode"`
}
// CDInsert inserts new CD image to compute's CD-ROM
func (c Compute) CDInsert(ctx context.Context, req CDInsertRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -25,12 +31,39 @@ func (c Compute) CDInsert(ctx context.Context, req CDInsertRequest) (bool, error
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCDInsertRequest{
CDInsertRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/cdInsert"
_, err = c.client.DecortApiCall(ctx, http.MethodPost, url, req)
_, err = c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
return true, nil
}
// CDInsertAsync inserts new CD image to compute's CD-ROM with AsyncMode
func (c Compute) CDInsertAsync(ctx context.Context, req CDInsertRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCDInsertRequest{
CDInsertRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/cdInsert"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -31,6 +31,12 @@ type ChangeIPRequest struct {
IPAddr string `url:"ip_addr" json:"ip_addr" validate:"required"`
}
type wrapperChangeIPRequest struct {
ChangeIPRequest
AsyncMode bool `url:"asyncMode"`
}
// ChangeIP change reserved IP for compute instance
func (c Compute) ChangeIP(ctx context.Context, req ChangeIPRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -38,9 +44,14 @@ func (c Compute) ChangeIP(ctx context.Context, req ChangeIPRequest) (bool, error
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeIPRequest{
ChangeIPRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/changeIp"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -52,3 +63,25 @@ func (c Compute) ChangeIP(ctx context.Context, req ChangeIPRequest) (bool, error
return result, nil
}
// ChangeIPAsync change reserved IP for compute instance with AsyncMode
func (c Compute) ChangeIPAsync(ctx context.Context, req ChangeIPRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeIPRequest{
ChangeIPRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/changeIp"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -3,8 +3,9 @@ package compute
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ChangeLinkStateRequest struct for changing link state
@@ -23,6 +24,12 @@ type ChangeLinkStateRequest struct {
State string `url:"state" json:"state" validate:"required,interfaceState"`
}
type wrapperChangeLinkStateRequest struct {
ChangeLinkStateRequest
AsyncMode bool `url:"asyncMode"`
}
// ChangeLinkState changes the status link virtual of compute
func (c Compute) ChangeLinkState(ctx context.Context, req ChangeLinkStateRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +37,14 @@ func (c Compute) ChangeLinkState(ctx context.Context, req ChangeLinkStateRequest
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeLinkStateRequest{
ChangeLinkStateRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/changeLinkState"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -41,5 +53,28 @@ func (c Compute) ChangeLinkState(ctx context.Context, req ChangeLinkStateRequest
if err != nil {
return false, err
}
return result, nil
}
// ChangeLinkStateAsync changes the status link virtual of compute with AsyncMode
func (c Compute) ChangeLinkStateAsync(ctx context.Context, req ChangeLinkStateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeLinkStateRequest{
ChangeLinkStateRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/changeLinkState"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type ChangeMTURequest struct {
MTU uint64 `url:"mtu" json:"mtu" validate:"required" validate:"omitempty,mtu"`
}
type wrapperChangeMTURequest struct {
ChangeMTURequest
AsyncMode bool `url:"asyncMode"`
}
// ChangeMTU change MTU for compute instance
func (c Compute) ChangeMTU(ctx context.Context, req ChangeMTURequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) ChangeMTU(ctx context.Context, req ChangeMTURequest) (bool, err
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeMTURequest{
ChangeMTURequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/change_mtu"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) ChangeMTU(ctx context.Context, req ChangeMTURequest) (bool, err
return result, nil
}
// ChangeMTUAsync change MTU for compute instance with AsyncMode
func (c Compute) ChangeMTUAsync(ctx context.Context, req ChangeMTURequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeMTURequest{
ChangeMTURequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/change_mtu"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -27,6 +27,12 @@ type ChangeSecGroupsRequest struct {
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
}
type wrapperChangeSecGroupsRequest struct {
ChangeSecGroupsRequest
AsyncMode bool `url:"asyncMode"`
}
// ChangeSecGroups changes security groups for compute
func (c Compute) ChangeSecGroups(ctx context.Context, req ChangeSecGroupsRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -34,9 +40,14 @@ func (c Compute) ChangeSecGroups(ctx context.Context, req ChangeSecGroupsRequest
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeSecGroupsRequest{
ChangeSecGroupsRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/change_security_groups"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -48,3 +59,25 @@ func (c Compute) ChangeSecGroups(ctx context.Context, req ChangeSecGroupsRequest
return result, nil
}
// ChangeSecGroupsAsync changes security groups for compute with AsyncMode
func (c Compute) ChangeSecGroupsAsync(ctx context.Context, req ChangeSecGroupsRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperChangeSecGroupsRequest{
ChangeSecGroupsRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/change_security_groups"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -44,6 +44,12 @@ type CloneRequest struct {
SEPID uint64 `url:"sep_id" json:"sep_id"`
}
type wrapperCloneRequest struct {
CloneRequest
AsyncMode bool `url:"asyncMode" json:"asyncMode"`
}
// Clone clones compute instance
func (c Compute) Clone(ctx context.Context, req CloneRequest) (string, error) {
err := validators.ValidateRequest(req)
@@ -51,9 +57,36 @@ func (c Compute) Clone(ctx context.Context, req CloneRequest) (string, error) {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCloneRequest{
CloneRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/clone"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}
// CloneAsync clones compute instance with AsyncMode
func (c Compute) CloneAsync(ctx context.Context, req CloneRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCloneRequest{
CloneRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/clone"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, reqWrapped)
if err != nil {
return "", err
}

View File

@@ -19,6 +19,12 @@ type CreateTemplateRequest struct {
Name string `url:"name" json:"name" validate:"required"`
}
type wrapperCreateTemplateRequest struct {
CreateTemplateRequest
AsyncMode bool `url:"asyncMode"`
}
// CreateTemplate create template from compute instance
func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest) (string, error) {
err := validators.ValidateRequest(req)
@@ -26,9 +32,14 @@ func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest)
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCreateTemplateRequest{
CreateTemplateRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/createTemplate"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
@@ -37,3 +48,25 @@ func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest)
return result, nil
}
// CreateTemplateAsync create template from compute instance with AsyncMode
func (c Compute) CreateTemplateAsync(ctx context.Context, req CreateTemplateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperCreateTemplateRequest{
CreateTemplateRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/createTemplate"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type DeleteRequest struct {
DetachDisks bool `url:"detachDisks,omitempty" json:"detachDisks,omitempty"`
}
type wrapperDeleteRequest struct {
DeleteRequest
AsyncMode bool `url:"asyncMode"`
}
// Delete deletes compute
func (c Compute) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/delete"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
return result, nil
}
// DeleteAsync deletes compute with AsyncMode
func (c Compute) DeleteAsync(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDeleteRequest{
DeleteRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/delete"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,39 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DeleteCPUAlignmentProfileRequest struct to delete CPU alignment profile for computes
type DeleteCPUAlignmentProfileRequest struct {
// IDs of the compute instances
// Required: true
ComputeIDs []uint64 `url:"compute_ids" json:"compute_ids" validate:"min=1"`
}
// DeleteCPUAlignmentProfile deletes CPU alignment profile for computes
func (c Compute) DeleteCPUAlignmentProfile(ctx context.Context, req DeleteCPUAlignmentProfileRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/delete_cpu_alignment_profile"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -15,6 +15,12 @@ type DisableRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperDisableRequest struct {
DisableRequest
AsyncMode bool `url:"asyncMode"`
}
// Disable disables compute
func (c Compute) Disable(ctx context.Context, req DisableRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Disable(ctx context.Context, req DisableRequest) (bool, error)
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDisableRequest{
DisableRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/disable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Disable(ctx context.Context, req DisableRequest) (bool, error)
return result, nil
}
// DisableAsync disables compute with AsyncMode
func (c Compute) DisableAsync(ctx context.Context, req DisableRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDisableRequest{
DisableRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/disable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -56,9 +56,19 @@ type DiskAddRequest struct {
// Required: false
Cache string `url:"cache,omitempty" json:"cache,omitempty"`
// BLK Discard
// Discard
// Required: false
BLKDiscard interface{} `url:"blkdiscard,omitempty" json:"blkdiscard,omitempty" validate:"omitempty,isBool"`
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
// Mount disk in read-only mode
// Required: false
ReadOnly bool `url:"read_only,omitempty" json:"read_only,omitempty"`
}
type wrapperDiskAddRequest struct {
DiskAddRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskAdd creates new disk and attach to compute
@@ -68,9 +78,14 @@ func (c Compute) DiskAdd(ctx context.Context, req DiskAddRequest) (uint64, error
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskAddRequest{
DiskAddRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskAdd"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return 0, err
}
@@ -82,3 +97,25 @@ func (c Compute) DiskAdd(ctx context.Context, req DiskAddRequest) (uint64, error
return result, nil
}
// DiskAddAsync creates new disk and attach to compute with AsyncMode
func (c Compute) DiskAddAsync(ctx context.Context, req DiskAddRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskAddRequest{
DiskAddRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskAdd"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -25,6 +25,16 @@ type DiskAttachRequest struct {
// Desired bus number (hex string, e.g. "0x03")
// Required: false
BusNumber string `url:"bus_number,omitempty" json:"bus_number,omitempty"`
// Mount disk in read-only mode
// Required: false
ReadOnly bool `url:"read_only,omitempty" json:"read_only,omitempty"`
}
type wrapperDiskAttachRequest struct {
DiskAttachRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskAttach attach disk to compute
@@ -34,9 +44,14 @@ func (c Compute) DiskAttach(ctx context.Context, req DiskAttachRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskAttachRequest{
DiskAttachRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -48,3 +63,25 @@ func (c Compute) DiskAttach(ctx context.Context, req DiskAttachRequest) (bool, e
return result, nil
}
// DiskAttachAsync attach disk to compute with AsyncMode
func (c Compute) DiskAttachAsync(ctx context.Context, req DiskAttachRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskAttachRequest{
DiskAttachRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type DiskDelRequest struct {
Permanently bool `url:"permanently" json:"permanently"`
}
type wrapperDiskDelRequest struct {
DiskDelRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskDel deletes disk and detaches it from compute
func (c Compute) DiskDel(ctx context.Context, req DiskDelRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) DiskDel(ctx context.Context, req DiskDelRequest) (bool, error)
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskDelRequest{
DiskDelRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskDel"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) DiskDel(ctx context.Context, req DiskDelRequest) (bool, error)
return result, nil
}
// DiskDelAsync deletes disk and detaches it from compute with AsyncMode
func (c Compute) DiskDelAsync(ctx context.Context, req DiskDelRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskDelRequest{
DiskDelRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskDel"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -19,6 +19,12 @@ type DiskDetachRequest struct {
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
}
type wrapperDiskDetachRequest struct {
DiskDetachRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskDetach detaches disk from compute
func (c Compute) DiskDetach(ctx context.Context, req DiskDetachRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -26,9 +32,14 @@ func (c Compute) DiskDetach(ctx context.Context, req DiskDetachRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskDetachRequest{
DiskDetachRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskDetach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +51,25 @@ func (c Compute) DiskDetach(ctx context.Context, req DiskDetachRequest) (bool, e
return result, nil
}
// DiskDetachAsync detaches disk from compute with AsyncMode
func (c Compute) DiskDetachAsync(ctx context.Context, req DiskDetachRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskDetachRequest{
DiskDetachRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskDetach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type DiskQOSRequest struct {
Limits string `url:"limits" json:"limits" validate:"required"`
}
type wrapperDiskQOSRequest struct {
DiskQOSRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskQOS changes QOS of the disk
func (c Compute) DiskQOS(ctx context.Context, req DiskQOSRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) DiskQOS(ctx context.Context, req DiskQOSRequest) (bool, error)
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskQOSRequest{
DiskQOSRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskQos"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) DiskQOS(ctx context.Context, req DiskQOSRequest) (bool, error)
return result, nil
}
// DiskQOSAsync changes QOS of the disk with AsyncMode
func (c Compute) DiskQOSAsync(ctx context.Context, req DiskQOSRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskQOSRequest{
DiskQOSRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskQos"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type DiskResizeRequest struct {
Size uint64 `url:"size" json:"size" validate:"required"`
}
type wrapperDiskResizeRequest struct {
DiskResizeRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskResize changes disk size
func (c Compute) DiskResize(ctx context.Context, req DiskResizeRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) DiskResize(ctx context.Context, req DiskResizeRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskResizeRequest{
DiskResizeRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskResize"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) DiskResize(ctx context.Context, req DiskResizeRequest) (bool, e
return result, nil
}
// DiskResizeAsync changes disk size with AsyncMode
func (c Compute) DiskResizeAsync(ctx context.Context, req DiskResizeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskResizeRequest{
DiskResizeRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskResize"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type DiskSwitchToReplicationRequest struct {
StopReplication bool `url:"stopReplication" json:"stopReplication"`
}
type wrapperDiskSwitchToReplicationRequest struct {
DiskSwitchToReplicationRequest
AsyncMode bool `url:"asyncMode"`
}
// DiskSwitchToReplication switches disk to it's replication
func (c Compute) DiskSwitchToReplication(ctx context.Context, req DiskSwitchToReplicationRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) DiskSwitchToReplication(ctx context.Context, req DiskSwitchToRe
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskSwitchToReplicationRequest{
DiskSwitchToReplicationRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/diskSwitchToReplication"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) DiskSwitchToReplication(ctx context.Context, req DiskSwitchToRe
return result, nil
}
// DiskSwitchToReplicationAsync switches disk to it's replication with AsyncMode
func (c Compute) DiskSwitchToReplicationAsync(ctx context.Context, req DiskSwitchToReplicationRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperDiskSwitchToReplicationRequest{
DiskSwitchToReplicationRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/diskSwitchToReplication"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,46 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetCPUAlignmentProfileRequest struct to get CPU alignment profile for compute
type GetCPUAlignmentProfileRequest struct {
// ID of the compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
// GetCPUAlignmentProfile gets CPU alignment profile for compute
func (c Compute) GetCPUAlignmentProfile(ctx context.Context, req GetCPUAlignmentProfileRequest) (*CPUAlignmentProfile, error) {
res, err := c.GetCPUAlignmentProfileRaw(ctx, req)
if err != nil {
return nil, err
}
info := CPUAlignmentProfile{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetCPUAlignmentProfileRaw gets CPU alignment profile for compute as an array of bytes
func (c Compute) GetCPUAlignmentProfileRaw(ctx context.Context, req GetCPUAlignmentProfileRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/get_cpu_alignment_profile"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -15,6 +15,12 @@ type GuestAgentDisableRequest struct {
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
type wrapperGuestAgentDisableRequest struct {
GuestAgentDisableRequest
AsyncMode bool `url:"asyncMode"`
}
// Disable guest agent at a specific compute
func (c Compute) GuestAgentDisable(ctx context.Context, req GuestAgentDisableRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) GuestAgentDisable(ctx context.Context, req GuestAgentDisableReq
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentDisableRequest{
GuestAgentDisableRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/guest_agent_disable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) GuestAgentDisable(ctx context.Context, req GuestAgentDisableReq
return result, nil
}
// GuestAgentDisableAsync disables guest agent at a specific compute with AsyncMode
func (c Compute) GuestAgentDisableAsync(ctx context.Context, req GuestAgentDisableRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentDisableRequest{
GuestAgentDisableRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/guest_agent_disable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type GuestAgentEnableRequest struct {
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
type wrapperGuestAgentEnableRequest struct {
GuestAgentEnableRequest
AsyncMode bool `url:"asyncMode"`
}
// Enable guest agent at a specific compute
func (c Compute) GuestAgentEnable(ctx context.Context, req GuestAgentEnableRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) GuestAgentEnable(ctx context.Context, req GuestAgentEnableReque
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentEnableRequest{
GuestAgentEnableRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/guest_agent_enable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) GuestAgentEnable(ctx context.Context, req GuestAgentEnableReque
return result, nil
}
// GuestAgentEnableAsync enables guest agent at a specific compute with AsyncMode
func (c Compute) GuestAgentEnableAsync(ctx context.Context, req GuestAgentEnableRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentEnableRequest{
GuestAgentEnableRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/guest_agent_enable"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type GuestAgentExecuteRequest struct {
Arguments string `url:"arguments" json:"arguments" validate:"required"`
}
type wrapperGuestAgentExecuteRequest struct {
GuestAgentExecuteRequest
AsyncMode bool `url:"asyncMode"`
}
// Execute guest agent command
func (c Compute) GuestAgentExecuteRequest(ctx context.Context, req GuestAgentExecuteRequest) (map[string]interface{}, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) GuestAgentExecuteRequest(ctx context.Context, req GuestAgentExe
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentExecuteRequest{
GuestAgentExecuteRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/guest_agent_execute"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return nil, err
}
@@ -46,3 +57,25 @@ func (c Compute) GuestAgentExecuteRequest(ctx context.Context, req GuestAgentExe
return result, nil
}
// GuestAgentExecuteRequestAsync executes guest agent command with AsyncMode
func (c Compute) GuestAgentExecuteRequestAsync(ctx context.Context, req GuestAgentExecuteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentExecuteRequest{
GuestAgentExecuteRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/guest_agent_execute"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type GuestAgentFeatureUpdateRequest struct {
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
type wrapperGuestAgentFeatureUpdateRequest struct {
GuestAgentFeatureUpdateRequest
AsyncMode bool `url:"asyncMode"`
}
// Feature update guest agent
func (c Compute) GuestAgentFeatureUpdate(ctx context.Context, req GuestAgentFeatureUpdateRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) GuestAgentFeatureUpdate(ctx context.Context, req GuestAgentFeat
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentFeatureUpdateRequest{
GuestAgentFeatureUpdateRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/guest_agent_feature_update"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) GuestAgentFeatureUpdate(ctx context.Context, req GuestAgentFeat
return result, nil
}
// GuestAgentFeatureUpdateAsync feature updates guest agent with AsyncMode
func (c Compute) GuestAgentFeatureUpdateAsync(ctx context.Context, req GuestAgentFeatureUpdateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperGuestAgentFeatureUpdateRequest{
GuestAgentFeatureUpdateRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/guest_agent_feature_update"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -19,6 +19,12 @@ type MassDeleteRequest struct {
Permanently bool `url:"permanently,omitempty" json:"permanently,omitempty"`
}
type wrapperMassDeleteRequest struct {
MassDeleteRequest
AsyncMode bool `url:"asyncMode"`
}
// MassDelete starts jobs to delete several computes
func (c Compute) MassDelete(ctx context.Context, req MassDeleteRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -26,9 +32,14 @@ func (c Compute) MassDelete(ctx context.Context, req MassDeleteRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassDeleteRequest{
MassDeleteRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/massDelete"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +51,25 @@ func (c Compute) MassDelete(ctx context.Context, req MassDeleteRequest) (bool, e
return result, nil
}
// MassDeleteAsync starts jobs to delete several computes with AsyncMode
func (c Compute) MassDeleteAsync(ctx context.Context, req MassDeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassDeleteRequest{
MassDeleteRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/massDelete"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type MassRebootRequest struct {
ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"min=1"`
}
type wrapperMassRebootRequest struct {
MassRebootRequest
AsyncMode bool `url:"asyncMode"`
}
// MassReboot starts jobs to reboot several computes
func (c Compute) MassReboot(ctx context.Context, req MassRebootRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) MassReboot(ctx context.Context, req MassRebootRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassRebootRequest{
MassRebootRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/massReboot"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) MassReboot(ctx context.Context, req MassRebootRequest) (bool, e
return result, nil
}
// MassRebootAsync starts jobs to reboot several computes with AsyncMode
func (c Compute) MassRebootAsync(ctx context.Context, req MassRebootRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassRebootRequest{
MassRebootRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/massReboot"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type MassStartRequest struct {
ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"min=1"`
}
type wrapperMassStartRequest struct {
MassStartRequest
AsyncMode bool `url:"asyncMode"`
}
// MassStart starts jobs to start several computes
func (c Compute) MassStart(ctx context.Context, req MassStartRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) MassStart(ctx context.Context, req MassStartRequest) (bool, err
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassStartRequest{
MassStartRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/massStart"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) MassStart(ctx context.Context, req MassStartRequest) (bool, err
return result, nil
}
// MassStartAsync starts jobs to start several computes with AsyncMode
func (c Compute) MassStartAsync(ctx context.Context, req MassStartRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassStartRequest{
MassStartRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/massStart"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -19,6 +19,12 @@ type MassStopRequest struct {
Force bool `url:"force,omitempty" json:"force,omitempty"`
}
type wrapperMassStopRequest struct {
MassStopRequest
AsyncMode bool `url:"asyncMode"`
}
// MassStop starts jobs to stop several computes
func (c Compute) MassStop(ctx context.Context, req MassStopRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -26,9 +32,14 @@ func (c Compute) MassStop(ctx context.Context, req MassStopRequest) (bool, error
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassStopRequest{
MassStopRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/massStop"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +51,25 @@ func (c Compute) MassStop(ctx context.Context, req MassStopRequest) (bool, error
return result, nil
}
// MassStopAsync starts jobs to stop several computes with AsyncMode
func (c Compute) MassStopAsync(ctx context.Context, req MassStopRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMassStopRequest{
MassStopRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/massStop"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type MigrateAbortRequest struct {
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
}
type wrapperMigrateAbortRequest struct {
MigrateAbortRequest
AsyncMode bool `url:"asyncMode"`
}
// MigrateAbort aborts compute migration
func (c Compute) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (string, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (str
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateAbortRequest{
MigrateAbortRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/migrate_abort"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
@@ -33,3 +44,25 @@ func (c Compute) MigrateAbort(ctx context.Context, req MigrateAbortRequest) (str
return result, nil
}
// MigrateAbortAsync aborts compute migration with AsyncMode
func (c Compute) MigrateAbortAsync(ctx context.Context, req MigrateAbortRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateAbortRequest{
MigrateAbortRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/migrate_abort"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -3,7 +3,7 @@ package compute
import (
"context"
"net/http"
"strings"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -20,21 +20,57 @@ type MigrateStorageAbortRequest struct {
StatusCheck bool `url:"statusCheck" json:"statusCheck"`
}
type wrapperMigrateStorageAbortRequest struct {
MigrateStorageAbortRequest
AsyncMode bool `url:"asyncMode"`
}
// MigrateStorageAbort aborts complex compute migration job
func (c Compute) MigrateStorageAbort(ctx context.Context, req MigrateStorageAbortRequest) (string, error) {
func (c Compute) MigrateStorageAbort(ctx context.Context, req MigrateStorageAbortRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateStorageAbortRequest{
MigrateStorageAbortRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/migrateStorageAbort"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}
// MigrateStorageAbortAsync aborts complex compute migration job with AsyncMode
func (c Compute) MigrateStorageAbortAsync(ctx context.Context, req MigrateStorageAbortRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateStorageAbortRequest{
MigrateStorageAbortRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/migrateStorageAbort"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
result := strings.ReplaceAll(string(res), "\"", "")
return result, nil
return string(res), nil
}

View File

@@ -3,7 +3,7 @@ package compute
import (
"context"
"net/http"
"strings"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -15,23 +15,59 @@ type MigrateStorageCleanUpRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperMigrateStorageCleanUpRequest struct {
MigrateStorageCleanUpRequest
AsyncMode bool `url:"asyncMode"`
}
// MigrateStorageCleanUp cleanup resources after finished (success of failed) complex compute migration.
// If the migration was successful, then old disks will be removed, else new (target) disks will be removed.
// Do it wisely!
func (c Compute) MigrateStorageCleanUp(ctx context.Context, req MigrateStorageCleanUpRequest) (string, error) {
func (c Compute) MigrateStorageCleanUp(ctx context.Context, req MigrateStorageCleanUpRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateStorageCleanUpRequest{
MigrateStorageCleanUpRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/migrateStorageCleanup"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}
// MigrateStorageCleanUpAsync cleanup resources after finished migration with AsyncMode
func (c Compute) MigrateStorageCleanUpAsync(ctx context.Context, req MigrateStorageCleanUpRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateStorageCleanUpRequest{
MigrateStorageCleanUpRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/migrateStorageCleanup"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
result := strings.ReplaceAll(string(res), "\"", "")
return result, nil
return string(res), nil
}

View File

@@ -19,16 +19,27 @@ type MigrateToZoneRequest struct {
ZoneID uint64 `url:"zoneId" json:"zoneId" validate:"required"`
}
// MoveToZone moves compute to new zone
type wrapperMigrateToZoneRequest struct {
MigrateToZoneRequest
AsyncMode bool `url:"asyncMode"`
}
// MigrateToZone moves compute to new zone
func (c Compute) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateToZoneRequest{
MigrateToZoneRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/migrateToZone"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +51,25 @@ func (c Compute) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (b
return result, nil
}
// MigrateToZoneAsync moves compute to new zone with AsyncMode
func (c Compute) MigrateToZoneAsync(ctx context.Context, req MigrateToZoneRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMigrateToZoneRequest{
MigrateToZoneRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/migrateToZone"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -67,6 +67,9 @@ type ListACL []ItemACL
// Main information about snapshot
type ItemSnapshot struct {
// Compute info
Compute RecordCompute `json:"compute"`
// List of disk IDs
Disks []uint64 `json:"disks"`
@@ -76,6 +79,9 @@ type ItemSnapshot struct {
// Label
Label string `json:"label"`
// Memory dump image ID
MemoryDumpImage uint64 `json:"memory_dump_image"`
// Timestamp
Timestamp uint64 `json:"timestamp"`
}
@@ -391,8 +397,8 @@ type ItemDisk struct {
// Access Control List
ACL ItemACL `json:"acl"`
// BLK Discard
BLKDiscard bool `json:"blkdiscard"`
// Discard
Discard string `json:"discard"`
// Block Size
BlockSize string `json:"block_size"`
@@ -546,6 +552,9 @@ type ItemDisk struct {
// UpdatedTime
UpdatedTime uint64 `json:"updatedTime"`
// Read-only
ReadOnly bool `json:"read_only"`
}
type ItemReplication struct {
@@ -723,6 +732,9 @@ type InfoCompute struct {
// Clone reference
CloneReference uint64 `json:"cloneReference"`
// Clock
Clock string `json:"clock"`
// List clone IDs
Clones []uint64 `json:"clones"`
@@ -825,6 +837,9 @@ type InfoCompute struct {
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// CPU alignment profile
CPUAlignmentProfile CPUAlignmentProfile `json:"cpu_alignment_profile"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
@@ -912,6 +927,12 @@ type QemuQuest struct {
User string `json:"user"`
}
type CPUAlignmentProfile struct {
Model string `json:"model"`
Name string `json:"name"`
Vendor string `json:"vendor"`
}
// Information about libvirt settings
type LibvirtSettings struct {
// TX mode
@@ -986,6 +1007,9 @@ type RecordCompute struct {
// Clone reference
CloneReference uint64 `json:"cloneReference"`
// Clock
Clock string `json:"clock"`
// List clone IDs
Clones []uint64 `json:"clones"`
@@ -1115,6 +1139,9 @@ type RecordCompute struct {
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// CPU alignment profile
CPUAlignmentProfile CPUAlignmentProfile `json:"cpu_alignment_profile"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
@@ -1307,6 +1334,9 @@ type InfoDisk struct {
// SEP ID
SepID int64 `json:"sepId"`
// Read-only
ReadOnly bool `json:"read_only"`
}
// List computes

View File

@@ -34,16 +34,27 @@ type MoveToRGRequest struct {
ForceStop bool `url:"forceStop,omitempty" json:"forceStop,omitempty"`
}
type wrapperMoveToRGRequest struct {
MoveToRGRequest
AsyncMode bool `url:"asyncMode"`
}
// MoveToRG moves compute instance to new resource group
func (c Compute) Validate(ctx context.Context, req MoveToRGRequest) (bool, error) {
func (c Compute) MoveToRG(ctx context.Context, req MoveToRGRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMoveToRGRequest{
MoveToRGRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/moveToRg"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -55,3 +66,25 @@ func (c Compute) Validate(ctx context.Context, req MoveToRGRequest) (bool, error
return result, nil
}
// MoveToRGAsync moves compute instance to new resource group with AsyncMode
func (c Compute) MoveToRGAsync(ctx context.Context, req MoveToRGRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperMoveToRGRequest{
MoveToRGRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/moveToRg"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -53,9 +53,9 @@ type NetAttachRequest struct {
// Required: false
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
// SDN Object Group ID
// SDN Object Group IDs
// Required: false
SDNObjectGroupID string `url:"sdn_object_group_id,omitempty" json:"sdn_object_group_id,omitempty"`
SDNObjectGroupIDs []string `url:"sdn_object_group_ids,omitempty" json:"sdn_object_group_ids,omitempty"`
// SDN Logical Port Display Name
// Required: false
@@ -83,6 +83,12 @@ type NetAttachRequest struct {
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
}
type wrapperNetAttachRequest struct {
NetAttachRequest
AsyncMode bool `url:"asyncMode"`
}
// NetAttach attaches network to compute and gets info about network
func (c Compute) NetAttach(ctx context.Context, req NetAttachRequest) (*RecordNetAttach, error) {
err := validators.ValidateRequest(req)
@@ -90,9 +96,14 @@ func (c Compute) NetAttach(ctx context.Context, req NetAttachRequest) (*RecordNe
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetAttachRequest{
NetAttachRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return nil, err
}
@@ -106,3 +117,25 @@ func (c Compute) NetAttach(ctx context.Context, req NetAttachRequest) (*RecordNe
return &info, nil
}
// NetAttachAsync attaches network to compute with AsyncMode
func (c Compute) NetAttachAsync(ctx context.Context, req NetAttachRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetAttachRequest{
NetAttachRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/netAttach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type NetDetachRequest struct {
MAC string `url:"mac,omitempty" json:"mac,omitempty"`
}
type wrapperNetDetachRequest struct {
NetDetachRequest
AsyncMode bool `url:"asyncMode"`
}
// NetDetach detaches network from compute
func (c Compute) NetDetach(ctx context.Context, req NetDetachRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) NetDetach(ctx context.Context, req NetDetachRequest) (bool, err
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetDetachRequest{
NetDetachRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/netDetach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) NetDetach(ctx context.Context, req NetDetachRequest) (bool, err
return result, nil
}
// NetDetachAsync detaches network from compute with AsyncMode
func (c Compute) NetDetachAsync(ctx context.Context, req NetDetachRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetDetachRequest{
NetDetachRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/netDetach"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -38,6 +38,12 @@ type NetQOSRequest struct {
EgressRate uint64 `url:"egress_rate,omitempty" json:"egress_rate,omitempty"`
}
type wrapperNetQOSRequest struct {
NetQOSRequest
AsyncMode bool `url:"asyncMode"`
}
// NetQOS updates compute interfaces QOS
func (c Compute) NetQOS(ctx context.Context, req NetQOSRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -45,9 +51,14 @@ func (c Compute) NetQOS(ctx context.Context, req NetQOSRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetQOSRequest{
NetQOSRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/netQos"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -59,3 +70,25 @@ func (c Compute) NetQOS(ctx context.Context, req NetQOSRequest) (bool, error) {
return result, nil
}
// NetQOSAsync updates compute interfaces QOS with AsyncMode
func (c Compute) NetQOSAsync(ctx context.Context, req NetQOSRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperNetQOSRequest{
NetQOSRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/netQos"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type PauseRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperPauseRequest struct {
PauseRequest
AsyncMode bool `url:"asyncMode"`
}
// Pause pause compute
func (c Compute) Pause(ctx context.Context, req PauseRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Pause(ctx context.Context, req PauseRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPauseRequest{
PauseRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/pause"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Pause(ctx context.Context, req PauseRequest) (bool, error) {
return result, nil
}
// PauseAsync pauses compute with AsyncMode
func (c Compute) PauseAsync(ctx context.Context, req PauseRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPauseRequest{
PauseRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/pause"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -35,6 +35,12 @@ type PFWAddRequest struct {
Proto string `url:"proto" json:"proto" validate:"proto"`
}
type wrapperPFWAddRequest struct {
PFWAddRequest
AsyncMode bool `url:"asyncMode"`
}
// PFWAdd adds port forward rule
func (c Compute) PFWAdd(ctx context.Context, req PFWAddRequest) (uint64, error) {
err := validators.ValidateRequest(req)
@@ -42,9 +48,14 @@ func (c Compute) PFWAdd(ctx context.Context, req PFWAddRequest) (uint64, error)
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPFWAddRequest{
PFWAddRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/pfwAdd"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return 0, err
}
@@ -56,3 +67,25 @@ func (c Compute) PFWAdd(ctx context.Context, req PFWAddRequest) (uint64, error)
return result, nil
}
// PFWAddAsync adds port forward rule with AsyncMode
func (c Compute) PFWAddAsync(ctx context.Context, req PFWAddRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPFWAddRequest{
PFWAddRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/pfwAdd"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -38,6 +38,12 @@ type PFWDelRequest struct {
Proto string `url:"proto,omitempty" json:"proto,omitempty" validate:"omitempty,proto"`
}
type wrapperPFWDelRequest struct {
PFWDelRequest
AsyncMode bool `url:"asyncMode"`
}
// PFWDel deletes port forward rule
func (c Compute) PFWDel(ctx context.Context, req PFWDelRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -45,9 +51,14 @@ func (c Compute) PFWDel(ctx context.Context, req PFWDelRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPFWDelRequest{
PFWDelRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/pfwDel"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -59,3 +70,25 @@ func (c Compute) PFWDel(ctx context.Context, req PFWDelRequest) (bool, error) {
return result, nil
}
// PFWDelAsync deletes port forward rule with AsyncMode
func (c Compute) PFWDelAsync(ctx context.Context, req PFWDelRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPFWDelRequest{
PFWDelRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/pfwDel"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -28,6 +28,12 @@ type PinToNodeRequest struct {
AutoStart bool `url:"autoStart" json:"autoStart"`
}
type wrapperPinToNodeRequest struct {
PinToNodeRequest
AsyncMode bool `url:"asyncMode"`
}
// PinToNode pins compute to current node
func (c Compute) PinToNode(ctx context.Context, req PinToNodeRequest) (uint64, error) {
err := validators.ValidateRequest(req)
@@ -35,9 +41,14 @@ func (c Compute) PinToNode(ctx context.Context, req PinToNodeRequest) (uint64, e
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPinToNodeRequest{
PinToNodeRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/pin_to_node"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return 0, err
}
@@ -49,3 +60,25 @@ func (c Compute) PinToNode(ctx context.Context, req PinToNodeRequest) (uint64, e
return result, nil
}
// PinToNodeAsync pins compute to current node with AsyncMode
func (c Compute) PinToNodeAsync(ctx context.Context, req PinToNodeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPinToNodeRequest{
PinToNodeRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/pin_to_node"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type PowerCycleRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperPowerCycleRequest struct {
PowerCycleRequest
AsyncMode bool `url:"asyncMode"`
}
// PowerCycle makes force stop and start compute
func (c Compute) PowerCycle(ctx context.Context, req PowerCycleRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) PowerCycle(ctx context.Context, req PowerCycleRequest) (bool, e
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPowerCycleRequest{
PowerCycleRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/powerCycle"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) PowerCycle(ctx context.Context, req PowerCycleRequest) (bool, e
return result, nil
}
// PowerCycleAsync makes force stop and start compute with AsyncMode
func (c Compute) PowerCycleAsync(ctx context.Context, req PowerCycleRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperPowerCycleRequest{
PowerCycleRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/powerCycle"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -6,11 +6,17 @@ import (
"strconv"
)
type wrapperRaiseDownRequest struct {
AsyncMode bool `url:"asyncMode"`
}
// RaiseDown starting all computes in "DOWN" tech status
func (c Compute) RaiseDown(ctx context.Context) (bool, error) {
reqWrapped := wrapperRaiseDownRequest{AsyncMode: false}
url := "/cloudbroker/compute/raiseDown"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, nil)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -22,3 +28,17 @@ func (c Compute) RaiseDown(ctx context.Context) (bool, error) {
return result, nil
}
// RaiseDownAsync starting all computes in "DOWN" tech status with AsyncMode
func (c Compute) RaiseDownAsync(ctx context.Context) (string, error) {
reqWrapped := wrapperRaiseDownRequest{AsyncMode: true}
url := "/cloudbroker/compute/raiseDown"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type RebootRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperRebootRequest struct {
RebootRequest
AsyncMode bool `url:"asyncMode"`
}
// Reboot reboots compute
func (c Compute) Reboot(ctx context.Context, req RebootRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Reboot(ctx context.Context, req RebootRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRebootRequest{
RebootRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/reboot"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Reboot(ctx context.Context, req RebootRequest) (bool, error) {
return result, nil
}
// RebootAsync reboots compute with AsyncMode
func (c Compute) RebootAsync(ctx context.Context, req RebootRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRebootRequest{
RebootRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/reboot"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -47,6 +47,12 @@ type RedeployRequest struct {
ForceStop bool `url:"forceStop,omitempty" json:"forceStop,omitempty"`
}
type wrapperRedeployRequest struct {
RedeployRequest
AsyncMode bool `url:"asyncMode"`
}
// Redeploy redeploys compute
func (c Compute) Redeploy(ctx context.Context, req RedeployRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -54,9 +60,14 @@ func (c Compute) Redeploy(ctx context.Context, req RedeployRequest) (bool, error
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRedeployRequest{
RedeployRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/redeploy"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -68,3 +79,25 @@ func (c Compute) Redeploy(ctx context.Context, req RedeployRequest) (bool, error
return result, nil
}
// RedeployAsync redeploys compute with AsyncMode
func (c Compute) RedeployAsync(ctx context.Context, req RedeployRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRedeployRequest{
RedeployRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/redeploy"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type ResetRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperResetRequest struct {
ResetRequest
AsyncMode bool `url:"asyncMode"`
}
// Reset resets compute
func (c Compute) Reset(ctx context.Context, req ResetRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Reset(ctx context.Context, req ResetRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResetRequest{
ResetRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/reset"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Reset(ctx context.Context, req ResetRequest) (bool, error) {
return result, nil
}
// ResetAsync resets compute with AsyncMode
func (c Compute) ResetAsync(ctx context.Context, req ResetRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResetRequest{
ResetRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/reset"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -43,6 +43,12 @@ func (r ResizeRequest) GetRAM() map[string]uint64 {
return res
}
type wrapperResizeRequest struct {
ResizeRequest
AsyncMode bool `url:"asyncMode"`
}
// Resize resizes compute instance
func (c Compute) Resize(ctx context.Context, req ResizeRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -50,9 +56,14 @@ func (c Compute) Resize(ctx context.Context, req ResizeRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/resize"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -64,3 +75,25 @@ func (c Compute) Resize(ctx context.Context, req ResizeRequest) (bool, error) {
return result, nil
}
// ResizeAsync resizes compute instance with AsyncMode
func (c Compute) ResizeAsync(ctx context.Context, req ResizeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResizeRequest{
ResizeRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/resize"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type RestoreRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperRestoreRequest struct {
RestoreRequest
AsyncMode bool `url:"asyncMode"`
}
// Restore restores compute from recycle bin
func (c Compute) Restore(ctx context.Context, req RestoreRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Restore(ctx context.Context, req RestoreRequest) (bool, error)
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/restore"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Restore(ctx context.Context, req RestoreRequest) (bool, error)
return result, nil
}
// RestoreAsync restores compute from recycle bin with AsyncMode
func (c Compute) RestoreAsync(ctx context.Context, req RestoreRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperRestoreRequest{
RestoreRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/restore"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -15,6 +15,12 @@ type ResumeRequest struct {
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
type wrapperResumeRequest struct {
ResumeRequest
AsyncMode bool `url:"asyncMode"`
}
// Resume resumes Compute from paused state
func (c Compute) Resume(ctx context.Context, req ResumeRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -22,9 +28,14 @@ func (c Compute) Resume(ctx context.Context, req ResumeRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResumeRequest{
ResumeRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/resume"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -36,3 +47,25 @@ func (c Compute) Resume(ctx context.Context, req ResumeRequest) (bool, error) {
return result, nil
}
// ResumeAsync resumes Compute from paused state with AsyncMode
func (c Compute) ResumeAsync(ctx context.Context, req ResumeRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperResumeRequest{
ResumeRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/resume"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,43 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// SetCPUAlignmentProfileRequest struct to set CPU alignment profile for computes
type SetCPUAlignmentProfileRequest struct {
// IDs of the compute instances
// Required: true
ComputeIDs []int64 `url:"compute_ids" json:"compute_ids" validate:"min=1"`
// CPU alignment profile name
// Required: true
CPUAlignmentProfile string `url:"cpu_alignment_profile" json:"cpu_alignment_profile" validate:"required"`
}
// SetCPUAlignmentProfile sets CPU alignment profile for computes
func (c Compute) SetCPUAlignmentProfile(ctx context.Context, req SetCPUAlignmentProfileRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/set_cpu_alignment_profile"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -20,6 +20,16 @@ type SnapshotCreateRequest struct {
// Maximum length: 36 characters
// Required: true
Label string `url:"label" json:"label" validate:"required,max=36,excludesall=<>"`
// Create snapshot with memory dump
// Required: false
// Default: false
WithMemory bool `url:"with_memory" json:"with_memory"`
}
type wrapperSnapshotCreateRequest struct {
SnapshotCreateRequest
AsyncMode bool `url:"asyncMode"`
}
// SnapshotCreate creates compute snapshot
@@ -29,9 +39,14 @@ func (c Compute) SnapshotCreate(ctx context.Context, req SnapshotCreateRequest)
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperSnapshotCreateRequest{
SnapshotCreateRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/snapshotCreate"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
@@ -40,3 +55,25 @@ func (c Compute) SnapshotCreate(ctx context.Context, req SnapshotCreateRequest)
return result, nil
}
// SnapshotCreateAsync creates compute snapshot in async mode
func (c Compute) SnapshotCreateAsync(ctx context.Context, req SnapshotCreateRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperSnapshotCreateRequest{
SnapshotCreateRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/snapshotCreate"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -17,6 +17,20 @@ type SnapshotRollbackRequest struct {
// Text label of snapshot to rollback
// Required: true
Label string `url:"label" json:"label" validate:"required"`
// Rollback with memory dump restore
// Required: false
// Default: true
WithMemory interface{} `url:"with_memory,omitempty" json:"with_memory,omitempty" validate:"omitempty,isBool"`
// ID of the node to rollback on
// Required: false
NodeID uint64 `url:"node_id,omitempty" json:"node_id,omitempty"`
}
type wrapperSnapshotRollbackRequest struct {
SnapshotRollbackRequest
AsyncMode bool `url:"asyncMode"`
}
// SnapshotRollback rollbacks specified compute snapshot
@@ -26,9 +40,14 @@ func (c Compute) SnapshotRollback(ctx context.Context, req SnapshotRollbackReque
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperSnapshotRollbackRequest{
SnapshotRollbackRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/snapshotRollback"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +59,25 @@ func (c Compute) SnapshotRollback(ctx context.Context, req SnapshotRollbackReque
return result, nil
}
// SnapshotRollbackAsync rollbacks specified compute snapshot in async mode
func (c Compute) SnapshotRollbackAsync(ctx context.Context, req SnapshotRollbackRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperSnapshotRollbackRequest{
SnapshotRollbackRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/snapshotRollback"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -23,6 +23,12 @@ type StartRequest struct {
NodeID uint64 `url:"node_id,omitempty" json:"node_id,omitempty"`
}
type wrapperStartRequest struct {
StartRequest
AsyncMode bool `url:"asyncMode"`
}
// Start starts compute
func (c Compute) Start(ctx context.Context, req StartRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -30,9 +36,14 @@ func (c Compute) Start(ctx context.Context, req StartRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperStartRequest{
StartRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/start"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -44,3 +55,25 @@ func (c Compute) Start(ctx context.Context, req StartRequest) (bool, error) {
return result, nil
}
// StartAsync starts compute with AsyncMode
func (c Compute) StartAsync(ctx context.Context, req StartRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperStartRequest{
StartRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/start"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -19,6 +19,12 @@ type StopRequest struct {
Force bool `url:"force,omitempty" json:"force,omitempty"`
}
type wrapperStopRequest struct {
StopRequest
AsyncMode bool `url:"asyncMode"`
}
// Stop stops compute
func (c Compute) Stop(ctx context.Context, req StopRequest) (bool, error) {
err := validators.ValidateRequest(req)
@@ -26,9 +32,14 @@ func (c Compute) Stop(ctx context.Context, req StopRequest) (bool, error) {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperStopRequest{
StopRequest: req,
AsyncMode: false,
}
url := "/cloudbroker/compute/stop"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return false, err
}
@@ -40,3 +51,25 @@ func (c Compute) Stop(ctx context.Context, req StopRequest) (bool, error) {
return result, nil
}
// StopAsync stops compute with AsyncMode
func (c Compute) StopAsync(ctx context.Context, req StopRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
reqWrapped := wrapperStopRequest{
StopRequest: req,
AsyncMode: true,
}
url := "/cloudbroker/compute/stop"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -73,6 +73,11 @@ type UpdateRequest struct {
// Priority weight of the compute: higher value means higher priority and later migration
// Required: false
Weight uint64 `url:"weight,omitempty" json:"weight,omitempty"`
// Clock type for the VM
// Required: false
// Default: null
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
}
// Update updates some properties of the compute

View File

@@ -42,9 +42,9 @@ type CreateRequest struct {
// Required: false
Cache string `url:"cache,omitempty" json:"cache,omitempty"`
// BLK Discard
// Discard
// Required: false
BLKDiscard interface{} `url:"blkdiscard,omitempty" json:"blkdiscard,omitempty" validate:"omitempty,isBool"`
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
}
// Create creates a disk

View File

@@ -21,9 +21,9 @@ type MigrateRequest struct {
// Required: true
PoolName string `url:"pool_name" json:"pool_name" validate:"required"`
// ID if the storage policy
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// ID of the storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
// Move moves disk to another sep, pool and storage policy

View File

@@ -53,8 +53,8 @@ type InfoDisk struct {
// Access Control Control
ACL map[string]interface{} `json:"acl"`
// BLK Discard
BLKDiscard bool `json:"blkdiscard"`
// Discard
Discard string `json:"discard"`
// Block size of disk
BlockSize string `json:"block_size"`
@@ -65,6 +65,9 @@ type InfoDisk struct {
// Computes
Computes map[string]string `json:"computes"`
// Computes read only
ComputesReadOnly map[string]bool `json:"computes_read_only"`
// Created time
CreatedTime uint64 `json:"createdTime"`

View File

@@ -18,9 +18,9 @@ type UpdateRequest struct {
// Required: false
Cache string `url:"cache,omitempty" json:"cache,omitempty"`
// BLK Discard
// Discard
// Required: false
BLKDiscard interface{} `url:"blkdiscard,omitempty" json:"blkdiscard,omitempty" validate:"omitempty,isBool"`
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
// Block size of disk
// Required: false

View File

@@ -46,6 +46,9 @@ type RecordResource struct {
// Number of GPU
GPU uint64 `json:"gpu"`
// Policies
Policies map[string]PolicyUsage `json:"policies"`
// Number of RAM
RAM uint64 `json:"ram"`
@@ -62,14 +65,17 @@ type DiskUsage struct {
DiskSizeMax float64 `json:"disksizemax"`
}
// Policy usage details
type PolicyUsage struct {
// Disk usage
DiskUsage
// SEPs
SEPs map[string]map[string]DiskUsage `json:"seps"`
}
// Detailed information about grid
type RecordGrid struct {
// CKey
CKey string `json:"_ckey"`
// Meta
Meta []interface{} `json:"_meta"`
// AuthBroker
AuthBroker []interface{} `json:"authBroker"`
@@ -97,6 +103,9 @@ type RecordGrid struct {
// SDN support
SDNSupport bool `json:"sdn_support"`
// Is Zero Access enabled
ZeroAccessEnabled bool `json:"zeroaccess_enabled"`
// Is BRO enabled
BROEnabled bool `json:"bro_enabled"`
}
@@ -166,6 +175,15 @@ type RecordSettingsGrid struct {
//Cleanup retention period
CleanupRetentionPeriod uint64 `json:"cleanupRetentionPeriod"`
// CPU allocation ratio
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
// CPU allocation ratio for VMs
CPUAllocationRatioVM uint64 `json:"cpu_allocation_ratio_vm"`
// Custom backup path
CustomBackupPath []string `json:"custom_backup_path"`
//Docker registry
DockerRegistry DockerRegistry `json:"docker_registry"`
@@ -178,6 +196,9 @@ type RecordSettingsGrid struct {
//Healthcheck notifications
HealthcheckNotifications HealthcheckNotifications `json:"healthcheck_notifications"`
// Interface generation scheme
InterfaceGenerationScheme string `json:"interface_generation_scheme"`
//k8s cleanup enabled
K8sCleanupEnabled bool `json:"k8s_cleanup_enabled"`
@@ -187,12 +208,21 @@ type RecordSettingsGrid struct {
//Location url
LocationURL string `json:"location_url"`
// MAC address prefix
MACAddressPrefix string `json:"mac_address_prefix"`
//Net QOS
NetQOS NetQOS `json:"net_qos"`
//Networks
Networks string `json:"networks"`
// Node self stop timer uptime monitor
NodeSelfStopTimerUptimeMonitor uint64 `json:"nodeSelfStopTimerUptimeMonitor"`
// Node self stop uptime monitor
NodeSelfStopUptimeMonitor bool `json:"nodeSelfStopUptimeMonitor"`
//Prometheus
Prometheus Prometheus `json:"prometheus"`

View File

@@ -16,7 +16,7 @@ type SetCPUAllocationRatioRequest struct {
// Allocation ratio
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetCPUAllocationRatio sets CPU allocation ratio

View File

@@ -15,7 +15,7 @@ type SetCPUAllocationRatioForVMRequest struct {
// Default CPU allocation ratio for computes
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetCPUAllocationRatioForVM sets CPU allocation ratio for computes

View File

@@ -16,7 +16,7 @@ type SetMemAllocationRatioRequest struct {
// Allocation ratio
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetMemAllocationRatio sets memory allocation ratio

View File

@@ -28,7 +28,7 @@ type ListRequest struct {
// Find by type
// Required: false
TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"`
TypeImage []string `url:"typeImage,omitempty" json:"typeImage,omitempty"`
// Find by image size
// Required: false

View File

@@ -24,22 +24,22 @@ type MultiImageExportRequest struct {
}
// MultiImageExport copies a physical image from multi image to the specified pool
func (i Image) MultiImageExport(ctx context.Context, req MultiImageExportRequest) (bool, error) {
func (i Image) MultiImageExport(ctx context.Context, req MultiImageExportRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/image/multi_image_export"
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
return 0, err
}
result, err := strconv.ParseBool(string(res))
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return false, err
return 0, err
}
return result, nil

View File

@@ -63,9 +63,9 @@ type Interface struct {
// Required: false
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
// SDN Object Group ID
// SDN Object Group IDs
// Required: false
SDNObjectGroupID string `url:"sdn_object_group_id,omitempty" json:"sdn_object_group_id,omitempty"`
SDNObjectGroupIDs []string `url:"sdn_object_group_ids,omitempty" json:"sdn_object_group_ids,omitempty"`
// SDN Logical Port Display Name
// Required: false
@@ -112,9 +112,9 @@ type DataDisk struct {
// Required: false
Cache string `url:"cache,omitempty" json:"cache,omitempty"`
// BLK Discard
// Discard
// Required: false
BLKDiscard interface{} `url:"blkdiscard,omitempty" json:"blkdiscard,omitempty" validate:"omitempty,isBool"`
Discard string `url:"discard,omitempty" json:"discard,omitempty"`
}
// CreateRequest struct to create KVM x86 VM
@@ -233,14 +233,23 @@ type CreateRequest struct {
// Required: false
BootDiskCache string `url:"boot_disk_cache,omitempty" json:"boot_disk_cache,omitempty"`
// Boot Disk BLK Discard
// Boot Disk Discard
// Required: false
BootDiskBLKDiscard interface{} `url:"boot_disk_blkdiscard,omitempty" json:"boot_disk_blkdiscard,omitempty" validate:"omitempty,isBool"`
BootDiskDiscard string `url:"boot_disk_discard,omitempty" json:"boot_disk_discard,omitempty"`
// Priority weight of the VM: higher value means higher priority and later migration
// Required: false
// Default: 1
Weight uint64 `url:"weight,omitempty" json:"weight,omitempty"`
// CPU alignment profile name
// Required: false
CPUAlignmentProfile string `url:"cpu_alignment_profile,omitempty" json:"cpu_alignment_profile,omitempty"`
// Clock type for the VM
// Required: false
// Default: default
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
}
// GetRAM returns RAM field values
@@ -268,7 +277,7 @@ func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
if len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
@@ -285,7 +294,7 @@ func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
var dataDisks []string
if req.DataDisks != nil && len(req.DataDisks) != 0 {
if len(req.DataDisks) != 0 {
dataDisks = make([]string, 0, len(req.DataDisks))
for i := range req.DataDisks {

View File

@@ -120,14 +120,23 @@ type CreateBlankRequest struct {
// Required: false
BootDiskCache string `url:"boot_disk_cache,omitempty" json:"boot_disk_cache,omitempty"`
// Boot Disk BLK Discard
// Boot Disk Discard
// Required: false
BootDiskBLKDiscard interface{} `url:"boot_disk_blkdiscard" json:"boot_disk_blkdiscard" validate:"omitempty,isBool"`
BootDiskDiscard string `url:"boot_disk_discard,omitempty" json:"boot_disk_discard,omitempty"`
// Priority weight of the VM: higher value means higher priority and later migration
// Required: false
// Default: 1
Weight uint64 `url:"weight,omitempty" json:"weight,omitempty"`
// CPU alignment profile name
// Required: false
CPUAlignmentProfile string `url:"cpu_alignment_profile,omitempty" json:"cpu_alignment_profile,omitempty"`
// Clock type for the VM
// Required: false
// Default: default
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
}
// GetRAM returns RAM field values
@@ -155,7 +164,7 @@ func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
if len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
@@ -172,7 +181,7 @@ func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
var dataDisks []string
if req.DataDisks != nil && len(req.DataDisks) != 0 {
if len(req.DataDisks) != 0 {
dataDisks = make([]string, 0, len(req.DataDisks))
for i := range req.DataDisks {

View File

@@ -57,9 +57,9 @@ type InterfaceMassCreate struct {
// Required: false
SDNSegmentID string `url:"sdn_segment_id,omitempty" json:"sdn_segment_id,omitempty"`
// SDN Object Group ID
// SDN Object Group IDs
// Required: false
SDNObjectGroupID string `url:"sdn_object_group_id,omitempty" json:"sdn_object_group_id,omitempty"`
SDNObjectGroupIDs []string `url:"sdn_object_group_ids,omitempty" json:"sdn_object_group_ids,omitempty"`
// SDN Logical Port Display Name
// Required: false
@@ -158,14 +158,23 @@ type MassCreateRequest struct {
// Required: false
BootDiskCache string `url:"boot_disk_cache,omitempty" json:"boot_disk_cache,omitempty"`
// Boot Disk BLK Discard
// Boot Disk Discard
// Required: false
BootDiskBLKDiscard interface{} `url:"boot_disk_blkdiscard" json:"boot_disk_blkdiscard" validate:"omitempty,isBool"`
BootDiskDiscard string `url:"boot_disk_discard,omitempty" json:"boot_disk_discard,omitempty"`
// Priority weight of the VM: higher value means higher priority and later migration
// Required: false
// Default: 1
Weight uint64 `url:"weight,omitempty" json:"weight,omitempty"`
// CPU alignment profile name
// Required: false
CPUAlignmentProfile string `url:"cpu_alignment_profile,omitempty" json:"cpu_alignment_profile,omitempty"`
// Clock type for the VM
// Required: false
// Default: default
Clock string `url:"clock,omitempty" json:"clock,omitempty"`
}
type asyncWrapperMassCreateRequest struct {
@@ -198,7 +207,7 @@ func (k KVMX86) MassCreate(ctx context.Context, req MassCreateRequest) ([]uint64
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
if len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
@@ -215,7 +224,7 @@ func (k KVMX86) MassCreate(ctx context.Context, req MassCreateRequest) ([]uint64
var dataDisks []string
if req.DataDisks != nil && len(req.DataDisks) != 0 {
if len(req.DataDisks) != 0 {
dataDisks = make([]string, 0, len(req.DataDisks))
for i := range req.DataDisks {
@@ -262,7 +271,7 @@ func (k KVMX86) MassCreateAsync(ctx context.Context, req MassCreateRequest) (str
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
if len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
@@ -279,7 +288,7 @@ func (k KVMX86) MassCreateAsync(ctx context.Context, req MassCreateRequest) (str
var dataDisks []string
if req.DataDisks != nil && len(req.DataDisks) != 0 {
if len(req.DataDisks) != 0 {
dataDisks = make([]string, 0, len(req.DataDisks))
for i := range req.DataDisks {

View File

@@ -0,0 +1,46 @@
package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetNetworkInfoRequest struct to get network information of a node
type GetNetworkInfoRequest struct {
// Node ID
// Required: true
NodeID uint64 `url:"node_id" json:"node_id" validate:"required"`
}
// GetNetworkInfo gets network information of a node as a RecordNodeNetworkInfo struct
func (n Node) GetNetworkInfo(ctx context.Context, req GetNetworkInfoRequest) (*RecordNodeNetworkInfo, error) {
res, err := n.GetNetworkInfoRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordNodeNetworkInfo{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetNetworkInfoRaw gets network information of a node as an array of bytes
func (n Node) GetNetworkInfoRaw(ctx context.Context, req GetNetworkInfoRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/get_network_info"
res, err := n.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,62 @@
package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetPCIDevicesRequest struct to get list of PCI devices on a node
type GetPCIDevicesRequest struct {
// Node ID
// Required: true
NodeID uint64 `url:"nid" json:"nid" validate:"required"`
// Search string
// Required: false
Search string `url:"search,omitempty" json:"search,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty" validate:"omitempty,sortBy"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// GetPCIDevices gets list of PCI devices on a node as a ListPCIDevices struct
func (n Node) GetPCIDevices(ctx context.Context, req GetPCIDevicesRequest) (*ListPCIDevices, error) {
res, err := n.GetPCIDevicesRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListPCIDevices{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// GetPCIDevicesRaw gets list of PCI devices on a node as an array of bytes
func (n Node) GetPCIDevicesRaw(ctx context.Context, req GetPCIDevicesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/get_pci_devices"
res, err := n.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -9,7 +9,7 @@ type RecordNode struct {
CpuInfo CpuInfo `json:"cpuInfo"`
// CPU Allocation Ratio
CPUAllocationRatio float64 `json:"cpu_allocation_ratio"`
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
// DPDK info
DPDK DPDK `json:"dpdk"`
@@ -27,7 +27,7 @@ type RecordNode struct {
IsolatedCpus []interface{} `json:"isolatedCpus"`
// MemAllocationRatio
MemAllocationRatio float64 `json:"mem_allocation_ratio"`
MemAllocationRatio uint64 `json:"mem_allocation_ratio"`
// Name
Name string `json:"name"`
@@ -120,7 +120,7 @@ type FreeResourcesInfo struct {
RAM float64 `json:"RAM"`
// VCPU
VCPU float64 `json:"vCPUs"`
VCPU uint64 `json:"vCPUs"`
}
// Resources Info
@@ -303,10 +303,10 @@ type ItemNode struct {
OldCompatLVMID uint64 `json:"old_compat_lvm_id"`
// CPU Allocation ratio
CPUAllocationRatio float64 `json:"cpu_allocation_ratio"`
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
// MemAllocationRatio
MemAllocationRatio float64 `json:"mem_allocation_ratio"`
MemAllocationRatio uint64 `json:"mem_allocation_ratio"`
// Packages
Packages map[string]PackageInfo `json:"packages"`
@@ -319,6 +319,9 @@ type ItemNode struct {
// AutoStart Count
AutoStartCount uint64 `json:"autostart_count"`
// PCI devices attached to the node
PCIDevices []ItemPCIDevice `json:"pci_devices"`
}
type PackageInfo struct {
@@ -350,9 +353,36 @@ type ItemMemory struct {
// 1G
OneG uint64 `json:"1G"`
// 1G available
OneGAvailable uint64 `json:"1G_available"`
// 1G free
OneGFree uint64 `json:"1G_free"`
// 1G reserved
OneGReserved uint64 `json:"1G_reserved"`
// 1G used
OneGUsed uint64 `json:"1G_used"`
// 1G DPDK reserved
OneGDPDKReserved uint64 `json:"1G_dpdk_reserved"`
// 2M
TwoM uint64 `json:"2M"`
// 2M available
TwoMAvailable uint64 `json:"2M_available"`
// 2M free
TwoMFree uint64 `json:"2M_free"`
// 2M reserved
TwoMReserved uint64 `json:"2M_reserved"`
// 2M used
TwoMUsed uint64 `json:"2M_used"`
// Total
Total uint64 `json:"total"`
}
@@ -454,6 +484,54 @@ type Role struct {
Time uint64 `json:"time"`
}
// PCI device info
type ItemPCIDevice struct {
// Hardware path
HWPath string `json:"hw_path"`
// Current driver
CurrentDriver string `json:"current_driver"`
// NUMA node
NUMANode uint64 `json:"numa_node"`
// Product ID
ProductID string `json:"product_id"`
// Product name
ProductName string `json:"product_name"`
// Vendor ID
VendorID string `json:"vendor_id"`
// Vendor name
VendorName string `json:"vendor_name"`
// IOMMU group
IOMMUGroup uint64 `json:"iommu_group"`
}
// List of PCI devices
type ListPCIDevices struct {
// Data
Data []ItemPCIDevice `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Response for PCI device driver binding actions
type RecordPCIDeviceDriver struct {
// Success
Success bool `json:"success"`
// Message
Message string `json:"message"`
// Result
Result interface{} `json:"result"`
}
// Information about SSH Identity
type SSHIdentity struct {
//Host name of the client
@@ -465,3 +543,231 @@ type SSHIdentity struct {
//Array of SSH public keys of the client
PublicKeys []string `json:"public_keys"`
}
// Full network configuration of a node
type RecordNodeNetworkInfo struct {
// System-level information about all network interfaces on the node
SystemNetworksInfo map[string]SystemNetworkInfo `json:"system_networks_info"`
// Raw OVS ports data
OVSNetworksInfo []OVSNetworkInfo `json:"ovs_networks_info"`
// VM network interface connections
LibvirtNetworksInfo []LibvirtNetworkInfo `json:"libvirt_networks_info"`
// Assembled network topology of the node
Topology NetworkTopology `json:"topology"`
}
// System network interface
type SystemNetworkInfo struct {
// MTU value
MTU uint64 `json:"mtu"`
// Interface link speed
Speed int64 `json:"speed"`
// Linux bridge ID
BridgeID string `json:"bridge_id"`
// Bridge port ID
BPortID string `json:"bport_id"`
// MAC address
MAC string `json:"mac"`
}
// OVS port information
type OVSNetworkInfo struct {
// Bridge name
BridgeName string `json:"bridge_name"`
// Bridge tag
BridgeTag string `json:"bridge_tag"`
// Interface UUID
InterfaceUUID string `json:"interface_uuid"`
// Interface type
InterfaceType string `json:"interface_type"`
// Interface name
InterfaceName string `json:"interface_name"`
// Interface MTU value
InterfaceMTU uint64 `json:"interface_mtu"`
// Interface IP address
InterfaceIP string `json:"interface_ip"`
// Interface MAC address
InterfaceMAC string `json:"interface_mac"`
// Interface peer name
InterfacePeer string `json:"interface_peer"`
}
// VM network interface connection
type LibvirtNetworkInfo struct {
// VM name
VMName string `json:"vm_name"`
// Host-side interface name used by the VM
Interface string `json:"interface"`
// Interface type
InterfaceType string `json:"interface_type"`
// Name of the bridge the VM interface is attached to
InterfaceSource string `json:"interface_source"`
}
// Assembled network topology of the node
type NetworkTopology struct {
// Map of all network interfaces by name with their topology details and connections
Interfaces map[string]TopologyInterface `json:"interfaces"`
}
// Interface and its role in the network topology
type TopologyInterface struct {
// Interface type
Type string `json:"type"`
// Interface MTU value
MTU uint64 `json:"mtu"`
// Interface link speed
Speed int64 `json:"speed"`
// Connections to VMs and to bridges
Connections TopologyInterfaceConnections `json:"connections"`
// VLANs associated with the interface
VLANs []string `json:"vlans"`
// Linux bridge ID
BridgeID string `json:"bridge_id"`
// Port configuration of this bridge
BridgeInfo *TopologyBridgeInfo `json:"bridge_info"`
// Peer bridges connected to this bridge via patch ports
BridgeConnections []TopologyBridgeRef `json:"bridge_connections"`
// Names of interfaces attached to this bridge as ports
ConnectedInterfaces []string `json:"connected_interfaces"`
// Peer interface name
Peer string `json:"peer"`
// OVS UUID
UUID string `json:"uuid"`
}
// Lists what is connected to this interface
type TopologyInterfaceConnections struct {
// VMs connected to this interface
VMs []TopologyVMConnection `json:"vms"`
// Bridges this interface is attached to
Bridges []TopologyBridgeAttachment `json:"bridges"`
}
// VM connected to a bridge or interface
type TopologyVMConnection struct {
// VM name
Name string `json:"name"`
// Host-side interface name
VMInterface string `json:"vm_interface"`
// VM interface type
VMInterfaceType string `json:"vm_interface_type"`
// Connection type
ConnectionType string `json:"connection_type"`
// Via bridge
ViaBridge string `json:"via_bridge"`
}
// How interface is attached to a bridge
type TopologyBridgeAttachment struct {
// Bridge name
Name string `json:"name"`
// Bridge type
Type string `json:"type"`
// Attachment method
Via string `json:"via"`
// Port details
PortInfo *TopologyPortInfo `json:"port_info"`
// Linux bridge port ID
BPortID string `json:"bport_id"`
}
// Bridge port entry
type TopologyPortInfo struct {
// Port name
Name string `json:"name"`
// Port type
Type string `json:"type"`
// MTU value
MTU uint64 `json:"mtu"`
// VLAN tag
VLAN string `json:"vlan"`
// OVS UUID of the port
UUID string `json:"uuid"`
}
// OVS bridge port configuration
type TopologyBridgeInfo struct {
// Bridge type
Type string `json:"type"`
// List of ports on this bridge
Ports []TopologyBridgePort `json:"ports"`
}
// Port on an OVS bridge
type TopologyBridgePort struct {
// Port name
Name string `json:"name"`
// Port type
Type string `json:"type"`
// MTU value
MTU uint64 `json:"mtu"`
// VLAN tag
VLAN string `json:"vlan"`
// UUID
UUID string `json:"uuid"`
// IP address
IP string `json:"ip"`
// MAC address
MAC string `json:"mac"`
}
// Peer bridge connected via a patch port
type TopologyBridgeRef struct {
// Name of the peer bridge
Name string `json:"name"`
// Name of the patch port used to connect to the peer bridge
Via string `json:"via"`
// VLAN tag on the patch connection
VLAN string `json:"vlan"`
}

View File

@@ -0,0 +1,45 @@
package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// PCIDeviceDriverToKernelRequest struct to bind PCI device driver to kernel
type PCIDeviceDriverToKernelRequest struct {
// Node ID
// Required: true
NodeID uint64 `url:"nid" json:"nid" validate:"required"`
// 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"`
}
// PCIDeviceDriverToKernel binds PCI device driver to kernel
func (n Node) PCIDeviceDriverToKernel(ctx context.Context, req PCIDeviceDriverToKernelRequest) (*RecordPCIDeviceDriver, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/pci_device_driver_to_kernel"
res, err := n.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return nil, err
}
result := RecordPCIDeviceDriver{}
err = json.Unmarshal(res, &result)
if err != nil {
return nil, err
}
return &result, nil
}

View File

@@ -0,0 +1,50 @@
package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// PCIDeviceDriverToVFIORequest struct to bind PCI device driver to VFIO
type PCIDeviceDriverToVFIORequest struct {
// Node ID
// Required: true
NodeID uint64 `url:"nid" json:"nid" validate:"required"`
// 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"`
// Driver binding mode
// Required: true
// Possible values: safe, unsafe
Mode string `url:"mode" json:"mode" validate:"required,oneof=safe unsafe"`
}
// PCIDeviceDriverToVFIO binds PCI device driver to VFIO
func (n Node) PCIDeviceDriverToVFIO(ctx context.Context, req PCIDeviceDriverToVFIORequest) (*RecordPCIDeviceDriver, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/pci_device_driver_to_vfio"
res, err := n.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return nil, err
}
result := RecordPCIDeviceDriver{}
err = json.Unmarshal(res, &result)
if err != nil {
return nil, err
}
return &result, nil
}

View File

@@ -2,6 +2,7 @@ package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
@@ -15,22 +16,29 @@ type SetCpuAllocationRatioRequest struct {
// Allocation ratio (zero or positive value)
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetCpuAllocationRatio set CPU allocation ratio
func (i Node) SetCpuAllocationRatio(ctx context.Context, req SetCpuAllocationRatioRequest) error {
func (i Node) SetCpuAllocationRatio(ctx context.Context, req SetCpuAllocationRatioRequest) (*ItemNode, error) {
err := validators.ValidateRequest(req)
if err != nil {
return validators.ValidationErrors(validators.GetErrors(err))
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/set_cpu_allocation_ratio"
_, err = i.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return err
return nil, err
}
return nil
info := ItemNode{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}

View File

@@ -2,6 +2,7 @@ package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
@@ -15,22 +16,29 @@ type SetMemAllocationRatioRequest struct {
// Allocation ratio (zero or positive value)
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetMemAllocationRatio set memory allocation ratio
func (i Node) SetMemAllocationRatio(ctx context.Context, req SetMemAllocationRatioRequest) error {
func (i Node) SetMemAllocationRatio(ctx context.Context, req SetMemAllocationRatioRequest) (*ItemNode, error) {
err := validators.ValidateRequest(req)
if err != nil {
return validators.ValidationErrors(validators.GetErrors(err))
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/set_mem_allocation_ratio"
_, err = i.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return err
return nil, err
}
return nil
info := ItemNode{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}

View File

@@ -18,7 +18,7 @@ type GetByComputeRequest struct {
StartTime uint64 `url:"starttime,omitempty" json:"starttime,omitempty"`
// End of time period - unixtime
// Required: true
// Required: false
EndTime uint64 `url:"endtime,omitempty" json:"endtime,omitempty"`
}

View File

@@ -14,7 +14,7 @@ type GetByComputesRequest struct {
StartTime uint64 `url:"starttime,omitempty" json:"starttime,omitempty"`
// End of time period - unixtime
// Required: true
// Required: false
EndTime uint64 `url:"endtime,omitempty" json:"endtime,omitempty"`
}

View File

@@ -14,7 +14,7 @@ type GetByGRIDRequest struct {
StartTime uint64 `url:"starttime,omitempty" json:"starttime,omitempty"`
// End of time period - unixtime
// Required: true
// Required: false
EndTime uint64 `url:"endtime,omitempty" json:"endtime,omitempty"`
}

View File

@@ -18,7 +18,7 @@ type GetByNodeRequest struct {
StartTime uint64 `url:"starttime,omitempty" json:"starttime,omitempty"`
// End of time period - unixtime
// Required: true
// Required: false
EndTime uint64 `url:"endtime,omitempty" json:"endtime,omitempty"`
}

View File

@@ -14,7 +14,7 @@ type GetByNodesRequest struct {
StartTime uint64 `url:"starttime,omitempty" json:"starttime,omitempty"`
// End of time period - unixtime
// Required: true
// Required: false
EndTime uint64 `url:"endtime,omitempty" json:"endtime,omitempty"`
}

View File

@@ -152,7 +152,7 @@ type ItemRG struct {
CPUAllocationParameter string `json:"cpu_allocation_parameter"`
// CPU allocation ratio
CPUAllocationRatio float64 `json:"cpu_allocation_ratio"`
CPUAllocationRatio uint64 `json:"cpu_allocation_ratio"`
// Created by
CreatedBy string `json:"createdBy"`

View File

@@ -15,7 +15,7 @@ type SetCPUAllocationRatioRequest struct {
// CPU allocation ratio, i.e. one pCPU = ratio*vCPU
// Required: true
Ratio float64 `url:"ratio" json:"ratio" validate:"required"`
Ratio uint64 `url:"ratio" json:"ratio" validate:"required"`
}
// SetCPUAllocationRatio sets CPU allocation ratio

View File

@@ -16,7 +16,7 @@ type AddPoolRequest struct {
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
// Pool structure which contains fields such as "name", "usage_limit", "types", "system", "accessAccountIds", "accessResGroupIds". Added fields for other pool types: Des, Ovs - "uris" list of "ip, port".
// Dorado, Tatlin no additional fields required. Hitachi - "id", "snapshotable", "snapshot_pool_id", "minLdevId", "maxLdevId", "clone_technology". Shared - "description", "wwns", "allocate_type", "stripes", "metadata_size", "metadatatalun". Local - "description", "node_consumer", "block_disk".
// Dorado, Tatlin - "vdisk_discard". Hitachi - "id", "snapshotable", "snapshot_pool_id", "minLdevId", "maxLdevId", "clone_technology", "vdisk_discard". Shared - "description", "wwns", "allocate_type", "stripes", "metadata_size", "metadatatalun", "vdisk_discard" Local - "description", "node_consumer", "block_disk".
// Required: true
Pool string `url:"pool" json:"pool" validate:"required"`
}

View File

@@ -0,0 +1,48 @@
package sep
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateRequest struct to update SEP object
type UpdateRequest struct {
// ID of SEP to update
// Required: true
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required,min=1"`
// New SEP name
// Required: false
// Default: null
SEPName string `url:"name,omitempty" json:"name,omitempty" validate:"omitempty,min=1,max=256,sepName"`
// New description
// Required: false
// Default: null
Description string `url:"description,omitempty" json:"description,omitempty" validate:"omitempty,max=4096,sepDescription"`
}
// Update updates SEP object
func (s SEP) Update(ctx context.Context, req UpdateRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/sep/update"
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -18,9 +18,8 @@ type CreateRequest struct {
EmailAddress string `url:"emailaddress" json:"emailaddress" validate:"required"`
// Password of user
// Required: false
// Default: strongpassword
Password string `url:"password,omitempty" json:"password,omitempty"`
// Required: true
Password string `url:"password" json:"password" validate:"required"`
// List of apiaccess groups this user belongs to.
// Required: false

View File

@@ -54,9 +54,6 @@ type ItemUser struct {
// Mobile
Mobile []interface{} `json:"mobile"`
// Password
Password string `json:"passwd"`
// Protected
Protected bool `json:"protected"`

View File

@@ -0,0 +1,51 @@
package zone
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddCPUAlignmentProfileRequest struct to add CPU alignment profile to zone
type AddCPUAlignmentProfileRequest struct {
// ID of zone
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
// Hypervisor similarity in percentage
// Default: 70
// Required: false
HypervisorSimilarityInPercentage uint64 `url:"hypervisor_similarity_in_percentage,omitempty" json:"hypervisor_similarity_in_percentage,omitempty"`
}
// AddCPUAlignmentProfile adds CPU alignment profile to zone
func (e Zone) AddCPUAlignmentProfile(ctx context.Context, req AddCPUAlignmentProfileRequest) ([]CpuAlignmentProfile, error) {
res, err := e.AddCPUAlignmentProfileRaw(ctx, req)
if err != nil {
return nil, err
}
var profiles []CpuAlignmentProfile
err = json.Unmarshal(res, &profiles)
if err != nil {
return nil, err
}
return profiles, nil
}
// AddCPUAlignmentProfileRaw adds CPU alignment profile to zone and returns the result as an array of bytes
func (e Zone) AddCPUAlignmentProfileRaw(ctx context.Context, req AddCPUAlignmentProfileRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/zone/add_cpu_alignment_profile"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -0,0 +1,38 @@
package zone
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// DeleteCPUAlignmentProfileRequest struct to delete CPU alignment profile from zone
type DeleteCPUAlignmentProfileRequest struct {
// ID of zone
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
}
// DeleteCPUAlignmentProfile deletes CPU alignment profile from zone
func (e Zone) DeleteCPUAlignmentProfile(ctx context.Context, req DeleteCPUAlignmentProfileRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/zone/delete_cpu_alignment_profile"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,46 @@
package zone
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetCPUAlignmentProfileRequest struct to get CPU alignment profile of zone
type GetCPUAlignmentProfileRequest struct {
// ID of zone
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
}
// GetCPUAlignmentProfile gets CPU alignment profile of zone
func (e Zone) GetCPUAlignmentProfile(ctx context.Context, req GetCPUAlignmentProfileRequest) ([]CpuAlignmentProfile, error) {
res, err := e.GetCPUAlignmentProfileRaw(ctx, req)
if err != nil {
return nil, err
}
var profiles []CpuAlignmentProfile
err = json.Unmarshal(res, &profiles)
if err != nil {
return nil, err
}
return profiles, nil
}
// GetCPUAlignmentProfileRaw gets CPU alignment profile of zone as an array of bytes
func (e Zone) GetCPUAlignmentProfileRaw(ctx context.Context, req GetCPUAlignmentProfileRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/zone/get_cpu_alignment_profile"
res, err := e.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,45 @@
package zone
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListCPUAlignmentProfileRequest struct to list CPU alignment profiles
type ListCPUAlignmentProfileRequest struct {
// ID of zone
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
}
// ListCPUAlignmentProfile gets list of CPU alignment profiles
func (e Zone) ListCPUAlignmentProfile(ctx context.Context, req ListCPUAlignmentProfileRequest) (*ListCPUAlignmentProfiles, error) {
res, err := e.ListCPUAlignmentProfileRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListCPUAlignmentProfiles{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListCPUAlignmentProfileRaw gets list of CPU alignment profiles as an array of bytes
func (e Zone) ListCPUAlignmentProfileRaw(ctx context.Context, req ListCPUAlignmentProfileRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/zone/list_cpu_alignment_profile"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -1,5 +1,65 @@
package zone
// CPU alignment profile
type CpuAlignmentProfile struct {
// Profile name
Name string `json:"name"`
// Vendor
Vendor string `json:"vendor"`
// Model
Model string `json:"model"`
}
// CPU alignment profile candidate
type CpuAlignmentProfileCandidate struct {
// Profile name
Name string `json:"name"`
// Vendor
Vendor string `json:"vendor"`
// Model
Model string `json:"model"`
// Count
Count uint64 `json:"count"`
// Percentage
Percentage uint64 `json:"percentage"`
// Required count
RequiredCount uint64 `json:"required_count"`
}
// Response for test_cpu_alignment_profile
type TestCPUAlignmentProfileResult struct {
// Profiles
Profiles []CpuAlignmentProfile `json:"profiles"`
// Candidates
Candidates []CpuAlignmentProfileCandidate `json:"candidates"`
}
// Item for list_cpu_alignment_profile response
type ItemCPUAlignmentProfile struct {
// Zone ID
ZoneID uint64 `json:"zoneId"`
// CPU alignment profiles
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
}
// Response for list_cpu_alignment_profile
type ListCPUAlignmentProfiles struct {
// Entry count
EntryCount uint64 `json:"entryCount"`
// Data
Data []ItemCPUAlignmentProfile `json:"data"`
}
type ListZones struct {
// Entry count
EntryCount uint64 `json:"entryCount"`
@@ -96,6 +156,9 @@ type RecordZone struct {
// Domain
Domain string `json:"domain"`
// CPU alignment profiles
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
}
// A zone item from a list
@@ -165,4 +228,7 @@ type ItemZone struct {
// Domain
Domain string `json:"domain"`
// CPU alignment profiles
CpuAlignmentProfiles []CpuAlignmentProfile `json:"cpu_alignment_profiles"`
}

View File

@@ -0,0 +1,51 @@
package zone
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// TestCPUAlignmentProfileRequest struct to test CPU alignment profile for zone
type TestCPUAlignmentProfileRequest struct {
// ID of zone
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
// Hypervisor similarity in percentage
// Default: 70
// Required: false
HypervisorSimilarityInPercentage uint64 `url:"hypervisor_similarity_in_percentage,omitempty" json:"hypervisor_similarity_in_percentage,omitempty"`
}
// TestCPUAlignmentProfile tests CPU alignment profile for zone
func (e Zone) TestCPUAlignmentProfile(ctx context.Context, req TestCPUAlignmentProfileRequest) (*TestCPUAlignmentProfileResult, error) {
res, err := e.TestCPUAlignmentProfileRaw(ctx, req)
if err != nil {
return nil, err
}
result := TestCPUAlignmentProfileResult{}
err = json.Unmarshal(res, &result)
if err != nil {
return nil, err
}
return &result, nil
}
// TestCPUAlignmentProfileRaw tests CPU alignment profile for zone and returns the result as an array of bytes
func (e Zone) TestCPUAlignmentProfileRaw(ctx context.Context, req TestCPUAlignmentProfileRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/zone/test_cpu_alignment_profile"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}