This commit is contained in:
2026-09-04 17:02:31 +04:00
parent b3fccfb000
commit 71b53b743d
25 changed files with 440 additions and 102 deletions

View File

@@ -1,4 +1,4 @@
## Version 1.16.1 ## Version 1.16.2
### Deprecated ### Deprecated
@@ -21,97 +21,40 @@
### Добавлено ### Добавлено
#### account #### audit
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1007 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/account и в cloudbroker/account | | BGOS-1025 | Вычисляемое поле `PublicSessionID` в структуры ответа `ItemAudit` и `RecordAudit` в cloudbroker/audit и cloudapi/audit |
| BGOS-1007 | Структура запроса `DelACLAccessRequest` и метод `DelACLAccess` в cloudapi/account и в cloudbroker/account | | BGOS-1025 | Опциональное поле `PublicSessionID` в структуру запроса `ListRequest` в cloudbroker/audit и cloudapi/audit |
| BGOS-1007 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/account и в cloudbroker/account |
#### backup #### grid
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1012 | Методы `AbortDisksBackup`, `BackupDisksWithSpeed`, `Info` и `SetBackupSpeed` в cloudbroker/backup | | BGOS-1028 | Вычисляемое поле `Budget` в структуры ответа `ItemGridList` и `RecordGrid` в cloudbroker/grid |
| BGOS-1012 | Структуры ответов `ListDisksWithSpeed` и `TotalBackupsInfo` в cloudbroker/backup |
| BGOS-1018 | Опциональное поле `Speed` в структуры запроса `CreateDiskBackupRequest` и `Disk` в cloudbroker/backup |
#### vins
#### compute
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1009 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/compute и в cloudbroker/compute | | BGOS-1027 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemVNFInterface` в cloudbroker/vins и cloudapi/vins |
| BGOS-1009 | Структура запроса `DeleteACLAccessRequest` и метод `DeleteACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-1009 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-1009 | Структура запроса `GetACLAccessRequest` и метод `GetACLAccess` в cloudapi/compute и в cloudbroker/compute |
| BGOS-1014 | Вычисляемое поле `MemoryBalloonMode` в структуры ответа `ItemCompute` и `RecordCompute` в cloudapi/compute |
| BGOS-1014 | Вычисляемое поле `MemoryBalloonMode` в структуры ответа `InfoCompute` и `RecordCompute` в cloudbroker/compute |
| BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуру запроса `UpdateRequest` в cloudbroker/compute и cloudapi/compute |
| BGOS-1016 | Вычисляемое поле `ProfileName` в структуру ответа `ItemVGPU` в cloudbroker/compute и cloudapi/compute |
| BGOS-1019 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemShadowComputeInterface` в cloudbroker/compute |
#### disks #### session
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1015 | Методы `DeleteAsync`, `DeleteDisksAsync`, `LimitIOAsync`, `RenameAsync`, `ReplicateAsync`, `ReplicationResumeAsync`, `ReplicationReverseAsync`, `ReplicationStartAsync`, `ReplicationStopAsync`, `ReplicationSuspendAsync`, `Resize2Async`, `RestoreAsync`, `ShareAsync`, `UnshareAsync`, `SnapshotDeleteAsync`, `SnapshotRollbackAsync`, `ChangeDiskStoragePolicyAsync` в cloudapi/disks | | BGOS-1026 | Группа ручек cloudbroker/session |
| BGOS-1015 | Методы `DeleteAsync`, `DeleteDisksAsync`, `DepresentAsync`, `LimitIOAsync`, `MigrateAbortAsync`, `PresentAsync`, `RenameAsync`, `ReplicateAsync`, `ReplicationResumeAsync`, `ReplicationReverseAsync`, `ReplicationStartAsync`, `ReplicationStopAsync`, `ReplicationSuspendAsync`, `Resize2Async`, `RestoreAsync`, `ShareAsync`, `UnshareAsync`, `SnapshotDeleteAsync`, `SnapshotRollbackAsync`, `ChangeDiskStoragePolicyAsync`, `UpdateAsync` в cloudbroker/disks |
#### extnet
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1013 | Опциональное поле `AutoAssignable` в структуру запроса `AddReserveIPRequest` в cloudbroker/extnet |
| BGOS-1013 | Опциональное поле `AutoAssignable` в структуру запроса `GetReservedIP` в cloudbroker/extnet и cloudapi/extnet |
| BGOS-1013 | Вычисляемое поле `AutoAssignable` в структуру ответа `Reservations` в cloudbroker/extnet и cloudapi/extnet |
#### kvmx86
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуры запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 |
| BGOS-1014 | Опциональное поле `MemoryBalloonMode` в структуры запроса `CreateRequest`, `CreateBlankRequest` и `MassCreateRequest` в cloudbroker/kvmx86 |
#### node
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1020 | Опциональное поле `Mode` в структуру запроса `PCIDeviceDriverToKernelRequest` в cloudbroker/node |
#### pcidevice
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-990 | Опциональное поле `AccountID` в структуру запроса `ListRequest` в cloudapi/pcidevice и в структуры запроса `CreateRequest` и `ListRequest` в cloudbroker/pcidevice |
| BGOS-990 | Вычисляемое поле `AccountID` в структуру ответа `ItemPCIDevice` в cloudapi/pcidevice и в структуру ответа `ItemPCIDevice` в cloudbroker/pcidevice |
| BGOS-990 | Метод `AccessGrant` и структура запроса `AccessGrantRequest` в cloudbroker/pcidevice |
| BGOS-990 | Метод `AccessRevoke` и структура запроса `AccessRevokeRequest` в cloudbroker/pcidevice |
#### rg
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1008 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `DeleteACLAccessRequest` и метод `DeleteACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/rg и в cloudbroker/rg |
| BGOS-1008 | Структура запроса `GetACLAccessRequest` и метод `GetACLAccess` в cloudapi/rg и в cloudbroker/rg |
#### vgpu ### Изменено
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1011 | Вычисляемое поле `ProfileName` в структуру ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu |
### Удалено
#### account
| Идентификатор задачи | Описание |
| --- | --- |
| BGOS-1021 | Вычисляемое поле `CanBeDeleted` из структуры ответа `ListRecordACL` в cloudapi/account |
#### network qos policy #### network qos policy
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-1017 | Вычисляемые поля `CreatedAt`, `UpdatedAt`, `CreatedBy` и `UpdatedBy` из структур ответа `ItemQoSPolicy` и `RecordQoSPolicy` в cloudapi/qospolicy и cloudbroker/qospolicy | | BGOS-1030 | Тип вычисляемых полей `PCPTag` и `DSCPValue` с `uint64` на `*uint64` в структуре ответа `Rule` в cloudapi/qospolicy и cloudbroker/qospolicy |
| BGOS-1017 | Методы `FilterByCreatedBy` и `FilterByUpdatedBy` из cloudapi/qospolicy и cloudbroker/qospolicy | | BGOS-1030 | Тип опциональных полей `Name` и `Description` с `string` на `*string` в структуре запроса `UpdateRequest` в cloudapi/qospolicy и cloudbroker/qospolicy |
| BGOS-1017 | Методы `SortByCreatedAt` и `SortByUpdatedAt` из cloudapi/qospolicy и cloudbroker/qospolicy |
#### pcidevice
### Удалено
#### compute
| Идентификатор задачи | Описание | | Идентификатор задачи | Описание |
| --- | --- | | --- | --- |
| BGOS-990 | Опциональное поле `RGID` из структуры запроса `ListRequest` в cloudapi/pcidevice и из структур запроса `CreateRequest` и `ListRequest` в cloudbroker/pcidevice | | BGOS-1029 | Опциональное поле `Type` из структуры запроса `ListVGPURequest` в cloudbroker/compute и cloudapi/compute |
| BGOS-990 | Вычисляемое поле `RGID` из структуры ответа `ItemPCIDevice` в cloudapi/pcidevice и из структуры ответа `ItemPCIDevice` в cloudbroker/pcidevice |

