diff --git a/CHANGELOG.md b/CHANGELOG.md
index c032147..420f0fb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## Version 14.8.0
+## Version 14.9.0
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и в следующих версиях будут удалены
@@ -9,86 +9,7 @@
### Добавлено
-#### resource optimizer
+#### vgpu
| Идентификатор
задачи | Описание |
| --- | --- |
-| BGOS-842 | Опциональные поля `Username`, `Password`, `BroadcastAddr`, `PingAddr`, `SSLSkipVerify` и `Domain` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
-| BGOS-842 | Обязательное поле `SSOType` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
-
-#### grid
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-846 | Вычисляемое поле `BROEnabled` в структуры ответов `RecordGrid` и `ItemGridList` в cloudbroker/grid |
-
-#### locations
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-845 | Вычисляемое поле `BROEnabled` в структуру ответа `ItemLocation` в cloudapi/locations |
-
-#### zone
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-841 | Вычисляемые поля `PingAddr`, `BroadcastAddr`, `SSLSkipVerify` и `Domain` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
-| BGOS-844 | Вычисляемое поле `SSOType` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
-
-#### SDN segments
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-798 | Опциональное поле `OperationStatus` в структуру запроса `ListRequest` в sdn/segments |
-| BGOS-798 | Опциональные поля `Type` в структуры запросов `CreateRequest` и `UpdateRequest` в sdn/segments |
-| BGOS-798 | Метод `GetFAA`, структура запроса `GetFAARequest` и структура ответа `GetFAAResponse` в sdn/segments |
-| BGOS-798 | Вычисляемые поля `Type` и `L2ConnectionPort` в структуру ответа `SegmentResponse` в sdn/segments |
-| BGOS-798 | Вычисляемое поле `OperationStatus` в структуры `Status` и `HypervisorStatus`, структуры `L2ConnectionPort` и `L2ExternalNetwork` в sdn/segments |
-
-#### SDN network object groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-837 | Опциональные поля `Addresses` и `L2ConnectionPortsBindings` в структуру запроса `CreateRequest` в sdn/netobjgroups |
-| BGOS-837 | Опциональное поле `Addresses` в структуру запроса `UpdateRequest` в sdn/netobjgroups |
-| BGOS-837 | Поле `PortBindings` и структура `DetachLogicalPortBinding` в структуру запроса `DetachLogicalPortsRequest` в sdn/netobjgroups |
-| BGOS-837 | Поля `Purpose`, `Type`, `Addresses`, `L2ConnectionPorts` в структуру ответа `RecordNetObjGroup` в sdn/netobjgroups |
-| BGOS-837 | Поля `AddressesCount`, `L2ConnectionPortsCount` в структуру ответа `Counter` в sdn/netobjgroups |
-| BGOS-837 | Поля `Type`, `AppliedNetObjectGroups` в структуру ответа `SecurityPolicy` в sdn/netobjgroups |
-| BGOS-837 | Поля `AccessGroupID`, `Action`, `Direction`, `DisplayName`, `Enabled`, `LogEnabled`, `LogSeverity`, `Priority`, `StatisticsEnabled`, `VersionID`, `Description`, `DestinationNetObject`, `Filter`, `ID`, `LogName`, `SecurityPolicyID`, `SourceNetObject` и `Type` в структуру ответа `SecurityRule` в sdn/netobjgroups |
-| BGOS-837 | Поля `ExcludeFirewall`, `Labels` в структуру ответа `LogicalPort` в sdn/netobjgroups |
-| BGOS-837 | Поля `AccessGroupID`, `AccessGroupName` в структуру ответа `ExternalNetworkPort` в sdn/netobjgroups |
-
-### Исправлено
-
-#### SDN access groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-836 | Тип возвращаемого значения с `bool` на `string` в методе `Delete` в sdn/acsgroups |
-
-#### SDN hypervisors
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-847 | Тип вычисляемого поля `Ports` с `[]string` на структуру `Ports` в структуре ответа `RecordHypervisor` в sdn/hypervisors |
-
-#### SDN hetwork object groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-837 | Тип ответа метода `AttachExtNetPorts` с `bool` на `*RecordVersion` в sdn/netobjgroups |
-| BGOS-837 | Тип ответа метода `AttachLogicalPorts` с `bool` на `*RecordVersion` в sdn/netobjgroups |
-| BGOS-837 | Поле `Common` на `OperationStatus` в структуре `Status` в sdn/netobjgroups |
-| BGOS-837 | Поле `Status` на `OperationStatus` в структуре `HypervisorInfo` в sdn/netobjgroups |
-| BGOS-837 | Тип поля `VersionID` со `string` на `uint64` в структуре `ExternalNetworkPort` в sdn/netobjgroups |
-| BGOS-837 | Тип поля `VLANTag` со `string` на `int` в структуре `ExternalNetworkPort` в sdn/netobjgroups |
-
-### Удалено
-
-#### SDN access groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-836 | Поля `CreatedBy` и `UpdatedBy` в структуре ответа `AccessGroup` в sdn/acsgroups |
-
-#### SDN segments
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-798 | Метод `GetStatus` и структура запроса `GetStatusRequest` в sdn/segments |
-
-#### SDN network object groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-837 | Поле `IsExcludedFromFirewall` из структуры `Bindings` в sdn/netobjgroups |
-| BGOS-837 | Поле `AppliedToNetObjectGroupID` из структуры `SecurityPolicy` в sdn/netobjgroups |
+| BGOS-851 | Группа методов `cloudapi/vgpu` |
diff --git a/README.md b/README.md
index 8b8600d..2ea32a5 100644
--- a/README.md
+++ b/README.md
@@ -123,6 +123,7 @@ go get -u repository.basistech.ru/BASIS/dynamix-golang-sdk/v14
- `Trunk` - получение информации о транковых портах;
- `VFPool` - управление пулом виртуальных сетевых функций;
- `VINS` - управление виртуальными изолированными сетями;
+- `VGPU` - управление виртуальными графическими процессорами;
- `Zone` - управление зонами.
### Cloudbroker
@@ -336,6 +337,7 @@ func main() {
- `pkg/cloudapi/trunk` - для `Trunk`
- `pkg/cloudapi/vfpool` - для `VFPool`
- `pkg/cloudapi/vins` - для `VINS`
+ - `pkg/cloudapi/vgpu` - для `VGPU`
- `pkg/cloudapi/zone` - для `Zone`
- **cloudbroker**:
- `pkg/cloudbroker/account` - для `Account`
@@ -535,6 +537,7 @@ func main() {
- `.Trunk()` - для работы с `Trunk`
- `.VFPool()` - для работы с `VFPool`
- `.VINS()` - для работы с `VINS`
+ - `.VGPU()` - для работы с `VGPU`
- `.Zone()` - для работы с `Zone`
Доступные методы для `.CloudBroker()`:
diff --git a/pkg/cloudapi/vgpu.go b/pkg/cloudapi/vgpu.go
new file mode 100644
index 0000000..f1fcdbc
--- /dev/null
+++ b/pkg/cloudapi/vgpu.go
@@ -0,0 +1,8 @@
+package cloudapi
+
+import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v14/pkg/cloudapi/vgpu"
+
+// Accessing the VGPU method group
+func (ca *CloudAPI) VGPU() *vgpu.VGPU {
+ return vgpu.New(ca.client)
+}
diff --git a/pkg/cloudapi/vgpu/ids.go b/pkg/cloudapi/vgpu/ids.go
new file mode 100644
index 0000000..0ae6338
--- /dev/null
+++ b/pkg/cloudapi/vgpu/ids.go
@@ -0,0 +1,10 @@
+package vgpu
+
+// IDs gets array of VGPU IDs from ListVGPU struct
+func (l ListVGPU) IDs() []uint64 {
+ res := make([]uint64, 0, len(l.Data))
+ for _, v := range l.Data {
+ res = append(res, v.ID)
+ }
+ return res
+}
diff --git a/pkg/cloudapi/vgpu/list.go b/pkg/cloudapi/vgpu/list.go
new file mode 100644
index 0000000..4187f0b
--- /dev/null
+++ b/pkg/cloudapi/vgpu/list.go
@@ -0,0 +1,88 @@
+package vgpu
+
+import (
+ "context"
+ "encoding/json"
+ "net/http"
+
+ "repository.basistech.ru/BASIS/dynamix-golang-sdk/v14/internal/validators"
+)
+
+// ListRequest struct to get list of VGPU
+type ListRequest struct {
+ // Find by id
+ // Required: false
+ ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
+
+ // Find by vgpu status
+ // Required: false
+ Status string `url:"status,omitempty" json:"status,omitempty"`
+
+ // Find by vgpu type
+ // Required: false
+ Type string `url:"type,omitempty" json:"type,omitempty"`
+
+ // Find by vgpu mode
+ // Required: false
+ Mode string `url:"mode,omitempty" json:"mode,omitempty"`
+
+ // Find by id resgroup
+ // Required: false
+ RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"`
+
+ // Find by account id
+ // Required: false
+ AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
+
+ // Find by compute id
+ // Required: false
+ ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"`
+
+ // Find by pgpu id
+ // Required: false
+ PGPUID uint64 `url:"pgpuId,omitempty" json:"pgpuId,omitempty"`
+
+ // Sort by one of supported fields, format +|-(field)
+ // Required: false
+ SortBy string `url:"sortBy,omitempty" json:"sortBy,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"`
+}
+
+// List gets list of all VGPU as a ListVGPU struct
+func (v VGPU) List(ctx context.Context, req ListRequest) (*ListVGPU, error) {
+
+ res, err := v.ListRaw(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ list := ListVGPU{}
+
+ err = json.Unmarshal(res, &list)
+ if err != nil {
+ return nil, err
+ }
+
+ return &list, nil
+}
+
+// ListRaw gets list of all VGPU as an array of bytes
+func (v VGPU) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
+
+ err := validators.ValidateRequest(req)
+ if err != nil {
+ return nil, validators.ValidationErrors(validators.GetErrors(err))
+ }
+
+ url := "/cloudapi/vgpu/list"
+
+ res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req)
+ return res, err
+}
diff --git a/pkg/cloudapi/vgpu/models.go b/pkg/cloudapi/vgpu/models.go
new file mode 100644
index 0000000..696f4bf
--- /dev/null
+++ b/pkg/cloudapi/vgpu/models.go
@@ -0,0 +1,69 @@
+package vgpu
+
+type ItemVGPU struct {
+ // Account ID
+ AccountID uint64 `json:"accountId"`
+
+ // Created time
+ CreatedTime uint64 `json:"createdTime"`
+
+ // Deleted time
+ DeletedTime uint64 `json:"deletedTime"`
+
+ //Grid ID
+ GID uint64 `json:"gid"`
+
+ // GUID
+ GUID uint64 `json:"guid"`
+
+ // VGPU ID
+ ID uint64 `json:"id"`
+
+ // Last claimed by
+ LastClaimedBy uint64 `json:"lastClaimedBy"`
+
+ // Last update time
+ LastUpdateTime uint64 `json:"lastUpdateTime"`
+
+ // Mode
+ Mode string `json:"mode"`
+
+ // Bus number
+ BusNumber int `json:"bus_number"`
+
+ // PCI Slot
+ PCISlot int `json:"pciSlot"`
+
+ // PGPUID
+ PGPUID uint64 `json:"pgpuid"`
+
+ // Profile ID
+ ProfileID uint64 `json:"profileId"`
+
+ // RAM
+ RAM uint64 `json:"ram"`
+
+ // Reference ID
+ ReferenceID string `json:"referenceId"`
+
+ // RGID
+ RGID uint64 `json:"rgId"`
+
+ // Status
+ Status string `json:"status"`
+
+ // Type
+ Type string `json:"type"`
+
+ // VMID
+ VMID uint64 `json:"vmid"`
+}
+
+// List of VGPU
+type ListVGPU struct {
+ // Data
+ Data []ItemVGPU `json:"data"`
+
+ // Entry count
+ EntryCount uint64 `json:"entryCount"`
+}
diff --git a/pkg/cloudapi/vgpu/serialize.go b/pkg/cloudapi/vgpu/serialize.go
new file mode 100644
index 0000000..cc444b2
--- /dev/null
+++ b/pkg/cloudapi/vgpu/serialize.go
@@ -0,0 +1,43 @@
+package vgpu
+
+import (
+ "encoding/json"
+
+ "repository.basistech.ru/BASIS/dynamix-golang-sdk/v14/internal/serialization"
+)
+
+// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
+//
+// In order to serialize with indent make sure to follow these guidelines:
+// - First argument -> prefix
+// - Second argument -> indent
+func (l ListVGPU) Serialize(params ...string) (serialization.Serialized, error) {
+ if len(l.Data) == 0 {
+ return []byte{}, nil
+ }
+
+ if len(params) > 1 {
+ prefix := params[0]
+ indent := params[1]
+
+ return json.MarshalIndent(l, prefix, indent)
+ }
+
+ return json.Marshal(l)
+}
+
+// Serialize returns JSON-serialized []byte. Used as a wrapper over json.Marshal and json.MarshalIndent functions.
+//
+// In order to serialize with indent make sure to follow these guidelines:
+// - First argument -> prefix
+// - Second argument -> indent
+func (i ItemVGPU) Serialize(params ...string) (serialization.Serialized, error) {
+ if len(params) > 1 {
+ prefix := params[0]
+ indent := params[1]
+
+ return json.MarshalIndent(i, prefix, indent)
+ }
+
+ return json.Marshal(i)
+}
diff --git a/pkg/cloudapi/vgpu/vgpu.go b/pkg/cloudapi/vgpu/vgpu.go
new file mode 100644
index 0000000..8c3e81e
--- /dev/null
+++ b/pkg/cloudapi/vgpu/vgpu.go
@@ -0,0 +1,15 @@
+package vgpu
+
+import "repository.basistech.ru/BASIS/dynamix-golang-sdk/v14/interfaces"
+
+// Structure for creating request to VGPU
+type VGPU struct {
+ client interfaces.Caller
+}
+
+// Builder for VGPU endpoints
+func New(client interfaces.Caller) *VGPU {
+ return &VGPU{
+ client: client,
+ }
+}
diff --git a/pkg/sdn/acsgroups/filter_test.go b/pkg/sdn/acsgroups/filter_test.go
index bb55a21..78832e4 100644
--- a/pkg/sdn/acsgroups/filter_test.go
+++ b/pkg/sdn/acsgroups/filter_test.go
@@ -11,21 +11,18 @@ var testAccessGroups = AccessGroupList{
DisplayName: "Developers",
Comment: "First group",
CreatedAt: "2023-01-01",
- CreatedBy: "admin",
},
{
ID: "group2",
DisplayName: "Admins",
Comment: "Second group",
CreatedAt: "2023-01-02",
- CreatedBy: "admin",
},
{
ID: "group3",
DisplayName: "Users",
Comment: "Third group",
CreatedAt: "2023-01-03",
- CreatedBy: "admin",
},
},
}