This commit is contained in:
asteam
2025-08-29 12:51:25 +03:00
parent e10ee7f801
commit 825b1a0a00
177 changed files with 4821 additions and 349 deletions

View File

@@ -30,6 +30,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -73,6 +73,15 @@ type ResourceLimits struct {
// Number of graphics cores
GPUUnits float64 `json:"gpu_units"`
// Storage policy
StoragePolicy []StoragePolicyItem `json:"storage_policy"`
}
type StoragePolicyItem struct {
ID uint64 `json:"id"`
Limit int `json:"limit"`
}
// Main information in one of if the list of accounts
@@ -103,6 +112,9 @@ type ItemAccount struct {
// Updated time
UpdatedTime uint64 `json:"updatedTime"`
// Zones
ZoneIDs []uint64 `json:"zoneIds"`
}
// List of accounts
@@ -275,6 +287,9 @@ type RecordAccount struct {
// Status
Status string `json:"status"`
// Storage policy ids
StoragePolicyIDs []uint64 `json:"storage_policy_ids"`
// UniqPools
UniqPools []interface{} `json:"uniqPools"`
@@ -291,7 +306,7 @@ type RecordAccount struct {
VINSes uint64 `json:"vinses"`
// Zone
ZoneIDs []ZoneID
ZoneIDs []ZoneID `json:"zoneIds"`
// Zones
DefaultZoneID uint64 `json:"defaultZoneId"`

View File

@@ -12,6 +12,9 @@ type RecordAudit struct {
// GUID
GUID string `json:"guid"`
// Correlation ID
CorrelationID string `json:"correlation_id"`
// Kwargs
Kwargs string `json:"kwargs"`

View File

@@ -38,11 +38,9 @@ type GroupAddRequest struct {
// Required: true
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
// Compute driver
// should be one of:
// - KVM_X86
// Compute driver like a KVM_X86, etc.
// Required: true
Driver string `url:"driver" json:"driver" validate:"driver"`
Driver string `url:"driver" json:"driver" validate:"required"`
// Storage endpoint provider ID
// Required: false
@@ -75,6 +73,10 @@ type GroupAddRequest struct {
//Chipset "i440fx" or "Q35
//Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset,omitempty"`
// ID of the chosen storage policy
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -46,6 +46,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -12,11 +12,47 @@ import (
type AuditsRequest struct {
// ID of the compute
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Find all audits after point in time
// Required: false
TimestampAT uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
// Find all audits before point in time
// Required: false
TimestampTO uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
// Find by user
// Required: false
User string `url:"user,omitempty" json:"user,omitempty"`
// Find by api endpoints
// Required: false
Call string `url:"call,omitempty" json:"call,omitempty"`
// Sort by one of supported fields, format ±<field>
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Find by HTTP min status code
// Required: false
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
// Find by HTTP max status code
// Required: false
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
}
// Audits gets audit records for the specified compute object
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, error) {
func (c Compute) Audits(ctx context.Context, req AuditsRequest) (*ListAudits, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
@@ -24,7 +60,7 @@ func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, err
url := "/cloudapi/compute/audits"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {
return nil, err
}
@@ -36,5 +72,5 @@ func (c Compute) Audits(ctx context.Context, req AuditsRequest) (ListAudits, err
return nil, err
}
return list, nil
return &list, nil
}

View File

@@ -0,0 +1,50 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ChangeSecGroupsRequest struct to change security groups for compute
type ChangeSecGroupsRequest struct {
// Identifier compute
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Interface name or MAC address
// Required: true
Interface string `url:"interface" json:"interface" validate:"required"`
// List of security group IDs to assign to this interface
// Required: false
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
// Flag indicating whether security groups are enabled for this interface
// Required: false
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
}
// ChangeSecGroups changes security groups for compute
func (c Compute) ChangeSecGroups(ctx context.Context, req ChangeSecGroupsRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/change_security_groups"
res, err := c.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

@@ -27,6 +27,10 @@ type CreateTemplateFromBlankRequest struct {
// Required: true
ImageType string `url:"imagetype" json:"imagetype" validate:"imageType"`
// Storage policy id of disk. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Username for the image
// Required: false
Username string `url:"username,omitempty" json:"username,omitempty"`

View File

@@ -22,6 +22,10 @@ type DiskAddRequest struct {
// Required: true
Size uint64 `url:"size" json:"size" validate:"required"`
// Storage policy id of disk. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Type of the disk
// Should be one of:
// - D

View File

@@ -83,6 +83,7 @@ var computes = ListComputes{
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
ZoneID: 1,
},
{
ACL: ListACL{},
@@ -145,6 +146,7 @@ var computes = ListComputes{
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
ZoneID: 5,
},
},
EntryCount: 2,

View File

@@ -58,6 +58,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -238,7 +238,13 @@ type ItemAudit struct {
}
// List Detailed audits
type ListAudits []ItemAudit
type ListAudits struct {
// Data
Data []ItemAudit `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Short information about audit
type ItemShortAudit struct {
@@ -661,6 +667,9 @@ type ItemVNFInterface struct {
// Enabled
Enabled bool `json:"enabled"`
// Enable security groups
EnableSecGroups bool `json:"enable_secgroups"`
// FLIPGroup ID
FLIPGroupID uint64 `json:"flipgroupId"`
@@ -703,6 +712,9 @@ type ItemVNFInterface struct {
// QOS
QOS QOS `json:"qos"`
// List of security groups
SecGroups []uint64 `json:"security_groups"`
// SDN interface ID
SDNInterfaceID string `json:"sdn_interface_id"`
@@ -848,17 +860,20 @@ type ItemComputeDisk struct {
// Status
Status string `json:"status"`
// Storage policy id of compute.
StoragePolicyID uint64 `json:"storage_policy_id"`
// Tech status
TechStatus string `json:"techStatus"`
// Need to clean before destroy
ToClean bool `json:"to_clean"`
// Type
Type string `json:"type"`
// Updated by
UpdatedBy string `json:"updatedBy"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
type ItemReplication struct {
@@ -1161,6 +1176,9 @@ type ItemCompute struct {
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// ListInfoDisks

View File

@@ -42,12 +42,24 @@ type NetAttachRequest struct {
// Used only for EXTNET and DPDK
// For DPDK must be 1-9216
// For EXTNET must be 1500-9216
// Required: false
// Required: false
MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"`
// Unique identifier of logical port on SDN side
// Required: false
SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty" validate:"omitempty"`
// List of security group IDs to assign to this interface
// Required: false
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
// Flag indicating whether security groups are enabled for this interface
// Required: false
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
// Required: false
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
}
// NetAttach attaches network to compute and gets info about network

View File

@@ -14,6 +14,10 @@ type RedeployRequest struct {
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Storage policy id of compute. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// ID of the new OS image, if image change is required
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`

View File

@@ -0,0 +1,42 @@
package disks
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ChangeDiskStoragePolicyRequest struct to change storage policy for disk
type ChangeDiskStoragePolicyRequest struct {
// ID of the disk
// Required: true
DiskID uint64 `url:"disk_id" json:"disk_id" validate:"required"`
// ID of the storage policy to which to connect for disk
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
// ChangeDiskStoragePolicy changes storage policy for disk
func (d Disks) ChangeDiskStoragePolicy(ctx context.Context, req ChangeDiskStoragePolicyRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/change_disk_storage_policy"
res, err := d.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,6 +18,10 @@ type CreateRequest struct {
// Required: true
Name string `url:"name" json:"name" validate:"required"`
// ID of the storage policy under the disk will be created
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Description of disk
// Required: false
Description string `url:"description,omitempty" json:"description,omitempty"`

View File

@@ -43,11 +43,6 @@ type FromPlatformDiskRequest struct {
// Required: false
PoolName string `url:"poolName,omitempty" json:"poolName,omitempty"`
// List of types of compute suitable for image
// Example: [ "KVM_X86" ]
// Required: true
Drivers []string `url:"drivers" json:"drivers" validate:"required"`
// Does this machine supports hot resize
// Required: false
HotResize bool `url:"hotresize" json:"hotresize"`

View File

@@ -119,9 +119,15 @@ type ItemDisk struct {
// Status
Status string `json:"status"`
// Storage policy ID
StoragePolicyID uint64 `json:"storage_policy_id"`
// Tech status
TechStatus string `json:"techStatus"`
// Need to clean before destroy
ToClean bool `json:"to_clean"`
// Type
Type string `json:"type"`
@@ -477,9 +483,15 @@ type RecordDisk struct {
// Status
Status string `json:"status"`
// Storage policy ID
StoragePolicyID uint64 `json:"storage_policy_id"`
// Tech status
TechStatus string `json:"techStatus"`
// Need to clean before destroy
ToClean bool `json:"to_clean"`
// Type
Type string `json:"type"`

View File

@@ -25,9 +25,13 @@ type ReplicateRequest struct {
// Pool name to create slave disk in
// Required: true
PoolName string `url:"poolName" json:"poolName" validate:"required"`
// ID of the storage policy under the disk will be created
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
// Create an empty disk in chosen SEP and pool combination.
// Replicate create an empty disk in chosen SEP and pool combination.
// Starts replication between chosen disk and newly created disk
// Note: only TATLIN type SEP are supported for replications between
func (d Disks) Replicate(ctx context.Context, req ReplicateRequest) (uint64, error) {

View File

@@ -14,6 +14,9 @@ type RecordDPDKNet struct {
// Description
Description string `json:"description"`
// Enable Security Groups
EnableSecGroups bool `json:"enable_secgroups"`
// Grid ID
GID uint64 `json:"gid"`
@@ -63,6 +66,9 @@ type ItemDPDKNet struct {
// Description
Description string `json:"description"`
// Enable Security Groups
EnableSecGroups bool `json:"enable_secgroups"`
// Grid ID
GID uint64 `json:"gid"`

View File

@@ -42,6 +42,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -172,6 +172,9 @@ type RecordExtNet struct {
// Excluded
Excluded []Excluded `json:"excluded"`
// Enable Security Groups
EnableSecGroups bool `json:"enable_secgroups"`
// Free IPs
FreeIPs int64 `json:"free_ips"`

View File

@@ -0,0 +1,41 @@
package image
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ChangeStoragePolicyRequest struct {
// ID of the image to change the storage policy
// Required: true
ImageID uint64 `url:"image_id" json:"image_id" validate:"required"`
// ID of the storage policy to move the image to
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
// ChangeStoragePolicy changes the storage policy of the image chosen
func (i Image) ChangeStoragePolicy(ctx context.Context, req ChangeStoragePolicyRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/image/change_storage_policy"
res, err := i.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

@@ -35,6 +35,10 @@ type CreateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// ID of the chosen storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming
// Should be:
// - eth
@@ -69,11 +73,6 @@ type CreateRequest struct {
// Pool for image create
// Required: false
Pool string `url:"poolName,omitempty" json:"poolName,omitempty"`
// List of types of compute suitable for image
// Example: [ "KVM_X86" ]
// Required: true
Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"`
}
type asyncWrapperCreateRequest struct {

View File

@@ -17,6 +17,11 @@ type CreateVirtualRequest struct {
// ID of real image to link this virtual image to upon creation
// Required: true
TargetID uint64 `url:"targetId" json:"targetId" validate:"required"`
// AccountID to make the virtual image exclusive
// Required: false
// Default: 0
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
}
// CreateVirtual creates virtual image

View File

@@ -191,6 +191,9 @@ type RecordImage struct {
// Status
Status string `json:"status"`
// Storage policy ID
StoragePolicyID uint64 `json:"storage_policy_id"`
// Tech status
TechStatus string `json:"techStatus"`

View File

@@ -22,14 +22,6 @@ type ListRequest struct {
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by worker driver
// Required: false
WorkerDriver string `url:"workerDriver,omitempty" json:"workerDriver,omitempty"`
// Find by master driver
// Required: false
MasterDriver string `url:"masterDriver,omitempty" json:"masterDriver,omitempty"`
// Find by network plugin
// Required: false
NetworkPlugins string `url:"netPlugins,omitempty" json:"netPlugins,omitempty"`

View File

@@ -18,14 +18,6 @@ type ListDeletedRequest struct {
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by worker driver
// Required: false
WorkerDriver string `url:"workerDriver,omitempty" json:"workerDriver,omitempty"`
// Find by master driver
// Required: false
MasterDriver string `url:"masterDriver,omitempty" json:"masterDriver,omitempty"`
// Find by network plugin
// Required: false
NetworkPlugins string `url:"netPlugins,omitempty" json:"netPlugins,omitempty"`

View File

@@ -31,6 +31,10 @@ type CreateRequest struct {
// Required: true
NetworkPlugin string `url:"networkPlugin" json:"networkPlugin" validate:"required,networkPlugin"`
// ID of the chosen storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// ID of SEP to create boot disks for master nodes. Uses images SEP ID if not set
// Required: false
MasterSEPID uint64 `url:"masterSepId,omitempty" json:"masterSepId,omitempty"`

View File

@@ -46,6 +46,11 @@ type ListRequest struct {
// Required: false
IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`

View File

@@ -17,6 +17,10 @@ type WorkersGroupAddRequest struct {
// Required: true
Name string `url:"name" json:"name" validate:"required"`
// ID of the chosen storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// ID of SEP to create boot disks for default worker nodes group. Uses images SEP ID if not set
// Required: false
WorkerSEPID uint64 `url:"workerSepId,omitempty" json:"workerSepId,omitempty"`

View File

@@ -42,6 +42,18 @@ type Interface struct {
// SDN interface id
// Required: false
SDNInterfaceID string `url:"sdn_interface_id,omitempty" json:"sdn_interface_id,omitempty"`
// List of security group IDs to assign to this interface
// Required: false
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
// Flag indicating whether security groups are enabled for this interface
// Required: false
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
// Flag indicating whether this interface is enabled (only for VINS, EXTNET, DPDK, SDN, TRUNK)
// Required: false
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
}
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
@@ -54,6 +66,10 @@ type DataDisk struct {
// Required: true
Size uint64 `url:"size" json:"size" validate:"required"`
// Storage policy id of disk. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Storage endpoint provider ID
// By default the same with boot disk
// Required: false
@@ -92,6 +108,10 @@ type CreateRequest struct {
// Required: true
RAM uint64 `url:"ram" json:"ram" validate:"required"`
// Storage policy id of сompute. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state
// Required: false
WithoutBootDisk bool `url:"withoutBootDisk" json:"withoutBootDisk"`
@@ -150,10 +170,6 @@ type CreateRequest struct {
// Required: false
CustomFields string `url:"customFields,omitempty" json:"customFields,omitempty"`
// Type of compute Stateful (KVM_X86)
// Required: false
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
// Rule for VM placement with NUMA affinity.
// Possible values - none (placement without NUMA affinity),
// strict (strictly with NUMA affinity, if not possible - do not start VM),

View File

@@ -28,6 +28,10 @@ type CreateBlankRequest struct {
// Required: true
RAM uint64 `url:"ram" json:"ram" validate:"required"`
// Storage policy id of compute. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state
// Required: false
WithoutBootDisk bool `url:"withoutBootDisk" json:"withoutBootDisk"`
@@ -57,10 +61,6 @@ type CreateBlankRequest struct {
// Required: false
Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
// Type of compute Stateful (KVM_X86)
// Required: false
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
// Type of the emulated system, Q35 or i440fx
// Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"omitempty,chipset"`

View File

@@ -50,6 +50,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -5,6 +5,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -22,6 +23,10 @@ type CreateRequest struct {
// Required: true
Name string `url:"name" json:"name" validate:"required,min=2"`
// Storage policies
// Required: false
StoragePolicies []StoragePolicy `url:"storage_policies" json:"storage_policies"`
// Max size of memory in MB
// Required: false
MaxMemoryCapacity int64 `url:"maxMemoryCapacity,omitempty" json:"maxMemoryCapacity,omitempty"`
@@ -77,6 +82,11 @@ type CreateRequest struct {
SDNAccessGroupID string `url:"sdn_access_group_id,omitempty" json:"sdn_access_group_id,omitempty"`
}
type StoragePolicy struct {
ID int64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
}
// Create creates resource group
func (r RG) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req)
@@ -86,7 +96,7 @@ func (r RG) Create(ctx context.Context, req CreateRequest) (uint64, error) {
url := "/cloudapi/rg/create"
res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := r.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return 0, err
}

View File

@@ -134,6 +134,9 @@ type RecordResourceGroup struct {
// List of resource types
ResTypes []string `json:"resourceTypes"`
// Storage policy ids
StoragePolicyIDs []uint64 `json:"storage_policy_ids"`
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
@@ -233,6 +236,9 @@ type ItemResourceGroup struct {
// SDN access group id
SDNAccessGroupID string `json:"sdn_access_group_id"`
// Storage policy ids
StoragePolicyIDs []uint64 `json:"storage_policy_ids"`
// Secret
Secret string `json:"secret"`
@@ -308,6 +314,9 @@ type ResourceLimits struct {
// GPU units
GPUUnits float64 `json:"gpu_units"`
// Storage policies
StoragePolicies []StoragePolicy `json:"storage_policy"`
}
// Main information about affinity group

View File

@@ -5,6 +5,7 @@ import (
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -50,6 +51,10 @@ type UpdateRequest struct {
// Default: false
// Required: false
ClearUniqPools bool `url:"clearUniqPools" json:"clearUniqPools"`
// Storage policies
// Required: false
StoragePolicies []StoragePolicy `url:"-" json:"storage_policies,omitempty"`
}
// Update updates resource group
@@ -61,7 +66,7 @@ func (r RG) Update(ctx context.Context, req UpdateRequest) (bool, error) {
url := "/cloudapi/rg/update"
res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req)
res, err := r.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return false, err
}

View File

@@ -0,0 +1,46 @@
package securitygroup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type CreateRequest struct {
// Account ID that owns security group
// Required: true
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
// Security group name
// Required: true
Name string `url:"name" json:"name" validate:"required"`
// Security group description
// Required: false
Description string `url:"description,omitempty" json:"description,omitempty"`
}
func (sg SecurityGroup) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/create"
res, err := sg.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return 0, err
}
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return 0, err
}
return result, nil
}

View File

@@ -0,0 +1,63 @@
package securitygroup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type CreateRuleRequest struct {
// Security group ID
// Required: true
SecurityGroupID uint64 `url:"security_group_id" json:"security_group_id" validate:"required"`
// Traffic direction (inbound/outbound)
// Required: true
Direction string `url:"direction" json:"direction" validate:"required,securityGroupDirection"`
// IP protocol version
// Default: IPv4
// Required: false
Ethertype string `url:"ethertype,omitempty" json:"ethertype,omitempty" validate:"omitempty,securityGroupEthertype"`
// Network protocol, available values : icmp, tcp, udp
// Required: false
Protocol string `url:"protocol,omitempty" json:"protocol,omitempty" validate:"omitempty,securityGroupProtocol"`
// Start port number (for TCP/UDP)
// Required: false
PortRangeMin uint64 `url:"port_range_min,omitempty" json:"port_range_min,omitempty"`
// End port number (for TCP/UDP)
// Required: false
PortRangeMax uint64 `url:"port_range_max,omitempty" json:"port_range_max,omitempty"`
// Remote IP prefix in CIDR notation
// Required: false
RemoteIPPrefix string `url:"remote_ip_prefix,omitempty" json:"remote_ip_prefix,omitempty"`
}
func (sg SecurityGroup) CreateRule(ctx context.Context, req CreateRuleRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/create_rule"
res, err := sg.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return 0, err
}
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return 0, err
}
return result, nil
}

View File

@@ -0,0 +1,36 @@
package securitygroup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type DeleteRequest struct {
// Security group ID
// Required: true
SecurityGroupID uint64 `url:"security_group_id" json:"security_group_id" validate:"required"`
}
func (sg SecurityGroup) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/delete"
res, err := sg.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,40 @@
package securitygroup
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type DeleteRuleRequest struct {
// Security group ID
// Required: true
SecurityGroupID uint64 `url:"security_group_id" json:"security_group_id" validate:"required"`
// Rule ID
// Required: true
RuleID uint64 `url:"rule_id" json:"rule_id" validate:"required"`
}
func (sg SecurityGroup) DeleteRule(ctx context.Context, req DeleteRuleRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/delete_rule"
res, err := sg.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,80 @@
package securitygroup
// FilterByID returns ListSecurityGroups with specified ID.
func (lsg ListSecurityGroups) FilterByID(id uint64) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.ID == id
}
return lsg.FilterFunc(predicate)
}
// FilterByID returns ListSecurityGroups with specified Name.
func (lsg ListSecurityGroups) FilterByName(name string) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.Name == name
}
return lsg.FilterFunc(predicate)
}
// FilterByCreatedBy returns ListSecurityGroups with specified CreatedBy.
func (lsg ListSecurityGroups) FilterByCreatedBy(createdBy string) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.CreatedBy == createdBy
}
return lsg.FilterFunc(predicate)
}
// FilterByDescription returns ListSecurityGroups with specified Description.
func (lsg ListSecurityGroups) FilterByDescription(description string) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.Description == description
}
return lsg.FilterFunc(predicate)
}
// FilterByUpdatedBy returns ListSecurityGroups with specified UpdatedBy.
func (lsg ListSecurityGroups) FilterByUpdatedBy(updatedBy string) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.UpdatedBy == updatedBy
}
return lsg.FilterFunc(predicate)
}
// FilterByAccountID returns ListSecurityGroups with specified AccountID.
func (lsg ListSecurityGroups) FilterByAccountID(accountID uint64) ListSecurityGroups {
predicate := func(isg ItemSecurityGroup) bool {
return isg.AccountID == accountID
}
return lsg.FilterFunc(predicate)
}
// FilterFunc allows filtering ListSecurityGroups based on a user-specified predicate.
func (lsg ListSecurityGroups) FilterFunc(predicate func(ItemSecurityGroup) bool) ListSecurityGroups {
var result ListSecurityGroups
for _, item := range lsg.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns first found ItemSecurityGroup
// If none was found, returns an empty struct.
func (lsg ListSecurityGroups) FindOne() ItemSecurityGroup {
if len(lsg.Data) == 0 {
return ItemSecurityGroup{}
}
return lsg.Data[0]
}

View File

@@ -0,0 +1,87 @@
package securitygroup
import "testing"
var securityGroups = ListSecurityGroups{
Data: []ItemSecurityGroup{
{
ID: 1,
AccountID: 1,
Name: "sg1",
Description: "some desc",
CreatedBy: "user",
},
{
ID: 3,
AccountID: 3,
Name: "sg3",
Description: "some desc",
CreatedBy: "anotheruser",
},
{
ID: 5,
AccountID: 3,
Name: "sg5",
Description: "some other desc",
CreatedBy: "anotheruser",
UpdatedBy: "user",
},
},
EntryCount: 3,
}
func TestFilterByID(t *testing.T) {
actual := securityGroups.FilterByID(1).FindOne()
if actual.ID != 1 {
t.Fatal("expected ID 1, found: ", actual.ID)
}
}
func TestFilterByName(t *testing.T) {
actual := securityGroups.FilterByName("sg3").FindOne()
if actual.Name != "sg3" {
t.Fatal("expected Name sg3, found: ", actual.Name)
}
}
func TestFilterByDescription(t *testing.T) {
actual := securityGroups.FilterByDescription("some desc")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.Description != "some desc" {
t.Fatal("expected Description 'some desc', found: ", item.Description)
}
}
}
func TestFilterByAccountID(t *testing.T) {
actual := securityGroups.FilterByAccountID(1).FindOne()
if actual.AccountID != 1 {
t.Fatal("expected AccountID 1, found: ", actual.AccountID)
}
}
func TestFilterByCreatedBy(t *testing.T) {
actual := securityGroups.FilterByCreatedBy("anotheruser")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.CreatedBy != "anotheruser" {
t.Fatal("expected CreatedBy 'anotheruser', found: ", item.CreatedBy)
}
}
}
func TestFilterByUpdatedBy(t *testing.T) {
actual := securityGroups.FilterByUpdatedBy("user").FindOne()
if actual.UpdatedBy != "user" {
t.Fatal("expected UpdatedBy 'user', found: ", actual.UpdatedBy)
}
}

View File

@@ -0,0 +1,43 @@
package securitygroup
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type GetRequest struct {
// ID of security group
// Required: true
SecurityGroupID uint64 `url:"security_group_id" json:"security_group_id" validate:"required"`
}
func (sg SecurityGroup) Get(ctx context.Context, req GetRequest) (*RecordSecurityGroup, error) {
res, err := sg.GetRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordSecurityGroup{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
func (sg SecurityGroup) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/get"
res, err := sg.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,86 @@
package securitygroup
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ListRequest struct {
// Search by security group id
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Search by account id
// Required: false
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
// Search by security group name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Search by security group description
// Required: false
Description string `url:"description,omitempty" json:"description,omitempty"`
// Search by created after time (unix timestamp)
// Required: false
CreatedMin uint64 `url:"created_min,omitempty" json:"created_min,omitempty"`
// Search by created before time (unix timestamp)
// Required: false
CreatedMax uint64 `url:"created_max,omitempty" json:"created_max,omitempty"`
// Search by updated after time (unix timestamp)
// Required: false
UpdatedMin uint64 `url:"updated_min,omitempty" json:"updated_min,omitempty"`
// Search by updated before time (unix timestamp)
// Required: false
UpdatedMax uint64 `url:"updated_max,omitempty" json:"updated_max,omitempty"`
// Sort by one of supported fields, format ±<field>
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// List gets list of security groups as a ListSecurityGroups struct
func (sg SecurityGroup) List(ctx context.Context, req ListRequest) (*ListSecurityGroups, error) {
res, err := sg.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListSecurityGroups{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of security groups as an array of bytes
func (sg SecurityGroup) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/list"
res, err := sg.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,43 @@
package securitygroup
type ListSecurityGroups struct {
Data []ItemSecurityGroup `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type RecordSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type Rules []Rule
type Rule struct {
ID uint64 `json:"id"`
Direction string `json:"direction"`
Ethertype string `json:"ethertype"`
Protocol string `json:"protocol"`
PortRangeMin uint64 `json:"port_range_min"`
PortRangeMax uint64 `json:"port_range_max"`
RemoteIPPrefix string `json:"remote_ip_prefix"`
RemoteGroupID uint64 `json:"remote_group_id"`
}

View File

@@ -0,0 +1,15 @@
package securitygroup
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
// Structure for creating request to storage policy
type SecurityGroup struct {
client interfaces.Caller
}
// Builder for stack endpoint
func New(client interfaces.Caller) *SecurityGroup {
return &SecurityGroup{
client: client,
}
}

View File

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

View File

@@ -0,0 +1,51 @@
package securitygroup
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type UpdateRequest struct {
// Security group ID
// Required: true
SecurityGroupID uint64 `url:"security_group_id" json:"security_group_id" validate:"required"`
// New security group name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// New security group description
// Required: false
Description string `url:"description,omitempty" json:"description,omitempty"`
}
func (sg SecurityGroup) Update(ctx context.Context, req UpdateRequest) (*RecordSecurityGroup, error) {
res, err := sg.UpdateRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordSecurityGroup{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
func (sg SecurityGroup) UpdateRaw(ctx context.Context, req UpdateRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/security_group/update"
res, err := sg.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -0,0 +1,10 @@
package cloudapi
import (
securitygroup "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/security_group"
)
// Accessing the Security Group method group
func (ca *CloudAPI) SecurityGroup() *securitygroup.SecurityGroup {
return securitygroup.New(ca.client)
}

View File

@@ -0,0 +1,43 @@
package storagepolicy
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type GetRequest struct {
// ID of storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePolicy, error) {
res, err := sp.GetRaw(ctx, req)
if err != nil {
return nil, err
}
info := InfoStoragePolicy{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
func (sp StoragePolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/storage_policy/get"
res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,90 @@
package storagepolicy
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ListRequest struct {
// ID of account ID
// Required: true
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Search by storage policy ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Search by storage policy name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Search by storage policy status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Search by storage policy desc
// Required: false
Desc string `url:"desc,omitempty" json:"desc,omitempty"`
// Search by storage policy iops limit
// Required: false
LimitIOPS uint64 `url:"limit_iops,omitempty" json:"limit_iops,omitempty"`
// Sort by one of supported fields, format ±<field>
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
// Search by resgroup id
// Required: false
ResgroupID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"`
// Search by sep id
// Required: false
SepID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`
// Search by pool name
// Required: false
PoolName string `url:"pool_name,omitempty" json:"pool_name,omitempty"`
}
// List gets list of storage policies as a ListStoragePolicies struct
func (sp StoragePolicy) List(ctx context.Context, req ListRequest) (*ListStoragePolicies, error) {
res, err := sp.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListStoragePolicies{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of storage policies as an array of bytes
func (sp StoragePolicy) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/storage_policy/list"
res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,40 @@
package storagepolicy
type ListStoragePolicies struct {
Data []ItemStoragePolicy `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type InfoStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type ListAccessSepPools []AccessSepPool
type AccessSepPool struct {
SepID uint64 `json:"sep_id"`
PoolNames []string `json:"pool_names"`
}
type Usage struct {
Accounts []uint64 `json:"accounts"`
Resgroups []uint64 `json:"resgroups"`
}

View File

@@ -0,0 +1,15 @@
package storagepolicy
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
// Structure for creating request to storage policy
type StoragePolicy struct {
client interfaces.Caller
}
// Builder for stack endpoint
func New(client interfaces.Caller) *StoragePolicy {
return &StoragePolicy{
client: client,
}
}

View File

@@ -0,0 +1,10 @@
package cloudapi
import (
storagepolicy "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/storage_policy"
)
// Accessing the Storage Policy method group
func (ca *CloudAPI) StoragePolicy() *storagepolicy.StoragePolicy {
return storagepolicy.New(ca.client)
}

View File

@@ -27,6 +27,9 @@ type ListRequest struct {
// Page size
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Status
Status string `url:"status,omitempty" json:"status,omitempty"`
}
// List gets list of all trunks as a ListTrunks struct

View File

@@ -46,6 +46,11 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Sort by zone id
// Default value: 0
// Required: false
ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -673,6 +673,9 @@ type RecordVINS struct {
// Description
Description string `json:"desc"`
// Enable Security Groups
EnableSecGroups bool `json:"enable_secgroups"`
// Grid ID
GID uint64 `json:"gid"`

View File

@@ -22,12 +22,30 @@ type RecordZone struct {
// Name
Name string `json:"name"`
// List of associated account IDs
AccountIDs []uint64 `json:"accountIds"`
// List of associated bservice IDs
BserviceIDs []uint64 `json:"bserviceIds"`
// List of associated compute IDs
ComputeIDs []uint64 `json:"computeIds"`
// Description
Description string `json:"description"`
// Deletable flag
Deletable bool `json:"deletable"`
// List of associated ExtNet IDs
ExtnetIDs []uint64 `json:"extnetIds"`
// List of associated K8s IDs
K8SIDs []uint64 `json:"k8sIds"`
// List of associated LB IDs
LBIDs []uint64 `json:"lbIds"`
// Status
Status string `json:"status"`
@@ -39,4 +57,7 @@ type RecordZone struct {
// List of associated Node IDs
NodeIDs []uint64 `json:"nodeIds"`
// List of associated VINS IDs
VinsIDs []uint64 `json:"vinsIds"`
}