View File

@@ -168,6 +168,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `RG` - управление ресурсными группами аккаунта; - `RG` - управление ресурсными группами аккаунта;
- `Security group` управление группами безопасности; - `Security group` управление группами безопасности;
- `SEP` - управление storage endpoint (sep); - `SEP` - управление storage endpoint (sep);
- `Session` - получение информации о сессиях;
- `Storage policy` управление политиками хранения; - `Storage policy` управление политиками хранения;
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера); - `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
- `Trunk` - управление транковыми портами; - `Trunk` - управление транковыми портами;
@@ -378,6 +379,7 @@ func main() {
- `pkg/cloudbroker/rg` - для `RG` - `pkg/cloudbroker/rg` - для `RG`
- `pkg/cloudbroker/secgroup` - для `Security group` - `pkg/cloudbroker/secgroup` - для `Security group`
- `pkg/cloudbroker/sep` - для `SEP` - `pkg/cloudbroker/sep` - для `SEP`
- `pkg/cloudbroker/session` - для `Session`
- `pkg/cloudbroker/stpolicy` - для `Storage policy` - `pkg/cloudbroker/stpolicy` - для `Storage policy`
- `pkg/cloudbroker/tasks` - для `Tasks` - `pkg/cloudbroker/tasks` - для `Tasks`
- `pkg/cloudbroker/trunk` - для `Trunk` - `pkg/cloudbroker/trunk` - для `Trunk`
@@ -581,6 +583,7 @@ func main() {
- `.RG()` - для работы с `RG` - `.RG()` - для работы с `RG`
- `.SecurityGroup()` - для работы с `Security Group` - `.SecurityGroup()` - для работы с `Security Group`
- `.SEP()` - для работы с `SEP` - `.SEP()` - для работы с `SEP`
- `.Session()` - для работы с `Session`
- `.StPolicy()` - для работы с `Storage Policy` - `.StPolicy()` - для работы с `Storage Policy`
- `.Tasks()` - для работы с `Tasks` - `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk` - `.Trunk()` - для работы с `Trunk`

View File

@@ -90,6 +90,9 @@ type ListRequest struct {
// Exclude audit lines from response // Exclude audit lines from response
// Required: false // Required: false
ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"` ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
} }
// List gets audit records for the specified account object // List gets audit records for the specified account object

