Compare commits

...

3 Commits

Author SHA1 Message Date
asteam
1f8637400f v1.11.6 2025-07-15 17:26:44 +03:00
89831894df v1.11.5 2025-06-26 13:21:52 +03:00
92431c5c65 v1.11.4 2025-05-21 13:39:23 +03:00
9 changed files with 253 additions and 170 deletions

View File

@@ -1,59 +1,13 @@
## Version 1.11.3
### Добавлено
### account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-467 | Опциональные поля `Name` и `Reason` в структуре запроса `DeleteRequest` в cloudbroker/account |
### apiaccess
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-470 | Опциональное поле `Desc` в структуре запроса `ListRequest` в cloudbroker/apiaccess |
#### bservice
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-361 | Группа ручек `bservice` в cloudbroker/bservice |
#### location
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-471 | Поле `SDNSupport` в возвращаемой модели `ItemLocation` в cloudbroker/location |
### Исправлено
#### disks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-468 | Исправлен тип поля `UpdatedBy` c uint64 на string в структурах ответа `ItemComputeDisk` в cloudapi/disks и `ItemDisk` в cloudbroker/disks |
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-433 | Исправлена ошибка валидации поля LoaderType для всех структур в cloudapi/compute и в cloudbroker/compute |
| BGOS-458 | Изменен тип параметров `CPUPin`, `HPBacked`, `AutoStart`, `HotResize` с bool на interface в структуре `UpdateRequest` cloudapi/compute и в cloudbroker/compute |
#### node
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-472 | Исправлен тип поля `NumaNode` c uint64 на int в структуре ответа `Backplane1` в cloudbroker/node |
| BGOS-428 | Поле `Message` заменено на `Reason` в структуре запроса `EnableNodesRequest` в cloudbroker/node |
## Version 1.11.6
### Удалено
### compute
#### Account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-469 | Опциональное поле `SepID` в структуре запроса `CreateTemplateFromBlankRequest` в cloudapi/compute и cloudbroker/compute |
| BGOS-553 | Метод `Create` в cloudapi/account |
### disks
#### Image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-469 | Опциональное поле `SepID` в структуре запроса `FromPlatformDiskRequest` в cloudapi/disks и cloudbroker/disks |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-427 | Поле `RegisterComputes` в структурах ответа `RecordResourceGroup`, `ItemResourceGroup` в cloudapi/rg и `ItemRG` в cloudbroker/rg |
| BGOS-552 | Метод `UploadImageFile` в cloudbroker/image |

View File

