Compare commits

..

1 Commits
main ... v1.9.3

Author SHA1 Message Date
asteam aee072c194 v1.9.3
2 months ago

1
.gitignore vendored

@ -6,5 +6,4 @@ cmd/
tests/platform_upgrade/.env
tests/platform_upgrade/input.json
tests/platform_upgrade/*.txt
tests/platform_upgrade/*.log
*.env

@ -1,21 +1,13 @@
## Version 1.11.2
## Version 1.9.3
### Добавлено
#### bservice
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-366 | Метод `Get` структура запроса `GetRequest` и структура ответа `RecordBasicService` в cloudbroker/bservice |
| BGOS-366 | Метод `List` структура запроса `ListRequest` и структура ответа `ListBasicServices` в cloudbroker/bservice |
#### prometheus
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-406 | Добавлена группа ручек `prometheus` в cloudapi |
### Исправлено
| BGOS-333 | Группа ручек cloudbroker/prometheus |
#### compute
#### resmon
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-433 | Исправлена ошибка валидации поля LoaderType для всех структур в cloudapi/compute и в cloudbroker/compute |
| BGOS-334 | Группа ручек cloudbroker/resmon |

@ -14,8 +14,6 @@ Decort SDK - это библиотека, написанная на языке G
- Версия 1.7.х Decort-SDK соответствует 3.8.9 версии платформы
- Версия 1.8.х Decort-SDK соответствует 4.0.0 версии платформы
- Версия 1.9.х Decort-SDK соответствует 4.1.0 версии платформы
- Версия 1.10.х Decort-SDK соответствует 4.2.0 версии платформы
- Версия 1.11.х Decort-SDK соответствует 4.3.0 версии платформы
## Оглавление
@ -114,9 +112,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `KVMx86` - создание виртуальной машины x86;
- `LB` - управление балансировщиками нагрузки;
- `Locations` - получение информации о grid площадки;
- `Prometheus` - получение статистики prometheus;
- `RG` - управление ресурсными группами аккаунта;
- `SEP` - управление storage endpoint (sep);
- `Stack` - получение информации о вычислительных узлах;
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
- `VFPool` - управление пулом виртуальных сетевых функций;
@ -300,9 +296,7 @@ func main() {
- `pkg/cloudapi/kvmx86` - для `KVMX86`
- `pkg/cloudapi/lb` - для `LB`
- `pkg/cloudapi/locations` - для `Locations`
- `pkg/cloudapi/prometheus` - для `Prometheus`
- `pkg/cloudapi/rg` - для `RG`
- `pkg/cloudapi/sep` - для `SEP`
- `pkg/cloudapi/stack` - для `Stack`
- `pkg/cloudapi/tasks` - для `Tasks`
- `pkg/cloudapi/vfpool` - для `VFPool`
@ -488,9 +482,8 @@ func main() {
- `.KVMx86()` - для работы с `KVMX86`
- `.LB()` - для работы с `LB`
- `.Locations()` - для работы с `Locations`
- `.Prometheus()` - для работы с `Prometheus`
- `.RG()` - для работы с `RG`
- `.SEP()` - для работы с `SEP`
- `.Resmon()` - для работы с `Resmon`
- `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks`
- `.VFPool()` - для работы с `VFPool`

@ -27,13 +27,6 @@ func protoValidator(fe validator.FieldLevel) bool {
return IsInSlice(fieldValue, protoValues)
}
// apiGroupValidator is used to validate APIGroup fields
func apiGroupValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, apiGroupValues)
}
// accessTypeValidator is used to validate AccessType fields.
func accessTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
@ -381,46 +374,11 @@ func urlValidartor(fl validator.FieldLevel) bool {
func chipsetValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
fieldValue = strings.ToLower(fieldValue)
return IsInSlice(fieldValue, chipsetValues)
}
func preferredCPUValidator(fe validator.FieldLevel) bool {
fieldSlice, ok := fe.Field().Interface().([]int64)
if !ok {
return false
}
for _, value := range fieldSlice {
if value < -1 {
return false
}
}
return true
}
// loaderTypeValidator is used to validate loaderType fields
func loaderTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, loaderTypeValues)
}
// languageValidator is used to validate language fields
func languageValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, languageValues)
}
// sepTypeValidator is used to validate sepType fields
func sepTypeValidator(fe validator.FieldLevel) bool {
fieldValue := fe.Field().String()
return IsInSlice(fieldValue, sepTypeValues)
}
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
func ValidateRAM(r interfaces.RequestWithRAM, divisibility uint64) error {

@ -52,13 +52,6 @@ func errorMessage(fe validator.FieldError) string {
fe.Field(),
joinValues(protoValues))
// apiGroup Validators
case "apiGroup":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(apiGroupValues))
// Account Validators
case "accountCUType":
return fmt.Sprintf("%s %s must be one of the following: %s",
@ -101,9 +94,6 @@ func errorMessage(fe validator.FieldError) string {
case "mtu":
return fmt.Sprint(prefix, fe.Field(), "must be ", mtuMin, "-", mtuMax)
case "preferredCPU":
return fmt.Sprint(prefix, fe.Field(), "must be equal to or greater than", -1)
case "computex86NetType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
@ -315,24 +305,6 @@ func errorMessage(fe validator.FieldError) string {
prefix,
fe.Field(),
joinValues(chipsetValues))
case "loaderType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(loaderTypeValues))
case "language":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(languageValues))
case "sepType":
return fmt.Sprintf("%s %s must be one of the following: %s",
prefix,
fe.Field(),
joinValues(sepTypeValues))
}
return fe.Error()

@ -36,11 +36,6 @@ func registerAllValidators(validate *validator.Validate) error {
return err
}
err = validate.RegisterValidation("apiGroup", apiGroupValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("accessType", accessTypeValidator)
if err != nil {
return err
@ -266,25 +261,5 @@ func registerAllValidators(validate *validator.Validate) error {
return err
}
err = validate.RegisterValidation("preferredCPU", preferredCPUValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("loaderType", loaderTypeValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("language", languageValidator)
if err != nil {
return err
}
err = validate.RegisterValidation("sepType", sepTypeValidator)
if err != nil {
return err
}
return nil
}

@ -1,8 +1,6 @@
package validators
var (
apiGroupValues = []string{"cloudapi", "cloudbroker", "system"}
driverValues = []string{"KVM_X86"}
accessTypeValues = []string{"R", "RCX", "ARCXDU"}
resTypesValues = []string{"compute", "vins", "k8s", "openshift", "lb", "flipgroup"}
@ -37,7 +35,7 @@ var (
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDED"}
imageBootTypeValues = []string{"uefi", "bios"}
imageTypeValues = []string{"windows", "linux", "unknown"}
imageTypeValues = []string{"windows", "linux", "other"}
imageDriversValues = []string{"KVM_X86"}
imageArchitectureValues = []string{"X86_64"}
@ -53,7 +51,7 @@ var (
vmActionValues = []string{"stop", "move"}
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}
computeFeaturesValues = []string{"hugepages", "numa", "cpupin", "vfnic"}
networkInterfaceNamingValues = []string{"eth", "ens"}
@ -66,12 +64,6 @@ var (
eventIDxValues = []string{"on", "off", "selected by hypervisor"}
chipsetValues = []string{"i440fx", "Q35"}
loaderTypeValues = []string{"linux", "windows", "unknown"}
sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des"}
languageValues = []string{"ru", "en"}
)
const (

@ -13,10 +13,6 @@ type DisableEnableRequest struct {
// ID of account
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Reason of disabling
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
// Disable disables an account

@ -62,9 +62,6 @@ type ItemAccount struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// ID
ID uint64 `json:"id"`
@ -200,9 +197,6 @@ type RecordAccount struct {
// Created time
CreatedTime uint64 `json:"createdTime"`
// Description
Description string `json:"desc"`
// Deactivation time
DeactivationTime float64 `json:"deactivationTime"`
@ -518,9 +512,6 @@ type ItemRG struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// Resource group ID
RGID uint64 `json:"id"`

@ -14,10 +14,6 @@ type UpdateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Description
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Name of the account
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`

@ -12,7 +12,7 @@ import (
type GetRequest struct {
// Audit GUID
// Required: true
AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"`
AuditGuid string `url:"auditGuid" json:"auditGuid" validate:"required"`
}
// Get gets information about audit as a RecordAudit struct

@ -71,10 +71,6 @@ type GroupAddRequest struct {
// Meta data for working group computes, format YAML "user_data": 1111
// Required: false
UserData string `url:"userData,omitempty" json:"userData,omitempty"`
//Chipset "i440fx" or "Q35
//Required: false
Chipset string `url:"chipset,omitempty" json:"chipset,omitempty" validate:"chipset"`
}
// GetRAM returns RAM field values

@ -22,12 +22,6 @@ type GroupResizeRequest struct {
// Required: true
Count int64 `url:"count" json:"count" validate:"required"`
//Chipset for new computes, either i440fx or Q35 (i440fx by default)
//Available values : i440fx, Q35
//Default value : i440fx
//Required: true
Chipset string `url:"chipset" json:"chipset" validate:"required,chipset"`
// Either delta or absolute value of computes
// Should be one of:
// - ABSOLUTE

@ -295,9 +295,6 @@ type ItemGroupCompute struct {
// List of information about OS Users
OSUsers ListOSUsers `json:"osUsers"`
//Chipset
Chipset string `json:"chipset"`
}
// List of Group Computes

@ -12,23 +12,23 @@ import (
type ChangeIPRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Network type
// 'EXTNET' for connect to external network directly
// 'VINS' for connect to ViNS
// Required: true
NetType string `url:"net_type" json:"net_type" validate:"computeNetType"`
NetType string `url:"netType" json:"netType" validate:"computeNetType"`
// Network ID for connect to
// For EXTNET - external network ID
// For VINS - VINS ID
// Required: true
NetID uint64 `url:"net_id" json:"net_id" validate:"required"`
NetID uint64 `url:"netId" json:"netId" validate:"required"`
// IP address to which we will change the existing one, it must be from the same subnet
// Required: true
IPAddr string `url:"ip_addr" json:"ip_addr" validate:"required"`
IPAddr string `url:"ipAddr" json:"ipAddr" validate:"required"`
}
// ChangeIP change reserved IP for compute instance

@ -1,46 +0,0 @@
package compute
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ChangeMACRequest struct to change MAC for network
type ChangeMACRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Current mac address
// Required: true
СurrentMAC string `url:"current_mac_address" json:"current_mac_address" validate:"required"`
// the MAC address to which we will change the existing one
// Required: true
NewMAC string `url:"new_mac_address" json:"new_mac_address" validate:"required"`
}
// ChangeMAC change MAC for compute instance
func (c Compute) ChangeMAC(ctx context.Context, req ChangeMACRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/changeMac"
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
}

@ -48,7 +48,8 @@ var computes = ListComputes{
Devices: nil,
Disks: []InfoDisk{
{
ID: 65191,
ID: 65191,
PCISlot: 6,
},
},
Driver: "KVM_X86",
@ -63,7 +64,7 @@ var computes = ListComputes{
MigrationJob: 0,
Milestones: 363500,
Name: "test",
PinnedToStack: true,
Pinned: false,
RAM: 4096,
ReferenceID: "c7cb19ac-af4a-4067-852f-c5572949207e",
Registered: true,
@ -110,7 +111,8 @@ var computes = ListComputes{
Devices: nil,
Disks: []InfoDisk{
{
ID: 65248,
ID: 65248,
PCISlot: 6,
},
},
Driver: "KVM_X86",
@ -125,10 +127,10 @@ var computes = ListComputes{
MigrationJob: 0,
Milestones: 363853,
Name: "compute_2",
Pinned: false,
RAM: 4096,
ReferenceID: "a542c449-5b1c-4f90-88c5-7bb5f8ae68ff",
Registered: true,
PinnedToStack: true,
ResName: "compute-48556",
RGID: 79727,
RGName: "sdk_negative_fields_test",

@ -42,7 +42,7 @@ func (c Compute) GetLogGet(ctx context.Context, req GetLogRequest) (string, erro
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/getLog"
url := "/cloudapi//compute/getLog"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {

@ -299,18 +299,12 @@ type RecordCompute struct {
// List anti affinity rules
AntiAffinityRules ListRules `json:"antiAffinityRules"`
// Auto start when node restarted
AutoStart bool `json:"autoStart"`
// Architecture
Architecture string `json:"arch"`
// Boot order
BootOrder []string `json:"bootOrder"`
// Boot type
BootType string `json:"bootType"`
// Boot disk size
BootDiskSize uint64 `json:"bootdiskSize"`
@ -371,9 +365,6 @@ type RecordCompute struct {
// HPBacked
HPBacked bool `json:"hpBacked"`
// Hot resize
HotResize bool `json:"hotResize"`
// ID
ID uint64 `json:"id"`
@ -386,9 +377,6 @@ type RecordCompute struct {
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
// Loader type
LoaderType string `json:"loaderType"`
// Lock status
LockStatus string `json:"lockStatus"`
@ -410,9 +398,6 @@ type RecordCompute struct {
// NeedReboot
NeedReboot bool `json:"needReboot"`
// Network interface naming
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
// Numa Affinity
NumaAffinity string `json:"numaAffinity"`
@ -437,11 +422,8 @@ type RecordCompute struct {
// List OS Users
OSUsers ListOSUser `json:"osUsers"`
// Pinned to stack
PinnedToStack bool `json:"pinnedToStack"`
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// Pinned or not
Pinned bool `json:"pinned"`
// Number of RAM
RAM uint64 `json:"ram"`
@ -502,9 +484,6 @@ type RecordCompute struct {
// Virtual image name
VirtualImageName string `json:"virtualImageName"`
// VNC password
VNCPassword string `json:"vncPasswd"`
}
// Information about libvirt settings
@ -724,13 +703,13 @@ type ItemComputeDisk struct {
Passwd string `json:"passwd"`
// PCI slot
PCISlot int64 `json:"pci_slot"`
PCISlot int64 `json:"pciSlot"`
// Pool
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@ -753,9 +732,6 @@ type ItemComputeDisk struct {
// Shareable
Shareable bool `json:"shareable"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@ -774,9 +750,6 @@ type ItemComputeDisk struct {
// Type
Type string `json:"type"`
// Updated by
UpdatedBy uint64 `json:"updatedBy"`
// Virtual machine ID
VMID uint64 `json:"vmid"`
}
@ -893,18 +866,12 @@ type ItemCompute struct {
// List anti affinity rules
AntiAffinityRules ListRules `json:"antiAffinityRules"`
// Auto start when node restarted
AutoStart bool `json:"autoStart"`
// Architecture
Architecture string `json:"arch"`
// Boot order
BootOrder []string `json:"bootOrder"`
// Boot type
BootType string `json:"bootType"`
// Boot disk size
BootDiskSize uint64 `json:"bootdiskSize"`
@ -962,9 +929,6 @@ type ItemCompute struct {
// GUID
GUID uint64 `json:"guid"`
// Hot resize
HotResize bool `json:"hotResize"`
// HPBacked
HPBacked bool `json:"hpBacked"`
@ -977,9 +941,6 @@ type ItemCompute struct {
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
// Loader type
LoaderType string `json:"loaderType"`
// Lock status
LockStatus string `json:"lockStatus"`
@ -1001,20 +962,14 @@ type ItemCompute struct {
// NeedReboot
NeedReboot bool `json:"needReboot"`
// network interface naming
NetworkInterfaceNaming string `json:"networkInterfaceNaming"`
// Numa Affinity
NumaAffinity string `json:"numaAffinity"`
//NumaNodeId
NumaNodeId int64 `json:"numaNodeId"`
// Pinned to stack
PinnedToStack bool `json:"pinnedToStack"`
// PreferredCPU
PreferredCPU []int64 `json:"preferredCpu"`
// Pinned or not
Pinned bool `json:"pinned"`
// Number of RAM
RAM uint64 `json:"ram"`
@ -1084,6 +1039,12 @@ type ListInfoDisks []InfoDisk
type InfoDisk struct {
// ID
ID uint64 `json:"id"`
// PCISlot
PCISlot int64 `json:"pciSlot"`
// Bus number
BusNumber uint64 `json:"bus_number"`
}
// List information about computes

@ -32,10 +32,6 @@ type NetAttachRequest struct {
// Required: false
IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"`
// MAC address
// Required: false
MACAddr string `url:"mac_addr,omitempty" json:"mac_addr,omitempty"`
// Used only for DPDK type, must be 1-9216
// Required: false
MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"`

@ -13,30 +13,25 @@ type PinToStackRequest struct {
// ID of the compute instance
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Auto start when node restarted
// Required: false
// Default: false
AutoStart bool `url:"autoStart" json:"autoStart"`
}
// PinToStack pin compute to current stack
func (c Compute) PinToStack(ctx context.Context, req PinToStackRequest) (bool, error) {
func (c Compute) PinToStack(ctx context.Context, req PinToStackRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/compute/pinToStack"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
return 0, err
}
result, err := strconv.ParseBool(string(res))
result, err := strconv.ParseUint(string(res), 10, 64)
if err != nil {
return false, err
return 0, err
}
return result, nil

@ -27,10 +27,6 @@ type ResizeRequest struct {
// Force compute resize
// Required: false
Force bool `url:"force,omitempty" json:"force,omitempty"`
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
}
// GetRAM returns RAM field values

@ -43,31 +43,6 @@ type UpdateRequest struct {
// Required: false
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
// Auto start when node restarted
// Required: false
// Default: false
AutoStart bool `url:"autoStart" json:"autoStart"`
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
// Boot type of image bios or uefi
// Required: false
BootType string `url:"bootType,omitempty" json:"bootType,omitempty" validate:"omitempty,imageBootType"`
// Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming.
// Required: false
NetworkInterfaceNaming string `url:"networkInterfaceNaming,omitempty" json:"networkInterfaceNaming,omitempty" validate:"omitempty,networkInterfaceNaming"`
// Does this machine supports hot resize
// Required: false
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
}
// Update updates some properties of the compute

@ -3,9 +3,8 @@ package disks
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv"
)
// CreateRequest struct to create disk
@ -14,6 +13,10 @@ type CreateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// ID of the grid (platform)
// Required: true
GID uint64 `url:"gid" json:"gid" validate:"required"`
// Name of disk
// Required: true
Name string `url:"name" json:"name" validate:"required"`
@ -26,6 +29,17 @@ type CreateRequest struct {
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Type of disk
// - B=Boot
// - D=Data
// - T=Temp
// Required: true
Type string `url:"type" json:"type" validate:"diskType"`
// Size in GB default is 0
// Required: false
SSDSize uint64 `url:"ssdSize,omitempty" json:"ssdSize,omitempty"`
// Max IOPS disk can perform defaults to 2000
// Required: false
IOPS uint64 `url:"iops,omitempty" json:"iops,omitempty"`

@ -35,9 +35,9 @@ var disks = ListDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
//},
PresentTo: []uint64{
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@ -78,10 +78,10 @@ var disks = ListDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@ -211,9 +211,9 @@ var searchDisks = ListSearchDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
//},
PresentTo: []uint64{
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@ -254,10 +254,10 @@ var searchDisks = ListSearchDisks{
ParentID: 0,
PCISlot: 6,
Pool: "vmstor",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeTime: 0,
ResID: "sample",
ResName: "sample",
@ -393,7 +393,7 @@ var unattachedDisks = ListDisksUnattached{
Password: "",
PCISlot: -1,
Pool: "data05",
PresentTo: map[string]uint64{},
PresentTo: []uint64{},
PurgeAttempts: 0,
PurgeTime: 0,
RealityDeviceNumber: 0,
@ -445,10 +445,10 @@ var unattachedDisks = ListDisksUnattached{
Password: "",
PCISlot: -1,
Pool: "data05",
//PresentTo: []uint64{
// 27,
// 27,
//},
PresentTo: []uint64{
27,
27,
},
PurgeAttempts: 0,
PurgeTime: 0,
RealityDeviceNumber: 0,

@ -14,15 +14,9 @@ type ItemDisk struct {
// Computes
Computes map[string]string `json:"computes"`
//Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@ -56,9 +50,6 @@ type ItemDisk struct {
// Machine name
MachineName string `json:"machineName"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
@ -78,7 +69,7 @@ type ItemDisk struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@ -104,9 +95,6 @@ type ItemDisk struct {
// SepID
SepID uint64 `json:"sepId"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@ -127,12 +115,6 @@ type ItemDisk struct {
// Virtual machine ID
VMID uint64 `json:"vmid"`
// Update time
UpdatedTime uint64 `json:"updatedTime"`
// Updated by
UpdatedBy string `json:"updatedBy"`
}
type ItemDiskUnattached struct {
@ -218,7 +200,7 @@ type ItemDiskUnattached struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge attempts
PurgeAttempts uint64 `json:"purgeAttempts"`
@ -372,15 +354,9 @@ type RecordDisk struct {
// Computes
Computes map[string]string `json:"computes"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@ -408,15 +384,6 @@ type RecordDisk struct {
// IOTune
IOTune IOTune `json:"iotune"`
// Machine ID
MachineID uint64 `json:"machineId"`
// Machine name
MachineName string `json:"machineName"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
@ -436,7 +403,7 @@ type RecordDisk struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// Purge time
PurgeTime uint64 `json:"purgeTime"`
@ -462,9 +429,6 @@ type RecordDisk struct {
// Shareable
Shareable bool `json:"shareable"`
// Size available
SizeAvailable float64 `json:"sizeAvailable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
@ -485,12 +449,6 @@ type RecordDisk struct {
// Virtual machine ID
VMID uint64 `json:"vmid"`
// Update time
UpdatedTime uint64 `json:"updatedTime"`
// Updated by
UpdatedBy string `json:"updatedBy"`
}
type ItemReplication struct {

@ -19,6 +19,31 @@ type ResizeRequest struct {
Size uint64 `url:"size" json:"size" validate:"required"`
}
// Resize resizes disk
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.
// This method will not be used for disks, assigned to computes. Only unassigned disks and disks, assigned with "old" virtual machines.
func (d Disks) Resize(ctx context.Context, req ResizeRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/disks/resize"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}
// Resize2 resize disk
// Returns 200 if disk is resized online, else will return 202,
// in that case please stop and start your machine after changing the disk size, for your changes to be reflected.

@ -1,50 +0,0 @@
package extnet
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetRequest struct to get information about reserved address or address poll
type GetReservedIP struct {
// AccountID of the account whose reservation information we want to receive
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Field for specifying the ID of extnet whose reservation information we want to receive
// Required: false
ExtNetID uint64 `url:"extnetId,omitempty" json:"extnetId,omitempty"`
}
// GetReservedIP gets information about reserved address or address poll as a slice of RecordReservedIP struct
func (e ExtNet) GetReservedIP(ctx context.Context, req GetReservedIP) ([]RecordReservedIP, error) {
res, err := e.GetReservedIPRaw(ctx, req)
if err != nil {
return nil, err
}
reservedIP := make([]RecordReservedIP, 0)
err = json.Unmarshal(res, &reservedIP)
if err != nil {
return nil, err
}
return reservedIP, nil
}
// GetRaw gets detailed information about external network as an array of bytes
func (e ExtNet) GetReservedIPRaw(ctx context.Context, req GetReservedIP) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/extnet/getReservedIp"
res, err := e.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -49,10 +49,6 @@ type ListRequest struct {
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
//openVswitch bridge name
//Required: false
OVSBridge string `url:"ovsBridge,omitempty" json:"ovsBridge,omitempty"`
}
// List gets list of all available external networks as a ListExtNets struct

@ -87,9 +87,6 @@ type QOS struct {
// Main information about reservations
type ItemReservation struct {
// Account ID
AccountID uint64 `json:"account_id"`
// ClientType
ClientType string `json:"clientType"`
@ -202,9 +199,6 @@ type RecordExtNet struct {
// Network ID
NetworkID uint64 `json:"networkId"`
// NTP
NTP []string `json:"ntp"`
// OVS Bridge
OVSBridge string `json:"ovsBridge"`
@ -232,20 +226,3 @@ type RecordExtNet struct {
// VNFs
VNFs VNFs `json:"vnfs"`
}
// Detailed information about reserved address or address pool
type RecordReservedIP struct {
ExtnetID int `json:"extnet_id"`
Reservations []Reservations `json:"reservations"`
}
type Reservations struct {
AccountID int `json:"account_id"`
ClientType string `json:"clientType"`
DomainName string `json:"domainname"`
Hostname string `json:"hostname"`
IP string `json:"ip"`
Mac string `json:"mac"`
Type string `json:"type"`
VMID int `json:"vmId"`
}

@ -162,7 +162,7 @@ type RecordImage struct {
Pool string `json:"pool"`
// Present to
PresentTo map[string]uint64 `json:"presentTo"`
PresentTo []uint64 `json:"presentTo"`
// ProviderName
ProviderName string `json:"provider_name"`
@ -185,9 +185,6 @@ type RecordImage struct {
// Size
Size uint64 `json:"size"`
// snapshot ID
SnapshotID string `json:"snapshotId"`
// Status
Status string `json:"status"`

@ -89,9 +89,6 @@ type RecordK8S struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// Only external network
ExtnetOnly bool `json:"extnetOnly"`

@ -31,10 +31,6 @@ type Interface struct {
// Used only to DPDK net type
// Required: false
MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"`
// MAC address to assign to this VM when connecting to the specified network
// Required: false
MAC string `url:"mac,omitempty" json:"mac,omitempty" validate:"omitempty"`
}
// DataDisk detailed struct for DataDisks field in CreateRequest and CreateBlankRequest
@ -168,10 +164,6 @@ type CreateRequest struct {
// Required: false
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
}
// GetRAM returns RAM field values

@ -68,26 +68,6 @@ type CreateBlankRequest struct {
// Text description of this VM
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
// Required: false
PreferredCPU []int64 `url:"preferredCpu,omitempty" json:"preferredCpu,omitempty" validate:"omitempty,preferredCPU"`
// VM type linux, windows or unknown
// Required: false
LoaderType string `url:"loaderType,omitempty" json:"loaderType,omitempty" validate:"omitempty,loaderType"`
// Boot type of image bios or uefi
// Required: false
BootType string `url:"bootType,omitempty" json:"bootType,omitempty" validate:"omitempty,imageBootType"`
// Select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming.
// Required: false
NetworkInterfaceNaming string `url:"networkInterfaceNaming,omitempty" json:"networkInterfaceNaming,omitempty" validate:"omitempty,networkInterfaceNaming"`
// Does this machine supports hot resize
// Required: false
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
}
// GetRAM returns RAM field values

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

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeCPULoadRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Per-second CPU time consumed by Compute in percent, average over the time step specified
func (p Prometheus) ComputeCPULoad(ctx context.Context, req ComputeCPULoadRequest) (*PrometheusData, error) {
res, err := p.ComputeCPULoadRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeCPULoadRaw(ctx context.Context, req ComputeCPULoadRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeCPUload"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryAvailableRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Available Memory
func (p Prometheus) ComputeMemoryAvailable(ctx context.Context, req ComputeMemoryAvailableRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryAvailableRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryAvailableRaw(ctx context.Context, req ComputeMemoryAvailableRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryAvailable"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUnusedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Unused Memory
func (p Prometheus) ComputeMemoryUnused(ctx context.Context, req ComputeMemoryUnusedRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUnusedRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUnusedRaw(ctx context.Context, req ComputeMemoryUnusedRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUnused"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsableRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Usable Memory
func (p Prometheus) ComputeMemoryUsable(ctx context.Context, req ComputeMemoryUsableRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsableRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsableRaw(ctx context.Context, req ComputeMemoryUsableRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsable"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsageRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Memory Usage
func (p Prometheus) ComputeMemoryUsage(ctx context.Context, req ComputeMemoryUsageRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsageRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsageRaw(ctx context.Context, req ComputeMemoryUsageRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsage"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,53 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeMemoryUsedRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
}
// Used Memory
func (p Prometheus) ComputeMemoryUsed(ctx context.Context, req ComputeMemoryUsedRequest) (*PrometheusData, error) {
res, err := p.ComputeMemoryUsedRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeMemoryUsedRaw(ctx context.Context, req ComputeMemoryUsedRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeMemoryUsed"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReadBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Read Bytes
func (p Prometheus) ComputeReadBytes(ctx context.Context, req ComputeReadBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeReadBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReadBytesRaw(ctx context.Context, req ComputeReadBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReadBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReadRequestsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Read Requests
func (p Prometheus) ComputeReadRequests(ctx context.Context, req ComputeReadRequestsRequest) (*PrometheusData, error) {
res, err := p.ComputeReadRequestsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReadRequestsRaw(ctx context.Context, req ComputeReadRequestsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReadRequests"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReceiveBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Receive Bytes
func (p Prometheus) ComputeReceiveBytes(ctx context.Context, req ComputeReceiveBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeReceiveBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReceiveBytesRaw(ctx context.Context, req ComputeReceiveBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReceiveBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeReceivePacketsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Receive Packets
func (p Prometheus) ComputeReceivePackets(ctx context.Context, req ComputeReceivePacketsRequest) (*PrometheusData, error) {
res, err := p.ComputeReceivePacketsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeReceivePacketsRaw(ctx context.Context, req ComputeReceivePacketsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeReceivePackets"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeTransmitBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Transmit Bytes
func (p Prometheus) ComputeTransmitBytes(ctx context.Context, req ComputeTransmitBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeTransmitBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeTransmitBytesRaw(ctx context.Context, req ComputeTransmitBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeTransmitBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeTransmitPacketsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Transmit Packets
func (p Prometheus) ComputeTransmitPackets(ctx context.Context, req ComputeTransmitPacketsRequest) (*PrometheusData, error) {
res, err := p.ComputeTransmitPacketsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeTransmitPacketsRaw(ctx context.Context, req ComputeTransmitPacketsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeTransmitPackets"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeWriteBytesRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Write Bytes
func (p Prometheus) ComputeWriteBytes(ctx context.Context, req ComputeWriteBytesRequest) (*PrometheusData, error) {
res, err := p.ComputeWriteBytesRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeWriteBytesRaw(ctx context.Context, req ComputeWriteBytesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeWriteBytes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,57 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ComputeWriteRequestsRequest struct {
// Compute ID
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Write Requests
func (p Prometheus) ComputeWriteRequests(ctx context.Context, req ComputeWriteRequestsRequest) (*PrometheusData, error) {
res, err := p.ComputeWriteRequestsRaw(ctx, req)
if err != nil {
return nil, err
}
info := PrometheusData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputeWriteRequestsRaw(ctx context.Context, req ComputeWriteRequestsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computeWriteRequests"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,77 +0,0 @@
package prometheus
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
const (
ComputeCPULoad = "computeCPUload"
ComputeMemoryUsage = "computeMemoryUsage"
ComputeMemoryUsable = "computeMemoryUsable"
ComputeMemoryUnused = "computeMemoryUnused"
ComputeMemoryUsed = "computeMemoryUsed"
ComputeMemoryAvailable = "computeMemoryAvailable"
ComputeReadBytes = "computeReadBytes"
ComputeReadRequests = "computeReadRequests"
ComputeReceiveBytes = "computeReceiveBytes"
ComputeTransmitBytes = "computeTransmitBytes"
ComputeTransmitPackets = "computeTransmitPackets"
ComputeWriteBytes = "computeWriteBytes"
ComputeWriteRequests = "computeWriteRequests"
)
type ComputesRequest struct {
// List of compute IDs to fetch metrics for
// Required: true
ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"required"`
// List of compute IDs to fetch metrics for
// Required: true
MetricIDs []string `url:"metricIds" json:"metricIds" validate:"required"`
// Time to loads of statistic in seconds
// Required: false
ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"`
// The reading interval in seconds
// Required: false
Step uint64 `url:"step,omitempty" json:"step,omitempty"`
// Number of zeros after the decimal point
// Required: false
DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"`
}
// Get multiple metrics for multiple compute instances
func (p Prometheus) Computes(ctx context.Context, req ComputesRequest) (*ComputesData, error) {
res, err := p.ComputesRaw(ctx, req)
if err != nil {
return nil, err
}
info := ComputesData{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets information about compute as an array of bytes
func (p Prometheus) ComputesRaw(ctx context.Context, req ComputesRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/prometheus/computes"
res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,40 +0,0 @@
package prometheus
// PrometheusData represents an array of data points
type PrometheusData []PrometheusPoint
// PrometheusPoint represents a single data point
type PrometheusPoint struct {
// Value of the metric at a specific point in time
Value float64 `json:"value"`
// Timestamp the Unix timestamp.
Timestamp uint64 `json:"timestamp"`
}
// ComputesData represents an array of data points for computes
type ComputesData []ItemCompute
// ItemCompute represents a single data of compute
type ItemCompute struct {
// Compute ID
ComputeID uint64 `json:"computeId"`
// Array of metrics
Metrics []ItemMetric `json:"metrics"`
// Error
Error string `json:"error"`
}
// ItemMetric represents a single data point of metric
type ItemMetric struct {
// Metric ID
MetricID string `json:"metricId"`
// Data represents an array of data points
Data PrometheusData `json:"data"`
// Error
Error string `json:"error"`
}

@ -1,15 +0,0 @@
package prometheus
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
type Prometheus struct {
client interfaces.Caller
}
func New(client interfaces.Caller) *Prometheus {
return &Prometheus{
client: client,
}
}

@ -71,6 +71,10 @@ type CreateRequest struct {
// External IP address
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
// Register computes in registration system
// Required: false
RegisterComputes bool `url:"registerComputes,omitempty" json:"registerComputes,omitempty"`
}
// Create creates resource group

@ -42,6 +42,10 @@ type UpdateRequest struct {
// Required: false
MaxNumPublicIP int64 `url:"maxNumPublicIP,omitempty" json:"maxNumPublicIP,omitempty"`
// Register computes in registration system
// Required: false
RegisterComputes bool `url:"registerComputes,omitempty" json:"registerComputes,omitempty"`
// List of strings with pools i.e.: ["sep1_poolName1", "sep2_poolName2", etc]
// Required: false
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`

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

@ -1,83 +0,0 @@
package sep
// FilterBySEPID returns ListAvailableSEP with the specified SEPID.
func (sl ListAvailableSEP) FilterBySEPID(sepID uint64) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPID == sepID
}
return sl.FilterFunc(predicate)
}
// FilterBySEPName returns ListAvailableSEP with the specified SEPName.
func (sl ListAvailableSEP) FilterBySEPName(SEPName string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPName == SEPName
}
return sl.FilterFunc(predicate)
}
// FilterBySEPType returns ListAvailableSEP with the specified SEPType.
func (sl ListAvailableSEP) FilterBySEPType(SEPType string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
return sd.SEPType == SEPType
}
return sl.FilterFunc(predicate)
}
// FilterByPoolType returns ListAvailableSEP where at least one pool has the specified type.
func (sl ListAvailableSEP) FilterByPoolType(poolType string) ListAvailableSEP {
predicate := func(sd SEPData) bool {
for _, pool := range sd.Pools {
for _, pt := range pool.Types {
if pt == poolType {
return true
}
}
}
return false
}
return sl.FilterFunc(predicate)
}
// FilterBySystemPool returns ListAvailableSEP where at least one pool is a system pool.
func (sl ListAvailableSEP) FilterBySystemPool(isSystem bool) ListAvailableSEP {
predicate := func(sd SEPData) bool {
for _, pool := range sd.Pools {
if pool.System == isSystem {
return true
}
}
return false
}
return sl.FilterFunc(predicate)
}
// FilterFunc allows filtering ListAvailableSEP based on a user-defined predicate.
func (sl ListAvailableSEP) FilterFunc(predicate func(SEPData) bool) ListAvailableSEP {
var result ListAvailableSEP
for _, item := range sl.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns the first found SEPData.
// If nothing is found, returns an empty struct.
func (sl ListAvailableSEP) FindOne() SEPData {
if len(sl.Data) == 0 {
return SEPData{}
}
return sl.Data[0]
}

@ -1,134 +0,0 @@
package sep
import (
"testing"
)
var seps = ListAvailableSEP{
EntryCount: 3,
Data: []SEPData{
{
SEPID: 1,
SEPName: "sep_1",
SEPType: "TATLIN",
Pools: []Pool{
{
Name: "pool_1",
Types: []string{"DES"},
System: false,
},
},
},
{
SEPID: 2,
SEPName: "sep_2",
SEPType: "SHARED",
Pools: []Pool{
{
Name: "pool_2",
Types: []string{"DES"},
System: true,
},
},
},
{
SEPID: 3,
SEPName: "sep_3",
SEPType: "DES",
Pools: []Pool{
{
Name: "pool_3",
Types: []string{"DES"},
System: false,
},
},
},
},
}
func TestFilterBySEPID(t *testing.T) {
actual := seps.FilterBySEPID(1).FindOne()
if actual.SEPID != 1 {
t.Fatal("expected SEPID 1, found: ", actual.SEPID)
}
}
func TestFilterBySEPName(t *testing.T) {
actual := seps.FilterBySEPName("sep_2").FindOne()
if actual.SEPName != "sep_2" {
t.Fatal("expected SEPName 'sep_2', found: ", actual.SEPName)
}
}
func TestFilterBySEPType(t *testing.T) {
actual := seps.FilterBySEPType("TATLIN").FindOne()
if actual.SEPType != "TATLIN" {
t.Fatal("expected SEPType 'TATLIN', found: ", actual.SEPType)
}
}
func TestFilterByPoolType(t *testing.T) {
actual := seps.FilterByPoolType("DES")
if len(actual.Data) != 3 {
t.Fatal("expected 3 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
found := false
for _, pool := range item.Pools {
for _, poolType := range pool.Types {
if poolType == "DES" {
found = true
break
}
}
if found {
break
}
}
if !found {
t.Fatal("expected Pool type 'DES', not found in SEP: ", item.SEPID)
}
}
}
func TestFilterBySystemPool(t *testing.T) {
actual := seps.FilterBySystemPool(true)
if len(actual.Data) != 1 {
t.Fatal("expected 1 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
found := false
for _, pool := range item.Pools {
if pool.System {
found = true
break
}
}
if !found {
t.Fatal("expected System pool, not found in SEP: ", item.SEPID)
}
}
}
func TestFilterFunc(t *testing.T) {
actual := seps.FilterFunc(func(sd SEPData) bool {
return len(sd.Pools) > 0
})
if len(actual.Data) != 3 {
t.Fatal("expected 3 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if len(item.Pools) == 0 {
t.Fatal("expected Pools to contain at least 1 element, found: ", len(item.Pools))
}
}
}

@ -1,10 +0,0 @@
package sep
// IDs gets array of SEPIDs from ListSEP struct
func (ls ListAvailableSEP) IDs() []uint64 {
res := make([]uint64, 0, len(ls.Data))
for _, s := range ls.Data {
res = append(res, s.SEPID)
}
return res
}

@ -1,52 +0,0 @@
package sep
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListAvailableSEPAndPoolsRequest struct to get dict with entry count and list of dict with SEPs and pools details accessible by the Account and RG
type ListAvailableSEPAndPoolsRequest struct {
// Account ID
// Required: true
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
// RG ID
// Required: false
RGID uint64 `url:"rg_id,omitempty" json:"rg_id,omitempty"`
}
// ListAvailableSEPAndPools get dict with entry count and list of dict with SEPs and pools details accessible by the Account and RG
func (s SEP) ListAvailableSEPAndPools(ctx context.Context, req ListAvailableSEPAndPoolsRequest) (*ListAvailableSEP, error) {
res, err := s.ListAvailableSEPAndPoolsRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListAvailableSEP{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list as an array of bytes
func (s SEP) ListAvailableSEPAndPoolsRaw(ctx context.Context, req ListAvailableSEPAndPoolsRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/sep/listAvailableSepAndPools"
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,34 +0,0 @@
package sep
type Pool struct {
// Pool name
Name string `json:"name"`
// Pool types
Types []string `json:"types"`
// System
System bool `json:"system"`
}
type SEPData struct {
// SEP ID
SEPID uint64 `json:"sepId"`
// SEP name
SEPName string `json:"sepName"`
// Sep type
SEPType string `json:"sepType"`
// Pools
Pools []Pool `json:"pools"`
}
type ListAvailableSEP struct {
// Entry count
EntryCount uint64 `json:"entryCount"`
// Data
Data []SEPData `json:"data"`
}

@ -1,18 +0,0 @@
// Operator actions for handling interventions on a storage endpoint provider
package sep
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
// Structure for creating request to storage endpoint provider
type SEP struct {
client interfaces.Caller
}
// Builder for SEP endpoints
func New(client interfaces.Caller) *SEP {
return &SEP{
client: client,
}
}

@ -1,43 +0,0 @@
package sep
import (
"encoding/json"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/serialization"
)
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
//
// In order to serialize with indent make sure to follow these guidelines:
// - First argument -> prefix
// - Second argument -> indent
func (lsep ListAvailableSEP) Serialize(params ...string) (serialization.Serialized, error) {
if len(lsep.Data) == 0 {
return []byte{}, nil
}
if len(params) > 1 {
prefix := params[0]
indent := params[1]
return json.MarshalIndent(lsep, prefix, indent)
}
return json.Marshal(lsep)
}
// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
//
// In order to serialize with indent make sure to follow these guidelines:
// - First argument -> prefix
// - Second argument -> indent
func (rsep SEPData) Serialize(params ...string) (serialization.Serialized, error) {
if len(params) > 1 {
prefix := params[0]
indent := params[1]
return json.MarshalIndent(rsep, prefix, indent)
}
return json.Marshal(rsep)
}

@ -28,10 +28,6 @@ type GetAuditRequest struct {
// Required: false
MinStatusCode uint64 `url:"minStatusCode,omitempty" json:"minStatusCode,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Page number.
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`

@ -18,10 +18,6 @@ type ListRequest struct {
// 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 account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`

@ -208,9 +208,6 @@ type RecordVNFDev struct {
// List of VINS IDs
VINS []uint64 `json:"vins"`
// VNC password
VNCPassword string `json:"vncPasswd"`
}
// VNF config
@ -796,8 +793,17 @@ type ListNATRules struct {
// Main information about reservation
type ItemReservation struct {
// Account ID
AccountID uint64 `json:"account_id"`
// Client type
ClientType string `json:"clientType"`
// Description
Description string `json:"desc"`
// Domain name
DomainName string `json:"domainname"`
// Hostname
Hostname string `json:"hostname"`
// IP
IP string `json:"ip"`

@ -25,6 +25,10 @@ type StaticRouteAddRequest struct {
// Next hop host, IP address from ViNS ID free IP pool
// Required: true
Gateway string `url:"gateway" json:"gateway" validate:"required"`
// List of Compute IDs which have access to this route
// Required: false
ComputeIds []uint64 `url:"computeIds,omitempty" json:"computeIds,omitempty"`
}
// StaticRouteAdd adds new static route to ViNS

@ -14,10 +14,6 @@ type CreateRequest struct {
// Required: true
Name string `url:"name" json:"name" validate:"required"`
// Description
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Name of the account
// Required: true
Username string `url:"username" json:"username" validate:"required"`
@ -60,7 +56,7 @@ type CreateRequest struct {
UniqPools []string `url:"uniqPools,omitempty" json:"uniqPools,omitempty"`
// Advanced compute features,
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac
// one of: hugepages, numa, cpupin, vfnic
// Required: false
ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"`
}

@ -13,10 +13,6 @@ type DisableRequest struct {
// ID of account
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Reason of disabling
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
// Disable disables an account

@ -12,10 +12,6 @@ type DisableAccountsRequest struct {
// IDs of accounts
// Required: true
AccountIDs []uint64 `url:"accountIds" json:"accountIds" validate:"min=1"`
// Reason of disabling
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
// DisableAccounts disables accounts

@ -170,9 +170,6 @@ type InfoAccount struct {
// Display name
DisplayName string `json:"displayname"`
// Description
Description string `json:"desc"`
// GUID
GUID uint64 `json:"guid"`
@ -479,9 +476,6 @@ type ItemRG struct {
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
// ID
ID uint64 `json:"id"`

@ -12,10 +12,6 @@ type RestoreRequest struct {
// ID an account
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Reason of disabling
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
// Restore restores a deleted account

@ -14,10 +14,6 @@ type UpdateRequest struct {
// Required: true
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Description
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Name of the account
// Required: false
Name string `url:"name" json:"name"`

@ -15,7 +15,7 @@ type UpdateComputeFeaturesRequest struct {
AccountID uint64 `url:"accountId" json:"accountId" validate:"required"`
// Advanced compute features,
// one of: hugepages, numa, cpupin, vfnic, dpdk, changemac
// one of: hugepages, numa, cpupin, vfnic
// Required: false
ComputeFeatures []string `url:"computeFeatures,omitempty" json:"computeFeatures,omitempty" validate:"omitempty,computeFeatures"`
}

@ -10,20 +10,10 @@ import (
// APIFindRequest struct for finding apiaccess groups.
type APIFindRequest struct {
//API group to find (cloudbroker, cloudapi, etc)
//Available values : cloudapi, cloudbroker, system
//Required: true
APIGroup string `url:"api_group" json:"api_group" validate:"required,apiGroup"`
//API object to find (compute, vins, etc )
//Required: true
APIObject string `url:"api_object" json:"api_object" validate:"required"`
//API endpoint to find (delete, create, etc)
//Required: true
APIMethod string `url:"api_method" json:"api_method" valudate:"required"`
// API function to find
// Example: cloudbroker/k8s/create
// Required: true
APIName string `url:"apiName" json:"apiName" validate:"required"`
}
// APIFind outputs a list of apiaccess groups that mention the specified API function.

@ -15,7 +15,7 @@ type APIString string
type APIsExcludeRequest struct {
// APIAccess group ID
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// APIs to remove from APIAccess group
// Required: true

@ -12,7 +12,7 @@ import (
type APIsIncludeRequest struct {
// APIAccess group ID.
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// APIs to add to APIAccess group.
// Required: true

@ -12,7 +12,7 @@ import (
type CopyRequest struct {
// ID of the API access group to make copy from
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// Name of the target API access group, which will be created on successful copy
// Required: true

@ -12,7 +12,7 @@ import (
type DeleteRequest struct {
// APIAccess group ID.
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// Set True to delete apiaccess group with attached users.
// Required: false

@ -12,7 +12,7 @@ import (
type DescUpdateRequest struct {
// APIAccess group ID.
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// New description to set for the apiaccess group.
// Required: true

@ -12,7 +12,7 @@ import (
type GetRequest struct {
// APIAccess group ID.
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
}
// Get gets apiaccess group as an ItemAPIAccess struct

@ -6,11 +6,11 @@ import (
"net/http"
)
// GetDefault gets default apiaccess group
func (a APIAccess) GetDefault(ctx context.Context) (*ItemAPIAccessDefault, error) {
url := "/cloudbroker/apiaccess/getDefault"
// GetPreGroups gets list of pre default groups from spec
func (a APIAccess) GetPreGroups(ctx context.Context) (map[string]APIsEndpoints, error) {
url := "/cloudbroker/apiaccess/getPreGroups"
info := ItemAPIAccessDefault{}
info := make(map[string]APIsEndpoints)
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, nil)
if err != nil {
@ -22,5 +22,5 @@ func (a APIAccess) GetDefault(ctx context.Context) (*ItemAPIAccessDefault, error
return nil, err
}
return &info, nil
return info, nil
}

@ -22,18 +22,21 @@ type ListRequest struct {
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by created actor
// Required: false
CreatedBy string `url:"createdBy,omitempty" json:"createdBy,omitempty"`
// Find by created after time (unix timestamp)
// Required: false
CreatedAfter uint64 `url:"created_after,omitempty" json:"created_after,omitempty"`
CreatedAfter uint64 `url:"createdAfter,omitempty" json:"createdAfter,omitempty"`
// Find by created before time (unix timestamp)
// Required: false
CreatedBefore uint64 `url:"created_before,omitempty" json:"created_before,omitempty"`
CreatedBefore uint64 `url:"createdBefore,omitempty" json:"createdBefore,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty" validate:"omitempty,sortBy"`
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Page number
// Required: false

@ -0,0 +1,48 @@
package apiaccess
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListDeletedRequest struct for getting list of all deleted apiaccess instances.
type ListDeletedRequest struct {
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Page number.
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size.
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// ListDeleted gets list of all deleted apiaccess instances.
func (a APIAccess) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListAPIAccess, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/apiaccess/listDeleted"
info := ListAPIAccess{}
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return nil, err
}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}

@ -4,16 +4,23 @@ type ItemAPIAccess struct {
// APIs
APIs APIsEndpoints `json:"apis"`
CreatedTime uint64 `json:"created_at"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Is default
Default bool `json:"default"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deleted_at"`
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`
Description string `json:"decs"`
// GID
GID uint64 `json:"gid"`
@ -24,6 +31,9 @@ type ItemAPIAccess struct {
// ID
ID uint64 `json:"id"`
// Milestones
Milestones uint64 `json:"milestones"`
// Name
Name string `json:"name"`
@ -33,46 +43,11 @@ type ItemAPIAccess struct {
// Status
Status string `json:"status"`
// Updated time
UpdatedTime uint64 `json:"updated_at"`
}
type ItemAPIAccessDefault struct {
// APIs
APIs APIsEndpoints `json:"apis"`
// Created at
CreatedAt uint64 `json:"created_at"`
// Is default
Default bool `json:"default"`
// Deleted at
DeletedAt uint64 `json:"deleted_at"`
//Updated by
UpdatedBy string `json:"updatedBy"`
// Description
Description string `json:"decs"`
// GID
GID uint64 `json:"gid"`
// GUID
GUID uint64 `json:"guid"`
// ID
ID uint64 `json:"id"`
// Name
Name string `json:"name"`
// Protected
Protected bool `json:"protected"`
// Status
Status string `json:"status"`
//Updated at
UpdatedAt uint64 `json:"updated_at"`
// Updated time
UpdatedTime uint64 `json:"updatedTime"`
}
type ListAPIAccess struct {
@ -102,7 +77,6 @@ type CloudAPIEndpoints struct {
Compute []string `json:"compute,omitempty"`
ComputeCI []string `json:"computeci,omitempty"`
Disks []string `json:"disks,omitempty"`
DPDK []string `json:"dpdk,omitempty"`
ExtNet []string `json:"extnet,omitempty"`
FLIPGroup []string `json:"flipgroup,omitempty"`
GPU []string `json:"gpu,omitempty"`
@ -141,7 +115,6 @@ type CloudBrokerEndpoints struct {
Desnode []string `json:"desnode,omitempty"`
Diagnostics []string `json:"diagnostics,omitempty"`
Disks []string `json:"disks,omitempty"`
DPDK []string `json:"dpdk,omitempty"`
Eco []string `json:"eco,omitempty"`
ExtNet []string `json:"extnet,omitempty"`
FlIPgroup []string `json:"flipgroup,omitempty"`

@ -12,7 +12,7 @@ import (
type SetDefaultRequest struct {
// APIAccess group ID
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
}
// SetDefault sets current apiaccess group default.

@ -12,10 +12,10 @@ import (
// SubtractRequest struct for subtracting.
type SubtractRequest struct {
// ID of the API access group to subtract from. This group will contain the difference.
MinuendID uint64 `url:"minuend_group_id" json:"minuend_group_id" validate:"required"`
MinuendID uint64 `url:"minuendId" json:"minuendId" validate:"required"`
// ID of the API access group which is subtracted. This group is unchanged.
SubtrahendID uint64 `url:"subtrahend_group_id" json:"subtrahend_group_id" validate:"required"`
SubtrahendID uint64 `url:"subtrahendId" json:"subtrahendId" validate:"required"`
}
// Subtract removes such APIs from MinuendID that match APIs from SubtrahendID.

@ -12,11 +12,11 @@ import (
type UnionRequest struct {
// Recipient apiaccess group ID
// Required: true
RecipientID uint64 `url:"recipient_group_id" json:"recipient_group_id" validate:"required"`
RecipientID uint64 `url:"recipientId" json:"recipientId" validate:"required"`
// Donor apiaccess group ID
// Required: true
DonorID uint64 `url:"donor_group_id" json:"donor_group_id" validate:"required"`
DonorID uint64 `url:"donorId" json:"donorId" validate:"required"`
}
// Union combines the API list of group #1 ("recipient") and group #2 ("donor"),

@ -13,7 +13,7 @@ import (
type UpdateRequest struct {
// APIAccess group ID
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// APIs to remove from APIAccess group
// Required: false

@ -12,7 +12,7 @@ import (
type UserListRequest struct {
// APIAccess group ID
// Required: true
APIAccessID uint64 `url:"apiaccess_id" json:"apiaccess_id" validate:"required"`
APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"`
// Page number
// Required: false

@ -9,7 +9,7 @@ import (
func (a Audit) ExportAuditsToFile(ctx context.Context) ([]byte, error) {
url := "/cloudbroker/audit/exportAuditsToFile"
res, err := a.client.DecortApiCall(ctx, http.MethodGet, url, nil)
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, nil)
if err != nil {
return nil, err
}

@ -12,7 +12,7 @@ import (
type GetRequest struct {
// Audit GUID
// Required: true
AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"`
AuditGuid string `url:"auditGuid" json:"auditGuid" validate:"required"`
}
// Get gets information about audit as a RecordAudit struct

@ -12,7 +12,7 @@ import (
type LinkedJobsRequest struct {
// Audit GUID
// Required: true
AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"`
AuditGuid string `url:"auditGuid" json:"auditGuid" validate:"required"`
}
// LinkedJobs gets information about Linked Jobs as a ListLinkedJobs struct
@ -43,4 +43,4 @@ func (a Audit) GetRawLinkedJobs(ctx context.Context, req LinkedJobsRequest) ([]b
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}
}

@ -13,11 +13,11 @@ type ListRequest struct {
// Find all audits after point in time (unixtime)
// Required: false
TimestampAt uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
TimestampAt uint64 `url:"timestampAt,omitempty" json:"timestampAt,omitempty"`
// Find all audits before point in time (unixtime)
// Required: false
TimestampTo uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
TimestampTo uint64 `url:"timestampTo,omitempty" json:"timestampTo,omitempty"`
// Find by user (Mongo RegExp supported)
// Required: false
@ -27,21 +27,17 @@ type ListRequest struct {
// Required: false
Call string `url:"call,omitempty" json:"call,omitempty"`
// Find by request id
// Required: false
RequestID string `url:"request_id,omitempty" json:"request_id,omitempty"`
// Find by HTTP min status code
// Required: false
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
MinStatusCode uint64 `url:"minStatusCode,omitempty" json:"minStatusCode,omitempty"`
// Find by HTTP max status code
// Required: false
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
MaxStatusCode uint64 `url:"maxStatusCode,omitempty" json:"maxStatusCode,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty" validate:"omitempty,sortBy"`
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Page number
// Required: false

@ -2,44 +2,23 @@ package audit
// Main info about audit
type ItemAudit struct {
// Args
Args string `json:"args"`
// Call
Call string `json:"call"`
// GUID
GUID string `json:"guid"`
// Kwargs
Kwargs string `json:"kwargs"`
// RemoteAddr
RemoteAddr string `json:"remote_addr"`
// Response time
ResponseTime float64 `json:"responsetime"`
// Result
Result string `json:"result"`
// Status code
StatusCode uint64 `json:"statuscode"`
// Timestamp
Timestamp float64 `json:"timestamp"`
// Timestamp End
TimestampEnd float64 `json:"timestampEnd"`
// User
User string `json:"user"`
// TTL
TTL string `json:"_ttl"`
// Tags
Tags string `json:"tags"`
}
// List of audits
@ -89,9 +68,6 @@ type RecordAudit struct {
// User
User string `json:"user"`
// TTL
TTL string `json:"_ttl"`
}
// List of Linked Jobs
@ -109,9 +85,6 @@ type ItemLinkedJobs struct {
// NID
NID uint64 `json:"nid"`
// Physical Node or not
PhysicalNode bool `json:"physicalNode"`
// state
State string `json:"state"`

@ -1,8 +0,0 @@
package cloudbroker
import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/bservice"
// Accessing the BService method group
func (ca *CloudBroker) BService() *bservice.BService {
return bservice.New(ca.client)
}

@ -1,15 +0,0 @@
package bservice
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
// Structure for creating request to bservice
type BService struct {
client interfaces.Caller
}
// Builder for bservice endpoints
func New(client interfaces.Caller) *BService {
return &BService{
client,
}
}

@ -1,71 +0,0 @@
package bservice
// FilterByID returns ListBasicServices with specified ID.
func (lbs ListBasicServices) FilterByID(id uint64) ListBasicServices {
predicate := func(ibs ItemBasicService) bool {
return ibs.ID == id
}
return lbs.FilterFunc(predicate)
}
// FilterByName returns ListBasicServices with specified Name.
func (lbs ListBasicServices) FilterByName(name string) ListBasicServices {
predicate := func(ibs ItemBasicService) bool {
return ibs.Name == name
}
return lbs.FilterFunc(predicate)
}
// FilterByRGID returns ListBasicServices with specified RGID.
func (lbs ListBasicServices) FilterByRGID(rgID uint64) ListBasicServices {
predicate := func(ibs ItemBasicService) bool {
return ibs.RGID == rgID
}
return lbs.FilterFunc(predicate)
}
// FilterByStatus returns ListBasicServices with specified Status.
func (lbs ListBasicServices) FilterByStatus(status string) ListBasicServices {
predicate := func(ibs ItemBasicService) bool {
return ibs.Status == status
}
return lbs.FilterFunc(predicate)
}
// FilterByTechStatus returns ListBasicServices with specified TechStatus.
func (lbs ListBasicServices) FilterByTechStatus(techStatus string) ListBasicServices {
predicate := func(ibs ItemBasicService) bool {
return ibs.TechStatus == techStatus
}
return lbs.FilterFunc(predicate)
}
// FilterFunc allows filtering ListResourceGroups based on a user-specified predicate.
func (lbs ListBasicServices) FilterFunc(predicate func(ItemBasicService) bool) ListBasicServices {
var result ListBasicServices
for _, item := range lbs.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(lbs.Data))
return result
}
// FindOne returns first found ItemBasicService
// If none was found, returns an empty struct.
func (lbs ListBasicServices) FindOne() ItemBasicService {
if lbs.EntryCount == 0 {
return ItemBasicService{}
}
return lbs.Data[0]
}

@ -1,155 +0,0 @@
package bservice
import "testing"
var bservices = ListBasicServices{
Data: []ItemBasicService{
{
AccountID: 1,
AccountName: "std_1",
BaseDomain: "",
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1677743675,
DeletedBy: "",
DeletedTime: 0,
GID: 212,
Groups: []uint64{},
GUID: 1,
ID: 1,
Name: "bservice_1",
ParentSrvID: 0,
ParentSrvType: "",
RGID: 7971,
RGName: "rg_1",
SSHUser: "",
Status: "CREATED",
TechStatus: "STOPPED",
UpdatedBy: "",
UpdatedTime: 0,
UserManaged: true,
},
{
AccountID: 2,
AccountName: "std_2",
BaseDomain: "",
CreatedBy: "sample_user_1@decs3o",
CreatedTime: 1677743736,
DeletedBy: "",
DeletedTime: 0,
GID: 212,
Groups: []uint64{},
GUID: 2,
ID: 2,
Name: "bservice_2",
ParentSrvID: 0,
ParentSrvType: "",
RGID: 7972,
RGName: "rg_2",
SSHUser: "",
Status: "CREATED",
TechStatus: "STOPPED",
UpdatedBy: "",
UpdatedTime: 0,
UserManaged: true,
},
{
AccountID: 3,
AccountName: "std_3",
BaseDomain: "",
CreatedBy: "sample_user_2@decs3o",
CreatedTime: 1677743830,
DeletedBy: "",
DeletedTime: 0,
GID: 212,
Groups: []uint64{},
GUID: 3,
ID: 3,
Name: "bservice_3",
ParentSrvID: 0,
ParentSrvType: "",
RGID: 7973,
RGName: "rg_3",
SSHUser: "",
Status: "ENABLED",
TechStatus: "STARTED",
UpdatedBy: "",
UpdatedTime: 0,
UserManaged: true,
},
},
EntryCount: 3,
}
func TestFilterByID(t *testing.T) {
actual := bservices.FilterByID(1).FindOne()
if actual.ID != 1 {
t.Fatal("expected ID 1, found: ", actual.ID)
}
}
func TestFilterByName(t *testing.T) {
actual := bservices.FilterByName("bservice_3").FindOne()
if actual.Name != "bservice_3" {
t.Fatal("expected Name 'bservice_3', found: ", actual.Name)
}
}
func TestFilterByRGID(t *testing.T) {
actual := bservices.FilterByRGID(7971).FindOne()
if actual.RGID != 7971 {
t.Fatal("expected RGID 7971, found: ", actual.RGID)
}
}
func TestFilterByStatus(t *testing.T) {
actual := bservices.FilterByStatus("CREATED")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.Status != "CREATED" {
t.Fatal("expected Status 'CREATED', found: ", item.Status)
}
}
}
func TestFilterByTechStatus(t *testing.T) {
actual := bservices.FilterByTechStatus("STOPPED")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.TechStatus != "STOPPED" {
t.Fatal("expected TechStatus 'STOPPED', found: ", item.TechStatus)
}
}
}
func TestFilterFunc(t *testing.T) {
actual := bservices.FilterFunc(func(ibs ItemBasicService) bool {
return ibs.CreatedBy == "sample_user_2@decs3o"
})
if len(actual.Data) > 1 {
t.Fatal("expected 1 found, actual: ", len(actual.Data))
}
if actual.FindOne().CreatedBy != "sample_user_2@decs3o" {
t.Fatal("expected 'sample_user_2@decs3o', found: ", actual.FindOne().CreatedBy)
}
}
func TestSortByCreatedTime(t *testing.T) {
actual := bservices.SortByCreatedTime(true)
if actual.Data[0].CreatedTime != 1677743830 || actual.Data[2].CreatedTime != 1677743675 {
t.Fatal("expected descending order, found ascending")
}
}

@ -1,46 +0,0 @@
package bservice
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetRequest struct to get detailed information about service
type GetRequest struct {
// ID of the service to query information
// Required: true
ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"`
}
// Get gets detailed specifications for the BasicService as a RecordBasicService struct
func (b BService) Get(ctx context.Context, req GetRequest) (*RecordBasicService, error) {
res, err := b.GetRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordBasicService{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets detailed specifications for the BasicService as an array of bytes
func (b BService) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/bservice/get"
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

@ -1,87 +0,0 @@
package bservice
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListRequest struct to get list of BasicService instances
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"`
// ID of the account to query for BasicService instances
// 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"`
// ID of the resource group to query for BasicService instances
// 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 account name
// Required: false
AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}
// List gets list of BasicService instances associated with the specified Resource Group as a ListBasicServices struct
func (b BService) List(ctx context.Context, req ListRequest) (*ListBasicServices, error) {
res, err := b.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListBasicServices{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of BasicService instances associated with the specified Resource Group as an array of bytes
func (b BService) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/bservice/list"
res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

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

Loading…
Cancel
Save