View File

@@ -2,7 +2,6 @@ package audit
// Main info about audit // Main info about audit
type RecordAudit struct { type RecordAudit struct {
// Arguments // Arguments
Arguments string `json:"args"` Arguments string `json:"args"`
@@ -41,6 +40,9 @@ type RecordAudit struct {
// User // User
User string `json:"user"` User string `json:"user"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
} }
// Main info about audit // Main info about audit
@@ -81,6 +83,9 @@ type ItemAudit struct {
// User // User
User string `json:"user"` User string `json:"user"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
// TTL // TTL
TTL string `json:"_ttl"` TTL string `json:"_ttl"`
} }

View File

@@ -18,10 +18,6 @@ type ListVGPURequest struct {
// Required: false // Required: false
GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"` GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"`
// Find by type
// Required: false
Type string `url:"type,omitempty" json:"type,omitempty"`
// Find by status // Find by status
// Required: false // Required: false
Status string `url:"status,omitempty" json:"status,omitempty"` Status string `url:"status,omitempty" json:"status,omitempty"`

View File

@@ -73,10 +73,10 @@ type Rule struct {
Protocol string `json:"protocol"` Protocol string `json:"protocol"`
// Priority Code Point (0-7). L2 marking // Priority Code Point (0-7). L2 marking
PCPTag uint64 `json:"pcp_tag"` PCPTag *uint64 `json:"pcp_tag"`
// DSCP value (0-63). L3 marking // DSCP value (0-63). L3 marking
DSCPValue uint64 `json:"dscp_value"` DSCPValue *uint64 `json:"dscp_value"`
// Source IP address // Source IP address
SrcIP string `json:"src_ip"` SrcIP string `json:"src_ip"`

View File

@@ -16,11 +16,11 @@ type UpdateRequest struct {
// New QoS policy name // New QoS policy name
// Required: false // Required: false
Name string `url:"name,omitempty" json:"name,omitempty"` Name *string `url:"name,omitempty" json:"name,omitempty"`
// New QoS policy description // New QoS policy description
// Required: false // Required: false
Description string `url:"description,omitempty" json:"description,omitempty"` Description *string `url:"description,omitempty" json:"description,omitempty"`
} }
func (qp QoSPolicy) Update(ctx context.Context, req UpdateRequest) (*RecordQoSPolicy, error) { func (qp QoSPolicy) Update(ctx context.Context, req UpdateRequest) (*RecordQoSPolicy, error) {

View File

@@ -329,6 +329,9 @@ type ItemVNFInterface struct {
// QOS // QOS
QOS QOS `json:"qos"` QOS QOS `json:"qos"`
// List of QoS policies
QoSPolicies []uint64 `json:"qos_policies"`
// Target // Target
Target string `json:"target"` Target string `json:"target"`

View File

@@ -94,6 +94,9 @@ type ListRequest struct {
// Exclude audit lines from response // Exclude audit lines from response
// Required: false // Required: false
ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"` ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
} }
// List gets audit records for the specified account object // List gets audit records for the specified account object

