Compare commits
	
		
			4 Commits 
		
	
	
		
			main
			...
			1.5.8-k8s-
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 1972956aeb | 2 years ago | 
|  | afcbc7e749 | 2 years ago | 
|  | 0b3de4df7f | 2 years ago | 
|  | c0608d08b9 | 2 years ago | 
| @ -0,0 +1,62 @@ | |||||||
|  | # Decort SDK | ||||||
|  | 
 | ||||||
|  | Decort SDK is a library, written in GO (Golang) for interact with the **DECORT** API.   | ||||||
|  | The library contents structures and methods for requesting to an user (cloudapi) and admin (cloudbroker) groups of API.   | ||||||
|  | Also the library have structures for responses. | ||||||
|  | 
 | ||||||
|  | ## Contents | ||||||
|  | 
 | ||||||
|  | - [Install](#install) | ||||||
|  | - [API List](#api-list) | ||||||
|  | - [Examples](#examples) | ||||||
|  | - [Examples2](#examples2) | ||||||
|  | 
 | ||||||
|  | ## Install | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go get -u repository.basistech.ru/BASIS/decort-golang-sdk | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## API List | ||||||
|  | 
 | ||||||
|  | ## Examples | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"log" | ||||||
|  | 
 | ||||||
|  | 	"repository.basistech.ru/BASIS/decort-golang-sdk/config" | ||||||
|  | 	"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/kvmx86" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	cfg := config.Config{ | ||||||
|  | 		AppID:     "<APPID>", | ||||||
|  | 		AppSecret: "<APPSECRET>", | ||||||
|  | 		SSOURL:    "https://sso.digitalenergy.online", | ||||||
|  | 		DecortURL: "https://mr4.digitalenergy.online", | ||||||
|  | 		Retries:   5, | ||||||
|  | 	} | ||||||
|  | 	client := decort.New(cfg) | ||||||
|  | 	req := kvmx86.CreateRequest{ | ||||||
|  | 		RGID:    123, | ||||||
|  | 		Name:    "compute", | ||||||
|  | 		CPU:     4, | ||||||
|  | 		RAM:     4096, | ||||||
|  | 		ImageID: 321, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	res, err := client.KVMX86().Create(context.Background(), req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fmt.Println(res) | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Examples2 | ||||||
| @ -1,106 +0,0 @@ | |||||||
| package decortsdk |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"net/http" |  | ||||||
| 	"strings" |  | ||||||
| 
 |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type CheckInfo struct { |  | ||||||
| 	Version string `json:"version"` |  | ||||||
| 	Build   uint64 `json:"build"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const versionURL = "/system/info/version" |  | ||||||
| 
 |  | ||||||
| func (de DecortClient) Check() (*CheckInfo, error) { |  | ||||||
| 	res, err := de.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	info := CheckInfo{} |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info) |  | ||||||
| 	if err != nil { |  | ||||||
| 		var v string |  | ||||||
| 		json.Unmarshal([]byte(res), &v) |  | ||||||
| 		if _, exists := constants.VersionMap[v]; exists { |  | ||||||
| 			info.Version = v |  | ||||||
| 		} else { |  | ||||||
| 			return nil, fmt.Errorf("platform version isn't supported") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if v, ok := constants.VersionMap[info.Version]; ok { |  | ||||||
| 		if v == "-" { |  | ||||||
| 			return &info, nil |  | ||||||
| 		} |  | ||||||
| 		return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (bvs BVSDecortClient) Check() (*CheckInfo, error) { |  | ||||||
| 	res, err := bvs.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	info := CheckInfo{} |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info) |  | ||||||
| 	if err != nil { |  | ||||||
| 		var v string |  | ||||||
| 		json.Unmarshal([]byte(res), &v) |  | ||||||
| 		if _, exists := constants.VersionMap[v]; exists { |  | ||||||
| 			info.Version = v |  | ||||||
| 		} else { |  | ||||||
| 			return nil, fmt.Errorf("platform version isn't supported") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if v, ok := constants.VersionMap[info.Version]; ok { |  | ||||||
| 		if v == "-" { |  | ||||||
| 			return &info, nil |  | ||||||
| 		} |  | ||||||
| 		return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (ldc LegacyDecortClient) Check() (*CheckInfo, error) { |  | ||||||
| 	res, err := ldc.DecortApiCall(context.Background(), http.MethodGet, versionURL, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	info := CheckInfo{} |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal([]byte(strings.Replace(strings.Trim(string(res), `"`), "\\", "", -1)), &info) |  | ||||||
| 	if err != nil { |  | ||||||
| 		var v string |  | ||||||
| 		json.Unmarshal([]byte(res), &v) |  | ||||||
| 		if _, exists := constants.VersionMap[v]; exists { |  | ||||||
| 			info.Version = v |  | ||||||
| 		} else { |  | ||||||
| 			return nil, fmt.Errorf("platform version isn't supported") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if v, ok := constants.VersionMap[info.Version]; ok { |  | ||||||
| 		if v == "-" { |  | ||||||
| 			return &info, nil |  | ||||||
| 		} |  | ||||||
| 		return nil, errors.New(fmt.Sprintf("SDK don't support platform version %s, please use %s SDK version", info.Version, v)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil, errors.New(fmt.Sprintf("platform version %s isn't supported", info.Version)) |  | ||||||
| } |  | ||||||
| @ -1,216 +0,0 @@ | |||||||
| package config |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"os" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"gopkg.in/yaml.v3" |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/serialization" |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type BVSConfig struct { |  | ||||||
| 	// ServiceAccount username
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example : "osh_mikoev"
 |  | ||||||
| 	Username string `json:"username" yaml:"username" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// ServiceAccount password
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example: "[1o>hYkjnJr)HI78q7t&#%8Lm"
 |  | ||||||
| 	Password string `json:"password" yaml:"password" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// Domain name
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example: "dynamix"
 |  | ||||||
| 	Domain string `json:"domain" yaml:"domain" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// Application (client) identifier for authorization
 |  | ||||||
| 	// in the cloud platform controller in oauth2 mode.
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example: "ewqfrvea7s890avw804389qwguf234h0otfi3w4eiu"
 |  | ||||||
| 	AppID string `json:"appId" yaml:"appId" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// Application (client) secret code for authorization
 |  | ||||||
| 	// in the cloud platform controller in oauth2 mode.
 |  | ||||||
| 	// Example: "frvet09rvesfis0c9erv9fsov0vsdfi09ovds0f"
 |  | ||||||
| 	AppSecret string `json:"appSecret" yaml:"appSecret" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// Platform authentication service address
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example: "https://sso.digitalenergy.online"
 |  | ||||||
| 	SSOURL string `json:"ssoUrl" yaml:"ssoUrl" validate:"url"` |  | ||||||
| 
 |  | ||||||
| 	// The address of the platform on which the actions are planned
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	// Example: "https://mr4.digitalenergy.online"
 |  | ||||||
| 	DecortURL string `json:"decortUrl" yaml:"decortUrl" validate:"url"` |  | ||||||
| 
 |  | ||||||
| 	// JWT platform token
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	// Example: "qwqwdfwv68979we0q9bfv7e9sbvd89798qrwv97ff"
 |  | ||||||
| 	Token Token `json:"token" yaml:"token"` |  | ||||||
| 
 |  | ||||||
| 	// Amount platform request attempts
 |  | ||||||
| 	// Default value: 5
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	Retries uint64 `json:"retries" yaml:"retries"` |  | ||||||
| 
 |  | ||||||
| 	// Skip verify
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	SSLSkipVerify bool `json:"sslSkipVerify" yaml:"sslSkipVerify"` |  | ||||||
| 
 |  | ||||||
| 	// HTTP client timeout, unlimited if left empty
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	Timeout Duration `json:"timeout" yaml:"timeout"` |  | ||||||
| 
 |  | ||||||
| 	// The path of the configuration file entry
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	PathCfg string `json:"path_cfg" yaml:"path_cfg"` |  | ||||||
| 
 |  | ||||||
| 	// The path of the token file entry
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	PathToken string `json:"path_token" yaml:"path_token"` |  | ||||||
| 
 |  | ||||||
| 	// The number of minutes before the expiration of the token, a refresh will be made
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	TimeToRefresh int64 `json:"timeToRefresh" yaml:"timeToRefresh"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Token struct { |  | ||||||
| 	// AccessToken is the token that authorizes and authenticates
 |  | ||||||
| 	// the requests.
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	AccessToken string `json:"access_token" yaml:"access_token"` |  | ||||||
| 
 |  | ||||||
| 	// TokenType is the type of token.
 |  | ||||||
| 	// The Type method returns either this or "Bearer", the default.
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	TokenType string `json:"token_type" yaml:"token_type"` |  | ||||||
| 
 |  | ||||||
| 	// RefreshToken is a token that's used by the application
 |  | ||||||
| 	// (as opposed to the user) to refresh the access token
 |  | ||||||
| 	// if it expires.
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	RefreshToken string `json:"refresh_token" yaml:"refresh_token"` |  | ||||||
| 
 |  | ||||||
| 	// Expiry is the optional expiration time of the access token.
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	Expiry time.Time `json:"expiry" yaml:"expiry"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetTimeout is used to set HTTP client timeout.
 |  | ||||||
| func (c *BVSConfig) SetTimeout(dur time.Duration) { |  | ||||||
| 	c.Timeout = Duration(dur) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ParseConfigJSON parses Config from specified JSON-formatted file.
 |  | ||||||
| func ParseConfigBVSJSON(path string) (BVSConfig, error) { |  | ||||||
| 	file, err := os.ReadFile(path) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var config BVSConfig |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal(file, &config) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = validators.ValidateConfig(config) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return config, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ParseConfigJSON parses Token from specified JSON-formatted file.
 |  | ||||||
| func ParseTokenBVSJSON(path string) (Token, error) { |  | ||||||
| 	file, err := os.ReadFile(path) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var token Token |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal(file, &token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = validators.ValidateConfig(token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return token, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ParseTokenBVSYAML parses Token from specified YAML-formatted file.
 |  | ||||||
| func ParseTokenBVSYAML(path string) (Token, error) { |  | ||||||
| 	file, err := os.ReadFile(path) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var token Token |  | ||||||
| 
 |  | ||||||
| 	err = yaml.Unmarshal(file, &token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = validators.ValidateConfig(token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return Token{}, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return token, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ParseConfigYAML parses Config from specified YAML-formatted file.
 |  | ||||||
| func ParseConfigBVSYAML(path string) (BVSConfig, error) { |  | ||||||
| 	file, err := os.ReadFile(path) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var config BVSConfig |  | ||||||
| 
 |  | ||||||
| 	err = yaml.Unmarshal(file, &config) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = validators.ValidateConfig(config) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return BVSConfig{}, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return config, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (t Token) Serialize(params ...string) (serialization.Serialized, error) { |  | ||||||
| 	if len(params) > 1 { |  | ||||||
| 		prefix := params[0] |  | ||||||
| 		indent := params[1] |  | ||||||
| 
 |  | ||||||
| 		return json.MarshalIndent(t, prefix, indent) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return json.Marshal(t) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c BVSConfig) Serialize(params ...string) (serialization.Serialized, error) { |  | ||||||
| 	if len(params) > 1 { |  | ||||||
| 		prefix := params[0] |  | ||||||
| 		indent := params[1] |  | ||||||
| 
 |  | ||||||
| 		return json.MarshalIndent(c, prefix, indent) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return json.Marshal(c) |  | ||||||
| } |  | ||||||
| @ -1,8 +0,0 @@ | |||||||
| 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"` |  | ||||||
| } |  | ||||||
| @ -1,21 +1,19 @@ | |||||||
| module repository.basistech.ru/BASIS/decort-golang-sdk | module repository.basistech.ru/BASIS/decort-golang-sdk | ||||||
| 
 | 
 | ||||||
| go 1.24.0 | go 1.20 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/go-playground/validator/v10 v10.28.0 | 	github.com/go-playground/validator/v10 v10.11.2 | ||||||
| 	github.com/google/go-querystring v1.1.0 | 	github.com/google/go-querystring v1.1.0 | ||||||
| 	github.com/joho/godotenv v1.5.1 |  | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 | 	gopkg.in/yaml.v3 v3.0.1 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/gabriel-vasile/mimetype v1.4.10 // indirect |  | ||||||
| 	github.com/go-playground/locales v0.14.1 // indirect | 	github.com/go-playground/locales v0.14.1 // indirect | ||||||
| 	github.com/go-playground/universal-translator v0.18.1 // indirect | 	github.com/go-playground/universal-translator v0.18.1 // indirect | ||||||
| 	github.com/google/go-cmp v0.5.9 // indirect | 	github.com/kr/text v0.2.0 // indirect | ||||||
| 	github.com/leodido/go-urn v1.4.0 // indirect | 	github.com/leodido/go-urn v1.2.1 // indirect | ||||||
| 	golang.org/x/crypto v0.42.0 // indirect | 	golang.org/x/crypto v0.5.0 // indirect | ||||||
| 	golang.org/x/sys v0.36.0 // indirect | 	golang.org/x/sys v0.4.0 // indirect | ||||||
| 	golang.org/x/text v0.29.0 // indirect | 	golang.org/x/text v0.6.0 // indirect | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -1,7 +0,0 @@ | |||||||
| package interfaces |  | ||||||
| 
 |  | ||||||
| // Interface to valiate RAM values
 |  | ||||||
| type RequestWithRAM interface { |  | ||||||
| 	// GetRAM returns RAM values
 |  | ||||||
| 	GetRAM() map[string]uint64 |  | ||||||
| } |  | ||||||
| @ -1,36 +0,0 @@ | |||||||
| package constants |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	RESTMACHINE = "/restmachine" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	MIMEJSON              = "application/json" |  | ||||||
| 	MIMEHTML              = "text/html" |  | ||||||
| 	MIMEXML               = "application/xml" |  | ||||||
| 	MIMEXML2              = "text/xml" |  | ||||||
| 	MIMEPlain             = "text/plain" |  | ||||||
| 	MIMEPOSTForm          = "application/x-www-form-urlencoded" |  | ||||||
| 	MIMEMultipartPOSTForm = "multipart/form-data" |  | ||||||
| 	MIMEPROTOBUF          = "application/x-protobuf" |  | ||||||
| 	MIMEMSGPACK           = "application/x-msgpack" |  | ||||||
| 	MIMEMSGPACK2          = "application/msgpack" |  | ||||||
| 	MIMEYAML              = "application/x-yaml" |  | ||||||
| 	MIMEYAML2             = "application/yaml" |  | ||||||
| 	MIMETOML              = "application/toml" |  | ||||||
| 	MIMESTREAM            = "application/octet-stream" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var FileName = map[string]string{ |  | ||||||
| 	"OidcCertificate": "ca.crt", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"} |  | ||||||
| 
 |  | ||||||
| var VersionMap = map[string]string{ |  | ||||||
| 	"4.4.0": "-", |  | ||||||
| 	"4.3.0": "-", |  | ||||||
| 	"4.2.0": "-", |  | ||||||
| 	"4.1.1": "-", |  | ||||||
| 	"4.1.0": "-", |  | ||||||
| } |  | ||||||
| @ -1,41 +0,0 @@ | |||||||
| package multierror |  | ||||||
| 
 |  | ||||||
| func Join(errs ...error) error { |  | ||||||
| 	n := 0 |  | ||||||
| 	for _, err := range errs { |  | ||||||
| 		if err != nil { |  | ||||||
| 			n++ |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if n == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	e := &joinError{ |  | ||||||
| 		errs: make([]error, 0, n), |  | ||||||
| 	} |  | ||||||
| 	for _, err := range errs { |  | ||||||
| 		if err != nil { |  | ||||||
| 			e.errs = append(e.errs, err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return e |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type joinError struct { |  | ||||||
| 	errs []error |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (e *joinError) Error() string { |  | ||||||
| 	var b []byte |  | ||||||
| 	for i, err := range e.errs { |  | ||||||
| 		if i > 0 { |  | ||||||
| 			b = append(b, '\n') |  | ||||||
| 		} |  | ||||||
| 		b = append(b, err.Error()...) |  | ||||||
| 	} |  | ||||||
| 	return string(b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (e *joinError) Unwrap() []error { |  | ||||||
| 	return e.errs |  | ||||||
| } |  | ||||||
| @ -0,0 +1,77 @@ | |||||||
|  | package account | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"net/http" | ||||||
|  | 	"strconv" | ||||||
|  | 
 | ||||||
|  | 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Request struct for creating account
 | ||||||
|  | type CreateRequest struct { | ||||||
|  | 	// Display name
 | ||||||
|  | 	// Required: true
 | ||||||
|  | 	Name string `url:"name" json:"name" validate:"required"` | ||||||
|  | 
 | ||||||
|  | 	// Name of the account
 | ||||||
|  | 	// Required: true
 | ||||||
|  | 	Username string `url:"username" json:"username" validate:"required"` | ||||||
|  | 
 | ||||||
|  | 	// Email
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	EmailAddress string `url:"emailaddress,omitempty" json:"emailaddress,omitempty" validate:"omitempty,email"` | ||||||
|  | 
 | ||||||
|  | 	// Max size of memory in MB
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	MaxMemoryCapacity int64 `url:"maxMemoryCapacity,omitempty" json:"maxMemoryCapacity,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Max size of aggregated vdisks in GB
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	MaxVDiskCapacity int64 `url:"maxVDiskCapacity,omitempty" json:"maxVDiskCapacity,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Max number of CPU cores
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	MaxCPUCapacity int64 `url:"maxCPUCapacity,omitempty" json:"maxCPUCapacity,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Max sent/received network transfer peering
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	MaxNetworkPeerTransfer int64 `url:"maxNetworkPeerTransfer,omitempty" json:"maxNetworkPeerTransfer,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Max number of assigned public IPs
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	MaxNumPublicIP int64 `url:"maxNumPublicIP,omitempty" json:"maxNumPublicIP,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// If true send emails when a user is granted access to resources
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	SendAccessEmails bool `url:"sendAccessEmails" json:"sendAccessEmails"` | ||||||
|  | 
 | ||||||
|  | 	// Limit (positive) or disable (0) GPU resources
 | ||||||
|  | 	// Required: false
 | ||||||
|  | 	GPUUnits int64 `url:"gpu_units,omitempty" json:"gpu_units,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Create creates account
 | ||||||
|  | // Setting a cloud unit maximum to -1 or empty will not put any restrictions on the resource
 | ||||||
|  | func (a Account) Create(ctx context.Context, req CreateRequest) (uint64, error) { | ||||||
|  | 	err := validators.ValidateRequest(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		for _, validationError := range validators.GetErrors(err) { | ||||||
|  | 			return 0, validators.ValidationError(validationError) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	url := "/cloudapi/account/create" | ||||||
|  | 
 | ||||||
|  | 	res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	result, err := strconv.ParseUint(string(res), 10, 64) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | package account | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"net/http" | ||||||
|  | 
 | ||||||
|  | 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Request struct for download the resources tracking files for an account
 | ||||||
|  | type GetConsumptionRequest struct { | ||||||
|  | 	// ID an account
 | ||||||
|  | 	// Required: true
 | ||||||
|  | 	AccountID uint64 `url:"accountId" json:"accountId" validate:"required"` | ||||||
|  | 
 | ||||||
|  | 	// Epoch represents the start time
 | ||||||
|  | 	// Required: true
 | ||||||
|  | 	Start uint64 `url:"start" json:"start" validate:"required"` | ||||||
|  | 
 | ||||||
|  | 	// Epoch represents the end time
 | ||||||
|  | 	// Required: true
 | ||||||
|  | 	End uint64 `url:"end" json:"end" validate:"required"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetConsumption downloads the resources tracking files for an account within a given period
 | ||||||
|  | func (a Account) GetConsumption(ctx context.Context, req GetConsumptionRequest) (string, error) { | ||||||
|  | 	err := validators.ValidateRequest(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		for _, validationError := range validators.GetErrors(err) { | ||||||
|  | 			return "", validators.ValidationError(validationError) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	url := "/cloudapi/account/getConsumption" | ||||||
|  | 
 | ||||||
|  | 	res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return string(res), nil | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetConsumptionGet downloads the resources tracking files for an account within a given period
 | ||||||
|  | func (a Account) GetConsumptionGet(ctx context.Context, req GetConsumptionRequest) (string, error) { | ||||||
|  | 	err := validators.ValidateRequest(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		for _, validationError := range validators.GetErrors(err) { | ||||||
|  | 			return "", validators.ValidationError(validationError) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	url := "/cloudapi/account/getConsumption" | ||||||
|  | 
 | ||||||
|  | 	res, err := a.client.DecortApiCall(ctx, http.MethodGet, url, req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return string(res), nil | ||||||
|  | } | ||||||
| @ -1,73 +0,0 @@ | |||||||
| package account |  | ||||||
| 
 |  | ||||||
| // IDs gets array of AccountIDs from ListAccounts struct
 |  | ||||||
| func (la ListAccounts) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(la.Data)) |  | ||||||
| 	for _, acc := range la.Data { |  | ||||||
| 		res = append(res, acc.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of ComputeIDs from ListComputes struct
 |  | ||||||
| func (lc ListComputes) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lc.Data)) |  | ||||||
| 	for _, c := range lc.Data { |  | ||||||
| 		res = append(res, c.ComputeID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of DiskIDs from ListDisks struct
 |  | ||||||
| func (ld ListDisks) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(ld.Data)) |  | ||||||
| 	for _, d := range ld.Data { |  | ||||||
| 		res = append(res, d.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of FLIPGroupIDs from ListFLIPGroups struct
 |  | ||||||
| func (fg ListFLIPGroups) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(fg.Data)) |  | ||||||
| 	for _, g := range fg.Data { |  | ||||||
| 		res = append(res, g.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of AccountIDs from ListResourceConsumption struct
 |  | ||||||
| func (rc ListResourceConsumption) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(rc.Data)) |  | ||||||
| 	for _, r := range rc.Data { |  | ||||||
| 		res = append(res, r.AccountID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of RGIDs from ListRG struct
 |  | ||||||
| func (rg ListRG) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(rg.Data)) |  | ||||||
| 	for _, g := range rg.Data { |  | ||||||
| 		res = append(res, g.RGID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of TemplateIDs from ListTemplates struct
 |  | ||||||
| func (lt ListTemplates) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lt.Data)) |  | ||||||
| 	for _, t := range lt.Data { |  | ||||||
| 		res = append(res, t.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of VINSIDs from ListVINS struct
 |  | ||||||
| func (lv ListVINS) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lv.Data)) |  | ||||||
| 	for _, v := range lv.Data { |  | ||||||
| 		res = append(res, v.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| @ -1,10 +0,0 @@ | |||||||
| package cloudapi |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/audit" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Accessing the Stack method group
 |  | ||||||
| func (ca *CloudAPI) Audit() *audit.Audit { |  | ||||||
| 	return audit.New(ca.client) |  | ||||||
| } |  | ||||||
| @ -1,15 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" |  | ||||||
| 
 |  | ||||||
| // Structure for creating request to audit
 |  | ||||||
| type Audit struct { |  | ||||||
| 	client interfaces.Caller |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Builder for audit endpoint
 |  | ||||||
| func New(client interfaces.Caller) *Audit{ |  | ||||||
| 	return &Audit{ |  | ||||||
| 		client: client, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @ -1,81 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| // FilterByID returns ListAudits with specified ID.
 |  | ||||||
| func (la ListAudits) FilterByID(guid string) ListAudits { |  | ||||||
| 	predicate := func(ia ItemAudit) bool { |  | ||||||
| 		return ia.GUID == guid |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterByCall returns ListAudits with specified call.
 |  | ||||||
| func (la ListAudits) FilterByCall(call string) ListAudits { |  | ||||||
| 	predicate := func(ic ItemAudit) bool { |  | ||||||
| 		return ic.Call == call |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterByCorrelationID returns ListAudits with specified correlation id.
 |  | ||||||
| func (la ListAudits) FilterByCorrelationID(correlationID string) ListAudits { |  | ||||||
| 	predicate := func(ic ItemAudit) bool { |  | ||||||
| 		return ic.CorrelationID == correlationID |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterByRemoteAddr returns ListAudits with specified remote address.
 |  | ||||||
| func (la ListAudits) FilterByRemoteAddr(remoteAddr string) ListAudits { |  | ||||||
| 	predicate := func(ic ItemAudit) bool { |  | ||||||
| 		return ic.RemoteAddr == remoteAddr |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterByUser returns ListAudits with specified user name.
 |  | ||||||
| func (la ListAudits) FilterByUser(user string) ListAudits { |  | ||||||
| 	predicate := func(ic ItemAudit) bool { |  | ||||||
| 		return ic.User == user |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterByStatusCode return ListAudits with specified status code.
 |  | ||||||
| func (la ListAudits) FilterByStatusCode(statusCode uint64) ListAudits { |  | ||||||
| 	predicate := func(ic ItemAudit) bool { |  | ||||||
| 		return ic.StatusCode == statusCode |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.FilterFunc(predicate) |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilterFunc allows filtering ListAudits based on a user-specified predicate.
 |  | ||||||
| func (la ListAudits) FilterFunc(predicate func(ItemAudit) bool) ListAudits { |  | ||||||
| 	var result ListAudits |  | ||||||
| 
 |  | ||||||
| 	for _, item := range la.Data { |  | ||||||
| 		if predicate(item) { |  | ||||||
| 			result.Data = append(result.Data, item) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result.EntryCount = uint64(len(result.Data)) |  | ||||||
| 
 |  | ||||||
| 	return result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FindOne returns first found ItemAudit
 |  | ||||||
| // If none was found, returns an empty struct.
 |  | ||||||
| func (la ListAudits) FindOne() ItemAudit { |  | ||||||
| 	if len(la.Data) == 0 { |  | ||||||
| 		return ItemAudit{} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return la.Data[0] |  | ||||||
| } |  | ||||||
| @ -1,115 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var audits = ListAudits{ |  | ||||||
| 	Data: []ItemAudit{ |  | ||||||
| 		{ |  | ||||||
| 			Args:          "[]", |  | ||||||
| 			Call:          "/restmachine/cloudapi/audit/linkedJobs", |  | ||||||
| 			GUID:          "550e8400-e29b-41d4-a716-446655440001", |  | ||||||
| 			CorrelationID: "550e8400-e29b-41d4-a716-446655440001", |  | ||||||
| 			Kwargs:        `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`, |  | ||||||
| 			RemoteAddr:    "192.168.1.100", |  | ||||||
| 			ResponseTime:  1, |  | ||||||
| 			Result:        `[]`, |  | ||||||
| 			StatusCode:    200, |  | ||||||
| 			Timestamp:     1640995200, |  | ||||||
| 			TimestampEnd:  1640995201, |  | ||||||
| 			User:          "test@example.com", |  | ||||||
| 			TTL:           "2025-07-31T14:22:57.028000", |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			Args:          "[]", |  | ||||||
| 			Call:          "/restmachine/cloudapi/audit/test", |  | ||||||
| 			GUID:          "550e8400-e29b-41d4-a716-446655440002", |  | ||||||
| 			CorrelationID: "550e8400-e29b-41d4-a716-446655440002", |  | ||||||
| 			Kwargs:        `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`, |  | ||||||
| 			RemoteAddr:    "192.168.1.105", |  | ||||||
| 			ResponseTime:  5, |  | ||||||
| 			Result:        `[]`, |  | ||||||
| 			StatusCode:    400, |  | ||||||
| 			Timestamp:     1640995200, |  | ||||||
| 			TimestampEnd:  1640995201, |  | ||||||
| 			User:          "test2@example.com", |  | ||||||
| 			TTL:           "2025-07-31T14:22:57.028000", |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	EntryCount: 2, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByID(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByID("550e8400-e29b-41d4-a716-446655440002").FindOne() |  | ||||||
| 
 |  | ||||||
| 	if actual.GUID != "550e8400-e29b-41d4-a716-446655440002" { |  | ||||||
| 		t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.GUID) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	actualEmpty := audits.FilterByID("") |  | ||||||
| 
 |  | ||||||
| 	if len(actualEmpty.Data) != 0 { |  | ||||||
| 		t.Fatal("expected empty, actual: ", len(actualEmpty.Data)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByCorrelationID(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByCorrelationID("550e8400-e29b-41d4-a716-446655440002").FindOne() |  | ||||||
| 
 |  | ||||||
| 	if actual.CorrelationID != "550e8400-e29b-41d4-a716-446655440002" { |  | ||||||
| 		t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.CorrelationID) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	actualEmpty := audits.FilterByCorrelationID("") |  | ||||||
| 
 |  | ||||||
| 	if len(actualEmpty.Data) != 0 { |  | ||||||
| 		t.Fatal("expected empty, actual: ", len(actualEmpty.Data)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByRemoteAddr(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByRemoteAddr("192.168.1.100").FindOne() |  | ||||||
| 
 |  | ||||||
| 	if actual.RemoteAddr != "192.168.1.100" { |  | ||||||
| 		t.Fatal("expected remote address 192.168.1.100, found: ", actual.RemoteAddr) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	actualEmpty := audits.FilterByRemoteAddr("") |  | ||||||
| 
 |  | ||||||
| 	if len(actualEmpty.Data) != 0 { |  | ||||||
| 		t.Fatal("expected empty, actual: ", len(actualEmpty.Data)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByUser(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByUser("test@example.com").FindOne() |  | ||||||
| 
 |  | ||||||
| 	if actual.User != "test@example.com" { |  | ||||||
| 		t.Fatal("expected user test@example.com, found: ", actual.RemoteAddr) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	actualEmpty := audits.FilterByUser("") |  | ||||||
| 
 |  | ||||||
| 	if len(actualEmpty.Data) != 0 { |  | ||||||
| 		t.Fatal("expected empty, actual: ", len(actualEmpty.Data)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByCall(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByCall("/restmachine/cloudapi/audit/test").FindOne() |  | ||||||
| 
 |  | ||||||
| 	if actual.Call != "/restmachine/cloudapi/audit/test" { |  | ||||||
| 		t.Fatal("expected call /restmachine/cloudapi/audit/test, found: ", actual.Call) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFilterByStatusCode(t *testing.T) { |  | ||||||
| 	actual := audits.FilterByStatusCode(200) |  | ||||||
| 
 |  | ||||||
| 	for _, item := range actual.Data { |  | ||||||
| 		if item.StatusCode != 200 { |  | ||||||
| 			t.Fatal("expected 200 status code, found: ", item.StatusCode) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @ -1,46 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"net/http" |  | ||||||
| 
 |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // GetRequest struct to get information about account
 |  | ||||||
| type GetRequest struct { |  | ||||||
| 	// Audit GUID
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	AuditGuid string `url:"audit_guid" json:"audit_guid" validate:"required"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Get gets information about audit as a RecordAudit struct
 |  | ||||||
| func (a Audit) Get(ctx context.Context, req GetRequest) (*RecordAudit, error) { |  | ||||||
| 	res, err := a.GetRaw(ctx, req) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	info := RecordAudit{} |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal(res, &info) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &info, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetRaw gets information about audit as an array of bytes
 |  | ||||||
| func (a Audit) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) { |  | ||||||
| 	err := validators.ValidateRequest(req) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	url := "/cloudapi/audit/get" |  | ||||||
| 
 |  | ||||||
| 	res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) |  | ||||||
| 	return res, err |  | ||||||
| } |  | ||||||
| @ -1,124 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"net/http" |  | ||||||
| 
 |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // ListRequest struct to give list of account audits
 |  | ||||||
| type ListRequest struct { |  | ||||||
| 
 |  | ||||||
| 	// Find all audits after point in time (unixtime)
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	TimestampAt uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find all audits before point in time (unixtime)
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	TimestampTo uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by user (Mongo RegExp supported)
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	User string `url:"user,omitempty" json:"user,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by api endpoint (Mongo RegExp supported)
 |  | ||||||
| 	// 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"` |  | ||||||
| 
 |  | ||||||
| 	// Find by HTTP max status code
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Sort by one of supported fields, format +|-(field)
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	SortBy string `url:"sort_by,omitempty" json:"sort_by,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"` |  | ||||||
| 
 |  | ||||||
| 	// Find by resource group id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	RGID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by compute id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by account id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by vins id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	VINSID uint64 `url:"vins_id,omitempty" json:"vins_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by service id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	ServiceID uint64 `url:"service_id,omitempty" json:"service_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by k8s id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	K8SID uint64 `url:"k8s_id,omitempty" json:"k8s_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by flipgroup id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	FLIPGroupID uint64 `url:"flipgroup_id,omitempty" json:"flipgroup_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by load balancer id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	LBID uint64 `url:"lb_id,omitempty" json:"lb_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Find by sep id
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	// Exclude audit lines from response
 |  | ||||||
| 	// Required: false
 |  | ||||||
| 	ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // List gets audit records for the specified account object
 |  | ||||||
| func (a Audit) List(ctx context.Context, req ListRequest) (*ListAudits, error) { |  | ||||||
| 
 |  | ||||||
| 	res, err := a.ListRaw(ctx, req) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	list := ListAudits{} |  | ||||||
| 
 |  | ||||||
| 	err = json.Unmarshal(res, &list) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &list, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ListRaw gets list of audit records an array of bytes
 |  | ||||||
| func (a Audit) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) { |  | ||||||
| 
 |  | ||||||
| 	if err := validators.ValidateRequest(req); err != nil { |  | ||||||
| 		return nil, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	url := "/cloudapi/audit/list" |  | ||||||
| 
 |  | ||||||
| 	res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) |  | ||||||
| 	return res, err |  | ||||||
| } |  | ||||||
| @ -1,95 +0,0 @@ | |||||||
| package audit |  | ||||||
| 
 |  | ||||||
| // Main info about audit
 |  | ||||||
| type RecordAudit struct { |  | ||||||
| 
 |  | ||||||
| 	// Arguments
 |  | ||||||
| 	Arguments string `json:"args"` |  | ||||||
| 
 |  | ||||||
| 	// Call
 |  | ||||||
| 	Call string `json:"call"` |  | ||||||
| 
 |  | ||||||
| 	// GUID
 |  | ||||||
| 	GUID string `json:"guid"` |  | ||||||
| 
 |  | ||||||
| 	// Correlation ID
 |  | ||||||
| 	CorrelationID string `json:"correlation_id"` |  | ||||||
| 
 |  | ||||||
| 	// 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"` |  | ||||||
| 
 |  | ||||||
| 	// Tags
 |  | ||||||
| 	Tags string `json:"tags"` |  | ||||||
| 
 |  | ||||||
| 	// Timestamp
 |  | ||||||
| 	Timestamp float64 `json:"timestamp"` |  | ||||||
| 
 |  | ||||||
| 	// TimestampEnd
 |  | ||||||
| 	TimestampEnd float64 `json:"timestampEnd"` |  | ||||||
| 
 |  | ||||||
| 	// User
 |  | ||||||
| 	User string `json:"user"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Main info about audit
 |  | ||||||
| type ItemAudit struct { |  | ||||||
| 	// Args
 |  | ||||||
| 	Args string `json:"args"` |  | ||||||
| 
 |  | ||||||
| 	// Call
 |  | ||||||
| 	Call string `json:"call"` |  | ||||||
| 
 |  | ||||||
| 	// GUID
 |  | ||||||
| 	GUID string `json:"guid"` |  | ||||||
| 
 |  | ||||||
| 	// Correlation ID
 |  | ||||||
| 	CorrelationID string `json:"correlation_id"` |  | ||||||
| 
 |  | ||||||
| 	// 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"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // List of audits
 |  | ||||||
| type ListAudits struct { |  | ||||||
| 	// Data
 |  | ||||||
| 	Data []ItemAudit `json:"data"` |  | ||||||
| 
 |  | ||||||
| 	// EntryCount
 |  | ||||||
| 	EntryCount uint64 `json:"entryCount"` |  | ||||||
| } |  | ||||||
| @ -1,37 +0,0 @@ | |||||||
| package bservice |  | ||||||
| 
 |  | ||||||
| // IDs gets array of BasicServiceIDs from ListBasicServices struct
 |  | ||||||
| func (lbs ListBasicServices) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lbs.Data)) |  | ||||||
| 	for _, bs := range lbs.Data { |  | ||||||
| 		res = append(res, bs.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of ComputeIDs from ListComputes struct
 |  | ||||||
| func (lc ListComputes) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lc)) |  | ||||||
| 	for _, c := range lc { |  | ||||||
| 		res = append(res, c.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of GroupIDs from ListGroups struct
 |  | ||||||
| func (lg ListGroups) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lg)) |  | ||||||
| 	for _, g := range lg { |  | ||||||
| 		res = append(res, g.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IDs gets array of GroupComputeIDs from ListGroupComputes struct
 |  | ||||||
| func (lgc ListGroupComputes) IDs() []uint64 { |  | ||||||
| 	res := make([]uint64, 0, len(lgc)) |  | ||||||
| 	for _, gc := range lgc { |  | ||||||
| 		res = append(res, gc.ID) |  | ||||||
| 	} |  | ||||||
| 	return res |  | ||||||
| } |  | ||||||
| @ -1,42 +0,0 @@ | |||||||
| package bservice |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"net/http" |  | ||||||
| 	"strconv" |  | ||||||
| 
 |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // MigrateToZone struct to move basic service to another zone
 |  | ||||||
| type MigrateToZoneRequest struct { |  | ||||||
| 	// ID of the BasicService to move
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// ID of the zone to move
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	ZoneID uint64 `url:"zoneId" json:"zoneId" validate:"required"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MigrateToZone moves basic service instance to new zone
 |  | ||||||
| func (b BService) MigrateToZone(ctx context.Context, req MigrateToZoneRequest) (bool, error) { |  | ||||||
| 	err := validators.ValidateRequest(req) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	url := "/cloudapi/bservice/migrateToZone" |  | ||||||
| 
 |  | ||||||
| 	res, err := b.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 |  | ||||||
| } |  | ||||||
| @ -1,42 +0,0 @@ | |||||||
| package compute |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"net/http" |  | ||||||
| 	"strconv" |  | ||||||
| 
 |  | ||||||
| 	"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // AbortSharedSnapshotMergeRequest struct to abort shared snapshots merge
 |  | ||||||
| type AbortSharedSnapshotMergeRequest struct { |  | ||||||
| 	// ID of the compute
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"` |  | ||||||
| 
 |  | ||||||
| 	// Label of the snapshot
 |  | ||||||
| 	// Required: true
 |  | ||||||
| 	Label string `url:"label" json:"label" validate:"required"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // AbortSharedSnapshotMerge shared snapshots merge abort
 |  | ||||||
| func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (bool, error) { |  | ||||||
| 	err := validators.ValidateRequest(req) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, validators.ValidationErrors(validators.GetErrors(err)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	url := "/cloudapi/compute/abort_shared_snapshot_merge" |  | ||||||
| 
 |  | ||||||
| 	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 |  | ||||||
| } |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue