diff --git a/README.md b/README.md index 9ce9989..2d84a42 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Decort SDK - это библиотека, написанная на языке G - Версия 1.4.x Decort-SDK соответствует 3.8.6 версии платформы - Версия 1.5.x Decort-SDK соответствует 3.8.7 версии платформы - Версия 1.6.x Decort-SDK соответствует 3.8.8 версии платформы + - Версия 1.7.х Decort-SDK соответствует 3.8.9 версии платформы ## Оглавление @@ -936,6 +937,7 @@ func main() { legacyCfg := config.LegacyConfig{ Username: "", Password: "", + Domain: "dynamix", DecortURL: "https://mr4.digitalenergy.online", Retries: 5, } @@ -961,3 +963,176 @@ func main() { fmt.Println(res) } +``` + +## Работа с BVS клиентом + +Работа с BVS клиентом применяется для пользователей, которые используют для авторизации BVS. + +### Настройка конфигурации BVS клиента + +Сначала, необходимо создать переменную конфигурации клиента. Конфигурация состоит как из обязательных, так и необязательных полей. + +| Поле | Тип | Обязательный | Описание | +| ------------- | ------ | ------------ | ------------------------------------------------------------------ | +| Username | string | Да | username legacy пользователя | +| Password | string | Да | пароль legacy пользователя | +| DecortURL | string | Да | URL адрес платформы, с которой будет осуществляться взаимодействие | +| SSOURL | string | Да | URL адрес сервиса аутентификации и авторизации | +| Domain | string | Да | Имя домена | +| Retries | uint | Нет | Кол-во неудачных попыток выполнения запроса, по умолчанию - 5 | +| Timeout | config.Duration | Нет | Таймаут HTTP клиента, по умолчанию - без ограничений | +| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата | + + +#### Пример конфигурации BVS клиента + +```go +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/config" +) + +func main(){ + // Настройка конфигурации + BvsCfg := config.BVSConfig{ + AppID: "", + AppSecret: "", + Username: "", + Password: "", + SSOURL: "https://bvs-delta.qa.loc:8443" + DecortURL: "https://delta.qa.loc", + Domain: "dynamix" + Retries: 5, + } + + BvsCfg.SetTimeout(5 * time.Minute) +} +``` + +#### Парсинг BVS конфигурации из файла + +Также возможно создать переменную конфигурации из JSON или YAML файла, используя функцию `ParseConfigBVSJSON` (или `ParseConfigBVSYAML`) из пакета config. +
+*См. пример файлов конфигурации ниже и в директории `samples/`.* + +```go +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/config" +) + +func main() { + // Парсинг конфигурации из YAML-файла + BVSCfg := config.ParseConfigBVSYAML("") +} +``` + +#### Пример BVS JSON конфигурации + +```json +{ + "username": "", + "password": "", + "appId": "", + "appSecret": "", + "ssoUrl": "https://bvs-delta.qa.loc:8443", + "decortUrl": "https://delta.qa.loc", + "domain": "dynamix", + "retries": 5, + "timeout": "5m", + "sslSkipVerify": false +} +``` + +#### Пример BVS YAML конфигурации +```yaml + username: + password: + appId: + appSecret: + ssoUrl: https://bvs-delta.qa.loc:8443 + decortUrl: https://delta.qa.loc + domain: dynamix, + retries: 5 + timeout: 5m + sslSkipVerify: false +``` +### Создание BVS клиента + +Создание клиента происходит с помощью функции-строителя `NewBVS` из основного пакета `decort-sdk`, для избежания проблем с именами, пакету можно присвоить алиас `decort`. Функция принимает конфигурацию, возвращает структуру `DecortClient`, с помощью которой можно взаимодействовать с платформой. + +#### Пример создания BVS клиента + +```go +package main + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/config" + decort "repository.basistech.ru/BASIS/decort-golang-sdk" +) + +func main() { + // Настройка конфигурации + BVSCfg := config.BVSConfig{ + Username: "", + Password: "", + AppID: "", + AppSecret: "", + SSOURL: "https://bvs-delta.qa.loc:8443" + DecortURL: "https://mr4.digitalenergy.online", + Domain: "dynamix", + Retries: 5, + } + + BVSCfg.SetTimeout(5 * time.Minute) + + // Создание клиента + BVSClient := decort.NewBVS(cfg) +} +``` + +#### Пример выполнения запроса + +```go +package main + +import ( + "fmt" + + "repository.basistech.ru/BASIS/decort-golang-sdk/config" + decort "repository.basistech.ru/BASIS/decort-golang-sdk" +) + +func main() { + // Настройка конфигурации + BVSCfg := config.config.BVSConfig{ + Username: "", + Password: "", + AppID: "", + AppSecret: "", + SSOURL: "https://bvs-delta.qa.loc:8443" + DecortURL: "https://mr4.digitalenergy.online", + Domain: "dynamix", + Retries: 5, + } + + // Создание клиента + BVSClient := decort.NewBVS(cfg) + + // Создание структуры запроса + // CreateRequest - реквест на создание виртуальной машины + req := kvmx86.CreateRequest{ + RGID: 123, + Name: "compute", + CPU: 4, + RAM: 4096, + ImageID: 321, + } + + // Выполнение запроса + res, err := client.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_bvs.go b/client_bvs.go index f86bee9..75a5bfd 100644 --- a/client_bvs.go +++ b/client_bvs.go @@ -15,7 +15,6 @@ import ( "sync" "github.com/google/go-querystring/query" - "golang.org/x/oauth2" "repository.basistech.ru/BASIS/decort-golang-sdk/config" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi" k8s_ca "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/k8s" @@ -26,16 +25,9 @@ import ( // HTTP-client for platform type BVSDecortClient struct { client *http.Client - cfg *oauth2.Config + cfg config.BVSConfig mutex *sync.Mutex - token *oauth2.Token decortURL string - username string - password string -} - -type ProviderEndpoint struct { - TokenURL string `json:"token_endpoint"` } // Сlient builder @@ -43,11 +35,6 @@ func NewBVS(cfg config.BVSConfig) *BVSDecortClient { if cfg.Retries == 0 { cfg.Retries = 5 } - // if cfg.Token.AccessToken != "" { - - // } - ctx := context.Background() - providerEndpoint, _ := GetEndpoint(ctx, cfg.SSOURL, cfg.Domain, cfg.SSLSkipVerify) return &BVSDecortClient{ decortURL: cfg.DecortURL, @@ -59,15 +46,8 @@ func NewBVS(cfg config.BVSConfig) *BVSDecortClient { }, }, }, - cfg: &oauth2.Config{ - ClientID: cfg.AppID, - ClientSecret: cfg.AppSecret, - Endpoint: providerEndpoint, - }, - mutex: &sync.Mutex{}, - token: &cfg.Token, - username: cfg.Username, - password: cfg.Password, + cfg: cfg, + mutex: &sync.Mutex{}, } } @@ -131,14 +111,14 @@ func (bdc *BVSDecortClient) getToken(ctx context.Context) error { bdc.mutex.Lock() defer bdc.mutex.Unlock() - if !bdc.token.Valid() { + if !bdc.cfg.Token.Valid() { - body := fmt.Sprintf("grant_type=password&client_id=%s&client_secret=%s&username=%s&password=%s&response_type=token", bdc.cfg.ClientID, bdc.cfg.ClientSecret, bdc.username, bdc.password) + body := fmt.Sprintf("grant_type=password&client_id=%s&client_secret=%s&username=%s&password=%s&response_type=token&scope=openid", bdc.cfg.AppID, bdc.cfg.AppSecret, bdc.cfg.Username, bdc.cfg.Password) bodyReader := strings.NewReader(body) - // body := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s&", bdc.cfg.ClientID, bdc.cfg.ClientSecret) - // bodyReader := strings.NewReader(body) + + bdc.cfg.SSOURL = strings.TrimSuffix(bdc.cfg.SSOURL, "/") - req, _ := http.NewRequestWithContext(ctx, "POST", bdc.cfg.Endpoint.TokenURL, bodyReader) + req, _ := http.NewRequestWithContext(ctx, "POST", bdc.cfg.SSOURL+"/realms/"+bdc.cfg.Domain+"/protocol/openid-connect/token", bodyReader) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") resp, err := bdc.client.Do(req) @@ -153,7 +133,7 @@ func (bdc *BVSDecortClient) getToken(ctx context.Context) error { return fmt.Errorf("cannot get token: %s", tokenBytes) } - err = json.Unmarshal(tokenBytes, &bdc.token) + err = json.Unmarshal(tokenBytes, &bdc.cfg.Token) if err != nil { return fmt.Errorf("cannot unmarshal token: %s", tokenBytes) } @@ -168,7 +148,7 @@ func (bdc *BVSDecortClient) do(req *http.Request, ctype string) (*http.Response, } else { req.Header.Add("Content-Type", "application/x-www-form-urlencoded") } - bdc.token.SetAuthHeader(req) + bdc.cfg.Token.SetAuthHeader(req) req.Header.Set("Accept", "application/json") // var resp *http.Response @@ -180,7 +160,7 @@ func (bdc *BVSDecortClient) do(req *http.Request, ctype string) (*http.Response, req.Body = io.NopCloser(bytes.NewBuffer(buf)) resp, err := bdc.client.Do(req) // if err == nil { - if resp.StatusCode != 200 { + if resp.StatusCode == 200 { return resp, err } respBytes, _ := io.ReadAll(resp.Body) @@ -419,39 +399,3 @@ func createK8sCloudBrokerBVS(req k8s_cb.CreateRequest) (*bytes.Buffer, string) { writer.Close() return reqBody, ct } - -func GetEndpoint(ctx context.Context, issuer string, domain string, skip bool) (oauth2.Endpoint, error) { - wellKnown := issuer + "/" + domain + "/.well-known/openid-configuration" - req, err := http.NewRequestWithContext(ctx, "GET", wellKnown, nil) - if err != nil { - return oauth2.Endpoint{}, err - } - - client := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{ - //nolint:gosec - InsecureSkipVerify: skip, - }, - }, - } - - resp, err := client.Do(req) - if err != nil { - return oauth2.Endpoint{}, err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return oauth2.Endpoint{}, fmt.Errorf("unable to read response body: %w", err) - } - - var p ProviderEndpoint - err = json.Unmarshal(body, &p) - if err != nil { - return oauth2.Endpoint{}, fmt.Errorf("cannot unmarshal endpoint: %s", body) - } - - return oauth2.Endpoint{TokenURL: p.TokenURL}, nil -} diff --git a/config/config_bvs.go b/config/config_bvs.go index fc0e507..6b568bb 100644 --- a/config/config_bvs.go +++ b/config/config_bvs.go @@ -23,7 +23,7 @@ type BVSConfig struct { // Domain name // Required: true - // Example: "realms/dynamix" + // Example: "dynamix" Domain string `json:"domain" yaml:"domain"` // Application (client) identifier for authorization diff --git a/samples/config/bvs-config.json b/samples/config/bvs-config.json new file mode 100644 index 0000000..b57fc25 --- /dev/null +++ b/samples/config/bvs-config.json @@ -0,0 +1,12 @@ +{ + "username": "", + "password": "", + "appId": "", + "appSecret": "", + "ssoUrl": "https://bvs-delta.qa.loc:8443", + "decortUrl": "https://delta.qa.loc", + "domain": "dynamix", + "retries": 5, + "timeout": "5m", + "sslSkipVerify": false +} diff --git a/samples/config/bvs-config.yml b/samples/config/bvs-config.yml new file mode 100644 index 0000000..520a983 --- /dev/null +++ b/samples/config/bvs-config.yml @@ -0,0 +1,10 @@ +username: +password: +appId: +appSecret: +ssoUrl: https://bvs-delta.qa.loc:8443 +decortUrl: https://delta.qa.loc +domain: dynamix, +retries: 5 +timeout: 5m +sslSkipVerify: false