Compare commits

...

13 Commits

Author SHA1 Message Date
4d9b8fc9d8 v1.5.7 2023-09-04 18:48:22 +03:00
e8270453cc 1.5.6 2023-08-30 13:54:30 +03:00
7de095302b v1.5.5 2023-08-25 13:53:43 +03:00
a3711057ba v1.5.4 2023-08-22 15:28:39 +03:00
1c59ca338a v1.5.3 2023-08-15 11:42:30 +03:00
f1529c9aac v1.5.2 2023-08-09 19:33:50 +03:00
040235f92f v1.5.1 2023-07-24 18:13:52 +03:00
4a152cb44c v1.5.0 2023-07-24 16:43:10 +03:00
c78b1348e3 v1.5.0 2023-07-24 15:13:04 +03:00
8f152a2f63 v1.5.0 2023-07-21 15:14:10 +03:00
0be4d8fb0c v1.5.0-epsilon 2023-07-13 18:32:21 +03:00
Никита Сорокин
5025a17ea4 v1.5.0-delta 2023-07-13 15:28:07 +03:00
7c787f6fce v1.5.0-gamma2 2023-07-07 12:40:03 +03:00
242 changed files with 6117 additions and 2846 deletions

View File

@@ -1,4 +1,6 @@
## Version 1.4.7 ## Version 1.5.7
### Bugfix ### Bugfix
- Deleted validate:"required" tag from IPCIDR field in cloudapi/vins/createInRg request struct - Remove the required tag of the start field in the CreateRequest model in cb/lb/create, since it is impossible to create an lb without starting it
- Fix model the RecordGrid, add the ItemGridList model to cloudbroker/grid/models to correctly receive information on get and list requests
- Fix tag json field GID in model RecordResourcesConsumption cb/grid/models

View File

@@ -9,6 +9,7 @@ Decort SDK - это библиотека, написанная на языке G
- Версия 1.2.x Decort-SDK соответствует 3.8.5 версии платформы - Версия 1.2.x Decort-SDK соответствует 3.8.5 версии платформы
- Версия 1.3.x Decort-SDK соответствует 3.8.5 версии платформы - Версия 1.3.x Decort-SDK соответствует 3.8.5 версии платформы
- Версия 1.4.x Decort-SDK соответствует 3.8.6 версии платформы - Версия 1.4.x Decort-SDK соответствует 3.8.6 версии платформы
- Версия 1.5.x Decort-SDK соответствует 3.8.7 версии платформы
## Оглавление ## Оглавление

View File

@@ -4,6 +4,7 @@ import (
"crypto/tls" "crypto/tls"
"net/http" "net/http"
"net/url" "net/url"
"time"
"repository.basistech.ru/BASIS/decort-golang-sdk/config" "repository.basistech.ru/BASIS/decort-golang-sdk/config"
) )
@@ -17,14 +18,21 @@ func NewLegacyHttpClient(cfg config.LegacyConfig) *http.Client {
}, },
} }
var expiredTime time.Time
if cfg.Token != "" {
expiredTime = time.Now().AddDate(0, 0, 1)
}
return &http.Client{ return &http.Client{
Transport: &transportLegacy{ Transport: &transportLegacy{
base: transCfg, base: transCfg,
username: url.QueryEscape(cfg.Username), username: url.QueryEscape(cfg.Username),
password: url.QueryEscape(cfg.Password), password: url.QueryEscape(cfg.Password),
retries: cfg.Retries, retries: cfg.Retries,
token: cfg.Token, token: cfg.Token,
decortURL: cfg.DecortURL, decortURL: cfg.DecortURL,
expiryTime: expiredTime,
}, },
Timeout: cfg.Timeout.Get(), Timeout: cfg.Timeout.Get(),

View File

@@ -9,16 +9,17 @@ import (
) )
type transportLegacy struct { type transportLegacy struct {
base http.RoundTripper base http.RoundTripper
username string username string
password string password string
retries uint64 retries uint64
token string token string
decortURL string decortURL string
expiryTime time.Time
} }
func (t *transportLegacy) RoundTrip(request *http.Request) (*http.Response, error) { func (t *transportLegacy) RoundTrip(request *http.Request) (*http.Response, error) {
if t.token == "" { if t.token == "" || time.Now().After(t.expiryTime) {
body := fmt.Sprintf("username=%s&password=%s", t.username, t.password) body := fmt.Sprintf("username=%s&password=%s", t.username, t.password)
bodyReader := strings.NewReader(body) bodyReader := strings.NewReader(body)
@@ -39,6 +40,7 @@ func (t *transportLegacy) RoundTrip(request *http.Request) (*http.Response, erro
token := string(tokenBytes) token := string(tokenBytes)
t.token = token t.token = token
t.expiryTime = time.Now().AddDate(0, 0, 1)
} }
tokenValue := fmt.Sprintf("&authkey=%s", t.token) tokenValue := fmt.Sprintf("&authkey=%s", t.token)
@@ -63,7 +65,9 @@ func (t *transportLegacy) RoundTrip(request *http.Request) (*http.Response, erro
err = fmt.Errorf("%s", respBytes) err = fmt.Errorf("%s", respBytes)
resp.Body.Close() resp.Body.Close()
} }
if err != nil {
return nil, fmt.Errorf("could not execute request: %w", err)
}
time.Sleep(time.Second * 5) time.Sleep(time.Second * 5)
} }
return nil, fmt.Errorf("could not execute request: %w", err) return nil, fmt.Errorf("could not execute request: %w", err)

View File

@@ -1,11 +1,19 @@
package validators package validators
import ( import (
"github.com/go-playground/validator/v10"
"regexp" "regexp"
"strings" "strings"
"github.com/go-playground/validator/v10"
) )
// computeDriverValidator is used to validate Driver field in kvmx86/kvmppc create.
func computeDriverValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return StringInSlice(fieldValue, computeDriverValues)
}
// protoValidator is used to validate Proto fields. // protoValidator is used to validate Proto fields.
func protoValidator(fe validator.FieldLevel) bool { func protoValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String() fieldValue := fe.Field().String()
@@ -256,3 +264,11 @@ func strictLooseValidator(fe validator.FieldLevel) bool {
return StringInSlice(fieldValue, strictLooseValues) return StringInSlice(fieldValue, strictLooseValues)
} }
// name workerGroup must be more 3 symbol
func workerGroupNameValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
fieldValue = strings.Trim(fieldValue, " ")
return len(fieldValue) >= 3
}

View File

