This commit is contained in:
2026-09-25 16:32:09 +03:00
parent bf932e5ef9
commit 69f056616f
33 changed files with 2074 additions and 594 deletions

View File

@@ -88,6 +88,42 @@ type ItemAudit struct {
// TTL
TTL string `json:"_ttl"`
// Resource group ID
ResgroupID uint64 `json:"resgroup_id"`
// Account ID
AccountID uint64 `json:"account_id"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// VINS ID
VINSID uint64 `json:"vins_id"`
// Service ID
ServiceID uint64 `json:"service_id"`
// K8S ID
K8SID uint64 `json:"k8s_id"`
// FLIPGroup ID
FLIPGroupID uint64 `json:"flipgroup_id"`
// Load balancer ID
LBID uint64 `json:"lb_id"`
// SEP ID
SEPID uint64 `json:"sep_id"`
// Node IDs
NodeIDs []uint64 `json:"node_ids"`
// Persistent disk IDs associated with the operation
DiskIDs []uint64 `json:"disk_ids"`
// API task ID for asynchronous calls
APITask string `json:"apitask"`
}
// List of audits

View File

@@ -6,6 +6,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -51,14 +52,14 @@ type AffinityRuleAddRequest struct {
type wrapperAffinityRuleAddRequest struct {
AffinityRuleAddRequest
AsyncMode bool `url:"async_mode"`
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// AffinityRuleAdd add affinity rule
func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (bool, error) {
func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (AffinityRuleAddResult, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return AffinityRuleAddResult{}, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/affinityRuleAdd"
@@ -68,17 +69,24 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest
AsyncMode: false,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return false, err
return AffinityRuleAddResult{}, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
if !req.Migrate {
result, err := strconv.ParseBool(string(res))
return AffinityRuleAddResult{Ok: result}, err
}
return result, nil
var report MigrationReport
err = json.Unmarshal(res, &report)
if err != nil {
return AffinityRuleAddResult{}, err
}
return AffinityRuleAddResult{Ok: report.Applied, MigrationReport: &report}, nil
}
// AsyncAffinityRuleAdd add affinity rule in async mode
@@ -95,7 +103,7 @@ func (c Compute) AsyncAffinityRuleAdd(ctx context.Context, req AffinityRuleAddRe
AsyncMode: true,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return "", err
}

View File

@@ -6,6 +6,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -51,14 +52,14 @@ type AntiAffinityRuleAddRequest struct {
type wrapperAntiAffinityRuleAddRequest struct {
AntiAffinityRuleAddRequest
AsyncMode bool `url:"async_mode"`
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// AntiAffinityRuleAdd add anti affinity rule
func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (bool, error) {
func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (AntiAffinityRuleAddResult, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return AntiAffinityRuleAddResult{}, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/antiAffinityRuleAdd"
@@ -68,17 +69,24 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd
AsyncMode: false,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return false, err
return AntiAffinityRuleAddResult{}, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
if !req.Migrate {
result, err := strconv.ParseBool(string(res))
return AntiAffinityRuleAddResult{Ok: result}, err
}
return result, nil
var report MigrationReport
err = json.Unmarshal(res, &report)
if err != nil {
return AntiAffinityRuleAddResult{}, err
}
return AntiAffinityRuleAddResult{Ok: report.Applied, MigrationReport: &report}, nil
}
// AsyncAntiAffinityRuleAdd add anti affinity rule in async mode
@@ -95,7 +103,7 @@ func (c Compute) AsyncAntiAffinityRuleAdd(ctx context.Context, req AntiAffinityR
AsyncMode: true,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return "", err
}

View File

@@ -39,10 +39,6 @@ type CreateTemplateFromBlankRequest struct {
// Required: false
Password string `url:"password,omitempty" json:"password,omitempty"`
// Account ID to make the image exclusive
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Pool for image create
// Required: false
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`

View File

@@ -575,6 +575,9 @@ type RecordCompute struct {
// Zone ID
// Required: false
ZoneID uint64 `json:"zoneId"`
// Folder ID
FolderID uint64 `json:"folder_id"`
}
// Detailed information about ACL Access in a compute
@@ -1564,6 +1567,9 @@ type ItemCompute struct {
// Zone ID
ZoneID uint64 `json:"zoneId"`
// Folder ID
FolderID uint64 `json:"folder_id"`
}
// ListInfoDisks
@@ -1743,3 +1749,47 @@ type CloneStatus struct {
// Progress percent
ProgressPercent int `json:"progress_percent"`
}
type MigrationReportItem struct {
// ID of the compute instance
ComputeID uint64 `json:"compute_id"`
// Per-VM action result, not workflow status
// Should be one of:
// - migrated: migration completed; the rule may still be unsatisfied
// - skipped: migration was not needed or applicable
// - not_started: submission was not attempted
// - not_completed: completion is unconfirmed; the VM may have moved
Status string `json:"status"`
// Action details, errors and final rule-placement warnings
Message string `json:"message"`
// Workflow ID for tracking, or nil if submission was not attempted.
// A non-nil ID does not confirm job acceptance
WorkflowJobID *string `json:"workflow_job_id"`
}
type MigrationReport struct {
// Rules were saved; does not confirm migration success or rule satisfaction
Applied bool `json:"applied"`
// Per-compute migration results
Migrations []MigrationReportItem `json:"migrations"`
}
type AffinityRuleAddResult struct {
// Result of the rule addition
Ok bool
// Migration report. Populated only when the request was made with Migrate=true, nil otherwise
MigrationReport *MigrationReport
}
type AntiAffinityRuleAddResult struct {
// Result of the rule addition
Ok bool
// Migration report. Populated only when the request was made with Migrate=true, nil otherwise
MigrationReport *MigrationReport
}

View File

@@ -35,10 +35,6 @@ type FromPlatformDiskRequest struct {
// Required: false
Password string `url:"password,omitempty" json:"password,omitempty"`
// Account ID to make the image exclusive
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Pool for image create
// Required: false
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`

View File

@@ -93,6 +93,9 @@ type ItemReservation struct {
// Account ID
AccountID uint64 `json:"account_id"`
// Auto assignable
AutoAssignable bool `json:"auto_assignable"`
// ClientType
ClientType string `json:"clientType"`
@@ -127,6 +130,12 @@ type VNFs struct {
}
type Excluded struct {
// Account ID
AccountID uint64 `json:"account_id"`
// Auto assignable
AutoAssignable bool `json:"auto_assignable"`
// ClientType
ClientType string `json:"clientType"`

View File

@@ -230,6 +230,10 @@ type CreateRequest struct {
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// List of PCI device IDs to attach to this VM
// Required: false
PCIdevices []uint64 `url:"pcidevices,omitempty" json:"pcidevices,omitempty"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
@@ -252,6 +256,10 @@ type CreateRequest struct {
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
// List of vGPU IDs to attach to the VM
// Required: false
VGPUs []uint64 `url:"vgpus,omitempty" json:"vgpus,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -92,6 +92,10 @@ type CreateBlankRequest struct {
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// List of PCI device IDs to attach to this VM
// Required: false
PCIdevices []uint64 `url:"pcidevices,omitempty" json:"pcidevices,omitempty"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
@@ -134,6 +138,10 @@ type CreateBlankRequest struct {
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
// List of vGPU IDs to attach to the VM
// Required: false
VGPUs []uint64 `url:"vgpus,omitempty" json:"vgpus,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -15,7 +15,7 @@ type UpdateRequest struct {
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
// APIs to remove from APIAccess group
// Required: false
// Required: true
APIs APIsEndpoints `url:"-" json:"-"`
}

View File

@@ -43,6 +43,42 @@ type ItemAudit struct {
// TTL
TTL string `json:"_ttl"`
// Resource group ID
ResgroupID uint64 `json:"resgroup_id"`
// Account ID
AccountID uint64 `json:"account_id"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// VINS ID
VINSID uint64 `json:"vins_id"`
// Service ID
ServiceID uint64 `json:"service_id"`
// K8S ID
K8SID uint64 `json:"k8s_id"`
// FLIPGroup ID
FLIPGroupID uint64 `json:"flipgroup_id"`
// Load balancer ID
LBID uint64 `json:"lb_id"`
// SEP ID
SEPID uint64 `json:"sep_id"`
// Node IDs
NodeIDs []uint64 `json:"node_ids"`
// Persistent disk IDs associated with the operation
DiskIDs []uint64 `json:"disk_ids"`
// API task ID for asynchronous calls
APITask string `json:"apitask"`
}
// List of audits

View File

@@ -6,6 +6,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -53,14 +54,14 @@ type AffinityRuleAddRequest struct {
type wrapperAffinityRuleAddRequest struct {
AffinityRuleAddRequest
AsyncMode bool `url:"async_mode"`
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// AffinityRuleAdd adds affinity rule
func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (bool, error) {
func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (AffinityRuleAddResult, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return AffinityRuleAddResult{}, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/affinityRuleAdd"
@@ -70,17 +71,24 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest
AsyncMode: false,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return false, err
return AffinityRuleAddResult{}, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
if !req.Migrate {
result, err := strconv.ParseBool(string(res))
return AffinityRuleAddResult{Ok: result}, err
}
return result, nil
var report MigrationReport
err = json.Unmarshal(res, &report)
if err != nil {
return AffinityRuleAddResult{}, err
}
return AffinityRuleAddResult{Ok: report.Applied, MigrationReport: &report}, nil
}
// AsyncAffinityRuleAdd add affinity rule in async mode
@@ -97,7 +105,7 @@ func (c Compute) AsyncAffinityRuleAdd(ctx context.Context, req AffinityRuleAddRe
AsyncMode: true,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return "", err
}

View File

@@ -6,6 +6,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -51,14 +52,14 @@ type AntiAffinityRuleAddRequest struct {
type wrapperAntiAffinityRuleAddRequest struct {
AntiAffinityRuleAddRequest
AsyncMode bool `url:"async_mode"`
AsyncMode bool `url:"async_mode" json:"async_mode"`
}
// AntiAffinityRuleAdd adds anti affinity rule
func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (bool, error) {
func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (AntiAffinityRuleAddResult, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return AntiAffinityRuleAddResult{}, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/antiAffinityRuleAdd"
@@ -68,17 +69,24 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd
AsyncMode: false,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return false, err
return AntiAffinityRuleAddResult{}, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
if !req.Migrate {
result, err := strconv.ParseBool(string(res))
return AntiAffinityRuleAddResult{Ok: result}, err
}
return result, nil
var report MigrationReport
err = json.Unmarshal(res, &report)
if err != nil {
return AntiAffinityRuleAddResult{}, err
}
return AntiAffinityRuleAddResult{Ok: report.Applied, MigrationReport: &report}, nil
}
// AsyncAntiAffinityRuleAdd add anti affinity rule in async mode
@@ -95,7 +103,7 @@ func (c Compute) AsyncAntiAffinityRuleAdd(ctx context.Context, req AntiAffinityR
AsyncMode: true,
}
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq)
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, aReq)
if err != nil {
return "", err
}

View File

@@ -0,0 +1,83 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// Target describes a target for migration
type Target struct {
// SEP ID
// Required: true
SepID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
// Name of a pool
// Required: true
PoolName string `url:"pool_name" json:"pool_name" validate:"required"`
// Storage policy ID
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// Disk IDs
// Required: false
DiskIDs []uint64 `url:"disk_ids,omitempty" json:"disk_ids,omitempty"`
}
// Storage describes a destination for a disk
type Storage struct {
// Target for migration
// Required: false
Targets []Target `url:"targets,omitempty" json:"targets,omitempty"`
// Whether a separate source-disk cleanup job should be started after full success
// Required: false
AutoCleanup interface{} `url:"auto_cleanup,omitempty" json:"auto_cleanup,omitempty" validate:"omitempty,isBool"`
}
// MigrateV2Request to start a migration of a compute or a disk
type MigrateV2Request struct {
// ID of compute to migrate
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Stateless load balancers support only compute mode, including their local system disk.
// Required: false
Mode string `url:"mode,omitempty" json:"mode,omitempty" validate:"omitempty,migrateV2Mode"`
// ID of node to migrate to
// Required: false
TargetNodeID uint64 `url:"target_node_id,omitempty" json:"target_node_id,omitempty"`
// Destination for a disk
// Required: false
Storage Storage `url:"storage,omitempty" json:"storage,omitempty"`
}
// MigrateV2 starts a migration of a compute or a disk
func (c Compute) MigrateV2(ctx context.Context, req MigrateV2Request) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return "", err
}
var resp string
err = json.Unmarshal(res, &resp)
if err != nil {
return "", err
}
return resp, nil
}

View File

@@ -0,0 +1,47 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateV2AbortRequest to abort a migration of a compute
type MigrateV2AbortRequest struct {
// Original migration workflow IDs, not agent, cleanup or recovery job IDs
// Required: true
WorkflowJobIDs []string `url:"workflow_job_ids" json:"workflow_job_ids" validate:"required"`
}
// MigrateV2Abort aborts a migration of a compute
func (c Compute) MigrateV2Abort(ctx context.Context, req MigrateV2AbortRequest) (*MigrateV2AbortRecord, error) {
res, err := c.MigrateV2AbortRaw(ctx, req)
if err != nil {
return nil, err
}
info := MigrateV2AbortRecord{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// MigrateV2AbortRaw aborts a migration of a compute and returns an array of bytes
func (c Compute) MigrateV2AbortRaw(ctx context.Context, req MigrateV2AbortRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2_abort"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
return res, err
}

View File

@@ -0,0 +1,41 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateV2CleanupRequest to clean up after a migration of a compute
type MigrateV2CleanupRequest struct {
// Original migration workflow IDs, not agent, cleanup or recovery job IDs
// Required: true
WorkflowJobID string `url:"workflow_job_id" json:"workflow_job_id" validate:"required"`
}
// MigrateV2Cleanup cleans up after a migration of a compute
func (c Compute) MigrateV2Cleanup(ctx context.Context, req MigrateV2CleanupRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2_cleanup"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return "", err
}
var resp string
err = json.Unmarshal(res, &resp)
if err != nil {
return "", err
}
return resp, nil
}

View File

@@ -0,0 +1,46 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateV2GetRequest to get the information about a workflow job
type MigrateV2GetRequest struct {
// Original migration workflow IDs
// Required: true
WorkflowJobID string `url:"workflow_job_id" json:"workflow_job_id" validate:"required"`
}
// MigrateV2Get gets information about a workflow job as a MigrateV2Record struct
func (c Compute) MigrateV2Get(ctx context.Context, req MigrateV2GetRequest) (*MigrateV2Record, error) {
res, err := c.MigrateV2GetRaw(ctx, req)
if err != nil {
return nil, err
}
info := MigrateV2Record{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about a workflow job as an array of bytes
func (c Compute) MigrateV2GetRaw(ctx context.Context, req MigrateV2GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2_get"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,67 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateV2ListRequest to list migrations
type MigrateV2ListRequest struct {
// Exact APIServer migration workflow job ID
// Required: false
WorkflowJobID string `url:"workflow_job_id,omitempty" json:"workflow_job_id,omitempty"`
// Compute ID
// Required: false
ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"`
// Exact business migration status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Source node ID
// Required: false
SourceNodeID uint64 `url:"source_node_id,omitempty" json:"source_node_id,omitempty"`
// Target node ID
// Required: false
TargetNodeID uint64 `url:"target_node_id,omitempty" json:"target_node_id,omitempty"`
// Whether retained source disks still require cleanup
// Required: false
CleanupRequired interface{} `url:"cleanup_required,omitempty" json:"cleanup_required,omitempty" validate:"omitempty,isBool"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// MigrateV2List gets list of the jobs
func (c Compute) MigrateV2List(ctx context.Context, req MigrateV2ListRequest) (*ListMigrateV2, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2_list"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {
return nil, err
}
list := ListMigrateV2{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}

View File

@@ -0,0 +1,51 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateResolveRequest to resolve a migration
type MigrateV2ResolveRequest struct {
// Workflow job ID
// Required: true
WorkflowJobID string `url:"workflow_job_id" json:"workflow_job_id" validate:"required"`
// Take over cleanup
// Required: false
TakeOverCleanup interface{} `url:"take_over_cleanup,omitempty" json:"take_over_cleanup,omitempty" validate:"omitempty,isBool"`
}
// MigrateV2Resolve resolves a migration of a compute
func (c Compute) MigrateV2Resolve(ctx context.Context, req MigrateV2ResolveRequest) (*MigrateV2ResolveRecord, error) {
res, err := c.MigrateV2ResolveRaw(ctx, req)
if err != nil {
return nil, err
}
info := MigrateV2ResolveRecord{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// MigrateV2ResolveRaw resolves a migration of a compute and returns an array of bytes
func (c Compute) MigrateV2ResolveRaw(ctx context.Context, req MigrateV2ResolveRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_v2_resolve"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
return res, err
}

View File

@@ -938,6 +938,9 @@ type InfoCompute struct {
// Zone ID
ZoneID uint64 `json:"zoneId"`
// Folder ID
FolderID uint64 `json:"folder_id"`
}
type QemuQuest struct {
@@ -1252,6 +1255,9 @@ type RecordCompute struct {
//todo
_ uint64 `json:"nodeId"`
// Folder ID
FolderID uint64 `json:"folder_id"`
}
// Detailed information about ACL Access in a compute
@@ -2272,3 +2278,376 @@ type CheckComputePlacementItem struct {
}
type CheckComputePlacementResult map[uint64]CheckComputePlacementItem
type Result struct {
// Workflow ID
WorkflowJobID string `json:"workflow_job_id"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// Status
Status string `json:"status"`
// Job ID
JobID string `json:"job_id"`
// Message
Message string `json:"message"`
}
// MigrateV2 abort record
type MigrateV2AbortRecord struct {
// Results
Results []Result `json:"results"`
}
type Origin struct {
// Type
Type string `json:"type"`
// Correlation ID
CorrelationID string `json:"correlation_id"`
}
type Observation struct {
// Updated at
UpdatedAt uint64 `json:"updated_at"`
// Agent job ID
AgentJobID string `json:"agent_job_id"`
// Attempt
Attempt uint64 `json:"attempt"`
// Operation
Operation string `json:"operation"`
}
type Memory struct {
// Sampled at
SampledAt uint64 `json:"sampled_at"`
// Percent
Percent uint64 `json:"percent"`
// Bytes per second
BytesPerSecond uint64 `json:"bytes_per_second"`
// Processed bytes
ProcessedBytes uint64 `json:"processed_bytes"`
// Remaining bytes
RemainingBytes uint64 `json:"remaining_bytes"`
}
type ProgressDisks struct {
// Scope
Scope string `json:"scope"`
// Target devs
TargetDevs []string `json:"target_devs"`
// Sampled at
SampledAt uint64 `json:"sampled_at"`
// Percent
Percent uint64 `json:"percent"`
// Bytes per second
BytesPerSecond uint64 `json:"bytes_per_second"`
// Processed bytes
ProcessedBytes uint64 `json:"processed_bytes"`
// Remaining bytes
RemainingBytes uint64 `json:"remaining_bytes"`
}
type SystemDisk struct {
// Target dev
TargetDev string `json:"target_dev"`
// Sampled at
SampledAt uint64 `json:"sampled_at"`
// Percent
Percent uint64 `json:"percent"`
// Bytes per second
BytesPerSecond uint64 `json:"bytes_per_second"`
// Processed bytes
ProcessedBytes uint64 `json:"processed_bytes"`
// Remaining bytes
RemainingBytes uint64 `json:"remaining_bytes"`
}
type Progress struct {
// Observation
Observation Observation `json:"observation"`
// Memory
Memory Memory `json:"memory"`
// Disks
Disks ProgressDisks `json:"disks"`
// System disk
SystemDisk SystemDisk `json:"system_disk"`
}
type Disk struct {
// Source disk ID
SourceDiskID uint64 `json:"source_disk_id"`
// Target disk ID
TargetDiskID uint64 `json:"target_disk_id"`
// Target dev
TargetDev string `json:"target_dev"`
// SEP ID
SEPID uint64 `json:"sep_id"`
// Pool name
PoolName string `json:"pool_name"`
// Storage policy ID
StoragePolicyID uint64 `json:"storage_policy_id"`
// State
State string `json:"state"`
}
type Cleanup struct {
// Job ID
JobID string `json:"job_id"`
// Status
Status string `json:"status"`
// Error
Error string `json:"error"`
}
type Resolution struct {
// Resolved at
ResolvedAt string `json:"resolved_at"`
// Resolved by
ResolvedBy string `json:"resolved_by"`
// RequestID
RequestId string `json:"request_id"`
// Take over cleanup
TakeOverCleanup bool `json:"take_over_cleanup"`
// Previous status
PreviousStatus string `json:"previous_status"`
// Previous cleanup required
PreviousCleanupRequired bool `json:"previous_cleanup_required"`
// Previous error
PreviousError string `json:"previous_error"`
}
type MigrateV2Item struct {
// Workflow Job ID
WorkflowJobID string `json:"workflow_job_id"`
// Mode
Mode string `json:"mode"`
// Origin
Origin Origin `json:"origin"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// Progress
Progress Progress `json:"progress"`
// Domain name
DomainName string `json:"domain_name"`
// Domain UUID
DomainUUID string `json:"domain_uuid"`
// Source node ID
SourceNodeID uint64 `json:"source_node_id"`
// Target node ID
TargetNodeID uint64 `json:"target_node_id"`
// Source tech status
SourceTechStatus string `json:"source_tech_status"`
// Status
Status string `json:"status"`
// Migration result confirmed
MigrationResultConfirmed bool `json:"migration_result_confirmed"`
// Disks
Disks []Disk `json:"disks"`
// Disk IDs not copied
DiskIDsNotCopied []uint64 `json:"disk_ids_not_copied"`
// Error
Error string `json:"error"`
// Cleanup required
CleanupRequired bool `json:"cleanup_required"`
// Cleanup
Cleanup Cleanup `json:"cleanup"`
// Resolution
Resolution Resolution `json:"resolution"`
// Created at
CreatedAt string `json:"created_at"`
// Updated at
UpdatedAt string `json:"updated_at"`
}
type ListMigrateV2 struct {
// Entry count
EntryCount uint64 `json:"entry_count"`
// Data
Data []MigrateV2Item `json:"data"`
}
type MigrateV2Record struct {
// Workflow Job ID
WorkflowJobID string `json:"workflow_job_id"`
// Mode
Mode string `json:"mode"`
// Origin
Origin Origin `json:"origin"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// Progress
Progress Progress `json:"progress"`
// Domain name
DomainName string `json:"domain_name"`
// Domain UUID
DomainUUID string `json:"domain_uuid"`
// Source node ID
SourceNodeID uint64 `json:"source_node_id"`
// Target node ID
TargetNodeID uint64 `json:"target_node_id"`
// Source tech status
SourceTechStatus string `json:"source_tech_status"`
// Status
Status string `json:"status"`
// Migration result confirmed
MigrationResultConfirmed bool `json:"migration_result_confirmed"`
// Disks
Disks []Disk `json:"disks"`
// Disk IDs not copied
DiskIDsNotCopied []uint64 `json:"disk_ids_not_copied"`
// Error
Error string `json:"error"`
// Cleanup required
CleanupRequired bool `json:"cleanup_required"`
// Cleanup
Cleanup Cleanup `json:"cleanup"`
// Resolution
Resolution Resolution `json:"resolution"`
// Created at
CreatedAt string `json:"created_at"`
// Updated at
UpdatedAt string `json:"updated_at"`
// Logs
Logs []string `json:"logs"`
}
// Migrate V2 resolve record
type MigrateV2ResolveRecord struct {
// Workflow job ID
WorkflowJobID string `json:"workflow_job_id"`
// Compute ID
ComputeID uint64 `json:"compute_id"`
// Status
Status string `json:"status"`
// Cleanup required
CleanupRequired bool `json:"cleanup_required"`
// Resolution
Resolution Resolution `json:"resolution"`
}
type MigrationReportItem struct {
// ID of the compute instance
ComputeID uint64 `json:"compute_id"`
// Per-VM action result, not workflow status
// Should be one of:
// - migrated: migration completed; the rule may still be unsatisfied
// - skipped: migration was not needed or applicable
// - not_started: submission was not attempted
// - not_completed: completion is unconfirmed; the VM may have moved
Status string `json:"status"`
// Action details, errors and final rule-placement warnings
Message string `json:"message"`
// Workflow ID for tracking, or nil if submission was not attempted.
// A non-nil ID does not confirm job acceptance
WorkflowJobID *string `json:"workflow_job_id"`
}
type MigrationReport struct {
// Rules were saved; does not confirm migration success or rule satisfaction
Applied bool `json:"applied"`
// Per-compute migration results
Migrations []MigrationReportItem `json:"migrations"`
}
type AffinityRuleAddResult struct {
// Result of the rule addition
Ok bool
// Migration report. Populated only when the request was made with Migrate=true, nil otherwise
MigrationReport *MigrationReport
}
type AntiAffinityRuleAddResult struct {
// Result of the rule addition
Ok bool
// Migration report. Populated only when the request was made with Migrate=true, nil otherwise
MigrationReport *MigrationReport
}

View File

@@ -20,12 +20,21 @@ type ItemReservation struct {
// Account ID
AccountID uint64 `json:"account_id"`
// Auto assignable
AutoAssignable bool `json:"auto_assignable"`
// Client type
ClientType string `json:"clientType"`
// Description
Description string `json:"desc"`
// Domain name
DomainName string `json:"domainname"`
// Hostname
Hostname string `json:"hostname"`
// IP
IP string `json:"ip"`
@@ -37,12 +46,6 @@ type ItemReservation struct {
// Virtual machine ID
VMID uint64 `json:"vmId"`
// Domain name
DomainName string `json:"domainname"`
// Hostname
Hostname string `json:"hostname"`
}
// List reservations

View File

@@ -117,6 +117,9 @@ type RecordGrid struct {
// Budget
Budget bool `json:"budget"`
// Whether VM folders are enabled
VMFoldersEnabled bool `json:"vm_folders_enabled"`
}
// Information about grid
@@ -165,6 +168,9 @@ type ItemGridList struct {
// Budget
Budget bool `json:"budget"`
// Whether VM folders are enabled
VMFoldersEnabled bool `json:"vm_folders_enabled"`
}
// List Grids

View File

@@ -240,6 +240,10 @@ type CreateRequest struct {
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// List of PCI device IDs to attach to this VM
// Required: false
PCIdevices []uint64 `url:"pcidevices,omitempty" json:"pcidevices,omitempty"`
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
@@ -275,6 +279,10 @@ type CreateRequest struct {
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
// List of vGPU IDs to attach to the VM
// Required: false
VGPUs []uint64 `url:"vgpus,omitempty" json:"vgpus,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -92,6 +92,10 @@ type CreateBlankRequest struct {
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// List of PCI device IDs to attach to this VM
// Required: false
PCIdevices []uint64 `url:"pcidevices,omitempty" json:"pcidevices,omitempty"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
@@ -147,6 +151,10 @@ type CreateBlankRequest struct {
// Required: false
// Default: "auto"
MemoryBalloonMode string `url:"memory_balloon_mode,omitempty" json:"memory_balloon_mode,omitempty" validate:"omitempty,memoryBalloonMode"`
// List of vGPU IDs to attach to the VM
// Required: false
VGPUs []uint64 `url:"vgpus,omitempty" json:"vgpus,omitempty"`
}
// GetRAM returns RAM field values