Compare commits

..

3 Commits

Author SHA1 Message Date
f1e0f7abb6 v1.8.3 2024-08-26 17:51:34 +03:00
8eeef825c0 v1.8.2 2024-06-28 10:54:20 +03:00
9a7a7b6f36 v1.8.1 2024-06-05 12:42:19 +03:00
18 changed files with 221 additions and 53 deletions

View File

@@ -1,32 +1,9 @@
## Version 1.8.1
### Feature
- Add NumaAffinity, CPUPin and HPBacked fields to model CreateRequest in cloudapi/kvmx86 and cloudbroker/kvmx86
- Add NumaAffinity, CPUPin and HPBacked fields to model UpdateRequest in cloudapi/compute and cloudbroker/compute
- Add ReservedNodeCpus field to models ItemCompute, RecordCompute in cloudapi/compute and to models ItemCompute, InfoCompute in cloudbroker/compute
- Add VFNIC as possible NetType value in Interfaces field in model CreateRequest in cloudapi/kvmx86 and cloudbroker/kvmx86
- Add VFNIC as possible NetType value in model NetAttachRequest in cloudapi/compute and cloudbroker/compute
- Add WithoutBootDisk field to models CreateRequest, CreateBlankRequest, MassCreateRequest in cloudapi/kvmx86 and cloudbroker/kvmx86
- Set optional fields BootDisk, SEPID, Pool in model CreateBlankRequest in cloudapi/kvmx86 and cloudbroker/kvmx86
- Set optional field ImageID in model CreateRequest in cloudapi/kvmx86 and cloudbroker/kvmx86
- Add field VNFDevID in models ListRequest (cloudbrocker/vins/list) and ListDeletedRequest (cloudapi/vins/list_deleted)
- Add new endpoints /cloudbroker/disks/present and /cloudbroker/disks/depresent
- Add field AuditID in model ListRequest (cloudbrocker/tasks/list, cloudapi/tasks/list)
- Add field ClientIDs in model ListRequest (cloudbrocker/flipgroup/list, cloudapi/flipgroup/list)
- Add field Depresent in model StopRequest (cloudbrocker/compute/stop)
- Add new endpoint /cloudbroker/image/uploadImageFile
## Version 1.8.3
### Bugfix
- Change the return value of the method ReplicationStatus from interface to string in cloudapi/disks and cloudbroker/disks
- Fix type field Replication in models ItemComputeDisk (cloudapi/compute), ItemDisk (cloudapi/disks, cloudbroker/disks), RecordDisk (cloudapi/disks), InfoDisk (cloudbroker/compute). Add type ItemReplication in models cloudapi/disks, cloudbroker/disks, cloudapi/compute, cloudbroker/compute
- Rename field Async to AsyncMode in cloudapi/compute, cloudbroker/compute, cloudbroker/backup
- Fix url tags in fields UpdateTimeAt and UpdateTimeTo in models ListRequest (cloudapi/tasks/list, cloudbroker/tasks/list)
- Fix type field Completed in models ListRequest (cloudapi/tasks/list, cloudbroker/tasks/list)
- Fix type field Shared in models ListRequest (cloudapi/disk/list, cloudbroker/disk/list)
- Fix type field Shared in models ListDeletedRequest (cloudapi/disk/list_deleted, cloudbroker/disk/list_deleted)
- Fix type field Public, HotResize, Bootable in models ListRequest (cloudapi/image/list, cloudbroker/image/list)
- Fix type field Active, ServiceAccount in model ListRequest (cloudbroker/user/list)
- Change required type and correct description in field ImageID in model MassCreateRequest (cloudbroker/kvmx86/mass_create)
- Delete field AccountID in model ListLBRequest (cloudbroker/rg/listLB, cloudapi/rg/listLB)
- Change validation conditions in field type in models IPReserveRequest (cloudapi/vins/ip_reserve and cloudbroker/vins/ip_reserve).
- Fixed the return value in cloudbroker/sep/AddPool
- Fixed the InfoDisk model in cloudbroker/disks/models
- Change variable types in fields freeIPs in models ItemVINS (cloudapi/account/listVins, cloudbroker/account/listVins, cloudapi/rg/listVins, cloudbroker/rg/listVins, cloudapi/vins/list, cloudapi/vins/listDeleted, cloudbroker/vins/list, cloudbroker/vins/listdeleted)
- Change variable types in fields freeIPs in models RecordExtNet (cloudapi/extnet/get, cloudbroker/extnet/get) and ItemExtNet(cloudbroker/extnet/list)

