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", }, }, }