View File

@@ -38,6 +38,9 @@ type ItemAudit struct {
// User // User
User string `json:"user"` User string `json:"user"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
// TTL // TTL
TTL string `json:"_ttl"` TTL string `json:"_ttl"`
} }
@@ -93,6 +96,9 @@ type RecordAudit struct {
// User // User
User string `json:"user"` User string `json:"user"`
// Public Session ID
PublicSessionID string `json:"public_session_id"`
// TTL // TTL
TTL string `json:"_ttl"` TTL string `json:"_ttl"`

View File

@@ -18,10 +18,6 @@ type ListVGPURequest struct {
// Required: false // Required: false
GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"` GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"`
// Find by type
// Required: false
Type string `url:"type,omitempty" json:"type,omitempty"`
// Find by status // Find by status
// Required: false // Required: false
Status string `url:"status,omitempty" json:"status,omitempty"` Status string `url:"status,omitempty" json:"status,omitempty"`

View File

@@ -114,6 +114,9 @@ type RecordGrid struct {
// Is BRO enabled // Is BRO enabled
BROEnabled bool `json:"bro_enabled"` BROEnabled bool `json:"bro_enabled"`
// Budget
Budget bool `json:"budget"`
} }
// Information about grid // Information about grid
@@ -159,6 +162,9 @@ type ItemGridList struct {
// Is BRO enabled // Is BRO enabled
BROEnabled bool `json:"bro_enabled"` BROEnabled bool `json:"bro_enabled"`
// Budget
Budget bool `json:"budget"`
} }
// List Grids // List Grids

View File