135
README.md
View File

@@ -69,6 +69,13 @@ Decort SDK - это библиотека, написанная на языке G
- [Пример выполнения запроса](#пример-выполнения-запроса-2)
- [Пример валидации запросов, имеющих в своей структуре поле RAM (или MasterRam/WorkerRAM)](#пример-валидации-запросов-имеющих-в-своей-структуре-поле-ram-или-masterramworkerram)
- [Пример выполнения запроса](#пример-выполнения-запроса-3)
- [Работа с универсальным клиентом](#работа-с-универсальным-клиентом)
- [Настройка конфигурации универсального клиента](#настройка-конфигурации-универсального-клиента)
- [Пример конфигурации универсального клиента](#пример-конфигурации-универсального-клиента)
- [Парсинг универсальной конфигурации из файла](#парсинг-универсальной-конфигурации-из-файла)
- [Создание универсального клиента](#создание-универсального-клиента)
- [Пример создания универсального клиента](#пример-создания-универсального-клиента)
- [Пример выполнения запроса](#пример-выполнения-запроса-4)
## Установка
@@ -166,7 +173,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата |
| Token | string | Нет | JWT токен |
#### Пример конфигурации клиента
##### Пример конфигурации клиента
```go
import (
@@ -1455,4 +1462,130 @@ func main() {
log.Println(res)
}
```
## Работа с универсальным клиентом
Работа с универсальным клиентом позволяет использовать любой тип авторизации
### Настройка конфигурации универсального клиента
| Параметр | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| Decs3oConfig | *Config | Нет | Конфигурация Decs3o |
| BVSConfig | *BVSConfig | Нет | Конфигурация BVS |
| LegacyConfig | string | Нет | Конфигурация Legacy |
В универсальном клиенте можно использовать только один тип конфигурации одновременно.
#### Пример конфигурации универсального клиента
```go
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
)
func main(){
// Настройка конфигурации
BVSConfig := config.BVSConfig{
AppID: "<APP_ID>",
AppSecret: "<APP_SECRET>",
SSOURL: "https://sso.digitalenergy.online",
DecortURL: "https://mr4.digitalenergy.online",
Username: "<Username>",
Password: "<Password>",
Retries: 5,
}
BVSConfig.SetTimeout(5 * time.Minute)
cfg := config.UniversalConfig{
BVSConfig: &BVScfg,
}
}
```
#### Создание универсального клиента
Создание клиента происходит с помощью функции-строителя `NewUniversal` из основного пакета `decort-sdk`, для избежания проблем с именами, пакету можно присвоить алиас `decort`. Функция принимает конфигурацию, возвращает структуру `ClientInterface`, с помощью которой можно взаимодействовать с платформой.
#### Пример создания универсального клиента
```go
package main
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
decort "repository.basistech.ru/BASIS/decort-golang-sdk"
)
func main() {
// Настройка конфигурации
legacyCfg := config.LegacyConfig{
Username: "<USERNAME>",
Password: "<PASSWORD>",
DecortURL: "https://mr4.digitalenergy.online",
Retries: 5,
}
legacyCfg.SetTimeout(5 * time.Minute)
cfg := config.UniversalConfig{
LegacyConfig: &legacyCfg,
}
// Создание клиента
universalClient := decort.NewUniversal(cfg)
}
```
#### Пример выполнения запроса
```go
package main
import (
"fmt"
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
decort "repository.basistech.ru/BASIS/decort-golang-sdk"
)
func main() {
// Настройка конфигурации
legacyCfg := config.LegacyConfig{
Username: "<USERNAME>",
Password: "<PASSWORD>",
Domain: "dynamix",
DecortURL: "https://mr4.digitalenergy.online",
Retries: 5,
}
legacyCfg.SetTimeout(5 * time.Minute)
cfg := config.UniversalConfig{
LegacyConfig: &legacyCfg,
}
// Создание клиента
universalClient := decort.NewUniversal(cfg)
// Создание структуры запроса
// CreateRequest - реквест на создание виртуальной машины
req := kvmx86.CreateRequest{
RGID: 123,
Name: "compute",
CPU: 4,
RAM: 4096,
ImageID: 321,
}
// Выполнение запроса
res, err := universalClient.CloudAPI().KVMX86().Create(context.Background(), req)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
}
```

View File

@@ -54,7 +54,7 @@ func New(cfg config.Config) *DecortClient {
},
},
},
cfg: cfg,
cfg: trimConfig(&cfg),
expiryTime: expiryTime,
mutex: &sync.Mutex{},
}
@@ -369,3 +369,9 @@ func valueToString(a any) string {
func trimString(el reflect.StructField) string {
return strings.TrimSuffix(el.Tag.Get("url"), ",omitempty")
}
func trimConfig(cfg *config.Config) config.Config {
cfg.SSOURL = strings.TrimSuffix(cfg.SSOURL, "/")
cfg.DecortURL = strings.TrimSuffix(cfg.DecortURL, "/")
return *cfg
}

View File

@@ -54,7 +54,7 @@ func NewBVS(cfg config.BVSConfig) *BVSDecortClient {
},
},
},
cfg: cfg,
cfg: trimBVSConfig(&cfg),
mutex: &sync.Mutex{},
}
}
@@ -387,3 +387,9 @@ func (bdc *BVSDecortClient) do(req *http.Request, ctype string) ([]byte, error)
err = fmt.Errorf("%s", respBytes)
return nil, fmt.Errorf("could not execute request: %w", err)
}
func trimBVSConfig(cfg *config.BVSConfig) config.BVSConfig {
cfg.SSOURL = strings.TrimSuffix(cfg.SSOURL, "/")
cfg.DecortURL = strings.TrimSuffix(cfg.DecortURL, "/")
return *cfg
}

View File

@@ -0,0 +1,8 @@
package config
// UniversalConfig combines configurations for different types of clients
type UniversalConfig struct {
Decs3oConfig *Config `json:"decs3oConfig,omitempty" yaml:"decs3oConfig,omitempty"`
BVSConfig *BVSConfig `json:"bvsConfig,omitempty" yaml:"bvsConfig,omitempty"`
LegacyConfig *LegacyConfig `json:"legacyConfig,omitempty" yaml:"legacyConfig,omitempty"`
}

View File

@@ -32,7 +32,7 @@ var (
rgDefNetValues = []string{"PRIVATE", "PUBLIC", "NONE"}
rgNetTypeValues = []string{"PUBLIC", "PRIVATE"}
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDE"}
vinsTypeValues = []string{"DHCP", "VIP", "EXCLUDED"}
imageBootTypeValues = []string{"uefi", "bios"}
imageTypeValues = []string{"windows", "linux", "other"}

View File

@@ -50,7 +50,7 @@ func NewLegacy(cfg config.LegacyConfig) *LegacyDecortClient {
},
},
},
cfg: cfg,
cfg: trimLegacyConfig(&cfg),
expiryTime: expiryTime,
mutex: &sync.Mutex{},
}
@@ -241,3 +241,8 @@ func (ldc *LegacyDecortClient) do(req *http.Request, ctype string) ([]byte, erro
err = fmt.Errorf("%s", respBytes)
return nil, fmt.Errorf("could not execute request: %w", err)
}
func trimLegacyConfig(cfg *config.LegacyConfig) config.LegacyConfig {
cfg.DecortURL = strings.TrimSuffix(cfg.DecortURL, "/")
return *cfg
}

View File

@@ -384,7 +384,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// ID
ID uint64 `json:"id"`

View File

@@ -170,7 +170,7 @@ type RecordExtNet struct {
Excluded []Excluded `json:"excluded"`
// Free IPs
FreeIPs uint64 `json:"free_ips"`
FreeIPs int64 `json:"free_ips"`
// Gateway
Gateway string `json:"gateway"`

View File

@@ -787,7 +787,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// ID
ID uint64 `json:"id"`

View File

@@ -27,7 +27,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// ID
ID uint64 `json:"id"`

View File

@@ -537,7 +537,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// ID
ID uint64 `json:"id"`

View File

@@ -156,7 +156,7 @@ type InfoDisk struct {
Shareable bool `json:"shareable"`
// Size max
SizeMax uint64 `json:"sizeMax"`
SizeMax int64 `json:"sizeMax"`
// Size used
SizeUsed float64 `json:"sizeUsed"`

View File

@@ -71,7 +71,7 @@ type ItemExtNet struct {
Description string `json:"desc"`
// Free IPs number
FreeIPs uint64 `json:"freeIps"`
FreeIPs int64 `json:"freeIps"`
// Grid ID
GID uint64 `json:"gid"`
@@ -152,7 +152,7 @@ type RecordExtNet struct {
Excluded ListReservations `json:"excluded"`
// Free IPs number
FreeIPs uint64 `json:"free_ips"`
FreeIPs int64 `json:"free_ips"`
// Gateway
Gateway string `json:"gateway"`
@@ -237,4 +237,4 @@ type ItemRoutes struct {
//Destination network mask in 255.255.255.255 format
Netmask string `json:"netmask"`
}
}

View File

@@ -401,7 +401,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// ID
ID uint64 `json:"id"`

View File

@@ -3,7 +3,6 @@ package sep
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
@@ -25,23 +24,20 @@ type AddPoolRequest struct {
}
// AddPool adds pool to SEP
func (s SEP) AddPool(ctx context.Context, req AddPoolRequest) (bool, error) {
func (s SEP) AddPool(ctx context.Context, req AddPoolRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/sep/addPool"
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
return "", err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
result := string(res)
return result, nil
}

View File

@@ -684,7 +684,7 @@ type ItemVINS struct {
ExtnetId uint64 `json:"extnetId"`
// Free IPs
FreeIPs uint64 `json:"freeIPs"`
FreeIPs int64 `json:"freeIPs"`
// Grid ID
GID uint64 `json:"gid"`

37
universal-client.go Normal file
View File

@@ -0,0 +1,37 @@
package decortsdk
import (
"fmt"
"reflect"
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
)
type ClientInterface interface {
CloudAPI() *cloudapi.CloudAPI
CloudBroker() *cloudbroker.CloudBroker
}
func NewUniversal(cfg config.UniversalConfig) (ClientInterface, error) {
countConfigs := 0
var client ClientInterface
switch {
case cfg.Decs3oConfig != nil && reflect.TypeOf(*cfg.Decs3oConfig) == reflect.TypeOf(config.Config{}):
client = New(*cfg.Decs3oConfig)
countConfigs++
case cfg.BVSConfig != nil && reflect.TypeOf(*cfg.BVSConfig) == reflect.TypeOf(config.BVSConfig{}):
client = NewBVS(*cfg.BVSConfig)
countConfigs++
case cfg.LegacyConfig != nil && reflect.TypeOf(*cfg.LegacyConfig) == reflect.TypeOf(config.LegacyConfig{}):
client = NewLegacy(*cfg.LegacyConfig)
countConfigs++
}
if countConfigs != 1 {
return nil, fmt.Errorf("only 1 config can be used at a time")
}
return client, nil
}