diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c3b14..80778a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 1.16.1 +## Version 1.16.2 ### Deprecated @@ -21,97 +21,40 @@ ### Добавлено -#### account +#### audit | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1007 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/account и в cloudbroker/account | -| BGOS-1007 | Структура запроса `DelACLAccessRequest` и метод `DelACLAccess` в cloudapi/account и в cloudbroker/account | -| BGOS-1007 | Структура запроса `UpdateACLAccessRequest` и метод `UpdateACLAccess` в cloudapi/account и в cloudbroker/account | +| BGOS-1025 | Вычисляемое поле `PublicSessionID` в структуры ответа `ItemAudit` и `RecordAudit` в cloudbroker/audit и cloudapi/audit | +| BGOS-1025 | Опциональное поле `PublicSessionID` в структуру запроса `ListRequest` в cloudbroker/audit и cloudapi/audit | -#### backup +#### grid | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1012 | Методы `AbortDisksBackup`, `BackupDisksWithSpeed`, `Info` и `SetBackupSpeed` в cloudbroker/backup | -| BGOS-1012 | Структуры ответов `ListDisksWithSpeed` и `TotalBackupsInfo` в cloudbroker/backup | -| BGOS-1018 | Опциональное поле `Speed` в структуры запроса `CreateDiskBackupRequest` и `Disk` в cloudbroker/backup | +| BGOS-1028 | Вычисляемое поле `Budget` в структуры ответа `ItemGridList` и `RecordGrid` в cloudbroker/grid | - -#### compute +#### vins | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1009 | Структура запроса `AddACLAccessRequest` и метод `AddACLAccess` в cloudapi/compute и в cloudbroker/compute | -| 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 | +| BGOS-1027 | Вычисляемое поле `QoSPolicies` в структуру ответа `ItemVNFInterface` в cloudbroker/vins и cloudapi/vins | -#### disks +#### session | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1015 | Методы `DeleteAsync`, `DeleteDisksAsync`, `LimitIOAsync`, `RenameAsync`, `ReplicateAsync`, `ReplicationResumeAsync`, `ReplicationReverseAsync`, `ReplicationStartAsync`, `ReplicationStopAsync`, `ReplicationSuspendAsync`, `Resize2Async`, `RestoreAsync`, `ShareAsync`, `UnshareAsync`, `SnapshotDeleteAsync`, `SnapshotRollbackAsync`, `ChangeDiskStoragePolicyAsync` в cloudapi/disks | -| 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 | +| BGOS-1026 | Группа ручек cloudbroker/session | -#### vgpu -| Идентификатор задачи | Описание | -| --- | --- | -| BGOS-1011 | Вычисляемое поле `ProfileName` в структуру ответа `ItemVGPU` в cloudbroker/vgpu и cloudapi/vgpu | - - -### Удалено - -#### account -| Идентификатор задачи | Описание | -| --- | --- | -| BGOS-1021 | Вычисляемое поле `CanBeDeleted` из структуры ответа `ListRecordACL` в cloudapi/account | +### Изменено #### network qos policy | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1017 | Вычисляемые поля `CreatedAt`, `UpdatedAt`, `CreatedBy` и `UpdatedBy` из структур ответа `ItemQoSPolicy` и `RecordQoSPolicy` в cloudapi/qospolicy и cloudbroker/qospolicy | -| BGOS-1017 | Методы `FilterByCreatedBy` и `FilterByUpdatedBy` из cloudapi/qospolicy и cloudbroker/qospolicy | -| BGOS-1017 | Методы `SortByCreatedAt` и `SortByUpdatedAt` из cloudapi/qospolicy и cloudbroker/qospolicy | +| BGOS-1030 | Тип вычисляемых полей `PCPTag` и `DSCPValue` с `uint64` на `*uint64` в структуре ответа `Rule` в cloudapi/qospolicy и cloudbroker/qospolicy | +| BGOS-1030 | Тип опциональных полей `Name` и `Description` с `string` на `*string` в структуре запроса `UpdateRequest` в cloudapi/qospolicy и cloudbroker/qospolicy | -#### pcidevice + +### Удалено + +#### compute | Идентификатор задачи | Описание | | --- | --- | -| BGOS-990 | Опциональное поле `RGID` из структуры запроса `ListRequest` в cloudapi/pcidevice и из структур запроса `CreateRequest` и `ListRequest` в cloudbroker/pcidevice | -| BGOS-990 | Вычисляемое поле `RGID` из структуры ответа `ItemPCIDevice` в cloudapi/pcidevice и из структуры ответа `ItemPCIDevice` в cloudbroker/pcidevice | +| BGOS-1029 | Опциональное поле `Type` из структуры запроса `ListVGPURequest` в cloudbroker/compute и cloudapi/compute | diff --git a/README.md b/README.md index fe23535..09f16e1 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `RG` - управление ресурсными группами аккаунта; - `Security group` – управление группами безопасности; - `SEP` - управление storage endpoint (sep); +- `Session` - получение информации о сессиях; - `Storage policy` – управление политиками хранения; - `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера); - `Trunk` - управление транковыми портами; @@ -378,6 +379,7 @@ func main() { - `pkg/cloudbroker/rg` - для `RG` - `pkg/cloudbroker/secgroup` - для `Security group` - `pkg/cloudbroker/sep` - для `SEP` + - `pkg/cloudbroker/session` - для `Session` - `pkg/cloudbroker/stpolicy` - для `Storage policy` - `pkg/cloudbroker/tasks` - для `Tasks` - `pkg/cloudbroker/trunk` - для `Trunk` @@ -581,6 +583,7 @@ func main() { - `.RG()` - для работы с `RG` - `.SecurityGroup()` - для работы с `Security Group` - `.SEP()` - для работы с `SEP` + - `.Session()` - для работы с `Session` - `.StPolicy()` - для работы с `Storage Policy` - `.Tasks()` - для работы с `Tasks` - `.Trunk()` - для работы с `Trunk` diff --git a/pkg/cloudapi/audit/list.go b/pkg/cloudapi/audit/list.go index 9f833c2..c207e33 100644 --- a/pkg/cloudapi/audit/list.go +++ b/pkg/cloudapi/audit/list.go @@ -90,6 +90,9 @@ type ListRequest struct { // Exclude audit lines from response // Required: false 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 diff --git a/pkg/cloudapi/audit/models.go b/pkg/cloudapi/audit/models.go index 98626cf..7bf866f 100644 --- a/pkg/cloudapi/audit/models.go +++ b/pkg/cloudapi/audit/models.go @@ -2,7 +2,6 @@ package audit // Main info about audit type RecordAudit struct { - // Arguments Arguments string `json:"args"` @@ -41,6 +40,9 @@ type RecordAudit struct { // User User string `json:"user"` + + // Public Session ID + PublicSessionID string `json:"public_session_id"` } // Main info about audit @@ -81,6 +83,9 @@ type ItemAudit struct { // User User string `json:"user"` + // Public Session ID + PublicSessionID string `json:"public_session_id"` + // TTL TTL string `json:"_ttl"` } diff --git a/pkg/cloudapi/compute/list_vgpu.go b/pkg/cloudapi/compute/list_vgpu.go index a119054..4daacdc 100644 --- a/pkg/cloudapi/compute/list_vgpu.go +++ b/pkg/cloudapi/compute/list_vgpu.go @@ -18,10 +18,6 @@ type ListVGPURequest struct { // Required: false GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"` - // Find by type - // Required: false - Type string `url:"type,omitempty" json:"type,omitempty"` - // Find by status // Required: false Status string `url:"status,omitempty" json:"status,omitempty"` diff --git a/pkg/cloudapi/qospolicy/models.go b/pkg/cloudapi/qospolicy/models.go index 48b8017..62fbb59 100644 --- a/pkg/cloudapi/qospolicy/models.go +++ b/pkg/cloudapi/qospolicy/models.go @@ -73,10 +73,10 @@ type Rule struct { Protocol string `json:"protocol"` // Priority Code Point (0-7). L2 marking - PCPTag uint64 `json:"pcp_tag"` + PCPTag *uint64 `json:"pcp_tag"` // DSCP value (0-63). L3 marking - DSCPValue uint64 `json:"dscp_value"` + DSCPValue *uint64 `json:"dscp_value"` // Source IP address SrcIP string `json:"src_ip"` diff --git a/pkg/cloudapi/qospolicy/update.go b/pkg/cloudapi/qospolicy/update.go index c6d7739..ef4a731 100644 --- a/pkg/cloudapi/qospolicy/update.go +++ b/pkg/cloudapi/qospolicy/update.go @@ -16,11 +16,11 @@ type UpdateRequest struct { // New QoS policy name // Required: false - Name string `url:"name,omitempty" json:"name,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` // New QoS policy description // 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) { diff --git a/pkg/cloudapi/vins/models.go b/pkg/cloudapi/vins/models.go index 5f6bf89..ed6090e 100644 --- a/pkg/cloudapi/vins/models.go +++ b/pkg/cloudapi/vins/models.go @@ -329,6 +329,9 @@ type ItemVNFInterface struct { // QOS QOS QOS `json:"qos"` + // List of QoS policies + QoSPolicies []uint64 `json:"qos_policies"` + // Target Target string `json:"target"` diff --git a/pkg/cloudbroker/audit/list.go b/pkg/cloudbroker/audit/list.go index 4e1e649..f85dd09 100644 --- a/pkg/cloudbroker/audit/list.go +++ b/pkg/cloudbroker/audit/list.go @@ -94,6 +94,9 @@ type ListRequest struct { // Exclude audit lines from response // Required: false 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 diff --git a/pkg/cloudbroker/audit/models.go b/pkg/cloudbroker/audit/models.go index f232bf5..556514e 100644 --- a/pkg/cloudbroker/audit/models.go +++ b/pkg/cloudbroker/audit/models.go @@ -38,6 +38,9 @@ type ItemAudit struct { // User User string `json:"user"` + // Public Session ID + PublicSessionID string `json:"public_session_id"` + // TTL TTL string `json:"_ttl"` } @@ -93,6 +96,9 @@ type RecordAudit struct { // User User string `json:"user"` + // Public Session ID + PublicSessionID string `json:"public_session_id"` + // TTL TTL string `json:"_ttl"` diff --git a/pkg/cloudbroker/compute/list_vgpu.go b/pkg/cloudbroker/compute/list_vgpu.go index b412d9b..3f4a452 100644 --- a/pkg/cloudbroker/compute/list_vgpu.go +++ b/pkg/cloudbroker/compute/list_vgpu.go @@ -18,10 +18,6 @@ type ListVGPURequest struct { // Required: false GPUID uint64 `url:"gpuId,omitempty" json:"gpuId,omitempty"` - // Find by type - // Required: false - Type string `url:"type,omitempty" json:"type,omitempty"` - // Find by status // Required: false Status string `url:"status,omitempty" json:"status,omitempty"` diff --git a/pkg/cloudbroker/grid/models.go b/pkg/cloudbroker/grid/models.go index 83cd808..d71fd10 100644 --- a/pkg/cloudbroker/grid/models.go +++ b/pkg/cloudbroker/grid/models.go @@ -114,6 +114,9 @@ type RecordGrid struct { // Is BRO enabled BROEnabled bool `json:"bro_enabled"` + + // Budget + Budget bool `json:"budget"` } // Information about grid @@ -159,6 +162,9 @@ type ItemGridList struct { // Is BRO enabled BROEnabled bool `json:"bro_enabled"` + + // Budget + Budget bool `json:"budget"` } // List Grids diff --git a/pkg/cloudbroker/qospolicy/models.go b/pkg/cloudbroker/qospolicy/models.go index 48b8017..62fbb59 100644 --- a/pkg/cloudbroker/qospolicy/models.go +++ b/pkg/cloudbroker/qospolicy/models.go @@ -73,10 +73,10 @@ type Rule struct { Protocol string `json:"protocol"` // Priority Code Point (0-7). L2 marking - PCPTag uint64 `json:"pcp_tag"` + PCPTag *uint64 `json:"pcp_tag"` // DSCP value (0-63). L3 marking - DSCPValue uint64 `json:"dscp_value"` + DSCPValue *uint64 `json:"dscp_value"` // Source IP address SrcIP string `json:"src_ip"` diff --git a/pkg/cloudbroker/qospolicy/update.go b/pkg/cloudbroker/qospolicy/update.go index 48a6820..56c90a9 100644 --- a/pkg/cloudbroker/qospolicy/update.go +++ b/pkg/cloudbroker/qospolicy/update.go @@ -16,11 +16,11 @@ type UpdateRequest struct { // New QoS policy name // Required: false - Name string `url:"name,omitempty" json:"name,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` // New QoS policy description // 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) { diff --git a/pkg/cloudbroker/session.go b/pkg/cloudbroker/session.go new file mode 100644 index 0000000..2b6f80d --- /dev/null +++ b/pkg/cloudbroker/session.go @@ -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) +} diff --git a/pkg/cloudbroker/session/filter.go b/pkg/cloudbroker/session/filter.go new file mode 100644 index 0000000..53540ac --- /dev/null +++ b/pkg/cloudbroker/session/filter.go @@ -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] +} diff --git a/pkg/cloudbroker/session/filter_test.go b/pkg/cloudbroker/session/filter_test.go new file mode 100644 index 0000000..8a1ed4e --- /dev/null +++ b/pkg/cloudbroker/session/filter_test.go @@ -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) + } + } +} diff --git a/pkg/cloudbroker/session/get.go b/pkg/cloudbroker/session/get.go new file mode 100644 index 0000000..fa71e08 --- /dev/null +++ b/pkg/cloudbroker/session/get.go @@ -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 +} diff --git a/pkg/cloudbroker/session/ids.go b/pkg/cloudbroker/session/ids.go new file mode 100644 index 0000000..7e3a364 --- /dev/null +++ b/pkg/cloudbroker/session/ids.go @@ -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 +} diff --git a/pkg/cloudbroker/session/list.go b/pkg/cloudbroker/session/list.go new file mode 100644 index 0000000..e300aa7 --- /dev/null +++ b/pkg/cloudbroker/session/list.go @@ -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 +} diff --git a/pkg/cloudbroker/session/models.go b/pkg/cloudbroker/session/models.go new file mode 100644 index 0000000..f647c09 --- /dev/null +++ b/pkg/cloudbroker/session/models.go @@ -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"` +} diff --git a/pkg/cloudbroker/session/session.go b/pkg/cloudbroker/session/session.go new file mode 100644 index 0000000..37213bc --- /dev/null +++ b/pkg/cloudbroker/session/session.go @@ -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, + } +} diff --git a/pkg/cloudbroker/vins/models.go b/pkg/cloudbroker/vins/models.go index d52376d..b1466e1 100644 --- a/pkg/cloudbroker/vins/models.go +++ b/pkg/cloudbroker/vins/models.go @@ -173,6 +173,9 @@ type ItemInterface struct { // QOS QOS QOS `json:"qos"` + // List of QoS policies + QoSPolicies []uint64 `json:"qos_policies"` + // Target Target string `json:"target"` diff --git a/tests/platform_upgrade/cloud_test.go b/tests/platform_upgrade/cloud_test.go index 6dbf7b1..7b4e328 100644 --- a/tests/platform_upgrade/cloud_test.go +++ b/tests/platform_upgrade/cloud_test.go @@ -6,6 +6,7 @@ import ( "testing" "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/compute" "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") } + // 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 // List bytes, err = client.CloudAPI().BService().ListRaw(context.Background(), bservice.ListRequest{}) diff --git a/tests/platform_upgrade/request_map.go b/tests/platform_upgrade/request_map.go index 72d117a..35bb630 100644 --- a/tests/platform_upgrade/request_map.go +++ b/tests/platform_upgrade/request_map.go @@ -63,6 +63,7 @@ import ( rg_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/rg" secgroup_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/secgroup" 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" tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks" 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_update": compute.GuestAgentFeatureUpdateRequest{}, "/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 "/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/del_acl_access": rg.DeleteACLAccessRequest{}, "/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 "/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/start_migration_out": compute_cb.StartMigrationOutRequest{}, "/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 "/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/del_acl_access": rg_cb.DeleteACLAccessRequest{}, "/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 "/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/getTemplate": sep_cb.GetTemplateRequest{}, + // session + "/restmachine/cloudbroker/session/get": session.GetRequest{}, + "/restmachine/cloudbroker/session/list": session.ListRequest{}, + // storage_policy "/restmachine/cloudbroker/storage_policy/get": stpolicy_cb.GetRequest{}, "/restmachine/cloudbroker/storage_policy/list": stpolicy_cb.ListRequest{},