@@ -73,10 +73,10 @@ type Rule struct {
Protocol string `json:"protocol"` Protocol string `json:"protocol"`
// Priority Code Point (0-7). L2 marking // Priority Code Point (0-7). L2 marking
PCPTag uint64 `json:"pcp_tag"` PCPTag *uint64 `json:"pcp_tag"`
// DSCP value (0-63). L3 marking // DSCP value (0-63). L3 marking
DSCPValue uint64 `json:"dscp_value"` DSCPValue *uint64 `json:"dscp_value"`
// Source IP address // Source IP address
SrcIP string `json:"src_ip"` SrcIP string `json:"src_ip"`

View File

@@ -16,11 +16,11 @@ type UpdateRequest struct {
// New QoS policy name // New QoS policy name
// Required: false // Required: false
Name string `url:"name,omitempty" json:"name,omitempty"` Name *string `url:"name,omitempty" json:"name,omitempty"`
// New QoS policy description // New QoS policy description
// Required: false // Required: false
Description string `url:"description,omitempty" json:"description,omitempty"` Description *string `url:"description,omitempty" json:"description,omitempty"`
} }
func (qp QoSPolicy) Update(ctx context.Context, req UpdateRequest) (*RecordQoSPolicy, error) { func (qp QoSPolicy) Update(ctx context.Context, req UpdateRequest) (*RecordQoSPolicy, error) {

View File

@@ -0,0 +1,8 @@
package cloudbroker
import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/session"
// Accessing the session method group
func (cb *CloudBroker) Session() *session.Session {
return session.New(cb.client)
}

View File

@@ -0,0 +1,53 @@
package session
// FilterByID returns ListSession with specified ID.
func (lsession ListSession) FilterByID(id string) ListSession {
predicate := func(rsession ItemSession) bool {
return rsession.PublicSessionID == id
}
return lsession.FilterFunc(predicate)
}
// FilterByName returns ListSession with specified User.
func (lsession ListSession) FilterByUser(user string) ListSession {
predicate := func(rsession ItemSession) bool {
return rsession.User == user
}
return lsession.FilterFunc(predicate)
}
// FilterByObjStatus returns ListSession with specified IP.
func (lsession ListSession) FilterByIP(ip string) ListSession {
predicate := func(rsession ItemSession) bool {
return rsession.IP == ip
}
return lsession.FilterFunc(predicate)
}
// FilterFunc allows filtering ListSession based on user-specified predicate.
func (lsession ListSession) FilterFunc(predicate func(session ItemSession) bool) ListSession {
var result ListSession
for _, item := range lsession.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns first found ItemSession
// If none was found, returns an empty struct.
func (lsession ListSession) FindOne() ItemSession {
if len(lsession.Data) == 0 {
return ItemSession{}
}
return lsession.Data[0]
}

View File

@@ -0,0 +1,54 @@
package session
import "testing"
var sessions = ListSession{
Data: []ItemSession{
{
PublicSessionID: "06674bdf-13f1-4f78-a40a-242fd76e4cd1",
IP: "10.244.0.243",
User: "someuser",
},
{
PublicSessionID: "06674bdf-13f1-4f78-a40a-242fd76e4cd5",
IP: "10.244.0.242",
User: "someuser2",
},
{
PublicSessionID: "06674bdf-13f1-4f78-a40a-242fd76e4cd7",
IP: "10.244.0.243",
User: "someuser2",
},
},
EntryCount: 3,
}
func TestFilterByID(t *testing.T) {
actual := sessions.FilterByID("06674bdf-13f1-4f78-a40a-242fd76e4cd1").FindOne()
if actual.PublicSessionID != "06674bdf-13f1-4f78-a40a-242fd76e4cd1" {
t.Fatal("expected ID 1, found: ", actual.PublicSessionID)
}
}
func TestFilterByUser(t *testing.T) {
actual := sessions.FilterByUser("someuser").FindOne()
if actual.User != "someuser" {
t.Fatal("expected User 'someuser', found: ", actual.User)
}
}
func TestFilterByIP(t *testing.T) {
actual := sessions.FilterByIP("10.244.0.243")
if len(actual.Data) != 2 {
t.Fatal("expected 2 found, actual: ", len(actual.Data))
}
for _, item := range actual.Data {
if item.IP != "10.244.0.243" {
t.Fatal("expected IP '10.244.0.243', found: ", item.IP)
}
}
}

View File

@@ -0,0 +1,46 @@
package session
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetRequest struct to get Session parameters
type GetRequest struct {
// Storage endpoint provider ID
// Required: true
PublicSessionID string `url:"public_session_id" json:"public_session_id" validate:"required"`
}
// Get gets Session parameters as a RecordSession struct
func (s Session) Get(ctx context.Context, req GetRequest) (*RecordSession, error) {
res, err := s.GetRaw(ctx, req)
if err != nil {
return nil, err
}
info := RecordSession{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}
// GetRaw gets Session parameters as an array of bytes
func (s Session) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/session/get"
res, err := s.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,10 @@
package session
// IDs gets array of PublicSessionIDs from ListSession struct
func (ls ListSession) IDs() []string {
res := make([]string, 0, len(ls.Data))
for _, s := range ls.Data {
res = append(res, s.PublicSessionID)
}
return res
}

View File

@@ -0,0 +1,79 @@
package session
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type ListRequest struct {
// Filter by username
User string `url:"user,omitempty" json:"user,omitempty"`
// Filter by authorization system (bvs, decs3o, password)
AuthorizeSystem string `url:"authorize_system,omitempty" json:"authorize_system,omitempty"`
// Filter by public session ID (UUID)
PublicSessionID string `url:"public_session_id,omitempty" json:"public_session_id,omitempty"`
// Filter by sub from JWT
Sub string `url:"sub,omitempty" json:"sub,omitempty"`
// Filter by sid from JWT
SID uint64 `url:"sid,omitempty" json:"sid,omitempty"`
// Filter sessions with login_time >= timestamp (Unix timestamp)
TimestampAt uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
// Filter sessions with login_time <= timestamp (Unix timestamp)
TimestampTo uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
// Filter sessions active at this timestamp (login_time <= T < logout_time/expires_at)
ActiveAt uint64 `url:"active_at,omitempty" json:"active_at,omitempty"`
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty"`
}
// List gets list of sessions as a ListSession struct
func (s Session) List(ctx context.Context, req ListRequest) (*ListSession, error) {
res, err := s.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListSession{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of sessions as an array of bytes
func (s Session) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/session/list"
res, err := s.client.DecortApiCall(ctx, http.MethodGet, url, req)
return res, err
}

View File

@@ -0,0 +1,85 @@
package session
// Main information about a session
type RecordSession struct {
// Public session ID
PublicSessionID string `json:"public_session_id"`
// Username
User string `json:"user"`
// Subject from JWT
Sub string `json:"sub"`
// Session ID from JWT
SID string `json:"sid"`
// Authorization system
AuthorizeSystem string `json:"authorize_system"`
// Client IP address
IP string `json:"ip"`
// Client User-Agent
UserAgent string `json:"user_agent"`
// First login time
LoginTime string `json:"login_time"`
// Last activity time
UpdatedAt string `json:"updated_at"`
// Logout time
LogoutTime string `json:"logout_time"`
// Session expiration time
Expires string `json:"expires"`
// OAuth provider type
OAuthType string `json:"oauth_type"`
}
// List of sessions
type ListSession struct {
// Data
Data []ItemSession `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
// A session item
type ItemSession struct {
// Public session ID
PublicSessionID string `json:"public_session_id"`
// Username
User string `json:"user"`
// Subject from JWT
Sub string `json:"sub"`
// Session ID from JWT
SID string `json:"sid"`
// Authorization system
AuthorizeSystem string `json:"authorize_system"`
// Client IP address
IP string `json:"ip"`
// Client User-Agent
UserAgent string `json:"user_agent"`
// First login time
LoginTime string `json:"login_time"`
// Last activity time
UpdatedAt string `json:"updated_at"`
// Logout time
LogoutTime string `json:"logout_time"`
// Session expiration time
Expires string `json:"expires"`
}

View File

@@ -0,0 +1,18 @@
// Operator actions for handling interventions on a session
package session
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
)
// Structure for creating request to session
type Session struct {
client interfaces.Caller
}
// Builder for Session endpoints
func New(client interfaces.Caller) *Session {
return &Session{
client: client,
}
}

View File

@@ -173,6 +173,9 @@ type ItemInterface struct {
// QOS // QOS
QOS QOS `json:"qos"` QOS QOS `json:"qos"`
// List of QoS policies
QoSPolicies []uint64 `json:"qos_policies"`
// Target // Target
Target string `json:"target"` Target string `json:"target"`

View File

@@ -6,6 +6,7 @@ import (
"testing" "testing"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/account" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/account"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/audit"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/bservice" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/bservice"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/disks" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/disks"
@@ -96,6 +97,26 @@ func TestGetListCloudAPI(t *testing.T) {
t.Errorf("Can not test Account get because account list is empty") t.Errorf("Can not test Account get because account list is empty")
} }
// Audit
// List
bytes, err = client.CloudAPI().Audit().ListRaw(context.Background(), audit.ListRequest{})
if err != nil {
t.Error(err)
}
getResult("Audit list", bytes, audit.ListAudits{}, t)
// Get
listAudits, _ := client.CloudAPI().Audit().List(context.Background(), audit.ListRequest{})
if len(listAudits.Data) > 0 {
id := listAudits.Data[0].GUID
bytes, err = client.CloudAPI().Audit().GetRaw(context.Background(), audit.GetRequest{AuditGuid: id})
if err != nil {
t.Error(err)
}
getResult("Audit get", bytes, audit.RecordAudit{}, t)
} else {
t.Errorf("Can not test Audit get because Audit list is empty")
}
// Bservice // Bservice
// List // List
bytes, err = client.CloudAPI().BService().ListRaw(context.Background(), bservice.ListRequest{}) bytes, err = client.CloudAPI().BService().ListRaw(context.Background(), bservice.ListRequest{})

View File

@@ -63,6 +63,7 @@ import (
rg_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/rg" rg_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/rg"
secgroup_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/secgroup" secgroup_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/secgroup"
sep_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep" sep_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/session"
stpolicy_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stpolicy" stpolicy_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stpolicy"
tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks" tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks"
trunk_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk" trunk_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
@@ -229,10 +230,6 @@ func getRequestsMapCloudAPI() map[string]interface{} {
"/restmachine/cloudapi/compute/guest_agent_feature_get": compute.GuestAgentFeatureGetRequest{}, "/restmachine/cloudapi/compute/guest_agent_feature_get": compute.GuestAgentFeatureGetRequest{},
"/restmachine/cloudapi/compute/guest_agent_feature_update": compute.GuestAgentFeatureUpdateRequest{}, "/restmachine/cloudapi/compute/guest_agent_feature_update": compute.GuestAgentFeatureUpdateRequest{},
"/restmachine/cloudapi/compute/migrateToZone": compute.MigrateToZoneRequest{}, "/restmachine/cloudapi/compute/migrateToZone": compute.MigrateToZoneRequest{},
"/restmachine/cloudapi/rg/add_acl_access": compute.AddACLAccessRequest{},
"/restmachine/cloudapi/rg/del_acl_access": compute.DeleteACLAccessRequest{},
"/restmachine/cloudapi/rg/update_acl_access": compute.UpdateACLAccessRequest{},
"restmachine/cloudapi/rg/get_acl_access": compute.GetACLAccessRequest{},
// disks // disks
"/restmachine/cloudapi/disks/change_disk_storage_policy": disks.ChangeDiskStoragePolicyRequest{}, "/restmachine/cloudapi/disks/change_disk_storage_policy": disks.ChangeDiskStoragePolicyRequest{},
@@ -418,7 +415,7 @@ func getRequestsMapCloudAPI() map[string]interface{} {
"/restmachine/cloudapi/rg/add_acl_access": rg.AddACLAccessRequest{}, "/restmachine/cloudapi/rg/add_acl_access": rg.AddACLAccessRequest{},
"/restmachine/cloudapi/rg/del_acl_access": rg.DeleteACLAccessRequest{}, "/restmachine/cloudapi/rg/del_acl_access": rg.DeleteACLAccessRequest{},
"/restmachine/cloudapi/rg/update_acl_access": rg.UpdateACLAccessRequest{}, "/restmachine/cloudapi/rg/update_acl_access": rg.UpdateACLAccessRequest{},
"restmachine/cloudapi/rg/get_acl_access": rg.GetACLAccessRequest{}, "/restmachine/cloudapi/rg/get_acl_access": rg.GetACLAccessRequest{},
// security_group // security_group
"/restmachine/cloudapi/security_group/create": secgroup.CreateRequest{}, "/restmachine/cloudapi/security_group/create": secgroup.CreateRequest{},
@@ -682,10 +679,6 @@ func getRequestsMapCloudbroker() map[string]interface{} {
"/restmachine/cloudbroker/compute/migrate_abort": compute_cb.MigrateAbortRequest{}, "/restmachine/cloudbroker/compute/migrate_abort": compute_cb.MigrateAbortRequest{},
"/restmachine/cloudbroker/compute/start_migration_out": compute_cb.StartMigrationOutRequest{}, "/restmachine/cloudbroker/compute/start_migration_out": compute_cb.StartMigrationOutRequest{},
"/restmachine/cloudbroker/compute/stop_migration_out": compute_cb.StopMigrationOutRequest{}, "/restmachine/cloudbroker/compute/stop_migration_out": compute_cb.StopMigrationOutRequest{},
"/restmachine/cloudbroker/rg/add_acl_access": compute_cb.AddACLAccessRequest{},
"/restmachine/cloudbroker/rg/del_acl_access": compute_cb.DeleteACLAccessRequest{},
"/restmachine/cloudbroker/rg/update_acl_access": compute_cb.UpdateACLAccessRequest{},
"restmachine/cloudbroker/rg/get_acl_access": compute_cb.GetACLAccessRequest{},
// disks // disks
"/restmachine/cloudbroker/disks/change_disk_storage_policy": disks_cb.ChangeDiskStoragePolicyRequest{}, "/restmachine/cloudbroker/disks/change_disk_storage_policy": disks_cb.ChangeDiskStoragePolicyRequest{},
@@ -996,7 +989,7 @@ func getRequestsMapCloudbroker() map[string]interface{} {
"/restmachine/cloudbroker/rg/add_acl_access": rg_cb.AddACLAccessRequest{}, "/restmachine/cloudbroker/rg/add_acl_access": rg_cb.AddACLAccessRequest{},
"/restmachine/cloudbroker/rg/del_acl_access": rg_cb.DeleteACLAccessRequest{}, "/restmachine/cloudbroker/rg/del_acl_access": rg_cb.DeleteACLAccessRequest{},
"/restmachine/cloudbroker/rg/update_acl_access": rg_cb.UpdateACLAccessRequest{}, "/restmachine/cloudbroker/rg/update_acl_access": rg_cb.UpdateACLAccessRequest{},
"restmachine/cloudbroker/rg/get_acl_access": rg_cb.GetACLAccessRequest{}, "/restmachine/cloudbroker/rg/get_acl_access": rg_cb.GetACLAccessRequest{},
// security_group // security_group
"/restmachine/cloudbroker/security_group/create": secgroup_cb.CreateRequest{}, "/restmachine/cloudbroker/security_group/create": secgroup_cb.CreateRequest{},
@@ -1032,6 +1025,10 @@ func getRequestsMapCloudbroker() map[string]interface{} {
"/restmachine/cloudbroker/sep/sharedLockStart": sep_cb.SharedLockStartRequest{}, "/restmachine/cloudbroker/sep/sharedLockStart": sep_cb.SharedLockStartRequest{},
"/restmachine/cloudbroker/sep/getTemplate": sep_cb.GetTemplateRequest{}, "/restmachine/cloudbroker/sep/getTemplate": sep_cb.GetTemplateRequest{},
// session
"/restmachine/cloudbroker/session/get": session.GetRequest{},
"/restmachine/cloudbroker/session/list": session.ListRequest{},
// storage_policy // storage_policy
"/restmachine/cloudbroker/storage_policy/get": stpolicy_cb.GetRequest{}, "/restmachine/cloudbroker/storage_policy/get": stpolicy_cb.GetRequest{},
"/restmachine/cloudbroker/storage_policy/list": stpolicy_cb.ListRequest{}, "/restmachine/cloudbroker/storage_policy/list": stpolicy_cb.ListRequest{},