@@ -107,6 +107,12 @@ func errorMessage(fe validator.FieldError) string {
fe.Field(), fe.Field(),
joinValues(computeDataDisksValues)) joinValues(computeDataDisksValues))
case "computeDriver":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(computeDriverValues))
// Disk Validators // Disk Validators
case "diskType": case "diskType":
return fmt.Sprintf("%s %s must be one of the following: %s", return fmt.Sprintf("%s %s must be one of the following: %s",
@@ -121,6 +127,12 @@ func errorMessage(fe validator.FieldError) string {
fe.Field(), fe.Field(),
joinValues(flipgroupClientTypeValues)) joinValues(flipgroupClientTypeValues))
// k8s Validators
case "workerGroupName":
return fmt.Sprintf("%s %s must be more 3 symbol",
prefix,
fe.Field())
// KVM_X86/KVM_PPC Validators // KVM_X86/KVM_PPC Validators
case "kvmNetType": case "kvmNetType":
return fmt.Sprintf("%s %s must be one of the following: %s", return fmt.Sprintf("%s %s must be one of the following: %s",

View File

@@ -30,6 +30,11 @@ func registerAllValidators(validate *validator.Validate) error {
return err return err
} }
err = validate.RegisterValidation("computeDriver", computeDriverValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("accessType", accessTypeValidator) err = validate.RegisterValidation("accessType", accessTypeValidator)
if err != nil { if err != nil {
return err return err
@@ -175,5 +180,10 @@ func registerAllValidators(validate *validator.Validate) error {
return err return err
} }
err = validate.RegisterValidation("workerGroupName", workerGroupNameValidator)
if err != nil {
return err
}
return nil return nil
} }

View File

@@ -17,6 +17,7 @@ var (
computeNetTypeValues = []string{"EXTNET", "VINS"} computeNetTypeValues = []string{"EXTNET", "VINS"}
computeOrderValues = []string{"cdrom", "network", "hd"} computeOrderValues = []string{"cdrom", "network", "hd"}
computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"} computeDataDisksValues = []string{"KEEP", "DETACH", "DESTROY"}
computeDriverValues = []string{"KVM_X86", "SVA_KVM_X86"}
diskTypeValues = []string{"B", "T", "D"} diskTypeValues = []string{"B", "T", "D"}

View File

@@ -62,7 +62,7 @@ func (la ListAccounts) FilterFunc(predicate func(ItemAccount) bool) ListAccounts
// FindOne returns first found ItemAccount. // FindOne returns first found ItemAccount.
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (la ListAccounts) FindOne() ItemAccount { func (la ListAccounts) FindOne() ItemAccount {
if la.EntryCount == 0 { if len(la.Data) == 0 {
return ItemAccount{} return ItemAccount{}
} }

View File

@@ -16,7 +16,7 @@ type GetResourceConsumptionRequest struct {
} }
// GetResourceConsumption show amount of consumed and reserved resources (cpu, ram, disk) by specific account // GetResourceConsumption show amount of consumed and reserved resources (cpu, ram, disk) by specific account
func (a Account) GetResourceConsumption(ctx context.Context, req GetResourceConsumptionRequest) (*ItemResourceConsumption, error) { func (a Account) GetResourceConsumption(ctx context.Context, req GetResourceConsumptionRequest) (*RecordResourceConsumption, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -26,7 +26,7 @@ func (a Account) GetResourceConsumption(ctx context.Context, req GetResourceCons
url := "/cloudapi/account/getResourceConsumption" url := "/cloudapi/account/getResourceConsumption"
info := ItemResourceConsumption{} info := RecordResourceConsumption{}
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {

View File

@@ -14,7 +14,7 @@ type ListRequest struct {
// Find by name // Find by name
// Required: false // Required: false
Name string `urL:"name,omitempty" json:"name,omitempty"` Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by access control list // Find by access control list
// Required: false // Required: false

View File

@@ -13,10 +13,50 @@ type ListComputesRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Find by compute id
// Required: false
ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by resource group name
// Required: false
RGName string `url:"rgName,omitempty" json:"rgName,omitempty"`
// Find by resource group id
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by ip address
// Required: false
IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"`
// Find by external network name
// Required: false
ExtNetName string `url:"extNetName,omitempty" json:"extNetName,omitempty"`
// Find by external network id
// Required: false
ExtNetID uint64 `url:"extNetId,omitempty" json:"extNetId,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"`
} }
// ListComputes gets list all compute instances under specified account, accessible by the user // ListComputes gets list all compute instances under specified account, accessible by the user
func (a Account) ListComputes(ctx context.Context, req ListComputesRequest) (ListComputes, error) { func (a Account) ListComputes(ctx context.Context, req ListComputesRequest) (*ListComputes, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +78,5 @@ func (a Account) ListComputes(ctx context.Context, req ListComputesRequest) (Lis
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -15,6 +15,18 @@ type ListDeletedRequest struct {
// Page size // Page size
// Required: false // Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"` Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by access control list
// Required: false
ACL string `url:"acl,omitempty" json:"acl,omitempty"`
} }
// ListDeleted gets list all deleted accounts the user has access to // ListDeleted gets list all deleted accounts the user has access to

View File

@@ -13,10 +13,34 @@ type ListDisksRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Find by disk id
// Required: false
DiskID uint64 `url:"diskId,omitempty" json:"diskId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by max size disk
// Required: false
DiskMaxSize uint64 `url:"diskMaxSize,omitempty" json:"diskMaxSize,omitempty"`
// Type of the disks
// Required: false
Type string `url:"type,omitempty" json:"type,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"`
} }
// ListDisks gets list all currently unattached disks under specified account // ListDisks gets list all currently unattached disks under specified account
func (a Account) ListDisks(ctx context.Context, req ListDisksRequest) (ListDisks, error) { func (a Account) ListDisks(ctx context.Context, req ListDisksRequest) (*ListDisks, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +62,5 @@ func (a Account) ListDisks(ctx context.Context, req ListDisksRequest) (ListDisks
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -10,13 +10,45 @@ import (
// Request struct for get list FLIPGroups // Request struct for get list FLIPGroups
type ListFLIPGroupsRequest struct { type ListFLIPGroupsRequest struct {
// ID an account // ID of the account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by vinsId
// Required: false
VINSID uint64 `url:"vinsId,omitempty" json:"vinsId,omitempty"`
// Find by VINS name
// Required: false
VINSName string `url:"vinsName,omitempty" json:"vinsName,omitempty"`
// Find by external network id
// Required: false
ExtNetID uint64 `url:"extnetId,omitempty" json:"extnetId,omitempty"`
// Find by IP
// Required: false
ByIP string `url:"byIp,omitempty" json:"byIp,omitempty"`
// Find by flipGroup Id
// Required: false
FLIPGroupID uint64 `url:"flipGroupId,omitempty" json:"flipGroupId,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"`
} }
// ListFLIPGroups gets list all FLIPGroups under specified account, accessible by the user // ListFLIPGroups gets list all FLIPGroups under specified account, accessible by the user
func (a Account) ListFLIPGroups(ctx context.Context, req ListFLIPGroupsRequest) (ListFLIPGroups, error) { func (a Account) ListFLIPGroups(ctx context.Context, req ListFLIPGroupsRequest) (*ListFLIPGroups, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +70,5 @@ func (a Account) ListFLIPGroups(ctx context.Context, req ListFLIPGroupsRequest)
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -13,10 +13,38 @@ type ListRGRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" 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"`
// Find by resource group id
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by vinsId
// Required: false
VINSID uint64 `url:"vinsId,omitempty" json:"vinsId,omitempty"`
// Find by VM ID
// Required: false
VMID uint64 `url:"vmId,omitempty" json:"vmId,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
} }
// ListRG gets list all resource groups under specified account, accessible by the user // ListRG gets list all resource groups under specified account, accessible by the user
func (a Account) ListRG(ctx context.Context, req ListRGRequest) (ListRG, error) { func (a Account) ListRG(ctx context.Context, req ListRGRequest) (*ListRG, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +66,5 @@ func (a Account) ListRG(ctx context.Context, req ListRGRequest) (ListRG, error)
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -12,15 +12,35 @@ import (
type ListTemplatesRequest struct { type ListTemplatesRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Include deleted images // Include deleted images
// Required: false // Required: false
IncludeDeleted bool `url:"includedeleted" json:"includedeleted"` IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"`
// Find by image id
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by type
// Required: false
Type string `url:"type,omitempty" json:"type,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"`
} }
// ListTemplates gets list templates which can be managed by this account // ListTemplates gets list templates which can be managed by this account
func (a Account) ListTemplates(ctx context.Context, req ListTemplatesRequest) (ListTemplates, error) { func (a Account) ListTemplates(ctx context.Context, req ListTemplatesRequest) (*ListTemplates, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -42,5 +62,5 @@ func (a Account) ListTemplates(ctx context.Context, req ListTemplatesRequest) (L
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -13,10 +13,34 @@ type ListVINSRequest struct {
// ID an account // ID an account
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Find by VINS ID
// Required: false
VINSID uint64 `url:"vins,omitempty" json:"vinsId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by resource group id
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by external network ip
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,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"`
} }
// ListVINS gets list all ViNSes under specified account, accessible by the user // ListVINS gets list all ViNSes under specified account, accessible by the user
func (a Account) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, error) { func (a Account) ListVINS(ctx context.Context, req ListVINSRequest) (*ListVINS, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +62,5 @@ func (a Account) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, e
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -33,7 +33,7 @@ type ResourceLimits struct {
CUD float64 `json:"CU_D"` CUD float64 `json:"CU_D"`
// Max disk size, GB // Max disk size, GB
CU_DM float64 `json:"CU_DM"` CUDM float64 `json:"CU_DM"`
// Number of public IP addresses // Number of public IP addresses
CUI float64 `json:"CU_I"` CUI float64 `json:"CU_I"`
@@ -112,7 +112,15 @@ type DiskUsage struct {
DiskSize float64 `json:"disksize"` DiskSize float64 `json:"disksize"`
// Disk size max // Disk size max
DiskSizeMax uint64 `json:"disksizemax"` DiskSizeMax float64 `json:"disksizemax"`
}
// Information about resource consumption
type RecordResourceConsumption struct {
ItemResourceConsumption
// Resource limits
ResourceLimits ResourceLimits `json:"resourceLimits"`
} }
// Information about resources // Information about resources
@@ -299,7 +307,13 @@ type ItemCompute struct {
} }
// List of computes // List of computes
type ListComputes []ItemCompute type ListComputes struct {
// Data
Data []ItemCompute `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about disk // Main information about disk
type ItemDisk struct { type ItemDisk struct {
@@ -326,7 +340,13 @@ type ItemDisk struct {
} }
// List of disks // List of disks
type ListDisks []ItemDisk type ListDisks struct {
// Data
Data []ItemDisk `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about VINS // Main information about VINS
type ItemVINS struct { type ItemVINS struct {
@@ -383,7 +403,13 @@ type ItemVINS struct {
} }
// List of VINS // List of VINS
type ListVINS []ItemVINS type ListVINS struct {
// Data
Data []ItemVINS `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main info about audit // Main info about audit
type ItemAudit struct { type ItemAudit struct {
@@ -497,7 +523,13 @@ type ItemRG struct {
} }
// List of Resource groups // List of Resource groups
type ListRG []ItemRG type ListRG struct {
// Data
Data []ItemRG `json:"data"`
// Enrtry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about template // Main information about template
type ItemTemplate struct { type ItemTemplate struct {
@@ -533,7 +565,13 @@ type ItemTemplate struct {
} }
// List of templates // List of templates
type ListTemplates []ItemTemplate type ListTemplates struct {
// Data
Data []ItemTemplate `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about FLIPGroup // Main information about FLIPGroup
type ItemFLIPGroup struct { type ItemFLIPGroup struct {
@@ -602,4 +640,10 @@ type ItemFLIPGroup struct {
} }
// List of FLIPGroups // List of FLIPGroups
type ListFLIPGroups []ItemFLIPGroup type ListFLIPGroups struct {
// Data
Data []ItemFLIPGroup `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -12,7 +12,7 @@ import (
// - First argument -> prefix // - First argument -> prefix
// - Second argument -> indent // - Second argument -> indent
func (la ListAccounts) Serialize(params ...string) (serialization.Serialized, error) { func (la ListAccounts) Serialize(params ...string) (serialization.Serialized, error) {
if la.EntryCount == 0 { if len(la.Data) == 0 {
return []byte{}, nil return []byte{}, nil
} }

View File

@@ -6,7 +6,7 @@ import "sort"
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (la ListAccounts) SortByCreatedTime(inverse bool) ListAccounts { func (la ListAccounts) SortByCreatedTime(inverse bool) ListAccounts {
if la.EntryCount < 2 { if len(la.Data) < 2 {
return la return la
} }
@@ -25,7 +25,7 @@ func (la ListAccounts) SortByCreatedTime(inverse bool) ListAccounts {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (la ListAccounts) SortByUpdatedTime(inverse bool) ListAccounts { func (la ListAccounts) SortByUpdatedTime(inverse bool) ListAccounts {
if la.EntryCount < 2 { if len(la.Data) < 2 {
return la return la
} }
@@ -44,7 +44,7 @@ func (la ListAccounts) SortByUpdatedTime(inverse bool) ListAccounts {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (la ListAccounts) SortByDeletedTime(inverse bool) ListAccounts { func (la ListAccounts) SortByDeletedTime(inverse bool) ListAccounts {
if la.EntryCount < 2 { if len(la.Data) < 2 {
return la return la
} }

View File

@@ -0,0 +1,40 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// Request struct for deleting compute's custome fields
type DeleteCustomFieldsRequest struct {
// ID of the compute
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
}
// DeleteCustomFields deletes computes custom fields
func (c Compute) DeleteCustomFields(ctx context.Context, req DeleteCustomFieldsRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
for _, validationError := range validators.GetErrors(err) {
return false, validators.ValidationError(validationError)
}
}
url := "/cloudapi/compute/deleteCustomFields"
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

@@ -22,11 +22,6 @@ type DiskAddRequest struct {
// Required: true // Required: true
Size uint64 `url:"size" json:"size" validate:"required"` Size uint64 `url:"size" json:"size" validate:"required"`
// Storage endpoint provider ID
// By default the same with boot disk
// Required: false
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Type of the disk // Type of the disk
// Should be one of: // Should be one of:
// - D // - D
@@ -34,6 +29,11 @@ type DiskAddRequest struct {
// Required: false // Required: false
DiskType string `url:"diskType,omitempty" json:"diskType,omitempty" validate:"omitempty,computeDiskType"` DiskType string `url:"diskType,omitempty" json:"diskType,omitempty" validate:"omitempty,computeDiskType"`
// Storage endpoint provider ID
// By default the same with boot disk
// Required: false
SepID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Pool name // Pool name
// By default will be chosen automatically // By default will be chosen automatically
// Required: false // Required: false

View File

@@ -20,7 +20,7 @@ type DiskDelRequest struct {
// False if disk is to be deleted to recycle bin // False if disk is to be deleted to recycle bin
// Required: true // Required: true
Permanently bool `url:"permanently" json:"permanently" validate:"required"` Permanently bool `url:"permanently" json:"permanently"`
} }
// DiskDel delete disk and detach from compute // DiskDel delete disk and detach from compute

View File

@@ -8,19 +8,15 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
// Request struct for get list GPU for compute // Request struct for getting Compute's customFields
type ListGPURequest struct { type GetCustomFieldsRequest struct {
// ID of compute instance // Compute ID
// Required: true // Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Also list destroyed
// Required: false
ListDestroyed bool `url:"list_destroyed,omitempty" json:"list_destroyed,omitempty"`
} }
// ListVGPU gets list GPU for compute // GetCustomFields gets Compute's customFields
func (c Compute) ListGPU(ctx context.Context, req ListGPURequest) ([]interface{}, error) { func (c Compute) GetCustomFields(ctx context.Context, req GetCustomFieldsRequest) (interface{}, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -28,19 +24,19 @@ func (c Compute) ListGPU(ctx context.Context, req ListGPURequest) ([]interface{}
} }
} }
url := "/cloudbroker/compute/listGpu" url := "/cloudapi/compute/getCustomFields"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
list := make([]interface{}, 0) var info interface{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &info)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return list, nil return &info, nil
} }

View File

@@ -8,6 +8,42 @@ import (
// Request struct for get deleted computes list // Request struct for get deleted computes list
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by resource group name
// Required: false
RGName string `url:"rgName,omitempty" json:"rgName,omitempty"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by IP address
// Required: false
IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"`
// Find by external network name
// Required: false
ExtNetName string `url:"extNetName,omitempty" json:"extNetName,omitempty"`
// Find by external network ID
// Required: false
ExtNetID uint64 `url:"extNetId,omitempty" json:"extNetId,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -13,10 +13,34 @@ type ListPCIDeviceRequest struct {
// Identifier compute // Identifier compute
// Required: true // Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by device id
// Required: false
DevID uint64 `url:"devId,omitempty" json:"devId,omitempty"`
// Find by type
// Required: false
Type string `url:"type,omitempty" json:"type,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,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"`
} }
// ListPCIDevice gets list PCI device // ListPCIDevice gets list PCI device
func (c Compute) ListPCIDevice(ctx context.Context, req ListPCIDeviceRequest) ([]interface{}, error) { func (c Compute) ListPCIDevice(ctx context.Context, req ListPCIDeviceRequest) (*ListPCIDevices, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,12 +55,12 @@ func (c Compute) ListPCIDevice(ctx context.Context, req ListPCIDeviceRequest) ([
return nil, err return nil, err
} }
list := []interface{}{} list := ListPCIDevices{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -13,10 +13,34 @@ type ListVGPURequest struct {
// Identifier compute // Identifier compute
// Required: true // Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Find by GPU id
// Required: false
GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"`
// Find by type
// Required: false
Type string `url:"type,omitempty" json:"type,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,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"`
// Include deleted computes. If using field 'status', then includedeleted will be ignored
// Required: false
IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"`
} }
// ListVGPU gets list vGPU // ListVGPU gets list vGPU
func (c Compute) ListVGPU(ctx context.Context, req ListVGPURequest) ([]interface{}, error) { func (c Compute) ListVGPU(ctx context.Context, req ListVGPURequest) (*ListVGPUs, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -24,19 +48,19 @@ func (c Compute) ListVGPU(ctx context.Context, req ListVGPURequest) ([]interface
} }
} }
url := "/cloudapi/compute/listVgpu" url := "/cloudapi/compute/listVGpu"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
list := []interface{}{} list := ListVGPUs{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -14,6 +14,14 @@ type RecordACL struct {
RGACL ListACL `json:"rgAcl"` RGACL ListACL `json:"rgAcl"`
} }
type ListUsers struct {
// Data
Data RecordACL `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
type Explicit bool type Explicit bool
func (e *Explicit) UnmarshalJSON(b []byte) error { func (e *Explicit) UnmarshalJSON(b []byte) error {
@@ -89,7 +97,13 @@ type ItemSnapshot struct {
} }
// List of snapshots // List of snapshots
type ListSnapShots []ItemSnapshot type ListSnapShots struct {
// Data
Data []ItemSnapshot `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about port forward // Main information about port forward
type ItemPFW struct { type ItemPFW struct {
@@ -116,7 +130,13 @@ type ItemPFW struct {
} }
// List port forwards // List port forwards
type ListPFWs []ItemPFW type ListPFWs struct {
// Data
Data []ItemPFW `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about affinity relations // Main information about affinity relations
type RecordAffinityRelations struct { type RecordAffinityRelations struct {
@@ -403,7 +423,7 @@ type RecordCompute struct {
SnapSets ListSnapSets `json:"snapSets"` SnapSets ListSnapSets `json:"snapSets"`
// Stateless SepID // Stateless SepID
StatelessSepID uint64 `json:"statelessSepId"` StatelessSepID int64 `json:"statelessSepId"`
// Stateless SepType // Stateless SepType
StatelessSepType string `json:"statelessSepType"` StatelessSepType string `json:"statelessSepType"`
@@ -862,7 +882,7 @@ type ItemCompute struct {
SnapSets ListSnapSets `json:"snapSets"` SnapSets ListSnapSets `json:"snapSets"`
// Stateless SepID // Stateless SepID
StatelessSepID uint64 `json:"statelessSepId"` StatelessSepID int64 `json:"statelessSepId"`
// Stateless SepType // Stateless SepType
StatelessSepType string `json:"statelessSepType"` StatelessSepType string `json:"statelessSepType"`
@@ -915,3 +935,21 @@ type ListComputes struct {
// Entry count // Entry count
EntryCount uint64 `json:"entryCount"` EntryCount uint64 `json:"entryCount"`
} }
// List VGPUs
type ListVGPUs struct {
// Data
Data []interface{} `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// List PCI devices
type ListPCIDevices struct {
// Data
Data []interface{} `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -16,7 +16,7 @@ type PFWListRequest struct {
} }
// PFWList gets compute port forwards list // PFWList gets compute port forwards list
func (c Compute) PFWList(ctx context.Context, req PFWListRequest) (ListPFWs, error) { func (c Compute) PFWList(ctx context.Context, req PFWListRequest) (*ListPFWs, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +38,5 @@ func (c Compute) PFWList(ctx context.Context, req PFWListRequest) (ListPFWs, err
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -0,0 +1,43 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// Request struct for setting customFields values for the Compute
type SetCustomFieldsRequest struct {
// ID of the compute
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Custom fields for Compute. Must be dict.
// Required: true
CustomFields string `url:"customFields" json:"customFields" validate:"required"`
}
// SetCustomFields sets customFields values for the Compute
func (c Compute) SetCustomFields(ctx context.Context, req SetCustomFieldsRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
for _, validationError := range validators.GetErrors(err) {
return false, validators.ValidationError(validationError)
}
}
url := "/cloudapi/compute/setCustomFields"
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

@@ -16,7 +16,7 @@ type SnapshotListRequest struct {
} }
// SnapshotList gets list compute snapshots // SnapshotList gets list compute snapshots
func (c Compute) SnapshotList(ctx context.Context, req SnapshotListRequest) (ListSnapShots, error) { func (c Compute) SnapshotList(ctx context.Context, req SnapshotListRequest) (*ListSnapShots, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +38,5 @@ func (c Compute) SnapshotList(ctx context.Context, req SnapshotListRequest) (Lis
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -16,7 +16,7 @@ type UserListRequest struct {
} }
// UserList gets users list for compute // UserList gets users list for compute
func (c Compute) UserList(ctx context.Context, req UserListRequest) (*RecordACL, error) { func (c Compute) UserList(ctx context.Context, req UserListRequest) (*ListUsers, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (c Compute) UserList(ctx context.Context, req UserListRequest) (*RecordACL,
return nil, err return nil, err
} }
list := RecordACL{} list := ListUsers{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

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

View File

@@ -1,18 +0,0 @@
// API Actor for managing ComputeCI. This actor is a final API for admin to manage ComputeCI
package computeci
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
// Structure for creating request to computeci
type ComputeCI struct {
client interfaces.Caller
}
// Builder for computeci endpoints
func New(client interfaces.Caller) *ComputeCI {
return &ComputeCI{
client,
}
}

View File

@@ -1,53 +0,0 @@
package computeci
// FilterByID returns ListComputeCI with specified ID.
func (lci ListComputeCI) FilterByID(id uint64) ListComputeCI {
predicate := func(ic ItemComputeCI) bool {
return ic.ID == id
}
return lci.FilterFunc(predicate)
}
// FilterByName returns ListComputeCI with specified Name.
func (lci ListComputeCI) FilterByName(name string) ListComputeCI {
predicate := func(ic ItemComputeCI) bool {
return ic.Name == name
}
return lci.FilterFunc(predicate)
}
// FilterByStatus returns ListComputeCI with specified Status.
func (lci ListComputeCI) FilterByStatus(status string) ListComputeCI {
predicate := func(ic ItemComputeCI) bool {
return ic.Status == status
}
return lci.FilterFunc(predicate)
}
// FilterFunc allows filtering ListComputeCI based on a user-specified predicate.
func (lci ListComputeCI) FilterFunc(predicate func(ItemComputeCI) bool) ListComputeCI {
var result ListComputeCI
for _, item := range lci.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns first found ItemComputeCI
// If none was found, returns an empty struct.
func (lci ListComputeCI) FindOne() ItemComputeCI {
if lci.EntryCount == 0 {
return ItemComputeCI{}
}
return lci.Data[0]
}

View File

@@ -1,98 +0,0 @@
package computeci
import "testing"
var computeciItems = ListComputeCI{
Data: []ItemComputeCI{
{
CustomFields: map[string]interface{}{},
Description: "",
Drivers: []string{
"KVM_X86",
},
GUID: 1,
ID: 1,
Name: "computeci_1",
Status: "ENABLED",
Template: "",
},
{
CustomFields: map[string]interface{}{},
Description: "",
Drivers: []string{
"KVM_X86",
},
GUID: 2,
ID: 2,
Name: "computeci_2",
Status: "ENABLED",
Template: "",
},
{
CustomFields: map[string]interface{}{},
Description: "",
Drivers: []string{
"SVA_KVM_X86",
},
GUID: 3,
ID: 3,
Name: "computeci_3",
Status: "DISABLED",
Template: "",
},
},
EntryCount: 3,
}
func TestFilterByID(t *testing.T) {
actual := computeciItems.FilterByID(2).FindOne()
if actual.ID != 2 {
t.Fatal("expected ID 2, found: ", actual.ID)
}
}
func TestFilterByName(t *testing.T) {
actual := computeciItems.FilterByName("computeci_3").FindOne()
if actual.Name != "computeci_3" {
t.Fatal("expected Name 'computeci_2', found: ", actual.Name)
}
}
func TestFilterByStatus(t *testing.T) {
actual := computeciItems.FilterByStatus("ENABLED")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.Status != "ENABLED" {
t.Fatal("expected Status 'ENABLED', found: ", item.Status)
}
}
}
func TestFilterFunc(t *testing.T) {
actual := computeciItems.FilterFunc(func(icc ItemComputeCI) bool {
for _, item := range icc.Drivers {
if item == "KVM_X86" {
return true
}
}
return false
})
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
for _, driver := range item.Drivers {
if driver != "KVM_X86" {
t.Fatal("expected 'KVM_X86' Driver, found: ", driver)
}
}
}
}

View File

@@ -1,42 +0,0 @@
package computeci
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// Request struct for information about computeci
type GetRequest struct {
// ID of the Compute CI
// Required: true
ComputeCIID uint64 `url:"computeciId" json:"computeciId" validate:"required"`
}
// Get gets information about computeci by ID
func (c ComputeCI) Get(ctx context.Context, req GetRequest) (*ItemComputeCI, error) {
err := validators.ValidateRequest(req)
if err != nil {
for _, validatonError := range validators.GetErrors(err) {
return nil, validators.ValidationError(validatonError)
}
}
url := "/cloudapi/computeci/get"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return nil, err
}
info := ItemComputeCI{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}

View File

@@ -1,35 +0,0 @@
package computeci
// Main information about computeci
type ItemComputeCI struct {
// Custom fields
CustomFields map[string]interface{} `json:"customFields"`
// Description
Description string `json:"desc"`
// List drivers
Drivers []string `json:"drivers"`
// GUID
GUID uint64 `json:"guid"`
// ID
ID uint64 `json:"id"`
// Name
Name string `json:"name"`
// Status
Status string `json:"status"`
// Template
Template string `json:"template"`
}
// List of computeci instances
type ListComputeCI struct {
Data []ItemComputeCI `json:"data"`
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -40,6 +40,14 @@ type ListRequest struct {
// Required: false // Required: false
Type string `url:"type,omitempty" json:"type,omitempty"` Type string `url:"type,omitempty" json:"type,omitempty"`
// Find by sep ID
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -8,6 +8,26 @@ import (
// Request struct for get list of deleted disks // Request struct for get list of deleted disks
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by id
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account name
// Required: false
AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"`
// Find by max size disk
// Required: false
DiskMaxSize int64 `url:"diskMaxSize,omitempty" json:"diskMaxSize,omitempty"`
// Find by shared, true or false
// Required: false
Shared bool `url:"shared,omitempty" json:"shared,omitempty"`
// ID of the account the disks belong to // ID of the account the disks belong to
// Required: false // Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`

View File

@@ -11,10 +11,18 @@ type ListTypesRequest struct {
// Show detailed disk types by seps // Show detailed disk types by seps
// Required: true // Required: true
Detailed bool `url:"detailed" json:"detailed" validate:"required"` Detailed bool `url:"detailed" json:"detailed" 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"`
} }
// ListTypes gets list defined disk types // ListTypes gets list defined disk types
func (d Disks) ListTypes(ctx context.Context, req ListTypesRequest) ([]interface{}, error) { func (d Disks) ListTypes(ctx context.Context, req ListTypesRequest) (*ListTypes, error) {
url := "/cloudapi/disks/listTypes" url := "/cloudapi/disks/listTypes"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -22,12 +30,12 @@ func (d Disks) ListTypes(ctx context.Context, req ListTypesRequest) ([]interface
return nil, err return nil, err
} }
list := make([]interface{}, 0) list := ListTypes{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -24,10 +24,6 @@ type ListUnattachedRequest struct {
// Required: false // Required: false
Status string `url:"status,omitempty" json:"status,omitempty"` Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by shared, true or false
// Required: false
Shared bool `url:"shared,omitempty" json:"shared,omitempty"`
// Type of the disks // Type of the disks
// Required: false // Required: false
Type string `url:"type,omitempty" json:"type,omitempty"` Type string `url:"type,omitempty" json:"type,omitempty"`
@@ -36,6 +32,14 @@ type ListUnattachedRequest struct {
// Required: false // Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by sep ID
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -442,3 +442,11 @@ type RecordDisk struct {
// Virtual machine ID // Virtual machine ID
VMID uint64 `json:"vmid"` VMID uint64 `json:"vmid"`
} }
type ListTypes struct {
// Data
Data []interface{} `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -13,10 +13,26 @@ type ListComputesRequest struct {
// Filter by account ID // Filter by account ID
// Required: true // Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Find by rg ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by compute ID
// Required: false
ComputeID uint64 `url:"computeId,omitempty" json:"computeId,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"`
} }
// ListComputes gets computes from account with extnets // ListComputes gets computes from account with extnets
func (e ExtNet) ListComputes(ctx context.Context, req ListComputesRequest) (ListExtNetComputes, error) { func (e ExtNet) ListComputes(ctx context.Context, req ListComputesRequest) (*ListExtNetComputes, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +54,5 @@ func (e ExtNet) ListComputes(ctx context.Context, req ListComputesRequest) (List
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -59,7 +59,13 @@ type ItemExtNetCompute struct {
} }
// List of information about computes with external network // List of information about computes with external network
type ListExtNetComputes []ItemExtNetCompute type ListExtNetComputes struct {
// Data
Data []ItemExtNetCompute `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// QOS // QOS
type QOS struct { type QOS struct {
@@ -118,6 +124,12 @@ type Excluded struct {
// ClientType // ClientType
ClientType string `json:"clientType"` ClientType string `json:"clientType"`
// Domain name
DomainName string `json:"domainname"`
// Host name
HostName string `json:"hostname"`
// IP // IP
IP string `json:"ip"` IP string `json:"ip"`
@@ -139,11 +151,8 @@ type RecordExtNet struct {
// Meta // Meta
Meta []interface{} `json:"_meta"` Meta []interface{} `json:"_meta"`
// CheckIPs
CheckIPs []string `json:"checkIPs"`
// CheckIps // CheckIps
CheckIps []string `json:"checkIps"` CheckIPs []string `json:"checkIps"`
// Default // Default
Default bool `json:"default"` Default bool `json:"default"`

View File

@@ -45,7 +45,7 @@ type CreateRequest struct {
} }
// Create method will create a new FLIPGorup in the specified Account // Create method will create a new FLIPGorup in the specified Account
func (f FLIPGroup) Create(ctx context.Context, req CreateRequest) (*RecordFLIPGroup, error) { func (f FLIPGroup) Create(ctx context.Context, req CreateRequest) (*RecordFLIPGroupCreated, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -60,7 +60,7 @@ func (f FLIPGroup) Create(ctx context.Context, req CreateRequest) (*RecordFLIPGr
return nil, err return nil, err
} }
info := RecordFLIPGroup{} info := RecordFLIPGroupCreated{}
err = json.Unmarshal(res, &info) err = json.Unmarshal(res, &info)
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ type GetRequest struct {
} }
// Get gets details of the specified Floating IP group // Get gets details of the specified Floating IP group
func (f FLIPGroup) Get(ctx context.Context, req GetRequest) (*ItemFLIPGroup, error) { func (f FLIPGroup) Get(ctx context.Context, req GetRequest) (*RecordFLIPGroup, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (f FLIPGroup) Get(ctx context.Context, req GetRequest) (*ItemFLIPGroup, err
return nil, err return nil, err
} }
info := ItemFLIPGroup{} info := RecordFLIPGroup{}
err = json.Unmarshal(res, &info) err = json.Unmarshal(res, &info)
if err != nil { if err != nil {

View File

@@ -1,7 +1,7 @@
package flipgroup package flipgroup
// Main information about FLIPGroup // Main information about FLIPGroup
type RecordFLIPGroup struct { type RecordFLIPGroupCreated struct {
// Default GW // Default GW
DefaultGW string `json:"defaultGW"` DefaultGW string `json:"defaultGW"`
@@ -18,6 +18,89 @@ type RecordFLIPGroup struct {
NetMask uint64 `json:"netmask"` NetMask uint64 `json:"netmask"`
} }
type RecordFLIPGroup struct {
// Account ID
AccountID uint64 `json:"accountId"`
// Account name
AccountName string `json:"accountName"`
// List of client IDs
ClientIDs []uint64 `json:"clientIds"`
// Client names
ClientNames []string `json:"clientNames"`
// Client type
ClientType string `json:"clientType"`
// Connection ID
ConnID uint64 `json:"connId"`
// Connection type
ConnType string `json:"connType"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Default GW
DefaultGW string `json:"defaultGW"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// Grid ID
GID uint64 `json:"gid"`
// GUID
GUID uint64 `json:"guid"`
// ID
ID uint64 `json:"id"`
// IP
IP string `json:"ip"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
// Network ID
NetID uint64 `json:"netId"`
// Network type
NetType string `json:"netType"`
// Network
Network string `json:"network"`
// Resource group ID
RGID uint64 `json:"rgId"`
// Resource group name
RGName string `json:"rgName"`
// Status
Status string `json:"status"`
// Updated by
UpdatedBy string `json:"updatedBy"`
// Updated time
UpdatedTime uint64 `json:"updatedTime"`
}
// Detailed information about FLIPGroup // Detailed information about FLIPGroup
type ItemFLIPGroup struct { type ItemFLIPGroup struct {
// CKey // CKey

View File

@@ -40,21 +40,23 @@ func (li ListImages) FilterByBootType(bootType string) ListImages {
func (li ListImages) FilterFunc(predicate func(ItemImage) bool) ListImages { func (li ListImages) FilterFunc(predicate func(ItemImage) bool) ListImages {
var result ListImages var result ListImages
for _, item := range li { for _, item := range li.Data {
if predicate(item) { if predicate(item) {
result = append(result, item) result.Data = append(result.Data, item)
} }
} }
result.EntryCount = uint64(len(result.Data))
return result return result
} }
// FindOne returns first found ItemImage // FindOne returns first found ItemImage
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (li ListImages) FindOne() ItemImage { func (li ListImages) FindOne() ItemImage {
if len(li) == 0 { if len(li.Data) == 0 {
return ItemImage{} return ItemImage{}
} }
return li[0] return li.Data[0]
} }

View File

@@ -3,66 +3,69 @@ package image
import "testing" import "testing"
var images = ListImages{ var images = ListImages{
ItemImage{ Data: []ItemImage{
AccountID: 0, {
Architecture: "X86_64", AccountID: 0,
BootType: "bios", Architecture: "X86_64",
Bootable: true, BootType: "bios",
Description: "", Bootable: true,
Drivers: []string{ Description: "",
"KVM_X86", Drivers: []string{
"KVM_X86",
},
HotResize: true,
ID: 9882,
LinkTo: 0,
Name: "u16",
Pool: "vmstor",
Size: 5,
Status: "CREATED",
Type: "linux",
Username: "",
Virtual: false,
}, },
HotResize: true, {
ID: 9882, AccountID: 0,
LinkTo: 0, Architecture: "X86_64",
Name: "u16", BootType: "bois",
Pool: "vmstor", Bootable: true,
Size: 5, Description: "",
Status: "CREATED", Drivers: []string{
Type: "linux", "KVM_X86",
Username: "", },
Virtual: false, HotResize: false,
}, ID: 9884,
ItemImage{ LinkTo: 0,
AccountID: 0, Name: "alpine-virt-3.17",
Architecture: "X86_64", Pool: "vmstor",
BootType: "bois", Size: 1,
Bootable: true, Status: "CREATED",
Description: "", Type: "linux",
Drivers: []string{ Username: "",
"KVM_X86", Virtual: true,
}, },
HotResize: false, {
ID: 9884, AccountID: 1,
LinkTo: 0, Architecture: "X86_64",
Name: "alpine-virt-3.17", BootType: "bios",
Pool: "vmstor", Bootable: true,
Size: 1, Description: "",
Status: "CREATED", Drivers: []string{
Type: "linux", "KVM_X86",
Username: "", },
Virtual: true, HotResize: true,
}, ID: 9885,
ItemImage{ LinkTo: 0,
AccountID: 1, Name: "test",
Architecture: "X86_64", Pool: "vmstor",
BootType: "bios", Size: 4,
Bootable: true, Status: "DESTROYED",
Description: "", Type: "linux",
Drivers: []string{ Username: "",
"KVM_X86", Virtual: false,
}, },
HotResize: true,
ID: 9885,
LinkTo: 0,
Name: "test",
Pool: "vmstor",
Size: 4,
Status: "DESTROYED",
Type: "linux",
Username: "",
Virtual: false,
}, },
EntryCount: 3,
} }
func TestFilterByID(t *testing.T) { func TestFilterByID(t *testing.T) {
@@ -84,11 +87,11 @@ func TestFilterByName(t *testing.T) {
func TestFilterByStatus(t *testing.T) { func TestFilterByStatus(t *testing.T) {
actual := images.FilterByStatus("CREATED") actual := images.FilterByStatus("CREATED")
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual)) t.Fatal("expected 2 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.Status != "CREATED" { if item.Status != "CREATED" {
t.Fatal("expected Status 'CREATED', found: ", item.Status) t.Fatal("expected Status 'CREATED', found: ", item.Status)
} }
@@ -98,11 +101,11 @@ func TestFilterByStatus(t *testing.T) {
func TestFilterByBootType(t *testing.T) { func TestFilterByBootType(t *testing.T) {
actual := images.FilterByBootType("bios") actual := images.FilterByBootType("bios")
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual)) t.Fatal("expected 2 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.BootType != "bios" { if item.BootType != "bios" {
t.Fatal("expected BootType 'bios', found: ", item.BootType) t.Fatal("expected BootType 'bios', found: ", item.BootType)
} }
@@ -110,15 +113,15 @@ func TestFilterByBootType(t *testing.T) {
} }
func TestFilterFunc(t *testing.T) { func TestFilterFunc(t *testing.T) {
actual := images.FilterFunc(func(ii ItemImage) bool { actual := images.FilterFunc(func(ii ItemImage) bool {
return ii.Virtual == true return ii.Virtual == true
}) })
if len(actual) != 1 { if len(actual.Data) != 1 {
t.Fatal("expected 1 found, actual: ", len(actual)) t.Fatal("expected 1 found, actual: ", len(actual.Data))
} }
if actual[0].Virtual != true { if actual.Data[0].Virtual != true {
t.Fatal("expected Virtual true, found false") t.Fatal("expected Virtual true, found false")
} }
} }

View File

@@ -8,9 +8,53 @@ import (
// Request struct for get list available images // Request struct for get list available images
type ListRequest struct { type ListRequest struct {
// Optional account ID to include account images // Find by storage endpoint provider ID
// Required: false // Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by id
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by ID
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by architecture
// Required: false
Architecture string `url:"architecture,omitempty" json:"architecture,omitempty"`
// Find by type
// Required: false
TypeImage string `url:"typeImage,omitempty" json:"typeImage,omitempty"`
// Find by image size
// Required: false
ImageSize uint64 `url:"imageSize,omitempty" json:"imageSize,omitempty"`
// Find by SEP name
// Required: false
SEPName string `url:"sepName,omitempty" json:"sepName,omitempty"`
// Find by pool
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Find by public True or False
// Required: false
Public bool `url:"public,omitempty" json:"public,omitempty"`
// Find by hot resize True or False
// Required: false
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
// Find by bootable True or False
// Required: false
Bootable bool `url:"bootable,omitempty" json:"bootable,omitempty"`
// Page number // Page number
// Required: false // Required: false
@@ -22,7 +66,7 @@ type ListRequest struct {
} }
// List gets list available images, optionally filtering by account ID // List gets list available images, optionally filtering by account ID
func (i Image) List(ctx context.Context, req ListRequest) (ListImages, error) { func (i Image) List(ctx context.Context, req ListRequest) (*ListImages, error) {
url := "/cloudapi/image/list" url := "/cloudapi/image/list"
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -37,5 +81,5 @@ func (i Image) List(ctx context.Context, req ListRequest) (ListImages, error) {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -58,7 +58,13 @@ type ItemImage struct {
} }
// List of information about images // List of information about images
type ListImages []ItemImage type ListImages struct {
// Data
Data []ItemImage `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// History // History
type History struct { type History struct {

View File

@@ -12,7 +12,7 @@ import (
// - First argument -> prefix // - First argument -> prefix
// - Second argument -> indent // - Second argument -> indent
func (li ListImages) Serialize(params ...string) (serialization.Serialized, error) { func (li ListImages) Serialize(params ...string) (serialization.Serialized, error) {
if len(li) == 0 { if len(li.Data) == 0 {
return []byte{}, nil return []byte{}, nil
} }

View File

@@ -8,6 +8,26 @@ import (
// Request struct for get list information about deleted images // Request struct for get list information about deleted images
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"k8cId,omitempty" json:"k8cId,omitempty"`
// Find by name
// 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"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -24,7 +24,7 @@ type CreateRequest struct {
// Name for first worker group created with cluster // Name for first worker group created with cluster
// Required: true // Required: true
WorkerGroupName string `url:"workerGroupName" json:"workerGroupName" validate:"required"` WorkerGroupName string `url:"workerGroupName" json:"workerGroupName" validate:"required,workerGroupName"`
// Network plugin // Network plugin
// Must be one of these values: flannel, weawenet, calico // Must be one of these values: flannel, weawenet, calico

View File

@@ -76,21 +76,23 @@ func (lkc ListK8SClusters) FilterByDeletedBy(deletedBy string) ListK8SClusters {
func (lkc ListK8SClusters) FilterFunc(predicate func(ItemK8SCluster) bool) ListK8SClusters { func (lkc ListK8SClusters) FilterFunc(predicate func(ItemK8SCluster) bool) ListK8SClusters {
var result ListK8SClusters var result ListK8SClusters
for _, item := range lkc { for _, item := range lkc.Data {
if predicate(item) { if predicate(item) {
result = append(result, item) result.Data = append(result.Data, item)
} }
} }
result.EntryCount = uint64(len(result.Data))
return result return result
} }
// FindOne returns first found ItemK8SCluster // FindOne returns first found ItemK8SCluster
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (lkc ListK8SClusters) FindOne() ItemK8SCluster { func (lkc ListK8SClusters) FindOne() ItemK8SCluster {
if len(lkc) == 0 { if len(lkc.Data) == 0 {
return ItemK8SCluster{} return ItemK8SCluster{}
} }
return lkc[0] return lkc.Data[0]
} }

View File

@@ -3,86 +3,88 @@ package k8s
import "testing" import "testing"
var k8sItems = ListK8SClusters{ var k8sItems = ListK8SClusters{
ItemK8SCluster{ Data: []ItemK8SCluster{
AccountID: 1, {
AccountName: "test_1", AccountID: 1,
ACL: []interface{}{}, AccountName: "test_1",
BServiceID: 1, ACL: []interface{}{},
CIID: 1, BServiceID: 1,
Config: nil, CIID: 1,
CreatedBy: "test_user", Config: nil,
CreatedTime: 132454563, CreatedBy: "test_user",
DeletedBy: "", CreatedTime: 132454563,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
ExtNetID: 1, Description: "",
GID: 0, ExtNetID: 1,
GUID: 1, GID: 0,
ID: 1, GUID: 1,
LBID: 1, ID: 1,
Milestones: 999999, LBID: 1,
Name: "k8s_1", Milestones: 999999,
RGID: 1, Name: "k8s_1",
RGName: "rg_1", RGID: 1,
Status: "ENABLED", RGName: "rg_1",
TechStatus: "STARTED", Status: "ENABLED",
UpdatedBy: "", TechStatus: "STARTED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 0, UpdatedTime: 0,
}, VINSID: 0,
ItemK8SCluster{ },
AccountID: 2, {
AccountName: "test_2", AccountID: 2,
ACL: []interface{}{}, AccountName: "test_2",
BServiceID: 2, ACL: []interface{}{},
CIID: 2, BServiceID: 2,
Config: nil, CIID: 2,
CreatedBy: "test_user", Config: nil,
CreatedTime: 132454638, CreatedBy: "test_user",
DeletedBy: "", CreatedTime: 132454638,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
ExtNetID: 2, Description: "",
GID: 0, ExtNetID: 2,
GUID: 2, GID: 0,
ID: 2, GUID: 2,
LBID: 2, ID: 2,
Milestones: 999999, LBID: 2,
Name: "k8s_2", Milestones: 999999,
RGID: 2, Name: "k8s_2",
RGName: "rg_2", RGID: 2,
Status: "ENABLED", RGName: "rg_2",
TechStatus: "STARTED", Status: "ENABLED",
UpdatedBy: "", TechStatus: "STARTED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 0, UpdatedTime: 0,
}, VINSID: 0,
ItemK8SCluster{ },
AccountID: 3, {
AccountName: "test_3", AccountID: 3,
ACL: []interface{}{}, AccountName: "test_3",
BServiceID: 3, ACL: []interface{}{},
CIID: 3, BServiceID: 3,
Config: nil, CIID: 3,
CreatedBy: "test_user", Config: nil,
CreatedTime: 132454682, CreatedBy: "test_user",
DeletedBy: "", CreatedTime: 132454682,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
ExtNetID: 3, Description: "",
GID: 0, ExtNetID: 3,
GUID: 3, GID: 0,
ID: 3, GUID: 3,
LBID: 3, ID: 3,
Milestones: 999999, LBID: 3,
Name: "k8s_3", Milestones: 999999,
RGID: 3, Name: "k8s_3",
RGName: "rg_3", RGID: 3,
Status: "DISABLED", RGName: "rg_3",
TechStatus: "STOPPED", Status: "DISABLED",
UpdatedBy: "", TechStatus: "STOPPED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 0, UpdatedTime: 0,
VINSID: 0,
},
}, },
} }
@@ -121,11 +123,11 @@ func TestFilterByRGID(t *testing.T) {
func TestFilterByStatus(t *testing.T) { func TestFilterByStatus(t *testing.T) {
actual := k8sItems.FilterByStatus("ENABLED") actual := k8sItems.FilterByStatus("ENABLED")
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual)) t.Fatal("expected 2 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.Status != "ENABLED" { if item.Status != "ENABLED" {
t.Fatal("expected Status 'ENABLED', found: ", item.Status) t.Fatal("expected Status 'ENABLED', found: ", item.Status)
} }
@@ -135,11 +137,11 @@ func TestFilterByStatus(t *testing.T) {
func TestFilterByTechStatus(t *testing.T) { func TestFilterByTechStatus(t *testing.T) {
actual := k8sItems.FilterByTechStatus("STARTED") actual := k8sItems.FilterByTechStatus("STARTED")
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual)) t.Fatal("expected 2 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.TechStatus != "STARTED" { if item.TechStatus != "STARTED" {
t.Fatal("expected TechStatus 'STARTED', found: ", item.TechStatus) t.Fatal("expected TechStatus 'STARTED', found: ", item.TechStatus)
} }
@@ -149,11 +151,11 @@ func TestFilterByTechStatus(t *testing.T) {
func TestFilterByCreatedBy(t *testing.T) { func TestFilterByCreatedBy(t *testing.T) {
actual := k8sItems.FilterByCreatedBy("test_user") actual := k8sItems.FilterByCreatedBy("test_user")
if len(actual) != 3 { if len(actual.Data) != 3 {
t.Fatal("expected 3 found, actual: ", len(actual)) t.Fatal("expected 3 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.CreatedBy != "test_user" { if item.CreatedBy != "test_user" {
t.Fatal("expected CreatedBy 'test_user', found: ", item.CreatedBy) t.Fatal("expected CreatedBy 'test_user', found: ", item.CreatedBy)
} }
@@ -163,8 +165,8 @@ func TestFilterByCreatedBy(t *testing.T) {
func TestFilterByDeletedBy(t *testing.T) { func TestFilterByDeletedBy(t *testing.T) {
actual := k8sItems.FilterByDeletedBy("test_user") actual := k8sItems.FilterByDeletedBy("test_user")
if len(actual) != 0 { if len(actual.Data) != 0 {
t.Fatal("expected 0 found, actual: ", len(actual)) t.Fatal("expected 0 found, actual: ", len(actual.Data))
} }
} }
@@ -182,7 +184,7 @@ func TestFilterFunc(t *testing.T) {
func TestSortByCreatedTime(t *testing.T) { func TestSortByCreatedTime(t *testing.T) {
actual := k8sItems.SortByCreatedTime(false) actual := k8sItems.SortByCreatedTime(false)
if actual[0].CreatedTime != 132454563 || actual[2].CreatedTime != 132454682 { if actual.Data[0].CreatedTime != 132454563 || actual.Data[2].CreatedTime != 132454682 {
t.Fatal("expected ascending sort, seems to be inversed") t.Fatal("expected ascending sort, seems to be inversed")
} }
} }

View File

@@ -8,6 +8,38 @@ import (
// Request struct for get list information K8S // Request struct for get list information K8S
type ListRequest struct { type ListRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by IP address
// Required: false
IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by lbId
// Required: false
LBID uint64 `url:"lbId,omitempty" json:"lbId,omitempty"`
// Find by basicServiceId
// Required: false
BasicServiceID uint64 `url:"basicServiceId,omitempty" json:"basicServiceId,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by techStatus
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Include deleted clusters in result // Include deleted clusters in result
// Required: false // Required: false
IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"` IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"`
@@ -22,7 +54,7 @@ type ListRequest struct {
} }
// List gets list all kubernetes clusters the user has access to // List gets list all kubernetes clusters the user has access to
func (k8s K8S) List(ctx context.Context, req ListRequest) (ListK8SClusters, error) { func (k8s K8S) List(ctx context.Context, req ListRequest) (*ListK8SClusters, error) {
url := "/cloudapi/k8s/list" url := "/cloudapi/k8s/list"
res, err := k8s.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k8s.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -37,5 +69,5 @@ func (k8s K8S) List(ctx context.Context, req ListRequest) (ListK8SClusters, erro
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -8,6 +8,38 @@ import (
// Request struct for get list deleted kubernetes cluster // Request struct for get list deleted kubernetes cluster
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by IP address
// Required: false
IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by lbId
// Required: false
LBID uint64 `url:"lbId,omitempty" json:"lbId,omitempty"`
// Find by basicServiceId
// Required: false
BasicServiceID uint64 `url:"basicServiceId,omitempty" json:"basicServiceId,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by techStatus
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`
@@ -18,7 +50,7 @@ type ListDeletedRequest struct {
} }
// ListDeleted gets all deleted kubernetes clusters the user has access to // ListDeleted gets all deleted kubernetes clusters the user has access to
func (k8s K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListK8SClusters, error) { func (k8s K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListK8SClusters, error) {
url := "/cloudapi/k8s/listDeleted" url := "/cloudapi/k8s/listDeleted"
res, err := k8s.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k8s.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -33,5 +65,5 @@ func (k8s K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListK8S
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -293,4 +293,10 @@ type RecordServiceAccount struct {
} }
// List of kubernetes clusters // List of kubernetes clusters
type ListK8SClusters []ItemK8SCluster type ListK8SClusters struct {
// Data
Data []ItemK8SCluster `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -12,7 +12,7 @@ import (
// - First argument -> prefix // - First argument -> prefix
// - Second argument -> indent // - Second argument -> indent
func (lkc ListK8SClusters) Serialize(params ...string) (serialization.Serialized, error) { func (lkc ListK8SClusters) Serialize(params ...string) (serialization.Serialized, error) {
if len(lkc) == 0 { if len(lkc.Data) == 0 {
return []byte{}, nil return []byte{}, nil
} }

View File

@@ -6,16 +6,16 @@ import "sort"
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (lkc ListK8SClusters) SortByCreatedTime(inverse bool) ListK8SClusters { func (lkc ListK8SClusters) SortByCreatedTime(inverse bool) ListK8SClusters {
if len(lkc) < 2 { if len(lkc.Data) < 2 {
return lkc return lkc
} }
sort.Slice(lkc, func(i, j int) bool { sort.Slice(lkc.Data, func(i, j int) bool {
if inverse { if inverse {
return lkc[i].CreatedTime > lkc[j].CreatedTime return lkc.Data[i].CreatedTime > lkc.Data[j].CreatedTime
} }
return lkc[i].CreatedTime < lkc[j].CreatedTime return lkc.Data[i].CreatedTime < lkc.Data[j].CreatedTime
}) })
return lkc return lkc
@@ -25,16 +25,16 @@ func (lkc ListK8SClusters) SortByCreatedTime(inverse bool) ListK8SClusters {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (lkc ListK8SClusters) SortByUpdatedTime(inverse bool) ListK8SClusters { func (lkc ListK8SClusters) SortByUpdatedTime(inverse bool) ListK8SClusters {
if len(lkc) < 2 { if len(lkc.Data) < 2 {
return lkc return lkc
} }
sort.Slice(lkc, func(i, j int) bool { sort.Slice(lkc.Data, func(i, j int) bool {
if inverse { if inverse {
return lkc[i].UpdatedTime > lkc[j].UpdatedTime return lkc.Data[i].UpdatedTime > lkc.Data[j].UpdatedTime
} }
return lkc[i].UpdatedTime < lkc[j].UpdatedTime return lkc.Data[i].UpdatedTime < lkc.Data[j].UpdatedTime
}) })
return lkc return lkc
@@ -44,16 +44,16 @@ func (lkc ListK8SClusters) SortByUpdatedTime(inverse bool) ListK8SClusters {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (lkc ListK8SClusters) SortByDeletedTime(inverse bool) ListK8SClusters { func (lkc ListK8SClusters) SortByDeletedTime(inverse bool) ListK8SClusters {
if len(lkc) < 2 { if len(lkc.Data) < 2 {
return lkc return lkc
} }
sort.Slice(lkc, func(i, j int) bool { sort.Slice(lkc.Data, func(i, j int) bool {
if inverse { if inverse {
return lkc[i].DeletedTime > lkc[j].DeletedTime return lkc.Data[i].DeletedTime > lkc.Data[j].DeletedTime
} }
return lkc[i].DeletedTime < lkc[j].DeletedTime return lkc.Data[i].DeletedTime < lkc.Data[j].DeletedTime
}) })
return lkc return lkc

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
@@ -18,8 +19,8 @@ type WorkerAddRequest struct {
WorkersGroupID uint64 `url:"workersGroupId" json:"workersGroupId" validate:"required"` WorkersGroupID uint64 `url:"workersGroupId" json:"workersGroupId" validate:"required"`
// How many worker nodes to add // How many worker nodes to add
// Required: true // Required: false
Num uint64 `url:"num" json:"num" validate:"required"` Num uint64 `url:"num,omitempty" json:"num,omitempty"`
} }
// WorkerAdd add worker nodes to a Kubernetes cluster // WorkerAdd add worker nodes to a Kubernetes cluster

View File

@@ -20,7 +20,7 @@ type WorkersGroupGetByNameRequest struct {
} }
// WorkersGroupGetByName gets worker group metadata by name // WorkersGroupGetByName gets worker group metadata by name
func (k8s K8S) WorkersGroupGetByName(ctx context.Context, req WorkersGroupGetByNameRequest) (*RecordK8SGroups, error) { func (k8s K8S) WorkersGroupGetByName(ctx context.Context, req WorkersGroupGetByNameRequest) (*ItemK8SGroup, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -35,7 +35,7 @@ func (k8s K8S) WorkersGroupGetByName(ctx context.Context, req WorkersGroupGetByN
return nil, err return nil, err
} }
info := RecordK8SGroups{} info := ItemK8SGroup{}
err = json.Unmarshal(res, &info) err = json.Unmarshal(res, &info)
if err != nil { if err != nil {

View File

@@ -2,12 +2,30 @@ package kvmppc
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
) )
type Interface struct {
// Network type
// Should be one of:
// - VINS
// - EXTNET
NetType string `url:"netType" json:"netType" validate:"required,kvmNetType"`
// Network ID for connect to,
// for EXTNET - external network ID,
// for VINS - VINS ID,
NetID uint64 `url:"netId" json:"netId" validate:"required"`
// IP address to assign to this VM when connecting to the specified network
// Required: false
IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"`
}
// Request struct for create KVM PowerPC VM // Request struct for create KVM PowerPC VM
type CreateRequest struct { type CreateRequest struct {
// ID of the resource group, which will own this VM // ID of the resource group, which will own this VM
@@ -45,24 +63,11 @@ type CreateRequest struct {
// Required: false // Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"` Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Network type // Slice of structs with net interface description.
// Should be one of: // If not specified, compute will be created with default interface from RG.
// - VINS // To create compute without interfaces, pass initialized empty slice .
// - EXTNET
// - NONE
// Required: false // Required: false
NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
// Network ID for connect to,
// for EXTNET - external network ID,
// for ViNS - ViNS ID,
// when netType is not "NONE"
// Required: false
NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"`
// IP address to assign to this VM when connecting to the specified network
// Required: false
IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"`
// Input data for cloud-init facility // Input data for cloud-init facility
// Required: false // Required: false
@@ -85,6 +90,11 @@ type CreateRequest struct {
IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"` IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"`
} }
type wrapperCreateRequest struct {
CreateRequest
Interfaces []string `url:"interfaces,omitempty"`
}
// Create creates KVM PowerPC VM based on specified OS image // Create creates KVM PowerPC VM based on specified OS image
func (k KVMPPC) Create(ctx context.Context, req CreateRequest) (uint64, error) { func (k KVMPPC) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -94,9 +104,31 @@ func (k KVMPPC) Create(ctx context.Context, req CreateRequest) (uint64, error) {
} }
} }
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
b, err := json.Marshal(req.Interfaces[i])
if err != nil {
return 0, err
}
interfaces = append(interfaces, string(b))
}
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
interfaces = []string{"[]"}
}
reqWrapped := wrapperCreateRequest{
CreateRequest: req,
Interfaces: interfaces,
}
url := "/cloudapi/kvmppc/create" url := "/cloudapi/kvmppc/create"
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@@ -2,6 +2,7 @@ package kvmppc
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -31,7 +32,7 @@ type CreateBlankRequest struct {
// Required: true // Required: true
BootDisk uint64 `url:"bootDisk" json:"bootDisk" validate:"required"` BootDisk uint64 `url:"bootDisk" json:"bootDisk" validate:"required"`
// ID of SEP to create boot disk on. // ID of SEP to create boot disk on
// Uses images SEP ID if not set // Uses images SEP ID if not set
// Required: true // Required: true
SEPID uint64 `url:"sepId" json:"sepId" validate:"required"` SEPID uint64 `url:"sepId" json:"sepId" validate:"required"`
@@ -40,30 +41,22 @@ type CreateBlankRequest struct {
// Required: true // Required: true
Pool string `url:"pool" json:"pool" validate:"required"` Pool string `url:"pool" json:"pool" validate:"required"`
// Network type // Slice of structs with net interface description.
// Should be one of: // If not specified, compute will be created with default interface from RG.
// - VINS // To create compute without interfaces, pass initialized empty slice .
// - EXTNET
// - NONE
// Required: false // Required: false
NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
// Network ID for connect to,
// for EXTNET - external network ID,
// for VINS - VINS ID,
// when network type is not "NONE"
// Required: false
NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"`
// IP address to assign to this VM when connecting to the specified network
// Required: false
IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"`
// Text description of this VM // Text description of this VM
// Required: false // Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"` Description string `url:"desc,omitempty" json:"desc,omitempty"`
} }
type wrapperCreateBlankRequest struct {
CreateBlankRequest
Interfaces []string `url:"interfaces,omitempty"`
}
// CreateBlank creates KVM PowerPC VM from scratch // CreateBlank creates KVM PowerPC VM from scratch
func (k KVMPPC) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) { func (k KVMPPC) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -73,9 +66,31 @@ func (k KVMPPC) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
} }
} }
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
b, err := json.Marshal(req.Interfaces[i])
if err != nil {
return 0, err
}
interfaces = append(interfaces, string(b))
}
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
interfaces = []string{"[]"}
}
reqWrapped := wrapperCreateBlankRequest{
CreateBlankRequest: req,
Interfaces: interfaces,
}
url := "/cloudapi/kvmppc/createBlank" url := "/cloudapi/kvmppc/createBlank"
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@@ -2,6 +2,7 @@ package kvmx86
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -63,7 +64,10 @@ type CreateRequest struct {
Pool string `url:"pool,omitempty" json:"pool,omitempty"` Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Slice of structs with net interface description. // Slice of structs with net interface description.
Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // If not specified, compute will be created with default interface from RG.
// To create compute without interfaces, pass initialized empty slice .
// Required: false
Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
// Input data for cloud-init facility // Input data for cloud-init facility
// Required: false // Required: false
@@ -84,6 +88,19 @@ type CreateRequest struct {
// Compute purpose // Compute purpose
// Required: false // Required: false
IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"` IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"`
// Custom fields for compute. Must be a dict
// Required: false
CustomFields string `url:"customFields,omitempty" json:"customFields,omitempty"`
// Type of compute Stateful (KVM_X86) or Stateless (SVA_KVM_X86)
// Required: false
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
}
type wrapperCreateRequest struct {
CreateRequest
Interfaces []string `url:"interfaces,omitempty"`
} }
// Create creates KVM x86 VM based on specified OS image // Create creates KVM x86 VM based on specified OS image
@@ -95,9 +112,31 @@ func (k KVMX86) Create(ctx context.Context, req CreateRequest) (uint64, error) {
} }
} }
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
b, err := json.Marshal(req.Interfaces[i])
if err != nil {
return 0, err
}
interfaces = append(interfaces, string(b))
}
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
interfaces = []string{"[]"}
}
reqWrapped := wrapperCreateRequest{
CreateRequest: req,
Interfaces: interfaces,
}
url := "/cloudapi/kvmx86/create" url := "/cloudapi/kvmx86/create"
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@@ -2,6 +2,7 @@ package kvmx86
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"strconv" "strconv"
@@ -41,12 +42,25 @@ type CreateBlankRequest struct {
Pool string `url:"pool" json:"pool" validate:"required"` Pool string `url:"pool" json:"pool" validate:"required"`
// Slice of structs with net interface description. // Slice of structs with net interface description.
Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // If not specified, compute will be created with default interface from RG.
// To create compute without interfaces, pass initialized empty slice .
// Required: false
Interfaces []Interface `url:"-" json:"interfaces,omitempty" validate:"omitempty,dive"`
// Type of compute Stateful (KVM_X86) or Stateless (SVA_KVM_X86)
// Required: false
Driver string `url:"driver,omitempty" json:"driver,omitempty" validate:"omitempty,computeDriver"`
// Text description of this VM // Text description of this VM
// Required: false // Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"` Description string `url:"desc,omitempty" json:"desc,omitempty"`
} }
type wrapperCreateBlankRequest struct {
CreateBlankRequest
Interfaces []string `url:"interfaces,omitempty"`
}
// CreateBlank creates KVM x86 VM from scratch // CreateBlank creates KVM x86 VM from scratch
func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) { func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
@@ -56,9 +70,31 @@ func (k KVMX86) CreateBlank(ctx context.Context, req CreateBlankRequest) (uint64
} }
} }
var interfaces []string
if req.Interfaces != nil && len(req.Interfaces) != 0 {
interfaces = make([]string, 0, len(req.Interfaces))
for i := range req.Interfaces {
b, err := json.Marshal(req.Interfaces[i])
if err != nil {
return 0, err
}
interfaces = append(interfaces, string(b))
}
} else if req.Interfaces != nil && len(req.Interfaces) == 0 {
interfaces = []string{"[]"}
}
reqWrapped := wrapperCreateBlankRequest{
CreateBlankRequest: req,
Interfaces: interfaces,
}
url := "/cloudapi/kvmx86/createBlank" url := "/cloudapi/kvmx86/createBlank"
res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := k.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@@ -44,7 +44,7 @@ func (ll ListLB) FilterByImageID(imageID uint64) ListLB {
} }
// FilterByK8SID returns ListLB used by specified K8S cluster. // FilterByK8SID returns ListLB used by specified K8S cluster.
func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient interfaces.Caller) (ListLB, error) { func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient interfaces.Caller) (*ListLB, error) {
caller := k8s.New(decortClient) caller := k8s.New(decortClient)
req := k8s.GetRequest{ req := k8s.GetRequest{
@@ -60,28 +60,32 @@ func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient i
return cluster.LBID == ill.ID return cluster.LBID == ill.ID
} }
return ll.FilterFunc(predicate), nil result := ll.FilterFunc(predicate)
return &result, nil
} }
// FilterFunc allows filtering ListLB based on a user-specified predicate. // FilterFunc allows filtering ListLB based on a user-specified predicate.
func (ll ListLB) FilterFunc(predicate func(ItemLoadBalancer) bool) ListLB { func (ll ListLB) FilterFunc(predicate func(ItemLoadBalancer) bool) ListLB {
var result ListLB var result ListLB
for _, item := range ll { for _, item := range ll.Data {
if predicate(item) { if predicate(item) {
result = append(result, item) result.Data = append(result.Data, item)
} }
} }
result.EntryCount = uint64(len(ll.Data))
return result return result
} }
// FindOne returns first found ItemLoadBalancer // FindOne returns first found ItemLoadBalancer
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (ll ListLB) FindOne() ItemLoadBalancer { func (ll ListLB) FindOne() ItemLoadBalancer {
if len(ll) == 0 { if len(ll.Data) == 0 {
return ItemLoadBalancer{} return ItemLoadBalancer{}
} }
return ll[0] return ll.Data[0]
} }

View File

@@ -3,93 +3,96 @@ package lb
import "testing" import "testing"
var lbs = ListLB{ var lbs = ListLB{
ItemLoadBalancer{ Data: []ItemLoadBalancer{
DPAPIPassword: "0000", {
RecordLB: RecordLB{ DPAPIPassword: "0000",
HAMode: true, RecordLB: RecordLB{
ACL: []interface{}{}, HAMode: true,
Backends: []ItemBackend{}, ACL: []interface{}{},
CreatedBy: "test_user_1", Backends: []ItemBackend{},
CreatedTime: 1636667448, CreatedBy: "test_user_1",
DeletedBy: "", CreatedTime: 1636667448,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
DPAPIUser: "api_user", Description: "",
ExtNetID: 2522, DPAPIUser: "api_user",
Frontends: []ItemFrontend{}, ExtNetID: 2522,
GID: 212, Frontends: []ItemFrontend{},
GUID: 1, GID: 212,
ID: 1, GUID: 1,
ImageID: 2121, ID: 1,
Milestones: 129000, ImageID: 2121,
Name: "k8s-lb-test-1", Milestones: 129000,
RGID: 25090, Name: "k8s-lb-test-1",
RGName: "", RGID: 25090,
Status: "ENABLED", RGName: "",
TechStatus: "STARTED", Status: "ENABLED",
UpdatedBy: "", TechStatus: "STARTED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 101, UpdatedTime: 0,
}, VINSID: 101,
}, },
ItemLoadBalancer{ },
DPAPIPassword: "0000", {
RecordLB: RecordLB{ DPAPIPassword: "0000",
HAMode: false, RecordLB: RecordLB{
ACL: []interface{}{}, HAMode: false,
Backends: []ItemBackend{}, ACL: []interface{}{},
CreatedBy: "test_user_2", Backends: []ItemBackend{},
CreatedTime: 1636667506, CreatedBy: "test_user_2",
DeletedBy: "", CreatedTime: 1636667506,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
DPAPIUser: "api_user_2", Description: "",
ExtNetID: 2524, DPAPIUser: "api_user_2",
Frontends: []ItemFrontend{}, ExtNetID: 2524,
GID: 212, Frontends: []ItemFrontend{},
GUID: 2, GID: 212,
ID: 2, GUID: 2,
ImageID: 2129, ID: 2,
Milestones: 129013, ImageID: 2129,
Name: "k8s-lb-test-2", Milestones: 129013,
RGID: 25092, Name: "k8s-lb-test-2",
RGName: "", RGID: 25092,
Status: "ENABLED", RGName: "",
TechStatus: "STOPPED", Status: "ENABLED",
UpdatedBy: "", TechStatus: "STOPPED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 102, UpdatedTime: 0,
}, VINSID: 102,
}, },
ItemLoadBalancer{ },
DPAPIPassword: "0000", {
RecordLB: RecordLB{ DPAPIPassword: "0000",
HAMode: true, RecordLB: RecordLB{
ACL: []interface{}{}, HAMode: true,
Backends: []ItemBackend{}, ACL: []interface{}{},
CreatedBy: "te2t_user_3", Backends: []ItemBackend{},
CreatedTime: 1636667534, CreatedBy: "te2t_user_3",
DeletedBy: "", CreatedTime: 1636667534,
DeletedTime: 0, DeletedBy: "",
Description: "", DeletedTime: 0,
DPAPIUser: "api_user_3", Description: "",
ExtNetID: 2536, DPAPIUser: "api_user_3",
Frontends: []ItemFrontend{}, ExtNetID: 2536,
GID: 212, Frontends: []ItemFrontend{},
GUID: 3, GID: 212,
ID: 3, GUID: 3,
ImageID: 2139, ID: 3,
Milestones: 129025, ImageID: 2139,
Name: "k8s-lb-test-3", Milestones: 129025,
RGID: 25106, Name: "k8s-lb-test-3",
RGName: "", RGID: 25106,
Status: "DISABLED", RGName: "",
TechStatus: "STOPPED", Status: "DISABLED",
UpdatedBy: "", TechStatus: "STOPPED",
UpdatedTime: 0, UpdatedBy: "",
VINSID: 118, UpdatedTime: 0,
VINSID: 118,
},
}, },
}, },
EntryCount: 3,
} }
func TestFilterByID(t *testing.T) { func TestFilterByID(t *testing.T) {
@@ -129,7 +132,7 @@ func TestFilterFunc(t *testing.T) {
return rl.Status == "DISABLED" return rl.Status == "DISABLED"
}) })
for _, item := range actual { for _, item := range actual.Data {
if item.Status != "DISABLED" { if item.Status != "DISABLED" {
t.Fatal("expected Status 'DISABLED', found: ", item.Status) t.Fatal("expected Status 'DISABLED', found: ", item.Status)
} }
@@ -139,7 +142,7 @@ func TestFilterFunc(t *testing.T) {
func TestSortByCreatedTime(t *testing.T) { func TestSortByCreatedTime(t *testing.T) {
actual := lbs.SortByCreatedTime(true) actual := lbs.SortByCreatedTime(true)
if actual[0].CreatedTime != 1636667534 || actual[2].CreatedTime != 1636667448 { if actual.Data[0].CreatedTime != 1636667534 || actual.Data[2].CreatedTime != 1636667448 {
t.Fatal("expected descending order, found ascending") t.Fatal("expected descending order, found ascending")
} }
} }

View File

@@ -8,6 +8,38 @@ import (
// Request struct for get list of load balancers // Request struct for get list of load balancers
type ListRequest struct { type ListRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by frontend Ip
// Required: false
FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"`
// Find by backend Ip
// Required: false
BackIP string `url:"backIp,omitempty" json:"backIp,omitempty"`
// Included deleted load balancers // Included deleted load balancers
// Required: false // Required: false
IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"` IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"`
@@ -22,7 +54,7 @@ type ListRequest struct {
} }
// List gets list all load balancers // List gets list all load balancers
func (l LB) List(ctx context.Context, req ListRequest) (ListLB, error) { func (l LB) List(ctx context.Context, req ListRequest) (*ListLB, error) {
url := "/cloudapi/lb/list" url := "/cloudapi/lb/list"
res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -37,5 +69,5 @@ func (l LB) List(ctx context.Context, req ListRequest) (ListLB, error) {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -8,6 +8,34 @@ import (
// Request struct for get list of deleted load balancers // Request struct for get list of deleted load balancers
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"`
// Find by resource group ID
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by frontend Ip
// Required: false
FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"`
// Find by backend Ip
// Required: false
BackIP string `url:"backIp,omitempty" json:"backIp,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`
@@ -18,7 +46,7 @@ type ListDeletedRequest struct {
} }
// ListDeleted gets list of deleted load balancers // ListDeleted gets list of deleted load balancers
func (l LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListLB, error) { func (l LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListLB, error) {
url := "/cloudapi/lb/listDeleted" url := "/cloudapi/lb/listDeleted"
res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -33,5 +61,5 @@ func (l LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListLB, er
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -90,7 +90,13 @@ type ItemLoadBalancer struct {
} }
// List of load balancers // List of load balancers
type ListLB []ItemLoadBalancer type ListLB struct {
// Data
Data []ItemLoadBalancer `json:"data"`
// EntryCount
EntryCount uint64 `json:"entryCount"`
}
// Main information about backend // Main information about backend
type ItemBackend struct { type ItemBackend struct {

View File

@@ -12,7 +12,7 @@ import (
// - First argument -> prefix // - First argument -> prefix
// - Second argument -> indent // - Second argument -> indent
func (ll ListLB) Serialize(params ...string) (serialization.Serialized, error) { func (ll ListLB) Serialize(params ...string) (serialization.Serialized, error) {
if len(ll) == 0 { if len(ll.Data) == 0 {
return []byte{}, nil return []byte{}, nil
} }

View File

@@ -6,16 +6,16 @@ import "sort"
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (ll ListLB) SortByCreatedTime(inverse bool) ListLB { func (ll ListLB) SortByCreatedTime(inverse bool) ListLB {
if len(ll) < 2 { if len(ll.Data) < 2 {
return ll return ll
} }
sort.Slice(ll, func(i, j int) bool { sort.Slice(ll.Data, func(i, j int) bool {
if inverse { if inverse {
return ll[i].CreatedTime > ll[j].CreatedTime return ll.Data[i].CreatedTime > ll.Data[j].CreatedTime
} }
return ll[i].CreatedTime < ll[j].CreatedTime return ll.Data[i].CreatedTime < ll.Data[j].CreatedTime
}) })
return ll return ll
@@ -25,16 +25,16 @@ func (ll ListLB) SortByCreatedTime(inverse bool) ListLB {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (ll ListLB) SortByUpdatedTime(inverse bool) ListLB { func (ll ListLB) SortByUpdatedTime(inverse bool) ListLB {
if len(ll) < 2 { if len(ll.Data) < 2 {
return ll return ll
} }
sort.Slice(ll, func(i, j int) bool { sort.Slice(ll.Data, func(i, j int) bool {
if inverse { if inverse {
return ll[i].UpdatedTime > ll[j].UpdatedTime return ll.Data[i].UpdatedTime > ll.Data[j].UpdatedTime
} }
return ll[i].UpdatedTime < ll[j].UpdatedTime return ll.Data[i].UpdatedTime < ll.Data[j].UpdatedTime
}) })
return ll return ll
@@ -44,16 +44,16 @@ func (ll ListLB) SortByUpdatedTime(inverse bool) ListLB {
// //
// If inverse param is set to true, the order is reversed. // If inverse param is set to true, the order is reversed.
func (ll ListLB) SortByDeletedTime(inverse bool) ListLB { func (ll ListLB) SortByDeletedTime(inverse bool) ListLB {
if len(ll) < 2 { if len(ll.Data) < 2 {
return ll return ll
} }
sort.Slice(ll, func(i, j int) bool { sort.Slice(ll.Data, func(i, j int) bool {
if inverse { if inverse {
return ll[i].DeletedTime > ll[j].DeletedTime return ll.Data[i].DeletedTime > ll.Data[j].DeletedTime
} }
return ll[i].DeletedTime < ll[j].DeletedTime return ll.Data[i].DeletedTime < ll.Data[j].DeletedTime
}) })
return ll return ll

View File

@@ -20,7 +20,7 @@ type AffinityGroupComputesRequest struct {
} }
// AffinityGroupComputes gets list of all computes with their relationships to another computes // AffinityGroupComputes gets list of all computes with their relationships to another computes
func (r RG) AffinityGroupComputes(ctx context.Context, req AffinityGroupComputesRequest) (ListAffinityGroups, error) { func (r RG) AffinityGroupComputes(ctx context.Context, req AffinityGroupComputesRequest) (ListAffinityGroupsComputes, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -35,7 +35,7 @@ func (r RG) AffinityGroupComputes(ctx context.Context, req AffinityGroupComputes
return nil, err return nil, err
} }
list := ListAffinityGroups{} list := ListAffinityGroupsComputes{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ type AffinityGroupsListRequest struct {
} }
// AffinityGroupsList gets all currently defined affinity groups in this resource group with compute IDs // AffinityGroupsList gets all currently defined affinity groups in this resource group with compute IDs
func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListRequest) (map[string][]uint64, error) { func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListRequest) (*ListAffinityGroups, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListReques
return nil, err return nil, err
} }
list := map[string][]uint64{} list := &ListAffinityGroups{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -14,13 +14,49 @@ type ListComputesRequest struct {
// Required: true // Required: true
RGID uint64 `url:"rgId" json:"rgId" validate:"required"` RGID uint64 `url:"rgId" json:"rgId" validate:"required"`
// Reason for action // Find by compute id
// Required: false // Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"` ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// ID an account
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by ip address
// Required: false
IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"`
// Find by external network name
// Required: false
ExtNetName string `url:"extNetName,omitempty" json:"extNetName,omitempty"`
// Find by external network id
// Required: false
ExtNetID uint64 `url:"extNetId,omitempty" json:"extNetId,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"`
} }
// ListComputes gets list of all compute instances under specified resource group, accessible by the user // ListComputes gets list of all compute instances under specified resource group, accessible by the user
func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (ListComputes, error) { func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (*ListComputes, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -42,5 +78,5 @@ func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (ListComp
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -8,6 +8,34 @@ import (
// Request struct for get list deleted resource groups // Request struct for get list deleted resource groups
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by name account
// Required: false
AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"`
// Find by created after time (unix timestamp)
// Required: false
CreatedAfter uint64 `url:"createdAfter,omitempty" json:"createdAfter,omitempty"`
// Find by created before time (unix timestamp)
// Required: false
CreatedBefore uint64 `url:"createdBefore,omitempty" json:"createdBefore,omitempty"`
// Find by status lock
// Required: false
LockStatus string `url:"lockStatus,omitempty" json:"lockStatus,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -13,10 +13,46 @@ type ListLBRequest struct {
// Resource group ID // Resource group ID
// Required: true // Required: true
RGID uint64 `url:"rgId" json:"rgId" validate:"required"` RGID uint64 `url:"rgId" json:"rgId" validate:"required"`
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by frontend Ip
// Required: false
FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"`
// Find by backend Ip
// Required: false
BackIP string `url:"backIp,omitempty" json:"backIp,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"`
} }
// ListLB gets list all load balancers in the specified resource group, accessible by the user // ListLB gets list all load balancers in the specified resource group, accessible by the user
func (r RG) ListLB(ctx context.Context, req ListLBRequest) (ListLB, error) { func (r RG) ListLB(ctx context.Context, req ListLBRequest) (*ListLB, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +74,5 @@ func (r RG) ListLB(ctx context.Context, req ListLBRequest) (ListLB, error) {
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -16,7 +16,7 @@ type ListPFWRequest struct {
} }
// ListPFW gets list port forward rules for the specified resource group // ListPFW gets list port forward rules for the specified resource group
func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (ListPortForwards, error) { func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (*ListPortForwards, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -38,5 +38,5 @@ func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (ListPortForwards,
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -14,13 +14,33 @@ type ListVINSRequest struct {
// Required: true // Required: true
RGID uint64 `url:"rgId" json:"rgId" validate:"required"` RGID uint64 `url:"rgId" json:"rgId" validate:"required"`
// Reason for action // Find by name
// Required: false // Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"` Name string `url:"name,omitempty" json:"name,omitempty"`
// ID an account
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by ip extnet address
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
// Find by vins id
// Required: false
VINSID uint64 `url:"vinsId,omitempty" json:"vinsId,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"`
} }
// ListVINS gets list all ViNSes under specified resource group, accessible by the user // ListVINS gets list all ViNSes under specified resource group, accessible by the user
func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, error) { func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (*ListVINS, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -42,5 +62,5 @@ func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, error)
return nil, err return nil, err
} }
return list, nil return &list, nil
} }

View File

@@ -53,6 +53,9 @@ type ItemResourceConsumption struct {
// Reserved information about resources // Reserved information about resources
Reserved Resource `json:"Reserved"` Reserved Resource `json:"Reserved"`
// Resource limits
ResourceLimits ResourceLimits `json:"resourceLimits"`
// Resource group ID // Resource group ID
RGID uint64 `json:"rgid"` RGID uint64 `json:"rgid"`
} }
@@ -302,7 +305,7 @@ type ResourceLimits struct {
} }
// Main information about affinity group // Main information about affinity group
type ItemAffinityGroup struct { type ItemAffinityGroupComputes struct {
// Compute ID // Compute ID
ComputeID uint64 `json:"computeId"` ComputeID uint64 `json:"computeId"`
@@ -326,7 +329,15 @@ type ItemAffinityGroup struct {
} }
// List of affinity groups // List of affinity groups
type ListAffinityGroups []ItemAffinityGroup type ListAffinityGroupsComputes []ItemAffinityGroupComputes
type ListAffinityGroups struct {
// Data
Data map[string][]uint64 `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about audit // Main information about audit
type ItemAudit struct { type ItemAudit struct {
@@ -449,7 +460,13 @@ type ItemCompute struct {
} }
// List of computes // List of computes
type ListComputes []ItemCompute type ListComputes struct {
//Data
Data []ItemCompute `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about load balancer // Main information about load balancer
type RecordLoadBalancer struct { type RecordLoadBalancer struct {
@@ -563,7 +580,13 @@ type ItemBackend struct {
type ListBackends []ItemBackend type ListBackends []ItemBackend
// List of load balancers // List of load balancers
type ListLB []ItemLoadBalancer type ListLB struct {
// Data
Data []ItemLoadBalancer `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Server settings // Server settings
type RecordServerSettings struct { type RecordServerSettings struct {
@@ -704,7 +727,13 @@ type ItemPortForward struct {
} }
// List of port forwards // List of port forwards
type ListPortForwards []ItemPortForward type ListPortForwards struct {
//Data
Data []ItemPortForward `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about VINS // Main information about VINS
type ItemVINS struct { type ItemVINS struct {
@@ -761,7 +790,13 @@ type ItemVINS struct {
} }
// List of VINSes // List of VINSes
type ListVINS []ItemVINS type ListVINS struct {
// Data
Data []ItemVINS `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about usage of resource // Main information about usage of resource
type RecordResourceUsage struct { type RecordResourceUsage struct {

View File

@@ -37,6 +37,7 @@ func (r RG) Usage(ctx context.Context, req UsageRequest) (*RecordResourceUsage,
info := RecordResourceUsage{} info := RecordResourceUsage{}
err = json.Unmarshal(res, &info) err = json.Unmarshal(res, &info)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -22,21 +22,23 @@ func (ls ListSizes) FilterByName(name string) ListSizes {
func (ls ListSizes) FilterFunc(predicate func(ItemSize) bool) ListSizes { func (ls ListSizes) FilterFunc(predicate func(ItemSize) bool) ListSizes {
var result ListSizes var result ListSizes
for _, item := range ls { for _, item := range ls.Data {
if predicate(item) { if predicate(item) {
result = append(result, item) result.Data = append(result.Data, item)
} }
} }
result.EntryCount = uint64(len(result.Data))
return result return result
} }
// FindOne returns first found ItemSize // FindOne returns first found ItemSize
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (ls ListSizes) FindOne() ItemSize { func (ls ListSizes) FindOne() ItemSize {
if len(ls) == 0 { if len(ls.Data) == 0 {
return ItemSize{} return ItemSize{}
} }
return ls[0] return ls.Data[0]
} }

View File

@@ -3,30 +3,33 @@ package sizes
import "testing" import "testing"
var sizeItems = ListSizes{ var sizeItems = ListSizes{
{ Data: []ItemSize{
Description: "", {
Disks: []uint64{}, Description: "",
ID: 1, Disks: []uint64{},
Memory: 512, ID: 1,
Name: "size_1", Memory: 512,
VCPUs: 2, Name: "size_1",
}, VCPUs: 2,
{ },
Description: "", {
Disks: []uint64{}, Description: "",
ID: 2, Disks: []uint64{},
Memory: 1024, ID: 2,
Name: "size_2", Memory: 1024,
VCPUs: 4, Name: "size_2",
}, VCPUs: 4,
{ },
Description: "", {
Disks: []uint64{}, Description: "",
ID: 2, Disks: []uint64{},
Memory: 2048, ID: 2,
Name: "size_3", Memory: 2048,
VCPUs: 6, Name: "size_3",
VCPUs: 6,
},
}, },
EntryCount: 3,
} }
func TestFilterByID(t *testing.T) { func TestFilterByID(t *testing.T) {
@@ -50,11 +53,11 @@ func TestFilterFunc(t *testing.T) {
return is.Memory > 512 return is.Memory > 512
}) })
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual)) t.Fatal("expected 2 found, actual: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.Memory <= 512 { if item.Memory <= 512 {
t.Fatal("expected Memory greater than 512, found: ", item.Memory) t.Fatal("expected Memory greater than 512, found: ", item.Memory)
} }

View File

@@ -26,7 +26,7 @@ type ListRequest struct {
} }
// List gets list the available flavors, filtering can be based on the user which is doing the request // List gets list the available flavors, filtering can be based on the user which is doing the request
func (s Sizes) List(ctx context.Context, req ListRequest) (ListSizes, error) { func (s Sizes) List(ctx context.Context, req ListRequest) (*ListSizes, error) {
url := "/cloudapi/sizes/list" url := "/cloudapi/sizes/list"
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req) res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
@@ -34,7 +34,7 @@ func (s Sizes) List(ctx context.Context, req ListRequest) (ListSizes, error) {
return nil, err return nil, err
} }
list := ListSizes{} list := &ListSizes{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -22,4 +22,10 @@ type ItemSize struct {
} }
// List of configured available flavors // List of configured available flavors
type ListSizes []ItemSize type ListSizes struct {
// Data
Data []ItemSize `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -12,7 +12,7 @@ import (
// - First argument -> prefix // - First argument -> prefix
// - Second argument -> indent // - Second argument -> indent
func (ls ListSizes) Serialize(params ...string) (serialization.Serialized, error) { func (ls ListSizes) Serialize(params ...string) (serialization.Serialized, error) {
if len(ls) == 0 { if len(ls.Data) == 0 {
return []byte{}, nil return []byte{}, nil
} }

View File

@@ -16,7 +16,7 @@ type ExtNetListRequest struct {
} }
// ExtNetList show list of VINS external network connections // ExtNetList show list of VINS external network connections
func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (ListExtNets, error) { func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (*ListExtNets, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (ListExtNet
return nil, err return nil, err
} }
list := ListExtNets{} list := &ListExtNets{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ type IPListRequest struct {
} }
// IPList show DHCP IP reservations on VINS // IPList show DHCP IP reservations on VINS
func (v VINS) IPList(ctx context.Context, req IPListRequest) (ListIPs, error) { func (v VINS) IPList(ctx context.Context, req IPListRequest) (*ListIPs, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (v VINS) IPList(ctx context.Context, req IPListRequest) (ListIPs, error) {
return nil, err return nil, err
} }
list := ListIPs{} list := &ListIPs{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -8,6 +8,26 @@ import (
// Request struct for get list of deleted VINSes // Request struct for get list of deleted VINSes
type ListDeletedRequest struct { type ListDeletedRequest struct {
// Find by ID
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by name
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by resource group id
// Required: false
RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
// Find by external network IP
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
// Page number // Page number
// Required: false // Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"` Page uint64 `url:"page,omitempty" json:"page,omitempty"`

View File

@@ -104,7 +104,13 @@ type ItemExtNet struct {
} }
// List of external networks // List of external networks
type ListExtNets []ItemExtNet type ListExtNets struct {
// Data
Data []ItemExtNet `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about IP // Main information about IP
type ItemIP struct { type ItemIP struct {
@@ -131,7 +137,13 @@ type ItemIP struct {
} }
// List of IPs // List of IPs
type ListIPs []ItemIP type ListIPs struct {
// Data
Data []ItemIP `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about VNF device // Main information about VNF device
type RecordVNFDev struct { type RecordVNFDev struct {
@@ -671,7 +683,13 @@ type ItemNATRule struct {
} }
// List of NAT rules // List of NAT rules
type ListNATRules []ItemNATRule type ListNATRules struct {
// Data
Data []ItemNATRule `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// Main information about reservation // Main information about reservation
type ItemReservation struct { type ItemReservation struct {

View File

@@ -16,7 +16,7 @@ type NATRuleListRequest struct {
} }
// NATRuleList gets list of NAT (port forwarding) rules // NATRuleList gets list of NAT (port forwarding) rules
func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (ListNATRules, error) { func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (*ListNATRules, error) {
err := validators.ValidateRequest(req) err := validators.ValidateRequest(req)
if err != nil { if err != nil {
for _, validationError := range validators.GetErrors(err) { for _, validationError := range validators.GetErrors(err) {
@@ -31,7 +31,7 @@ func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (ListNATR
return nil, err return nil, err
} }
list := ListNATRules{} list := &ListNATRules{}
err = json.Unmarshal(res, &list) err = json.Unmarshal(res, &list)
if err != nil { if err != nil {

View File

@@ -20,7 +20,7 @@ type DeleteUserRequest struct {
// Recursively revoke access rights from owned cloudspaces and vmachines // Recursively revoke access rights from owned cloudspaces and vmachines
// Required: false // Required: false
RecursiveDelete bool `url:"recursivedelete,omitempty" json:"recursivedelete,omitempty"` RecursiveDelete bool `url:"recursivedelete" json:"recursivedelete" validate:"required"`
} }
// DeleteUser revokes user access from the account // DeleteUser revokes user access from the account

View File

@@ -16,7 +16,7 @@ type DisableRequest struct {
// Reason to disable // Reason to disable
// Required: true // Required: true
Reason string `url:"reason" json:"reason" validate:"required"` Reason string `url:"reason,omitempty" json:"reason,omitempty"`
} }
// Disable disables an account // Disable disables an account

View File

@@ -16,7 +16,7 @@ type EnableRequest struct {
// Reason to enable // Reason to enable
// Required: true // Required: true
Reason string `url:"reason" json:"reason" validate:"required"` Reason string `url:"reason,omitempty" json:"reason,omitempty"`
} }
// Enable enables an account // Enable enables an account

View File

@@ -1,34 +1,34 @@
package account package account
// FilterByID returns ListDeleted with specified ID. // FilterByID returns ListAccounts with specified ID.
func (ld ListDeleted) FilterByID(id uint64) ListDeleted { func (la ListAccounts) FilterByID(id uint64) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
return ia.ID == id return ia.ID == id
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterByName returns ListDeleted with specified Name. // FilterByName returns ListAccounts with specified Name.
func (ld ListDeleted) FilterByName(name string) ListDeleted { func (la ListAccounts) FilterByName(name string) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
return ia.Name == name return ia.Name == name
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterByStatus returns ListDeleted with specified Status. // FilterByStatus returns ListAccounts with specified Status.
func (ld ListDeleted) FilterByStatus(status string) ListDeleted { func (la ListAccounts) FilterByStatus(status string) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
return ia.Status == status return ia.Status == status
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterByUserGroupID returns ListDeleted with specified UserGroupID. // FilterByUserGroupID returns ListAccounts with specified UserGroupID.
func (ld ListDeleted) FilterByUserGroupID(userGroupID string) ListDeleted { func (la ListAccounts) FilterByUserGroupID(userGroupID string) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
acl := ia.ACL acl := ia.ACL
@@ -41,46 +41,48 @@ func (ld ListDeleted) FilterByUserGroupID(userGroupID string) ListDeleted {
return false return false
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterByCompany returns ListDeleted with specified Company. // FilterByCompany returns ListAccounts with specified Company.
func (ld ListDeleted) FilterByCompany(company string) ListDeleted { func (la ListAccounts) FilterByCompany(company string) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
return ia.Company == company return ia.Company == company
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterByCreatedBy returns ListDeleted created by specified user. // FilterByCreatedBy returns ListAccounts created by specified user.
func (ld ListDeleted) FilterByCreatedBy(createdBy string) ListDeleted { func (la ListAccounts) FilterByCreatedBy(createdBy string) ListAccounts {
predicate := func(ia ItemAccount) bool { predicate := func(ia ItemAccount) bool {
return ia.CreatedBy == createdBy return ia.CreatedBy == createdBy
} }
return ld.FilterFunc(predicate) return la.FilterFunc(predicate)
} }
// FilterFunc allows filtering ListDeleted based on a user-specified predicate. // FilterFunc allows filtering ListAccounts based on a user-specified predicate.
func (ld ListDeleted) FilterFunc(predicate func(ItemAccount) bool) ListDeleted { func (la ListAccounts) FilterFunc(predicate func(ItemAccount) bool) ListAccounts {
var result ListDeleted var result ListAccounts
for _, item := range ld { for _, item := range la.Data {
if predicate(item) { if predicate(item) {
result = append(result, item) result.Data = append(result.Data, item)
} }
} }
result.EntryCount = uint64(len(result.Data))
return result return result
} }
// FindOne returns first found ItemAccount. // FindOne returns first found ItemAccount.
// If none was found, returns an empty struct. // If none was found, returns an empty struct.
func (ld ListDeleted) FindOne() ItemAccount { func (la ListAccounts) FindOne() ItemAccount {
if len(ld) == 0 { if len(la.Data) == 0 {
return ItemAccount{} return ItemAccount{}
} }
return ld[0] return la.Data[0]
} }

View File

@@ -4,78 +4,81 @@ import (
"testing" "testing"
) )
var accounts = ListDeleted{ var accounts = ListAccounts{
ItemAccount{ Data: []ItemAccount{
Meta: []interface{}{}, {
InfoAccount: InfoAccount{ Meta: []interface{}{},
ACL: []ACL{ InfoAccount: InfoAccount{
{ ACL: []ACL{
Explicit: true, {
GUID: "", Explicit: true,
Right: "CXDRAU", GUID: "",
Status: "CONFIRMED", Right: "CXDRAU",
Type: "U", Status: "CONFIRMED",
UserGroupID: "not_really_timofey_tkachev_1@decs3o", Type: "U",
UserGroupID: "not_really_timofey_tkachev_1@decs3o",
},
}, },
CreatedTime: 1676878820,
DeletedTime: 0,
ID: 132847,
Name: "std_2",
Status: "CONFIRMED",
UpdatedTime: 1676645275,
},
},
{
Meta: []interface{}{},
InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
},
CreatedTime: 1676645275,
DeletedTime: 1677723401,
ID: 132846,
Name: "std",
Status: "DELETED",
UpdatedTime: 1676645275,
},
},
{
Meta: []interface{}{},
InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "second_account@decs3o",
},
},
CreatedTime: 1676883850,
DeletedTime: 1676883899,
ID: 132848,
Name: "std_broker",
Status: "DELETED",
UpdatedTime: 1676878820,
}, },
CreatedTime: 1676878820,
DeletedTime: 0,
ID: 132847,
Name: "std_2",
Status: "CONFIRMED",
UpdatedTime: 1676645275,
},
},
ItemAccount{
Meta: []interface{}{},
InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
},
CreatedTime: 1676645275,
DeletedTime: 1677723401,
ID: 132846,
Name: "std",
Status: "DELETED",
UpdatedTime: 1676645275,
},
},
ItemAccount{
Meta: []interface{}{},
InfoAccount: InfoAccount{
ACL: []ACL{
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "timofey_tkachev_1@decs3o",
},
{
Explicit: true,
GUID: "",
Right: "CXDRAU",
Status: "CONFIRMED",
Type: "U",
UserGroupID: "second_account@decs3o",
},
},
CreatedTime: 1676883850,
DeletedTime: 1676883899,
ID: 132848,
Name: "std_broker",
Status: "DELETED",
UpdatedTime: 1676878820,
}, },
}, },
EntryCount: 3,
} }
func TestFilterByID(t *testing.T) { func TestFilterByID(t *testing.T) {
@@ -109,11 +112,11 @@ func TestFilterByName(t *testing.T) {
func TestFilterByStatus(t *testing.T) { func TestFilterByStatus(t *testing.T) {
actual := accounts.FilterByStatus("DELETED") actual := accounts.FilterByStatus("DELETED")
if len(actual) != 2 { if len(actual.Data) != 2 {
t.Fatal("Expected 2 elements in slice, found: ", len(actual)) t.Fatal("Expected 2 elements in slice, found: ", len(actual.Data))
} }
for _, item := range actual { for _, item := range actual.Data {
if item.Status != "DELETED" { if item.Status != "DELETED" {
t.Fatal("expected DELETED, found: ", item.Status) t.Fatal("expected DELETED, found: ", item.Status)
} }
@@ -125,7 +128,7 @@ func TestFilterFunc(t *testing.T) {
return ia.DeletedTime == 0 return ia.DeletedTime == 0
}) })
for _, item := range actual { for _, item := range actual.Data {
if item.DeletedTime != 0 { if item.DeletedTime != 0 {
t.Fatal("Expected DeletedTime = 0, found: ", item.DeletedTime) t.Fatal("Expected DeletedTime = 0, found: ", item.DeletedTime)
} }
@@ -135,21 +138,21 @@ func TestFilterFunc(t *testing.T) {
func TestSortingByCreatedTime(t *testing.T) { func TestSortingByCreatedTime(t *testing.T) {
actual := accounts.SortByCreatedTime(false) actual := accounts.SortByCreatedTime(false)
if actual[0].Name != "std" { if actual.Data[0].Name != "std" {
t.Fatal("Expected account std as earliest, found: ", actual[0].Name) t.Fatal("Expected account std as earliest, found: ", actual.Data[0].Name)
} }
actual = accounts.SortByCreatedTime(true) actual = accounts.SortByCreatedTime(true)
if actual[0].Name != "std_broker" { if actual.Data[0].Name != "std_broker" {
t.Fatal("Expected account std_broker as latest, found: ", actual[0].Name) t.Fatal("Expected account std_broker as latest, found: ", actual.Data[0].Name)
} }
} }
func TestFilterEmpty(t *testing.T) { func TestFilterEmpty(t *testing.T) {
actual := accounts.FilterByID(0) actual := accounts.FilterByID(0)
if len(actual) != 0 { if len(actual.Data) != 0 {
t.Fatal("Expected 0 found, actual: ", len(actual)) t.Fatal("Expected 0 found, actual: ", len(actual.Data))
} }
} }

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