Compare commits

...

2 Commits

Author SHA1 Message Date
befff7acd9 V1.12.4 2025-09-19 13:45:58 +03:00
dayterr
abd35f858c v1.12.3 2025-09-11 15:56:44 +03:00
108 changed files with 1781 additions and 604 deletions

View File

@@ -1,183 +1,58 @@
## Version 1.12.2
## Version 1.12.4
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
### Добавлено
#### общие изменения
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-525 | Поддержка работы с различными сontent-type |
| BGOS-514 | Пакет SDN со структурой для SDN запросов |
| BGOS-587 | Проверка срока действия и обновления JWT токена для `DecortClient`, в связи с добавлением срока действия токена |
#### account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-572 | Поля `StoragePolicyIDs` в структуре ответа `RecordAccount` в cloudapi/account и в `InfoAccount` cloudbroker/account |
| BGOS-572 | Поля `StoragePolicies` в структуре ответа `ResourceLimits` в cloudapi/account и в cloudbroker/account |
| BGOS-572 | Методы `AddStoragePolicy`, `DelStoragePolicyRequest` и структуры запросов `AddStoragePolicyRequest`, `DelStoragePolicyRequest` в cloudbroker/account |
| BGOS-572 | Обязательное поле `StoragePolicies` в структуру запроса `CreateRequest` в cloudbroker/account |
| BGOS-572 | Опциональное поле `StoragePolicies` в структуру запроса `UpdateRequest` в cloudbroker/account |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/account и в cloudbroker/account |
#### audit
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-595 | Поле `CorrelationID` в структуры ответа `RecordAudit` в cloudapi/audit и в `RecordAudit` и `ItemAudit` в cloudbroker/audit |
#### bservice
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-576 | Опциональное поле `StoragePolicyID` в структуру запроса `GroupAddRequest` в cloudapi/bservice и в структуру запроса `GroupAddRequest` в cloudbroker/bservice |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/bservice и в cloudbroker/bservice |
| BGOS-621 | Метод `List` в структура запроса `ListRequest` в cloudapi/audit |
| BGOS-621 | Опциональные поля `RGID`, `ComputeID`, `AccountID`, `VINSID`, `ServiceID`, `K8SID`, `FLIPGroupID`, `LBID`, `SEPID`, `NodeID`, `ExcludeAuditLines` в структуру запроса `ListRequest` в cloudbroker/audit |
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-569 | Опциональные поля `TimestampAT`, `TimestampTO`, `User`, `Call`, `SortBy`, `Page`, `Size`, `MinStatusCode`, `MaxStatusCode` в структуру запроса `AuditsRequest` в cloudapi/compute и в cloudbroker/compute |
| BGOS-575 | Обязательное поле `StoragePolicyID` в структуру запроса `CreateTemplateFromBlankRequest`, `DiskAddRequest`, `RedeployRequest` в cloudapi/compute и в cloudbroker/compute |
| BGOS-575 | Поле `StoragePolicyID` в структуру ответа `ItemComputeDisk` в cloudapi/compute и в структуру ответа `ItemDisk` в cloudbroker/compute |
| BGOS-580 | Поле `ZoneID` в структуру ответа `ItemCompute` в cloudapi/compute |
| BGOS-583 | Опциональные поля `SecGroups`, `EnableSecGroups` в структуру запроса `NetAttachRequest` в cloudapi/compute и в cloudbroker/compute |
| BGOS-583 | Поля `SecGroups`, `EnableSecGroups` в структуру ответа `ItemVNFInterface` в cloudapi/compute и в `ItemInterface` cloudbroker/compute |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/compute и в cloudbroker/compute |
| BGOS-592 | Опциональное поле `Enabled` в структуру запроса `NetAttachRequest` в cloudapi/compute и в cloudbroker/compute |
| BGOS-593 | Поле `ToClean` в структурах ответа `ItemComputeDisk` в cloudapi/compute и `ItemDisk` cloudbroker/compute |
#### disks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-574 | Поля `StoragePolicyID` в структуры ответа `RecordDisk` и `ItemDisk` в cloudapi/disks и в `InfoDisk` cloudbroker/disks |
| BGOS-574 | Метод `ChangeDiskStoragePolicy` и структура запроса `ChangeDiskStoragePolicyRequest` в cloudapi/disks и в cloudbroker/disks |
| BGOS-574 | Обязательное поле `StoragePolicyID` в структуры запроса `CreateRequest` и `ReplicateRequest` в cloudapi/disks и в cloudbroker/disks |
| BGOS-593 | Поле `ToClean` в структурах ответа `ItemDisk`, `RecordDisk` в cloudapi/disks и `InfoDisk` cloudbroker/disks |
#### dpdknet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-584 | Опциональное поле `EnableSecGroups` в структуру запроса `UpdateRequest` в cloudbroker/dpdknet |
| BGOS-584 | Поле `EnableSecGroups` в структуры ответа `ItemDPDKNet`, `RecordDPDKNet` в cloudapi/dpdknet и в cloudbroker/dpdknet |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/extnet и в cloudbroker/extnet |
| BGOS-584 | Опциональное поле `EnableSecGroups` в структуру запроса `UpdateRequest` в cloudbroker/extnet |
| BGOS-584 | Поле `EnableSecGroups` в структуру ответа `ItemExtNet` в cloudbroker/extnet |
| BGOS-584 | Поле `EnableSecGroups` в структуру ответа `RecordExtNet` в cloudapi/extnet и в cloudbroker/extnet |
| BGOS-613 | Поля `UpdatedTime`, `DeletedBy`, `DeviceName`, `CreatedBy` в структуру ответа `ItemComputeDisk` в cloudapi/compute и в структуру ответа `ItemDisk` в cloudbroker/compute |
| BGOS-613 | Поле `LoaderMetaIso` в структуру ответа `RecordCompute` и структура `LoaderMetaIso` в cloudapi/compute и в cloudbroker/compute |
| BGOS-616 | Опциональные поля `PCISlot` и `BusNumber` в структуры запросов `DiskAdd` и `DiskAttach` в cloudapi/compute и cloudbroker/compute |
| BGOS-619 | Методы `StartMigrationOut` и `StopMigrationOut` и структуры запросов `StartMigrationOutRequest` и `StopMigrationOutRequest` в cloudbroker/compute |
| BGOS-619 | Структура `OSUser` в структуру запроса `StopMigrationINRequest` в cloudbroker/compute |
#### image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-578 | Обязательное поле `StoragePolicyID` в структуру запроса `CreateRequest` в cloudapi/image и в структуры запроса `CreateRequest` и `CreateCDROMImageRequest` в cloudbroker/image |
| BGOS-578 | Поле `StoragePolicyID` в структуру ответа `RecordImage` в cloudapi/image и в структуры ответа `RecordImage` и `ItemImage` в cloudbroker/image |
| BGOS-578 | Метод `ChangeStoragePolicy` и структура запроса `ChangeStoragePolicyRequest` в cloudapi/image и в cloudbroker/image |
#### k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-577 | Обязательное поле `StoragePolicyID` в структуры запроса `CreateRequest` и `WorkersGroupAddRequest` в cloudapi/k8s и в структуры запроса `CreateRequest` и `WorkersGroupAddRequest` в cloudbroker/k8s |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/k8s и в cloudbroker/k8s |
#### kvmx86
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-575 | Обязательное поле `StoragePolicyID` в структуры запросов `CreateRequest`, `DataDisk`, `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 и `MassCreateRequest` в cloudbroker/kvmx86 |
| BGOS-583 | Опциональные поля `SecGroups`, `EnableSecGroups` в структуру запроса `Interface` в cloudapi/kvmx86 и в cloudbroker/kvmx86 |
| BGOS-592 | Опциональное поле `Enabled` в структуру запроса `Interface` в cloudapi/kvmx86 и в cloudbroker/kvmx86 |
#### lb
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-585 | Опциональное поле `ZoneID` в структуру запроса `ListRequest` в cloudapi/lb и в cloudbroker/lb |
#### node
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-597 | Поле `VCPU` в структуру ответа `FreeResourcesInfo` в cloudbroker/node |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-573 | Поля `StoragePolicyIDs` в структуре ответа `RecordResourceGroup` в cloudapi/rg и в `ItemRG` cloudbroker/rg |
| BGOS-573 | Поля `StoragePolicies` в структуре ответа `ResourceLimits` в cloudapi/rg и в cloudbroker/rg |
| BGOS-573 | Методы `AddStoragePolicy`, `DelStoragePolicyRequest` и структуры запросов `AddStoragePolicyRequest`, `DelStoragePolicyRequest` в cloudbroker/rg |
| BGOS-573 | Опциональное поле `StoragePolicies` в структуры запроса `CreateRequest`, `UpdateRequest` в cloudapi/rg и в cloudbroker/rg |
#### security group
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-582 | Группа ручек `security_group` в cloudapi и в cloudbroker |
#### storage policy
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-571 | Группа ручек `storage_policy` в cloudapi и в cloudbroker |
#### trunk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-565 | Опциональное поле `Status` в структуру запроса `ListRequest` в cloudapi/trunk и в cloudbroker/trunk |
#### user
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-562 | Опциональное поле `AccountID` в структуру запроса `CreateVirtualRequest` в cloudapi/image и в cloudbroker/image |
| BGOS-614 | Поле `StoragePolicyID` в структуру ответа `ItemImage` в cloudapi/image |
| BGOS-617 | Опциональное поле `StoragePolicyID` в структуры запроса `ListRequest` в cloudapi/image и cloudbroker/image |
#### vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-584 | Метод `Update` и структура запроса `UpdateRequest` в cloudbroker/vins |
| BGOS-584 | Поле `EnableSecGroups` в структуру ответа `ItemVINS` в cloudbroker/vins |
| BGOS-584 | Поле `EnableSecGroups` в структуру ответа `RecordVINS` в cloudapi/vins и в cloudbroker/vins |
#### SDN access groups
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-514 | Группа api access_groups |
| BGOS-615 | Поле `ZoneID` в структуры ответа `RecordDHCP`, `RecordGW`, `RecordNAT`, `RecordVNFDev` в cloudapi/vins и `InfoVNF` и `VNFDev` в cloudbroker/vins |
| BGOS-615 | Поля `SecGroups`, `EnableSecGroups` в структуру ответа `ItemVNFInterface` в cloudapi/vins и `ItemInterface` в cloudbroker/vins |
### Исправлено
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-569 | Изменена структура ответа с `ListAudits` на `*ListAudits`, содержащую поля `Data` и `EntryCount` в методе `Audits` в cloudapi/compute |
| BGOS-569 | Изменена структура ответа с `ListDetailedAudits` на `*ListDetailedAudits`, содержащую поля `Data` и `EntryCount` в методе `Audits` в cloudbroker/compute |
| BGOS-619 | Ошибка работы фильтра `SortBy` в методе `MigrateStorageList` в cloudbroker/compute |
#### user
#### storage policy
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-561 | Изменен тип поля `UserIDs` с stirng на []string в структуре запроса `DeleteUsersRequest` в cloudbroker/user |
#### vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-560 | Изменен тип возвращаемого значения методов `MassDelete`, `MassDisable`, `MassEnable` c bool на string в cloudbroker/vins|
| BGOS-620 | Поле `AccountID` в структуре запроса `ListRequest` стало опциональным в cloudapi/stpolicy |
### Удалено
#### audit
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-621 | Поле `Tags` в структуре ответа `ItemAudit` в cloudbroker/audit |
#### disks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-563 | Опциональное поле `Drivers` в структуре запроса `FromPlatformDiskRequest` в cloudapi/disks и cloudbroker/disks |
| BGOS-618 | Поле `IOPS` из структуры запроса `CreateRequest` в cloudapi/disks и в cloudbroker/disks |
#### compute
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-580 | Поле `ZoneID` в структуре ответа `ItemComputeDisk` в cloudapi/compute |
#### image
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-563 | Опциональное поле `Drivers` в структуре запроса `CreateRequest` в cloudapi/image и cloudbroker/image |
| BGOS-563 | Опциональное поле `Drivers` в структуре запроса `CreateCDROMImageRequest` в cloudbroker/image |
#### k8ci
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-563 | Опциональные поля `MasterDriver` и `WorkerDriver` в структурах запроса `ListRequest` и `ListDeletedRequest` в cloudapi/k8ci и cloudbroker/k8ci |
| BGOS-563 | Опциональные поля `MasterDriver` и `WorkerDriver` в структуре запроса `CreateRequest` в cloudbroker/k8ci |
#### kvmx86
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BGOS-563 | Опциональное поле `Driver` в структурах запроса `CreateRequest` и `CreateBlankRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 |