@@ -79,6 +79,8 @@ Decort SDK - это библиотека, написанная на языке G
- [Создание универсального клиента](#создание-универсального-клиента)
- [Пример создания универсального клиента](#пример-создания-универсального-клиента)
- [Пример выполнения запроса](#пример-выполнения-запроса-4)
- [Проверка соответствия версии платформы и версии dynamix](#проверка-соответствия-версии-платформы-и-версии-dynamix)
- [Пример выполнения запроса](#пример-выполнения-запроса-5)
## Установка
@@ -1604,4 +1606,36 @@ func main() {
fmt.Println(res)
}
```
## Проверка соответствия версии платформы и версии dynamix
С версии 1.11.5 для каждого клиента добавлен метод `Check` для проверки соответствия decort-sdk и платформы dynamix.
В случае соответсвия decort-sdk и платформы dynamix возвращается структура, содержащая информацию о версии и актуальном билде платформы.
#### Пример выполнения запроса
```go
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
)
func main(){
// Настройка конфигурации
config := config.Config{
AppID: "<APP_ID>",
AppSecret: "<APP_SECRET>",
SSOURL: "https://sso.digitalenergy.online",
DecortURL: "https://mr4.digitalenergy.online",
Retries: 5,
SSLSkipVerify: true,
}
// Создание клиента
client := decort.New(config)
// Проверка соответствия версии
checkInfo, err := client.Check()
}
```

88
check.go Normal file
View File

@@ -0,0 +1,88 @@
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 {
return nil, err
}
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 {
return nil, err
}
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 {
return nil, err
}
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))
}

View File

@@ -12,3 +12,7 @@ var FileName = map[string]string{
}
var K8sValues = []string{"labels", "taints", "annotations, additionalSANs"}
var VersionMap = map[string]string{
"4.3.0": "-",
}

View File

@@ -1,75 +0,0 @@
package account
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// CreateRequest 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 {
return 0, validators.ValidationErrors(validators.GetErrors(err))
}
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
}

View File

@@ -494,8 +494,8 @@ type RecordCompute struct {
// Userdata
Userdata interface{} `json:"userdata"`
// vGPU IDs
VGPUs []uint64 `json:"vgpus"`
// vGPUs list
VGPUs []VGPUItem `json:"vgpus"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
@@ -507,6 +507,65 @@ type RecordCompute struct {
VNCPassword string `json:"vncPasswd"`
}
type VGPUItem struct {
// ID
ID uint64 `json:"id"`
// GID
GID uint64 `json:"gid"`
// Type
Type string `json:"type"`
// Mode
Mode string `json:"mode"`
// Status
Status string `json:"status"`
// ProfileID
ProfileID uint64 `json:"profileId"`
// RAM
RAM uint64 `json:"ram"`
// LastUpdateTime
LastUpdateTime uint64 `json:"lastUpdateTime"`
// CreatedTime
CreatedTime uint64 `json:"createdTime"`
// DeletedTime
DeletedTime uint64 `json:"deletedTime"`
// VMID
VMID uint64 `json:"vmid"`
// PGPuid
PGPuid uint64 `json:"pgpuid"`
// ReferenceID
ReferenceID string `json:"referenceId"`
// AccountID
AccountID uint64 `json:"accountId"`
// RgID
RgID uint64 `json:"rgId"`
// LastClaimedBy
LastClaimedBy uint64 `json:"lastClaimedBy"`
// PCISlot
PCISlot uint64 `json:"pciSlot"`
// BusNumber
BusNumber uint64 `json:"bus_number"`
// GUID
GUID uint64 `json:"guid"`
}
// Information about libvirt settings
type LibvirtSettings struct {
// TX mode

View File

@@ -1074,8 +1074,8 @@ type RecordCompute struct {
// Userdata
Userdata interface{} `json:"userdata"`
// List VGPU IDs
VGPUs []uint64 `json:"vgpus"`
// List VGPU
VGPUs []VGPUItem `json:"vgpus"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
@@ -1087,6 +1087,65 @@ type RecordCompute struct {
VNCPassword string `json:"vncPasswd"`
}
type VGPUItem struct {
// ID
ID uint64 `json:"id"`
// GID
GID uint64 `json:"gid"`
// Type
Type string `json:"type"`
// Mode
Mode string `json:"mode"`
// Status
Status string `json:"status"`
// ProfileID
ProfileID uint64 `json:"profileId"`
// RAM
RAM uint64 `json:"ram"`
// LastUpdateTime
LastUpdateTime uint64 `json:"lastUpdateTime"`
// CreatedTime
CreatedTime uint64 `json:"createdTime"`
// DeletedTime
DeletedTime uint64 `json:"deletedTime"`
// VMID
VMID uint64 `json:"vmid"`
// PGPuid
PGPuid uint64 `json:"pgpuid"`
// ReferenceID
ReferenceID string `json:"referenceId"`
// AccountID
AccountID uint64 `json:"accountId"`
// RgID
RgID uint64 `json:"rgId"`
// LastClaimedBy
LastClaimedBy uint64 `json:"lastClaimedBy"`
// PCISlot
PCISlot uint64 `json:"pciSlot"`
// BusNumber
BusNumber uint64 `json:"bus_number"`
// GUID
GUID uint64 `json:"guid"`
}
// Information about of disk IDs
type ListInfoDisks []InfoDisk

View File

@@ -1,39 +0,0 @@
package image
import (
"context"
"encoding/json"
"fmt"
"net/http"
"os"
)
// UploadImageFileResponse struct to enable image
type UploadImageFileResponse struct {
// ImageFileUri
ImageFileUri string `json:"image_file_uri"`
}
// UploadImageFile uploads file image to platform
func (i Image) UploadImageFile(ctx context.Context, filePath string) (string, error) {
file, err := os.ReadFile(filePath)
if err != nil {
return "", fmt.Errorf("can not read file %v", err)
}
url := "/cloudbroker/image/uploadImageFile"
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, file)
if err != nil {
return "", err
}
result := UploadImageFileResponse{}
err = json.Unmarshal(res, &result)
if err != nil {
return "", err
}
return result.ImageFileUri, nil
}

View File

@@ -709,7 +709,6 @@ func getRequestsMapCloudbroker() map[string]interface{} {
"/restmachine/cloudbroker/image/share": image_cb.ShareRequest{},
"/restmachine/cloudbroker/image/syncCreateImage": image_cb.SyncCreateRequest{},
"/restmachine/cloudbroker/image/updateNodes": image_cb.UpdateNodesRequest{},
"/restmachine/cloudbroker/image/uploadImageFile": image_cb.UploadImageFileResponse{},
// k8ci
"/restmachine/cloudbroker/k8ci/accessAdd": k8ci_cb.AccessAddRequest{},