From 8eeef825c0e8d109dfa5ae4d18e65f00bec595f8 Mon Sep 17 00:00:00 2001 From: Sergey Kisil Date: Fri, 28 Jun 2024 10:54:20 +0300 Subject: [PATCH] v1.8.2 --- CHANGELOG.md | 32 +-------- README.md | 135 ++++++++++++++++++++++++++++++++++++- client.go | 8 ++- client_bvs.go | 8 ++- config/universal-config.go | 8 +++ legacy-client.go | 7 +- universal-client.go | 37 ++++++++++ 7 files changed, 201 insertions(+), 34 deletions(-) create mode 100644 config/universal-config.go create mode 100644 universal-client.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b45721..2717eef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,33 +1,5 @@ -## Version 1.8.1 +## Version 1.8.2 ### 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 - -### 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) -- \ No newline at end of file +- Add universal client for connections \ No newline at end of file diff --git a/README.md b/README.md index 7303b66..3c6c0d2 100644 --- a/README.md +++ b/README.md @@ -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: "", + AppSecret: "", + SSOURL: "https://sso.digitalenergy.online", + DecortURL: "https://mr4.digitalenergy.online", + Username: "", + 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: "", + 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: "", + 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) +} ``` \ No newline at end of file diff --git a/client.go b/client.go index 91af120..e0df530 100644 --- a/client.go +++ b/client.go @@ -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 +} diff --git a/client_bvs.go b/client_bvs.go index 1b1f787..347d273 100644 --- a/client_bvs.go +++ b/client_bvs.go @@ -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 +} diff --git a/config/universal-config.go b/config/universal-config.go new file mode 100644 index 0000000..7dc0dfc --- /dev/null +++ b/config/universal-config.go @@ -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"` +} diff --git a/legacy-client.go b/legacy-client.go index f43baf1..f605788 100644 --- a/legacy-client.go +++ b/legacy-client.go @@ -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 +} diff --git a/universal-client.go b/universal-client.go new file mode 100644 index 0000000..bade8fd --- /dev/null +++ b/universal-client.go @@ -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 +}