View File

@@ -323,10 +323,10 @@ func main() {
- `pkg/cloudapi/locations` - для `Locations`
- `pkg/cloudapi/prometheus` - для `Prometheus`
- `pkg/cloudapi/rg` - для `RG`
- `pkg/cloudapi/security_group` - для `Security group`
- `pkg/cloudapi/secgroup` - для `Security group`
- `pkg/cloudapi/sep` - для `SEP`
- `pkg/cloudapi/stack` - для `Stack`
- `pkg/cloudapi/storage_policy` - для `Storage policy`
- `pkg/cloudapi/stpolicy` - для `Storage policy`
- `pkg/cloudapi/tasks` - для `Tasks`
- `pkg/cloudapi/trunk` - для `Trunk`
- `pkg/cloudapi/vfpool` - для `VFPool`
@@ -355,10 +355,10 @@ func main() {
- `pkg/cloudbroker/prometheus` - для `Prometheus`
- `pkg/cloudbroker/resmon` - для `Resmon`
- `pkg/cloudbroker/rg` - для `RG`
- `pkg/cloudbroker/security_group` - для `Security group`
- `pkg/cloudbroker/secgroup` - для `Security group`
- `pkg/cloudbroker/sep` - для `SEP`
- `pkg/cloudbroker/stack` - для `Stack`
- `pkg/cloudbroker/storage_policy` - для `Storage policy`
- `pkg/cloudbroker/stpolicy` - для `Storage policy`
- `pkg/cloudbroker/tasks` - для `Tasks`
- `pkg/cloudbroker/trunk` - для `Trunk`
- `pkg/cloudbroker/user` - для `User`
@@ -525,7 +525,7 @@ func main() {
- `.SecurityGroup()` - для работы с `Security Group`
- `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack`
- `.StoragePolicy()` - для работы с `Storage Policy`
- `.StPolicy()` - для работы с `Storage Policy`
- `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.VFPool()` - для работы с `VFPool`
@@ -559,7 +559,7 @@ func main() {
- `.SecurityGroup()` - для работы с `Security Group`
- `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack`
- `.StoragePolicy()` - для работы с `Storage Policy`
- `.StPolicy()` - для работы с `Storage Policy`
- `.Tasks()` - для работы с `Tasks`
- `.Trunk()` - для работы с `Trunk`
- `.User()` - для работы с `User`

View File

@@ -124,6 +124,18 @@ type ListAccounts struct {
EntryCount uint64 `json:"entryCount"`
}
// Policy
type Policy struct {
// Size of the disk
DiskSize float64 `json:"disksize"`
// Max size of the disk
DiskSizeMax float64 `json:"disksizemax"`
// SEPs used
SEPs map[string]map[string]DiskUsage `json:"seps"`
}
// Resources used
type Resource struct {
// Number of cores
@@ -144,6 +156,9 @@ type Resource struct {
// Number of grafic cores
GPU int64 `json:"gpu"`
// Policies
Policies map[string]Policy `json:"policies"`
// Number of RAM
RAM int64 `json:"ram"`
@@ -218,9 +233,6 @@ type RecordAccount struct {
// DCLocation
DCLocation string `json:"DCLocation"`
// CKey
CKey string `json:"_ckey"`
// Access control list
ACL []RecordACL `json:"acl"`

View File

@@ -0,0 +1,81 @@
package audit
// FilterByID returns ListAudits with specified ID.
func (la ListAudits) FilterByID(guid string) ListAudits {
predicate := func(ia ItemAudit) bool {
return ia.GUID == guid
}
return la.FilterFunc(predicate)
}
// FilterByCall returns ListAudits with specified call.
func (la ListAudits) FilterByCall(call string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.Call == call
}
return la.FilterFunc(predicate)
}
// FilterByCorrelationID returns ListAudits with specified correlation id.
func (la ListAudits) FilterByCorrelationID(correlationID string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.CorrelationID == correlationID
}
return la.FilterFunc(predicate)
}
// FilterByRemoteAddr returns ListAudits with specified remote address.
func (la ListAudits) FilterByRemoteAddr(remoteAddr string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.RemoteAddr == remoteAddr
}
return la.FilterFunc(predicate)
}
// FilterByUser returns ListAudits with specified user name.
func (la ListAudits) FilterByUser(user string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.User == user
}
return la.FilterFunc(predicate)
}
// FilterByStatusCode return ListAudits with specified status code.
func (la ListAudits) FilterByStatusCode(statusCode uint64) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.StatusCode == statusCode
}
return la.FilterFunc(predicate)
}
// FilterFunc allows filtering ListAudits based on a user-specified predicate.
func (la ListAudits) FilterFunc(predicate func(ItemAudit) bool) ListAudits {
var result ListAudits
for _, item := range la.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns first found ItemAudit
// If none was found, returns an empty struct.
func (la ListAudits) FindOne() ItemAudit {
if len(la.Data) == 0 {
return ItemAudit{}
}
return la.Data[0]
}

View File

@@ -0,0 +1,115 @@
package audit
import (
"testing"
)
var audits = ListAudits{
Data: []ItemAudit{
{
Args: "[]",
Call: "/restmachine/cloudapi/audit/linkedJobs",
GUID: "550e8400-e29b-41d4-a716-446655440001",
CorrelationID: "550e8400-e29b-41d4-a716-446655440001",
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
RemoteAddr: "192.168.1.100",
ResponseTime: 1,
Result: `[]`,
StatusCode: 200,
Timestamp: 1640995200,
TimestampEnd: 1640995201,
User: "test@example.com",
TTL: "2025-07-31T14:22:57.028000",
},
{
Args: "[]",
Call: "/restmachine/cloudapi/audit/test",
GUID: "550e8400-e29b-41d4-a716-446655440002",
CorrelationID: "550e8400-e29b-41d4-a716-446655440002",
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
RemoteAddr: "192.168.1.105",
ResponseTime: 5,
Result: `[]`,
StatusCode: 400,
Timestamp: 1640995200,
TimestampEnd: 1640995201,
User: "test2@example.com",
TTL: "2025-07-31T14:22:57.028000",
},
},
EntryCount: 2,
}
func TestFilterByID(t *testing.T) {
actual := audits.FilterByID("550e8400-e29b-41d4-a716-446655440002").FindOne()
if actual.GUID != "550e8400-e29b-41d4-a716-446655440002" {
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.GUID)
}
actualEmpty := audits.FilterByID("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByCorrelationID(t *testing.T) {
actual := audits.FilterByCorrelationID("550e8400-e29b-41d4-a716-446655440002").FindOne()
if actual.CorrelationID != "550e8400-e29b-41d4-a716-446655440002" {
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.CorrelationID)
}
actualEmpty := audits.FilterByCorrelationID("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByRemoteAddr(t *testing.T) {
actual := audits.FilterByRemoteAddr("192.168.1.100").FindOne()
if actual.RemoteAddr != "192.168.1.100" {
t.Fatal("expected remote address 192.168.1.100, found: ", actual.RemoteAddr)
}
actualEmpty := audits.FilterByRemoteAddr("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByUser(t *testing.T) {
actual := audits.FilterByUser("test@example.com").FindOne()
if actual.User != "test@example.com" {
t.Fatal("expected user test@example.com, found: ", actual.RemoteAddr)
}
actualEmpty := audits.FilterByUser("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByCall(t *testing.T) {
actual := audits.FilterByCall("/restmachine/cloudapi/audit/test").FindOne()
if actual.Call != "/restmachine/cloudapi/audit/test" {
t.Fatal("expected call /restmachine/cloudapi/audit/test, found: ", actual.Call)
}
}
func TestFilterByStatusCode(t *testing.T) {
actual := audits.FilterByStatusCode(200)
for _, item := range actual.Data {
if item.StatusCode != 200 {
t.Fatal("expected 200 status code, found: ", item.StatusCode)
}
}
}

124
pkg/cloudapi/audit/list.go Normal file
View File

@@ -0,0 +1,124 @@
package audit
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// ListRequest struct to give list of account audits
type ListRequest struct {
// Find all audits after point in time (unixtime)
// Required: false
TimestampAt uint64 `url:"timestamp_at,omitempty" json:"timestamp_at,omitempty"`
// Find all audits before point in time (unixtime)
// Required: false
TimestampTo uint64 `url:"timestamp_to,omitempty" json:"timestamp_to,omitempty"`
// Find by user (Mongo RegExp supported)
// Required: false
User string `url:"user,omitempty" json:"user,omitempty"`
// Find by api endpoint (Mongo RegExp supported)
// Required: false
Call string `url:"call,omitempty" json:"call,omitempty"`
// Find by request id
// Required: false
RequestID string `url:"request_id,omitempty" json:"request_id,omitempty"`
// Find by HTTP min status code
// Required: false
MinStatusCode uint64 `url:"min_status_code,omitempty" json:"min_status_code,omitempty"`
// Find by HTTP max status code
// Required: false
MaxStatusCode uint64 `url:"max_status_code,omitempty" json:"max_status_code,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,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"`
// Find by resource group id
// Required: false
RGID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"`
// Find by compute id
// Required: false
ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"`
// Find by account id
// Required: false
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
// Find by vins id
// Required: false
VINSID uint64 `url:"vins_id,omitempty" json:"vins_id,omitempty"`
// Find by service id
// Required: false
ServiceID uint64 `url:"service_id,omitempty" json:"service_id,omitempty"`
// Find by k8s id
// Required: false
K8SID uint64 `url:"k8s_id,omitempty" json:"k8s_id,omitempty"`
// Find by flipgroup id
// Required: false
FLIPGroupID uint64 `url:"flipgroup_id,omitempty" json:"flipgroup_id,omitempty"`
// Find by load balancer id
// Required: false
LBID uint64 `url:"lb_id,omitempty" json:"lb_id,omitempty"`
// Find by sep id
// Required: false
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`
// Exclude audit lines from response
// Required: false
ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"`
}
// List gets audit records for the specified account object
func (a Audit) List(ctx context.Context, req ListRequest) (*ListAudits, error) {
res, err := a.ListRaw(ctx, req)
if err != nil {
return nil, err
}
list := ListAudits{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}
// ListRaw gets list of audit records an array of bytes
func (a Audit) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudapi/audit/list"
res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req)
return res, err
}

View File

@@ -42,3 +42,54 @@ type RecordAudit struct {
// User
User string `json:"user"`
}
// Main info about audit
type ItemAudit struct {
// Args
Args string `json:"args"`
// Call
Call string `json:"call"`
// GUID
GUID string `json:"guid"`
// Correlation ID
CorrelationID string `json:"correlation_id"`
// Kwargs
Kwargs string `json:"kwargs"`
// RemoteAddr
RemoteAddr string `json:"remote_addr"`
// Response time
ResponseTime float64 `json:"responsetime"`
// Result
Result string `json:"result"`
// Status code
StatusCode uint64 `json:"statuscode"`
// Timestamp
Timestamp float64 `json:"timestamp"`
// Timestamp End
TimestampEnd float64 `json:"timestampEnd"`
// User
User string `json:"user"`
// TTL
TTL string `json:"_ttl"`
}
// List of audits
type ListAudits struct {
// Data
Data []ItemAudit `json:"data"`
// EntryCount
EntryCount uint64 `json:"entryCount"`
}

View File

@@ -50,6 +50,14 @@ type DiskAddRequest struct {
// Specify image id for create disk from template
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Desired PCI slot (hex string, e.g. "0x1A")
// Required: false
PCISlot string `url:"pci_slot,omitempty" json:"pci_slot,omitempty"`
// Desired bus number (hex string, e.g. "0x03")
// Required: false
BusNumber string `url:"bus_number,omitempty" json:"bus_number,omitempty"`
}
// DiskAdd creates new disk and attach to compute

View File

@@ -21,6 +21,14 @@ type DiskAttachRequest struct {
// Type of the disk B;D
// Required: false
DiskType string `url:"diskType,omitempty" json:"diskType,omitempty" validate:"omitempty,computeDiskType"`
// Desired PCI slot (hex string, e.g. "0x1A")
// Required: false
PCISlot string `url:"pci_slot,omitempty" json:"pci_slot,omitempty"`
// Desired bus number (hex string, e.g. "0x03")
// Required: false
BusNumber string `url:"bus_number,omitempty" json:"bus_number,omitempty"`
}
// DiskAttach attach disk to compute

View File

@@ -55,7 +55,6 @@ var computes = ListComputes{
GID: 212,
GUID: 48500,
ID: 48500,
ImageID: 9884,
Interfaces: []ItemVNFInterface{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -82,7 +81,6 @@ var computes = ListComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
ZoneID: 1,
},
{
@@ -118,7 +116,6 @@ var computes = ListComputes{
GID: 212,
GUID: 48556,
ID: 48556,
ImageID: 9884,
Interfaces: []ItemVNFInterface{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -145,7 +142,6 @@ var computes = ListComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
ZoneID: 5,
},
},

View File

@@ -392,6 +392,9 @@ type RecordCompute struct {
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
// Loader meta iso information
LoaderMetaIso LoaderMetaIso `json:"loaderMetaIso"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
@@ -443,6 +446,9 @@ type RecordCompute struct {
// Natable VINS network name
NatableVINSNetworkName string `json:"natableVinsNetworkName"`
// Name of OS
OSVersion string `json:"os_version"`
// List OS Users
OSUsers ListOSUser `json:"osUsers"`
@@ -509,12 +515,6 @@ type RecordCompute struct {
// vGPUs list
VGPUs []VGPUItem `json:"vgpus"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// Virtual image name
VirtualImageName string `json:"virtualImageName"`
// VNC password
VNCPassword string `json:"vncPasswd"`
@@ -522,6 +522,13 @@ type RecordCompute struct {
// Required: false
ZoneID uint64 `json:"zoneId"`
}
type LoaderMetaIso struct {
// Name
DeviceName string `json:"devicename"`
// Path
Path string `json:"path"`
}
type QemuQuest struct {
Enabled bool `json:"enabled"`
@@ -761,9 +768,18 @@ type ItemComputeDisk struct {
// Bus number
BusNumber uint64 `json:"bus_number"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Device name
DeviceName string `json:"devicename"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@@ -874,6 +890,9 @@ type ItemComputeDisk struct {
// Updated by
UpdatedBy string `json:"updatedBy"`
// UpdatedTime
UpdatedTime uint64 `json:"updatedTime"`
}
type ItemReplication struct {
@@ -1066,9 +1085,6 @@ type ItemCompute struct {
// ID
ID uint64 `json:"id"`
// Image ID
ImageID uint64 `json:"imageId"`
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
@@ -1117,6 +1133,9 @@ type ItemCompute struct {
// Number of RAM
RAM uint64 `json:"ram"`
// Name of OS
OSVersion string `json:"os_version"`
// Qemu_quest
QemuQuest QemuQuest `json:"qemu_guest"`
@@ -1174,9 +1193,6 @@ type ItemCompute struct {
// VINS connected
VINSConnected uint64 `json:"vinsConnected"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}

View File

@@ -21,6 +21,10 @@ type RedeployRequest struct {
// ID of the new OS image, if image change is required
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
// new size for the boot disk in GB, if boot disk size change is required
// Required: false

View File

@@ -65,6 +65,10 @@ type UpdateRequest struct {
// Does this machine supports hot resize, true or false
// Required: false
HotResize interface{} `url:"hotResize,omitempty" json:"hotResize,omitempty" validate:"omitempty,isBool"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
}
// Update updates some properties of the compute

View File

@@ -30,10 +30,6 @@ type CreateRequest struct {
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Max IOPS disk can perform defaults to 2000
// Required: false
IOPS uint64 `url:"iops,omitempty" json:"iops,omitempty"`
// Storage endpoint provider ID to create disk
// Required: false
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`

View File

@@ -46,6 +46,10 @@ type ListRequest struct {
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`

View File

@@ -38,6 +38,10 @@ type ListUnattachedRequest struct {
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`

View File

@@ -69,6 +69,10 @@ type ListRequest struct {
// Find by enabled True or False
// Required: false
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
}
// List gets list of available images as a ListImages struct, optionally filtering by account ID

View File

@@ -50,6 +50,9 @@ type ItemImage struct {
// Status
Status string `json:"status"`
// Storage policy ID
StoragePolicyID uint64 `json:"storage_policy_id"`
// Type
Type string `json:"type"`

View File

@@ -121,6 +121,10 @@ type CreateRequest struct {
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
// Size of the boot disk in GB
// Required: false
BootDisk uint64 `url:"bootDisk,omitempty" json:"bootDisk,omitempty"`

View File

@@ -92,6 +92,10 @@ type CreateBlankRequest struct {
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -83,8 +83,8 @@ type CreateRequest struct {
}
type StoragePolicy struct {
ID int64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
ID uint64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
}
// Create creates resource group

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
// FilterByID returns ListSecurityGroups with specified ID.
func (lsg ListSecurityGroups) FilterByID(id uint64) ListSecurityGroups {

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "testing"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -0,0 +1,94 @@
package secgroup
type ListSecurityGroups struct {
// List
Data []ItemSecurityGroup `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
type ItemSecurityGroup struct {
// ID of the security group
ID uint64 `json:"id"`
// Account ID that owns the security group
AccountID uint64 `json:"account_id"`
// Name of the security group
Name string `json:"name"`
// Description of the security group
Description string `json:"description"`
// List of rules
Rules Rules `json:"rules"`
// Created at
CreatedAt uint64 `json:"created_at"`
// Updated at
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
}
type RecordSecurityGroup struct {
// ID of the security group
ID uint64 `json:"id"`
// Account ID that owns the security group
AccountID uint64 `json:"account_id"`
// Name of the security group
Name string `json:"name"`
// Description of the security group
Description string `json:"description"`
// List of rules
Rules Rules `json:"rules"`
// Created at
CreatedAt uint64 `json:"created_at"`
// Updated at
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
}
type Rules []Rule
type Rule struct {
// ID of the rule
ID uint64 `json:"id"`
// Traffic direction (inbound/outbound)
Direction string `json:"direction"`
// IP protocol version
Ethertype string `json:"ethertype"`
// Network protocol
Protocol string `json:"protocol"`
// Start port number (for TCP/UDP)
PortRangeMin uint64 `json:"port_range_min"`
// End port number (for TCP/UDP)
PortRangeMax uint64 `json:"port_range_max"`
// Remote IP prefix in CIDR notation
RemoteIPPrefix string `json:"remote_ip_prefix"`
RemoteGroupID uint64 `json:"remote_group_id"`
}

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "sort"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,43 +0,0 @@
package securitygroup
type ListSecurityGroups struct {
Data []ItemSecurityGroup `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type RecordSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type Rules []Rule
type Rule struct {
ID uint64 `json:"id"`
Direction string `json:"direction"`
Ethertype string `json:"ethertype"`
Protocol string `json:"protocol"`
PortRangeMin uint64 `json:"port_range_min"`
PortRangeMax uint64 `json:"port_range_max"`
RemoteIPPrefix string `json:"remote_ip_prefix"`
RemoteGroupID uint64 `json:"remote_group_id"`
}

View File

@@ -1,10 +1,10 @@
package cloudapi
import (
securitygroup "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/security_group"
secgroup "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/secgroup"
)
// Accessing the Security Group method group
func (ca *CloudAPI) SecurityGroup() *securitygroup.SecurityGroup {
return securitygroup.New(ca.client)
func (ca *CloudAPI) SecurityGroup() *secgroup.SecurityGroup {
return secgroup.New(ca.client)
}

View File

@@ -0,0 +1,10 @@
package cloudapi
import (
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/stpolicy"
)
// Accessing the Storage Policy method group
func (ca *CloudAPI) StPolicy() *stpolicy.StPolicy {
return stpolicy.New(ca.client)
}

View File

@@ -1,40 +0,0 @@
package storagepolicy
type ListStoragePolicies struct {
Data []ItemStoragePolicy `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type InfoStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type ListAccessSepPools []AccessSepPool
type AccessSepPool struct {
SepID uint64 `json:"sep_id"`
PoolNames []string `json:"pool_names"`
}
type Usage struct {
Accounts []uint64 `json:"accounts"`
Resgroups []uint64 `json:"resgroups"`
}

View File

@@ -1,10 +0,0 @@
package cloudapi
import (
storagepolicy "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/storage_policy"
)
// Accessing the Storage Policy method group
func (ca *CloudAPI) StoragePolicy() *storagepolicy.StoragePolicy {
return storagepolicy.New(ca.client)
}

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -14,7 +14,7 @@ type GetRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePolicy, error) {
func (sp StPolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePolicy, error) {
res, err := sp.GetRaw(ctx, req)
if err != nil {
return nil, err
@@ -30,7 +30,7 @@ func (sp StoragePolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePo
return &info, nil
}
func (sp StoragePolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
func (sp StPolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -9,10 +9,6 @@ import (
)
type ListRequest struct {
// ID of account ID
// Required: true
AccountID uint64 `url:"account_id" json:"account_id" validate:"required"`
// Page number
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
@@ -45,6 +41,10 @@ type ListRequest struct {
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
// ID of account ID
// Required: false
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
// Search by resgroup id
// Required: false
ResgroupID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"`
@@ -59,7 +59,7 @@ type ListRequest struct {
}
// List gets list of storage policies as a ListStoragePolicies struct
func (sp StoragePolicy) List(ctx context.Context, req ListRequest) (*ListStoragePolicies, error) {
func (sp StPolicy) List(ctx context.Context, req ListRequest) (*ListStoragePolicies, error) {
res, err := sp.ListRaw(ctx, req)
if err != nil {
@@ -77,7 +77,7 @@ func (sp StoragePolicy) List(ctx context.Context, req ListRequest) (*ListStorage
}
// ListRaw gets list of storage policies as an array of bytes
func (sp StoragePolicy) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
func (sp StPolicy) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -0,0 +1,82 @@
package stpolicy
type ListStoragePolicies struct {
// List
Data []ItemStoragePolicy `json:"data"`
// Entry Count
EntryCount uint64 `json:"entryCount"`
}
type ItemStoragePolicy struct {
// ID of the storage policy
ID uint64 `json:"id"`
// GUID
GUID uint64 `json:"guid"`
// Name of the storage policy
Name string `json:"name"`
// Description of the storage policy
Description string `json:"description"`
// List of pools in SEP for storage policy
AccessSEPPools ListAccessSEPPools `json:"access_seps_pools"`
// Status of the storage policy
Status string `json:"status"`
// Max IOPS for the sotrage policy
LimitIOPS uint64 `json:"limit_iops"`
// Which accounts and resource groups use the storage policy
Usage Usage `json:"usage"`
}
type InfoStoragePolicy struct {
// ID of the storage policy
ID uint64 `json:"id"`
// GUID
GUID uint64 `json:"guid"`
// Name of the storage policy
Name string `json:"name"`
// Description of the storage policy
Description string `json:"description"`
// List of pools in SEP for storage policy
AccessSEPPools ListAccessSEPPools `json:"access_seps_pools"`
// Status of the storage policy
Status string `json:"status"`
// Max IOPS for the sotrage policy
LimitIOPS uint64 `json:"limit_iops"`
// Which accounts and resource groups use the storage policy
Usage Usage `json:"usage"`
}
type ListAccessSEPPools []AccessSEPPool
type AccessSEPPool struct {
// SEP ID
SEPID uint64 `json:"sep_id"`
// SEP name
Name string `json:"sep_name"`
// Pool names
PoolNames []string `json:"pool_names"`
}
type Usage struct {
// List of accounts
Accounts []uint64 `json:"accounts"`
// List of resource groups
Resgroups []uint64 `json:"resgroups"`
}

View File

@@ -1,15 +1,15 @@
package storagepolicy
package stpolicy
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
// Structure for creating request to storage policy
type StoragePolicy struct {
type StPolicy struct {
client interfaces.Caller
}
// Builder for stack endpoint
func New(client interfaces.Caller) *StoragePolicy {
return &StoragePolicy{
func New(client interfaces.Caller) *StPolicy {
return &StPolicy{
client: client,
}
}

View File

@@ -211,6 +211,9 @@ type RecordVNFDev struct {
// VNC password
VNCPassword string `json:"vncPasswd"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// VNF config
@@ -269,6 +272,9 @@ type ItemVNFInterface struct {
// Enabled
Enabled bool `json:"enabled"`
// Enable security groups
EnableSecGroups bool `json:"enable_secgroups"`
// FLIPGroup ID
FLIPGroupID uint64 `json:"flipgroupId"`
@@ -305,6 +311,9 @@ type ItemVNFInterface struct {
// NodeID
NodeID int64 `json:"nodeId"`
// List of security groups
SecGroups []uint64 `json:"security_groups"`
// SDNInterfaceID
SDNInterfaceID string `json:"sdn_interface_id"`
@@ -418,6 +427,9 @@ type RecordNAT struct {
// Type
Type string `json:"type"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// NAT configuration
@@ -486,6 +498,9 @@ type RecordGW struct {
// Type
Type string `json:"type"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// GW configuration
@@ -576,6 +591,9 @@ type RecordDHCP struct {
// Type
Type string `json:"type"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
// DHCP configuration

View File

@@ -29,7 +29,7 @@ type CreateRequest struct {
// Storage policies
// Required: false
StoragePolicies []StoragePolicy `url:"-" json:"storage_policies" validate:"required"`
StoragePolicies []StoragePolicy `url:"-" json:"storage_policies,omitempty"`
// Max size of memory in MB
// Required: false
@@ -79,8 +79,8 @@ type CreateRequest struct {
}
type StoragePolicy struct {
ID int64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
ID uint64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
}
// Create creates account

View File

@@ -7,7 +7,6 @@ import (
var accounts = ListAccounts{
Data: []ItemAccount{
{
Meta: []interface{}{},
InfoAccount: InfoAccount{
CreatedTime: 1676878820,
DeletedTime: 0,
@@ -28,7 +27,6 @@ var accounts = ListAccounts{
},
},
{
Meta: []interface{}{},
InfoAccount: InfoAccount{
CreatedTime: 1676645275,
DeletedTime: 1677723401,
@@ -49,7 +47,6 @@ var accounts = ListAccounts{
},
},
{
Meta: []interface{}{},
InfoAccount: InfoAccount{
CreatedTime: 1676883850,
DeletedTime: 1676883899,

View File

@@ -46,6 +46,18 @@ type ListResources struct {
EntryCount uint64 `json:"entryCount"`
}
// Policy
type Policy struct {
// Size of the disk
DiskSize float64 `json:"disksize"`
// Max size of the disk
DiskSizeMax float64 `json:"disksizemax"`
// SEPs used
SEPs map[string]map[string]DiskUsage `json:"seps"`
}
type Resource struct {
// Number of cores
CPU int64 `json:"cpu"`
@@ -70,6 +82,9 @@ type Resource struct {
// SEPs
SEPs map[string]map[string]DiskUsage `json:"seps"`
// Policies
Policies map[string]Policy `json:"policies"`
}
// Disk usage
@@ -143,9 +158,6 @@ type InfoAccount struct {
// DCLocation
DCLocation string `json:"DCLocation"`
// CKey
CKey string `json:"_ckey"`
// Company
Company string `json:"company"`
@@ -245,8 +257,6 @@ type RecordAccount struct {
// More information about account
type ItemAccount struct {
// Meta
Meta []interface{} `json:"_meta"`
// Access Control List
ACL []ACL `json:"acl"`

View File

@@ -0,0 +1,81 @@
package audit
// FilterByID returns ListAudits with specified ID.
func (la ListAudits) FilterByID(guid string) ListAudits {
predicate := func(ia ItemAudit) bool {
return ia.GUID == guid
}
return la.FilterFunc(predicate)
}
// FilterByCall returns ListAudits with specified call.
func (la ListAudits) FilterByCall(call string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.Call == call
}
return la.FilterFunc(predicate)
}
// FilterByCorrelationID returns ListAudits with specified correlation id.
func (la ListAudits) FilterByCorrelationID(correlationID string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.CorrelationID == correlationID
}
return la.FilterFunc(predicate)
}
// FilterByRemoteAddr returns ListAudits with specified remote address.
func (la ListAudits) FilterByRemoteAddr(remoteAddr string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.RemoteAddr == remoteAddr
}
return la.FilterFunc(predicate)
}
// FilterByUser returns ListAudits with specified user name.
func (la ListAudits) FilterByUser(user string) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.User == user
}
return la.FilterFunc(predicate)
}
// FilterByStatusCode return ListAudits with specified status code.
func (la ListAudits) FilterByStatusCode(statusCode uint64) ListAudits {
predicate := func(ic ItemAudit) bool {
return ic.StatusCode == statusCode
}
return la.FilterFunc(predicate)
}
// FilterFunc allows filtering ListAudits based on a user-specified predicate.
func (la ListAudits) FilterFunc(predicate func(ItemAudit) bool) ListAudits {
var result ListAudits
for _, item := range la.Data {
if predicate(item) {
result.Data = append(result.Data, item)
}
}
result.EntryCount = uint64(len(result.Data))
return result
}
// FindOne returns first found ItemAudit
// If none was found, returns an empty struct.
func (la ListAudits) FindOne() ItemAudit {
if len(la.Data) == 0 {
return ItemAudit{}
}
return la.Data[0]
}

View File

@@ -0,0 +1,115 @@
package audit
import (
"testing"
)
var audits = ListAudits{
Data: []ItemAudit{
{
Args: "[]",
Call: "/restmachine/cloudapi/audit/linkedJobs",
GUID: "550e8400-e29b-41d4-a716-446655440001",
CorrelationID: "550e8400-e29b-41d4-a716-446655440001",
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
RemoteAddr: "192.168.1.100",
ResponseTime: 1,
Result: `[]`,
StatusCode: 200,
Timestamp: 1640995200,
TimestampEnd: 1640995201,
User: "test@example.com",
TTL: "2025-07-31T14:22:57.028000",
},
{
Args: "[]",
Call: "/restmachine/cloudapi/audit/test",
GUID: "550e8400-e29b-41d4-a716-446655440002",
CorrelationID: "550e8400-e29b-41d4-a716-446655440002",
Kwargs: `{\"audit_guid\":\"dd8623a1-a887-48c1-a500-c10210d404cf\"}`,
RemoteAddr: "192.168.1.105",
ResponseTime: 5,
Result: `[]`,
StatusCode: 400,
Timestamp: 1640995200,
TimestampEnd: 1640995201,
User: "test2@example.com",
TTL: "2025-07-31T14:22:57.028000",
},
},
EntryCount: 2,
}
func TestFilterByID(t *testing.T) {
actual := audits.FilterByID("550e8400-e29b-41d4-a716-446655440002").FindOne()
if actual.GUID != "550e8400-e29b-41d4-a716-446655440002" {
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.GUID)
}
actualEmpty := audits.FilterByID("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByCorrelationID(t *testing.T) {
actual := audits.FilterByCorrelationID("550e8400-e29b-41d4-a716-446655440002").FindOne()
if actual.CorrelationID != "550e8400-e29b-41d4-a716-446655440002" {
t.Fatal("expected GUID 550e8400-e29b-41d4-a716-446655440002, found: ", actual.CorrelationID)
}
actualEmpty := audits.FilterByCorrelationID("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByRemoteAddr(t *testing.T) {
actual := audits.FilterByRemoteAddr("192.168.1.100").FindOne()
if actual.RemoteAddr != "192.168.1.100" {
t.Fatal("expected remote address 192.168.1.100, found: ", actual.RemoteAddr)
}
actualEmpty := audits.FilterByRemoteAddr("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByUser(t *testing.T) {
actual := audits.FilterByUser("test@example.com").FindOne()
if actual.User != "test@example.com" {
t.Fatal("expected user test@example.com, found: ", actual.RemoteAddr)
}
actualEmpty := audits.FilterByUser("")
if len(actualEmpty.Data) != 0 {
t.Fatal("expected empty, actual: ", len(actualEmpty.Data))
}
}
func TestFilterByCall(t *testing.T) {
actual := audits.FilterByCall("/restmachine/cloudapi/audit/test").FindOne()
if actual.Call != "/restmachine/cloudapi/audit/test" {
t.Fatal("expected call /restmachine/cloudapi/audit/test, found: ", actual.Call)
}
}
func TestFilterByStatusCode(t *testing.T) {
actual := audits.FilterByStatusCode(200)
for _, item := range actual.Data {
if item.StatusCode != 200 {
t.Fatal("expected 200 status code, found: ", item.StatusCode)
}
}
}

View File

@@ -50,6 +50,50 @@ type ListRequest struct {
// Page size
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Find by resource group id
// Required: false
RGID uint64 `url:"resgroup_id,omitempty" json:"resgroup_id,omitempty"`
// Find by compute id
// Required: false
ComputeID uint64 `url:"compute_id,omitempty" json:"compute_id,omitempty"`
// Find by account id
// Required: false
AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"`
// Find by vins id
// Required: false
VINSID uint64 `url:"vins_id,omitempty" json:"vins_id,omitempty"`
// Find by service id
// Required: false
ServiceID uint64 `url:"service_id,omitempty" json:"service_id,omitempty"`
// Find by k8s id
// Required: false
K8SID uint64 `url:"k8s_id,omitempty" json:"k8s_id,omitempty"`
// Find by flipgroup id
// Required: false
FLIPGroupID uint64 `url:"flipgroup_id,omitempty" json:"flipgroup_id,omitempty"`
// Find by load balancer id
// Required: false
LBID uint64 `url:"lb_id,omitempty" json:"lb_id,omitempty"`
// Find by sep id
// Required: false
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`
// Find by node id
// Required: false
NodeID uint64 `url:"node_id,omitempty" json:"node_id,omitempty"`
// Exclude audit lines from response
// Required: false
ExcludeAuditLines bool `url:"exclude_audit_lines,omitempty" json:"exclude_audit_lines,omitempty"`
}
// List gets audit records for the specified account object

View File

@@ -40,9 +40,6 @@ type ItemAudit struct {
// TTL
TTL string `json:"_ttl"`
// Tags
Tags string `json:"tags"`
}
// List of audits

View File

@@ -50,6 +50,14 @@ type DiskAddRequest struct {
// Specify image id for create disk from template
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Desired PCI slot (hex string, e.g. "0x1A")
// Required: false
PCISlot string `url:"pci_slot,omitempty" json:"pci_slot,omitempty"`
// Desired bus number (hex string, e.g. "0x03")
// Required: false
BusNumber string `url:"bus_number,omitempty" json:"bus_number,omitempty"`
}
// DiskAdd creates new disk and attach to compute

View File

@@ -21,6 +21,14 @@ type DiskAttachRequest struct {
// Type of the disk B;D
// Required: false
DiskType string `url:"diskType,omitempty" json:"diskType,omitempty"`
// Desired PCI slot (hex string, e.g. "0x1A")
// Required: false
PCISlot string `url:"pci_slot,omitempty" json:"pci_slot,omitempty"`
// Desired bus number (hex string, e.g. "0x03")
// Required: false
BusNumber string `url:"bus_number,omitempty" json:"bus_number,omitempty"`
}
// DiskAttach attach disk to compute

View File

@@ -58,7 +58,6 @@ var computes = ListComputes{
GID: 212,
GUID: 48500,
ID: 48500,
ImageID: 9884,
Interfaces: ListInterfaces{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -85,7 +84,6 @@ var computes = ListComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
},
},
{
@@ -122,7 +120,6 @@ var computes = ListComputes{
GID: 212,
GUID: 48556,
ID: 48556,
ImageID: 9884,
Interfaces: ListInterfaces{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -149,7 +146,6 @@ var computes = ListComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
},
},
},
@@ -301,7 +297,6 @@ var deleteComputes = ListDeletedComputes{
GID: 212,
GUID: 48500,
ID: 48500,
ImageID: 9884,
Interfaces: ListInterfaces{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -327,7 +322,6 @@ var deleteComputes = ListDeletedComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
},
},
{
@@ -364,7 +358,6 @@ var deleteComputes = ListDeletedComputes{
GID: 212,
GUID: 48556,
ID: 48556,
ImageID: 9884,
Interfaces: ListInterfaces{},
LockStatus: "UNLOCKED",
ManagerID: 0,
@@ -390,7 +383,6 @@ var deleteComputes = ListDeletedComputes{
UserManaged: true,
VGPUs: []uint64{},
VINSConnected: 0,
VirtualImageID: 0,
},
},
},

View File

@@ -46,10 +46,6 @@ type ListRequest struct {
// Required: false
StackID uint64 `url:"stackId,omitempty" json:"stackId,omitempty"`
// Find by image ID
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Find by CD image ID
// Required: false
CDImageID uint64 `url:"cdImageId,omitempty" json:"cdImageId,omitempty"`

View File

@@ -0,0 +1,55 @@
package compute
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// MigrateStorageListRequest struct to get list of jobs
type MigrateStorageListRequest struct {
// Find by job ID
// Required: false
MigrationJobID uint64 `url:"migration_job_id,omitempty" json:"migration_job_id,omitempty"`
// If True then return completed jobs
// Required: false
Completed interface{} `url:"completed,omitempty" json:"completed,omitempty" validate:"omitempty,isBool"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sort_by,omitempty" json:"sort_by,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"`
}
// MigrateStorageList gets list of the jobs.
func (c Compute) MigrateStorageList(ctx context.Context, req MigrateStorageListRequest) (*ListMigrateStorage, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/migrate_storage_list"
res, err := c.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {
return nil, err
}
list := ListMigrateStorage{}
err = json.Unmarshal(res, &list)
if err != nil {
return nil, err
}
return &list, nil
}

View File

@@ -373,9 +373,18 @@ type ItemDisk struct {
// Bus number
BusNumber uint64 `json:"bus_number"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Device name
DeviceName string `json:"devicename"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
@@ -495,6 +504,9 @@ type ItemDisk struct {
// Updated by
UpdatedBy string `json:"updatedBy"`
// UpdatedTime
UpdatedTime uint64 `json:"updatedTime"`
}
type ItemReplication struct {
@@ -720,9 +732,6 @@ type InfoCompute struct {
// ID
ID uint64 `json:"id"`
// Image ID
ImageID uint64 `json:"imageId"`
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
@@ -765,6 +774,9 @@ type InfoCompute struct {
// List OS users
OSUsers ListOSUsers `json:"osUsers"`
// Name of OS
OSVersion string `json:"os_version"`
// Pinned to stack
PinnedToStack int64 `json:"pinnedToStack"`
@@ -840,9 +852,6 @@ type InfoCompute struct {
// VINS connected
VINSConnected uint64 `json:"vinsConnected"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// Zone ID
ZoneID uint64 `json:"zoneId"`
}
@@ -983,12 +992,15 @@ type RecordCompute struct {
// Image ID
ImageID uint64 `json:"imageId"`
// ImageName
// Image name
ImageName string `json:"imageName"`
// List interfaces
Interfaces ListInterfaces `json:"interfaces"`
// Loader meta iso information
LoaderMetaIso LoaderMetaIso `json:"loaderMetaIso"`
// Live migration job ID
LiveMigrationJobID uint64 `json:"live_migration_job_id"`
@@ -1046,6 +1058,9 @@ type RecordCompute struct {
// List OS users
OSUsers ListOSUsers `json:"osUsers"`
// Name of OS
OSVersion string `json:"os_version"`
// Pinned to stack
PinnedToStack int64 `json:"pinnedToStack"`
@@ -1118,12 +1133,6 @@ type RecordCompute struct {
// List VGPU
VGPUs []VGPUItem `json:"vgpus"`
// Virtual image ID
VirtualImageID uint64 `json:"virtualImageId"`
// VirtualImageName
VirtualImageName string `json:"virtualImageName"`
// VNC password
VNCPassword string `json:"vncPasswd"`
@@ -1131,6 +1140,14 @@ type RecordCompute struct {
ZoneID uint64 `json:"zoneId"`
}
type LoaderMetaIso struct {
// Name
DeviceName string `json:"devicename"`
// Path
Path string `json:"path"`
}
type VGPUItem struct {
// ID
ID uint64 `json:"id"`
@@ -1375,3 +1392,31 @@ type ItemVGPU struct {
// VM ID
VMID uint64 `json:"vmid"`
}
type ListMigrateStorage struct {
EntryCount uint64 `json:"entryCount"`
Data []MigrateStorageItem `json:"data"`
}
type MigrateStorageItem struct {
// Migration completion status
Completed bool `json:"completed"`
// Domain name
DomainName string `json:"domainName"`
// Migration job ID
ID uint64 `json:"id"`
// Migration process log
Log []string `json:"log"`
// Source stack ID
SourceStackID uint64 `json:"sourceStackId"`
// Migration status
Status string `json:"status"`
// Target stack ID
TargetStackID uint64 `json:"targetStackId"`
}

View File

@@ -18,6 +18,10 @@ type RedeployRequest struct {
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
// Storage policy id of compute. The rules of the specified storage policy will be used.
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`

View File

@@ -0,0 +1,36 @@
package compute
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// StartMigrationINRequest struct to start compute for external migration in
type StartMigrationINRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// ID of the stack where the compute will be staged for migration-in
// Required: false
StackID uint64 `url:"stackId,omitempty" json:"stackId,omitempty"`
}
// StartMigrationIN starts compute for external migration in
func (c Compute) StartMigrationIN(ctx context.Context, req StartRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/start_migration_in"
res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,58 @@
package compute
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// StartMigrationOutRequest struct to start compute for external migration out
type StartMigrationOutRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"`
// Remote libvirt host to connect to
// Required: true
Target string `url:"target" json:"target" validate:"required"`
// Graphics handling on the destination
// Required: true
Graphics string `url:"graphics" json:"graphics" validate:"required"`
// Optional new domain name on the destination
// Required: false
NewName string `url:"new_name,omitempty" json:"new_name,omitempty"`
// When true, adds libvirt's UNSAFE flag to force migration even if libvirt marks it unsafe.
// Default: false
// Required: false
UseUnsafe bool `url:"use_unsafe,omitempty" json:"use_unsafe,omitempty"`
// Mapping of guest disk target names to absolute paths on the destination host.
// Required: false
Diskmap map[string]string `url:"diskmap,omitempty" json:"diskmap,omitempty"`
// Mapping for CD/DVD devices or their source paths to new ISO/device paths on the destination
// Required: false
CDROMMap map[string]string `url:"cdrommap,omitempty" json:"cdrommap,omitempty"`
}
// StartMigrationOut starts compute for external migration out
func (c Compute) StartMigrationOut(ctx context.Context, req StartMigrationOutRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/start_migration_out"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,57 @@
package compute
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// OSUsers struct contains OS user data for Guest OS.
// Must be provided if NewVMUUID is provided.
type OSUser struct {
// Login of a user
Login string `url:"login,omitempty" json:"login,omitempty"`
// Password of a user
Password string `url:"password,omitempty" json:"password,omitempty"`
// GUID
GUID string `url:"guid,omitempty" json:"guid,omitempty"`
// Pubkey
Pubkey string `url:"pubkey,omitempty" json:"pubkey,omitempty"`
}
// StopMigrationINRequest struct to stop compute for external migration in
type StopMigrationINRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// If provided, indicates the UUID of the VM on the target host and that migration completed.
// Required: false
NewVMUUID string `url:"new_vm_uuid,omitempty" json:"new_vm_uuid,omitempty"`
// OS user data for Guest OS
// Required: false
OSUsers []OSUser `url:"os_users,omitempty" json:"os_users,omitempty"`
}
// StopMigrationIN stops compute for external migration in
func (c Compute) StopMigrationIN(ctx context.Context, req StopMigrationINRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/stop_migration_in"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -0,0 +1,37 @@
package compute
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// StopMigrationOutRequest struct to stop compute for external migration out
type StopMigrationOutRequest struct {
// ID of compute instance
// Required: true
ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"`
// Identifier of the agent-side external migration (LibvirtMigrateToURI3Request) job
// Required: false
MigrateToURI3JobID string `url:"migrate_to_uri3_job_id,omitempty" json:"migrate_to_uri3_job_id,omitempty"`
}
// StopMigrationOut stops compute for external migration out
func (c Compute) StopMigrationOut(ctx context.Context, req StopMigrationOutRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/compute/stop_migration_out"
res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
return "", err
}
return string(res), nil
}

View File

@@ -65,6 +65,10 @@ type UpdateRequest struct {
// Does this machine supports hot resize, true or false
// Required: false
HotResize interface{} `url:"hotResize,omitempty" json:"hotResize,omitempty" validate:"omitempty,isBool"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
}
// Update updates some properties of the compute

View File

@@ -30,10 +30,6 @@ type CreateRequest struct {
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Max IOPS disk can perform defaults to 2000
// Required: false
IOPS uint64 `url:"iops,omitempty" json:"iops,omitempty"`
// Storage endpoint provider ID to create disk
// Required: false
SEPID uint64 `url:"sep_id,omitempty" json:"sep_id,omitempty"`

View File

@@ -46,6 +46,10 @@ type ListRequest struct {
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`

View File

@@ -38,6 +38,10 @@ type ListUnattachedRequest struct {
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
// Find by pool name
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`

View File

@@ -69,6 +69,10 @@ type ListRequest struct {
// Find by enabled True or False
// Required: false
Enabled interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
// Find by storage policy id
// Required: false
StoragePolicyID uint64 `url:"storage_policy_id,omitempty" json:"storage_policy_id,omitempty"`
}
// List gets list of information about images as a ListImages struct

View File

@@ -1,42 +0,0 @@
package image
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// UpdateNodesRequest struct to update nodes
type UpdateNodesRequest struct {
// Image ID
// Required: true
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
// List of stacks
// Required: false
EnabledStacks []uint64 `url:"enabledStacks,omitempty" json:"enabledStacks,omitempty"`
}
// UpdateNodes updates image availability on nodes
func (i Image) UpdateNodes(ctx context.Context, req UpdateNodesRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/image/updateNodes"
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -121,6 +121,10 @@ type CreateRequest struct {
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
// Size of the boot disk in GB
// Required: false
BootDisk uint64 `url:"bootDisk,omitempty" json:"bootDisk,omitempty"`

View File

@@ -92,6 +92,10 @@ type CreateBlankRequest struct {
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
}
// GetRAM returns RAM field values

View File

@@ -87,6 +87,10 @@ type MassCreateRequest struct {
// Zone ID
// Required: false
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
// The OS version that will be installed on the virtual machine
// Required: false
OSVersion string `url:"os_version,omitempty" json:"os_version,omitempty"`
}
type asyncWrapperMassCreateRequest struct {

View File

@@ -0,0 +1,54 @@
package node
import (
"context"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// AddSSHIdentityRequest struct to add node ssh information
type AddSSHIdentityRequest struct {
// Node ID
// Required: true
NID uint64 `url:"node_id" json:"node_id" validate:"required"`
// Host name of the client
// Required: true
ClientHostName string `url:"client_host_name" json:"client_host_name" validate:"required"`
// SSH host key of the client
// Required: true
ClientHostKey string `url:"client_host_key" json:"client_host_key" validate:"required" `
// SSH public key of the client
// Required: true
ClientPublicKey string `url:"client_public_key" json:"client_public_key" validate:"required"`
// IPv4 address
// Required: true
ClientIPAddress string `url:"client_ip_address" json:"client_ip_address" validate:"required" `
}
// AddSSHIdentity adds node ssh information
func (n Node) AddSSHIdentity(ctx context.Context, req AddSSHIdentityRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/add_ssh_identity"
res, err := n.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return false, err
}
result, err := strconv.ParseBool(string(res))
if err != nil {
return false, err
}
return result, nil
}

View File

@@ -0,0 +1,39 @@
package node
import (
"context"
"encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
// GetSSHIdentityRequest struct to get node ssh information
type GetSSHIdentityRequest struct {
// Node ID
// Required: true
NID uint64 `url:"node_id" json:"node_id" validate:"required"`
}
// GetSSHIdentity gets node ssh information
func (n Node) GetSSHIdentity(ctx context.Context, req GetSSHIdentityRequest) (*SSHIdentity, error) {
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/node/get_ssh_identity"
res, err := n.client.DecortApiCall(ctx, http.MethodGet, url, req)
if err != nil {
return nil, err
}
info := SSHIdentity{}
err = json.Unmarshal(res, &info)
if err != nil {
return nil, err
}
return &info, nil
}

View File

@@ -392,3 +392,15 @@ type Role struct {
Reason string `json:"reason"`
Time uint64 `json:"time"`
}
// Information about SSH Identity
type SSHIdentity struct {
//Host name of the client
HostName string `json:"host_name"`
//SSH host key of the client
HostKey string `json:"host_key"`
//Array of SSH public keys of the client
PublicKeys []string `json:"public_keys"`
}

View File

@@ -88,8 +88,8 @@ type CreateRequest struct {
}
type StoragePolicy struct {
ID int64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
ID uint64 `url:"id" json:"id"`
Limit int `url:"limit" json:"limit"`
}
// Create creates resource group

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
// FilterByID returns ListSecurityGroups with specified ID.
func (lsg ListSecurityGroups) FilterByID(id uint64) ListSecurityGroups {

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "testing"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -0,0 +1,94 @@
package secgroup
type ListSecurityGroups struct {
// List
Data []ItemSecurityGroup `json:"data"`
// Entry count
EntryCount uint64 `json:"entryCount"`
}
type ItemSecurityGroup struct {
// ID of the security group
ID uint64 `json:"id"`
// Account ID that owns the security group
AccountID uint64 `json:"account_id"`
// Name of the security group
Name string `json:"name"`
// Description of the security group
Description string `json:"description"`
// List of rules
Rules Rules `json:"rules"`
// Created at
CreatedAt uint64 `json:"created_at"`
// Updated at
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
}
type RecordSecurityGroup struct {
// ID of the security group
ID uint64 `json:"id"`
// Account ID that owns the security group
AccountID uint64 `json:"account_id"`
// Name of the security group
Name string `json:"name"`
// Description of the security group
Description string `json:"description"`
// List of rules
Rules Rules `json:"rules"`
// Created at
CreatedAt uint64 `json:"created_at"`
// Updated at
UpdatedAt uint64 `json:"updated_at"`
// Created by
CreatedBy string `json:"created_by"`
// Updated by
UpdatedBy string `json:"updated_by"`
}
type Rules []Rule
type Rule struct {
// ID of the rule
ID uint64 `json:"id"`
// Traffic direction (inbound/outbound)
Direction string `json:"direction"`
// IP protocol version
Ethertype string `json:"ethertype"`
// Network protocol
Protocol string `json:"protocol"`
// Start port number (for TCP/UDP)
PortRangeMin uint64 `json:"port_range_min"`
// End port number (for TCP/UDP)
PortRangeMax uint64 `json:"port_range_max"`
// Remote IP prefix in CIDR notation
RemoteIPPrefix string `json:"remote_ip_prefix"`
RemoteGroupID uint64 `json:"remote_group_id"`
}

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import "sort"

View File

@@ -1,4 +1,4 @@
package securitygroup
package secgroup
import (
"context"

View File

@@ -1,43 +0,0 @@
package securitygroup
type ListSecurityGroups struct {
Data []ItemSecurityGroup `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type RecordSecurityGroup struct {
ID uint64 `json:"id"`
AccountID uint64 `json:"account_id"`
Name string `json:"name"`
Description string `json:"description"`
Rules Rules `json:"rules"`
CreatedAt uint64 `json:"created_at"`
UpdatedAt uint64 `json:"updated_at"`
CreatedBy string `json:"created_by"`
UpdatedBy string `json:"updated_by"`
}
type Rules []Rule
type Rule struct {
ID uint64 `json:"id"`
Direction string `json:"direction"`
Ethertype string `json:"ethertype"`
Protocol string `json:"protocol"`
PortRangeMin uint64 `json:"port_range_min"`
PortRangeMax uint64 `json:"port_range_max"`
RemoteIPPrefix string `json:"remote_ip_prefix"`
RemoteGroupID uint64 `json:"remote_group_id"`
}

View File

@@ -1,10 +1,10 @@
package cloudbroker
import (
securitygroup "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/security_group"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/secgroup"
)
// Accessing the Security Group method group
func (cb *CloudBroker) SecurityGroup() *securitygroup.SecurityGroup {
return securitygroup.New(cb.client)
func (cb *CloudBroker) SecurityGroup() *secgroup.SecurityGroup {
return secgroup.New(cb.client)
}

View File

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

View File

@@ -1,51 +0,0 @@
package storagepolicy
type InfoStoragePolicyWithID struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
StoragePolicyID uint64 `json:"storage_policy_id"`
}
type ListStoragePolicies struct {
Data []ItemStoragePolicy `json:"data"`
EntryCount uint64 `json:"entryCount"`
}
type ItemStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type InfoStoragePolicy struct {
ID uint64 `json:"id"`
GUID uint64 `json:"guid"`
Name string `json:"name"`
Description string `json:"description"`
AccessSepPools ListAccessSepPools `json:"access_seps_pools"`
Status string `json:"status"`
LimitIOPS uint64 `json:"limit_iops"`
Usage Usage `json:"usage"`
}
type ListAccessSepPools []AccessSepPool
type AccessSepPool struct {
SepID uint64 `json:"sep_id"`
PoolNames []string `json:"pool_names"`
}
type Usage struct {
Accounts []uint64 `json:"accounts"`
Resgroups []uint64 `json:"resgroups"`
}

View File

@@ -1,10 +0,0 @@
package cloudbroker
import (
storagepolicy "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/storage_policy"
)
// Accessing the Storage Policy method group
func (cb *CloudBroker) StoragePolicy() *storagepolicy.StoragePolicy {
return storagepolicy.New(cb.client)
}

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -15,14 +15,14 @@ type AddPoolRequest struct {
// Storage endpoint provider ID to add
// Required: true
SepID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
// Pool to add
// Required: true
PoolName string `url:"pool_name" json:"pool_name" validate:"required"`
}
func (sp StoragePolicy) AddPool(ctx context.Context, req AddPoolRequest) (*InfoStoragePolicyWithID, error) {
func (sp StPolicy) AddPool(ctx context.Context, req AddPoolRequest) (*InfoStoragePolicyWithID, error) {
res, err := sp.AddPoolRaw(ctx, req)
if err != nil {
return nil, err
@@ -38,7 +38,7 @@ func (sp StoragePolicy) AddPool(ctx context.Context, req AddPoolRequest) (*InfoS
return &info, nil
}
func (sp StoragePolicy) AddPoolRaw(ctx context.Context, req AddPoolRequest) ([]byte, error) {
func (sp StPolicy) AddPoolRaw(ctx context.Context, req AddPoolRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -9,11 +9,11 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type AccessSepsPool struct {
type AccessSEPsPool struct {
// Storage endpoint provider ID
// Required: true
SepID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
// Names of pools
// Required: true
@@ -27,7 +27,7 @@ type CreateRequest struct {
// List of storage endpoint access objects
// Required: true
AccessSepsPools []AccessSepPool `url:"access_seps_pools" json:"access_seps_pools" validate:"required"`
AccessSEPsPools []AccessSEPsPool `url:"access_seps_pools" json:"access_seps_pools" validate:"required"`
// Description of the storage policy
// Required: false
@@ -40,7 +40,7 @@ type CreateRequest struct {
}
// Create creates a new storage policy
func (sp StoragePolicy) Create(ctx context.Context, req CreateRequest) (uint64, error) {
func (sp StPolicy) Create(ctx context.Context, req CreateRequest) (uint64, error) {
err := validators.ValidateRequest(req)
if err != nil {
return 0, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -14,7 +14,7 @@ type DeleteRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
func (sp StPolicy) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -8,21 +8,21 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type DeletePollRequest struct {
type DeletePoolRequest struct {
// ID of storage policy
// Required: true
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
// Storage endpoint provider ID to delete
// Required: true
SepID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
// Pool to delete
// Required: true
PoolName string `url:"pool_name" json:"pool_name" validate:"required"`
}
func (sp StoragePolicy) DeletePool(ctx context.Context, req DeletePollRequest) (*InfoStoragePolicyWithID, error) {
func (sp StPolicy) DeletePool(ctx context.Context, req DeletePoolRequest) (*InfoStoragePolicyWithID, error) {
res, err := sp.DeletePoolRaw(ctx, req)
if err != nil {
return nil, err
@@ -38,7 +38,7 @@ func (sp StoragePolicy) DeletePool(ctx context.Context, req DeletePollRequest) (
return &info, nil
}
func (sp StoragePolicy) DeletePoolRaw(ctx context.Context, req DeletePollRequest) ([]byte, error) {
func (sp StPolicy) DeletePoolRaw(ctx context.Context, req DeletePoolRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -14,7 +14,7 @@ type DisableRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Disable(ctx context.Context, req DisableRequest) (bool, error) {
func (sp StPolicy) Disable(ctx context.Context, req DisableRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -14,7 +14,7 @@ type EnableRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Enable(ctx context.Context, req EnableRequest) (bool, error) {
func (sp StPolicy) Enable(ctx context.Context, req EnableRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
// FilterByID returns ListStoragePolicies with specified ID.
func (lsp ListStoragePolicies) FilterByID(id uint64) ListStoragePolicies {

View File

@@ -1,19 +1,19 @@
package storagepolicy
package stpolicy
import "testing"
var asp9 = AccessSepPool{
SepID: 9,
var asp9 = AccessSEPPool{
SEPID: 9,
PoolNames: []string{"data03"},
}
var asp7 = AccessSepPool{
SepID: 7,
var asp7 = AccessSEPPool{
SEPID: 7,
PoolNames: []string{"pool_QA"},
}
var asp8 = AccessSepPool{
SepID: 8,
var asp8 = AccessSEPPool{
SEPID: 8,
PoolNames: []string{
"alpha_pool_block",
"alpha_pool_stripe",
@@ -28,7 +28,7 @@ var storagePolicyItems = ListStoragePolicies{
GUID: 1,
Name: "storagePolicy01",
Description: "desc",
AccessSepPools: ListAccessSepPools{asp7},
AccessSEPPools: ListAccessSEPPools{asp7},
Status: "ENABLED",
LimitIOPS: 2000,
Usage: Usage{},
@@ -38,7 +38,7 @@ var storagePolicyItems = ListStoragePolicies{
GUID: 3,
Name: "storagePolicy03",
Description: "desc",
AccessSepPools: ListAccessSepPools{asp7, asp8, asp9},
AccessSEPPools: ListAccessSEPPools{asp7, asp8, asp9},
Status: "ENABLED",
LimitIOPS: 2500,
Usage: Usage{},
@@ -48,7 +48,7 @@ var storagePolicyItems = ListStoragePolicies{
GUID: 5,
Name: "storagePolicy05",
Description: "another desc",
AccessSepPools: ListAccessSepPools{asp8, asp9},
AccessSEPPools: ListAccessSEPPools{asp8, asp9},
Status: "DISABLED",
LimitIOPS: 2000,
Usage: Usage{},

View File

@@ -1,4 +1,4 @@
package storagepolicy
package stpolicy
import (
"context"
@@ -14,7 +14,7 @@ type GetRequest struct {
StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"`
}
func (sp StoragePolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePolicy, error) {
func (sp StPolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePolicy, error) {
res, err := sp.GetRaw(ctx, req)
if err != nil {
return nil, err
@@ -30,7 +30,7 @@ func (sp StoragePolicy) Get(ctx context.Context, req GetRequest) (*InfoStoragePo
return &info, nil
}
func (sp StoragePolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
func (sp StPolicy) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))

Some files were not shown because too many files have changed in this diff Show More