1.5.8-k8s-extnet-branch v1.5.2
Nikita Sorokin 2 years ago
parent 040235f92f
commit f1529c9aac

@ -1,6 +1,14 @@
## Version 1.5.1 ## Version 1.5.2
### Bugfix ### Bugfix
- Changed StatelessSepID field type in cloudapi/compute/get and cloudapi/compute/list responde models - Fix tag 'url' VINSID field in cloudbroker/account/list_vins
- Added oppurtunity to create compute without interface in cloudapi/cloubroker/kvm*/create* - Made the field Reason not required in cloudbroker/account/enable and cloudbroker/account/disable
- Made the field RecursiveDelete required in cloudbroker/account/deleteUser
- Add a validator function to a workersGroupName field - must be 3 or more symbol
- Add a token actuality check, add an error handler in client/client-transport and client/http-client
- Add a fields SEPID and Pool in ListRequest struct in cloudbroker/disks/list and cloudapi/disks/list

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

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

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

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

@ -180,5 +180,10 @@ func registerAllValidators(validate *validator.Validate) error {
return err return err
} }
err = validate.RegisterValidation("workerGroupName", workerGroupNameValidator)
if err != nil {
return err
}
return nil return nil
} }

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

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

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

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

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

@ -16,7 +16,7 @@ type ListVINSRequest struct {
// Find by VINS ID // Find by VINS ID
// Required: false // Required: false
VINSID uint64 `url:"vins,omitempty" json:"vinsId,omitempty"` VINSID uint64 `url:"vinsId,omitempty" json:"vinsId,omitempty"`
// Find by name // Find by name
// Required: false // Required: false

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

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

Loading…
Cancel
Save