diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c212b..5f8d095 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,143 @@ -## Version 1.4.7 +## Version 1.5.0 + +### Feature + +- Updated lists responses models in: +- - cloudapi/account/list +- - cloudbroker/account/list +- - cloudapi/bservice/list +- - cloudapi/compute/list +- - cloudbroker/compute/list +- - cloudapi/computeci/list +- - cloudapi/disks/list +- - cloudbroker/disks/list +- - cloudapi/extnet/list +- - cloudbroker/extnet/list +- - cloudapi/flipgroup/list +- - cloudapi/image/list +- - cloudbroker/image/list +- - cloudapi/k8ci/list +- - cloudbroker/k8ci/list +- - cloudapi/k8s/list +- - cloudapi/k8s/listDeleted +- - cloudbroker/k8s/list +- - cloudbroker/k8s/listDeleted +- - cloudapi/tasks/list +- - cloudbroker/tasks/list +- - cloudapi/rg/list +- - cloudbroker/rg/list +- - cloudapi/vins/list +- - cloudbroker/vins/list +- - cloudapi/account/listDeleted +- - cloudapi/account/listCompute +- - cloudapi/account/listDisks +- - cloudapi/account/listFlipGroups +- - cloudapi/account/listRG +- - cloudapi/account/listVINS +- - cloudapi/compute/listDeleted +- - cloudapi/disks/listDeleted +- - cloudapi/disks/listTypes +- - cloudapi/k8ci/listDeleted +- - cloudapi/lb/list +- - cloudapi/lb/listDeleted +- - cloudbroker/lb/list +- - cloudbroker/lb/listDeleted +- - cloudapi/rg/listComputes +- - cloudapi/rg/listDeleted +- - cloudapi/rg/listLb +- - cloudapi/rg/listPFW +- - cloudapi/rg/listVins +- - cloudapi/vins/listDeleted +- - cloudbroker/account/listComputes +- - cloudbroker/account/listDeleted +- - cloudbroker/account/listDisks +- - cloudbroker/account/listFlipGroups +- - cloudbroker/account/listRG +- - cloudbroker/account/listVINS +- - cloudbroker/compute/listDeleted +- - cloudapi/compute/listPciDevice +- - cloudbroker/compute/listPciDevice +- - cloudapi/compute/listVGpu +- - cloudbroker/compute/listVGpu +- - cloudbroker/disks/listTypes +- - cloudbroker/grid/list +- - cloudbroker/grid/listEmails +- - cloudbroker/k8ci/listDeleted +- - cloudbroker/pcidevice/list +- - cloudbroker/rg/affinityGroupsList +- - cloudbroker/rg/listDeleted +- - cloudbroker/rg/listComputes +- - cloudbroker/rg/listLB +- - cloudbroker/rg/listPfw +- - cloudbroker/rg/listResourceConsumption +- - cloudbroker/rg/listVins +- - cloudbroker/sep/list +- - cloudbroker/vgpu/list +- - cloudbroker/vins/extnetList +- - cloudbroker/vins/IpList +- - cloudbroker/vins/natRuleList + +- Added new endpoints: +- - cloudapi/rg/getResourceConsumption +- - cloudapi/rg/listResourceConsumption +- - cloudbroker/rg/getResourceConsumption +- - cloudbroker/rg/listResourceConsumption +- - cloudapi/account/getResourceConsumption +- - cloudapi/account/listResourceConsumption +- - cloudbroker/account/getResourceConsumption +- - cloudbroker/account/listResourceConsumption +- - cloudbroker/grid/getResourceConsumption +- - cloudbroker/grid/listResourceConsumption + +- Added field CU_DM to ResourceLimits model (account, rg) + +- Added field ReferenceID to SnapshotExtended model in cloudapi/compute/get + +- Added field Interfaces in requests: +- - cloudapi/kvmppc/create +- - cloudapi/kvmppc/createBlank +- - cloudapi/kvmx86/create +- - cloudapi/kvmx86/createBlank +- - cloudbroker/kvmppc/create +- - cloudbroker/kvmppc/createBlank +- - cloudbroker/kvmx86/create +- - cloudbroker/kvmx86/createBlank + +- Added UpdatedBy field to task model in cloudbroker/task/get + +- Made optional fields in requests: +- - Reason (cloudbroker/account/delete) +- - Reason (cloudbroker/account/restore) +- - Gateway (cloudbroker/extnet/create) +- - Reason (cloudbroker/image/delete) +- - Num (cloudapi/k8s/workerAdd) +- - NetID (cloudbroker/vins/extnetConnect) + +- Updated cloudapi/rg/get model + +- Deleted field Username from cloudbroker/account/update request + +- Deleted field EmailAddress from cloudbroker/account/update request + +- Added field DiskType to cloudbroker/compute/diskAttach request + +- Added field Reason to cloudbroker/compute/diskQos request + +- Added field Enabled to cloudbroker/compute/netAttach response model + +- Added field CPUAllocationRatio to cloudbroker/image/listStacks response model + +- Added field Descr to cloudbroker/image/listStacks response model + +- Added field MemAllocationRatio to cloudbroker/image/listStacks response model + +- Updated cloudapi/k8s/workersGroupByName response model + +- Deleted field LBImageID from cloudbroker/k8ci/create request + +- Deleted field ImageID from cloudbroker/lb/create request + +- Deleted field Reason from cloudbroker/vins/extnetList request ### Bugfix -- Deleted validate:"required" tag from IPCIDR field in cloudapi/vins/createInRg request struct +- Changed the Excluded field type in cloudbroker/extnet/get response model diff --git a/README.md b/README.md index ecf1ec4..6f4df8d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Decort SDK - это библиотека, написанная на языке G - Версия 1.2.x Decort-SDK соответствует 3.8.5 версии платформы - Версия 1.3.x Decort-SDK соответствует 3.8.5 версии платформы - Версия 1.4.x Decort-SDK соответствует 3.8.6 версии платформы + - Версия 1.5.x Decort-SDK соответствует 3.8.7 версии платформы ## Оглавление diff --git a/pkg/cloudapi/kvmppc/create.go b/pkg/cloudapi/kvmppc/create.go index 8a5ae8d..1363045 100644 --- a/pkg/cloudapi/kvmppc/create.go +++ b/pkg/cloudapi/kvmppc/create.go @@ -8,6 +8,23 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) +type Interface struct { + // Network type + // Should be one of: + // - VINS + // - EXTNET + NetType string `url:"netType" json:"netType" validate:"required,kvmNetType"` + + // Network ID for connect to, + // for EXTNET - external network ID, + // for VINS - VINS ID, + NetID uint64 `url:"netId" json:"netId" validate:"required"` + + // IP address to assign to this VM when connecting to the specified network + // Required: false + IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` +} + // Request struct for create KVM PowerPC VM type CreateRequest struct { // ID of the resource group, which will own this VM @@ -45,24 +62,9 @@ type CreateRequest struct { // Required: false Pool string `url:"pool,omitempty" json:"pool,omitempty"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE - // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for ViNS - ViNS ID, - // when netType is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network + // Slice of structs with net interface description. // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility // Required: false diff --git a/pkg/cloudapi/kvmppc/create_blank.go b/pkg/cloudapi/kvmppc/create_blank.go index db17493..45526a5 100644 --- a/pkg/cloudapi/kvmppc/create_blank.go +++ b/pkg/cloudapi/kvmppc/create_blank.go @@ -31,7 +31,7 @@ type CreateBlankRequest struct { // Required: true BootDisk uint64 `url:"bootDisk" json:"bootDisk" validate:"required"` - // ID of SEP to create boot disk on. + // ID of SEP to create boot disk on // Uses images SEP ID if not set // Required: true SEPID uint64 `url:"sepId" json:"sepId" validate:"required"` @@ -40,24 +40,9 @@ type CreateBlankRequest struct { // Required: true Pool string `url:"pool" json:"pool" validate:"required"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE + // Slice of structs with net interface description // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Text description of this VM // Required: false diff --git a/pkg/cloudapi/kvmx86/create.go b/pkg/cloudapi/kvmx86/create.go index 64eb711..ccb69c7 100644 --- a/pkg/cloudapi/kvmx86/create.go +++ b/pkg/cloudapi/kvmx86/create.go @@ -63,6 +63,7 @@ type CreateRequest struct { Pool string `url:"pool,omitempty" json:"pool,omitempty"` // Slice of structs with net interface description. + // Required: false Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility diff --git a/pkg/cloudapi/kvmx86/create_blank.go b/pkg/cloudapi/kvmx86/create_blank.go index d0effdf..5f2cd69 100644 --- a/pkg/cloudapi/kvmx86/create_blank.go +++ b/pkg/cloudapi/kvmx86/create_blank.go @@ -41,7 +41,9 @@ type CreateBlankRequest struct { Pool string `url:"pool" json:"pool" validate:"required"` // Slice of structs with net interface description. + // Required: false Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` + // Text description of this VM // Required: false Description string `url:"desc,omitempty" json:"desc,omitempty"` diff --git a/pkg/cloudbroker/compute/list_gpu.go b/pkg/cloudbroker/compute/list_gpu.go deleted file mode 100644 index f6ab49b..0000000 --- a/pkg/cloudbroker/compute/list_gpu.go +++ /dev/null @@ -1,46 +0,0 @@ -package compute - -import ( - "context" - "encoding/json" - "net/http" - - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" -) - -// Request struct for get list GPU for compute -type ListGPURequest struct { - // ID of compute instance - // Required: true - ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` - - // Also list destroyed - // Required: false - ListDestroyed bool `url:"list_destroyed,omitempty" json:"list_destroyed,omitempty"` -} - -// ListVGPU gets list GPU for compute -func (c Compute) ListGPU(ctx context.Context, req ListGPURequest) ([]interface{}, error) { - err := validators.ValidateRequest(req) - if err != nil { - for _, validationError := range validators.GetErrors(err) { - return nil, validators.ValidationError(validationError) - } - } - - url := "/cloudbroker/compute/listGpu" - - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) - if err != nil { - return nil, err - } - - list := make([]interface{}, 0) - - err = json.Unmarshal(res, &list) - if err != nil { - return nil, err - } - - return list, nil -} diff --git a/pkg/cloudbroker/extnet/models.go b/pkg/cloudbroker/extnet/models.go index 203216b..bcb35c5 100644 --- a/pkg/cloudbroker/extnet/models.go +++ b/pkg/cloudbroker/extnet/models.go @@ -137,7 +137,7 @@ type RecordExtNet struct { DNS []string `json:"dns"` // List excludes - Excluded []string `json:"excluded"` + Excluded ListReservations `json:"excluded"` // Gateway Gateway string `json:"gateway"` diff --git a/pkg/cloudbroker/k8s/create.go b/pkg/cloudbroker/k8s/create.go index a4274e4..3bca12f 100644 --- a/pkg/cloudbroker/k8s/create.go +++ b/pkg/cloudbroker/k8s/create.go @@ -103,7 +103,7 @@ type CreateRequest struct { // Create kubernetes cluster with masters nodes behind load balancer if true. // Otherwise give all cluster nodes direct external addresses from selected external network // Required: false - WithLB bool `url:"withLB,omitempty" json:"withLB,omitempty"` + WithLB bool `url:"withLB" json:"withLB"` // Text description of this kubernetes cluster // Required: false diff --git a/pkg/cloudbroker/k8s/filter.go b/pkg/cloudbroker/k8s/filter.go index d5d2c3c..076bcce 100644 --- a/pkg/cloudbroker/k8s/filter.go +++ b/pkg/cloudbroker/k8s/filter.go @@ -76,21 +76,23 @@ func (lkc ListK8S) FilterByDeletedBy(deletedBy string) ListK8S { func (lkc ListK8S) FilterFunc(predicate func(ItemK8S) bool) ListK8S { var result ListK8S - for _, item := range lkc { + for _, item := range lkc.Data { if predicate(item) { - result = append(result, item) + result.Data = append(result.Data, item) } } + result.EntryCount = uint64(len(result.Data)) + return result } // FindOne returns first found ItemK8S // If none was found, returns an empty struct. func (lkc ListK8S) FindOne() ItemK8S { - if len(lkc) == 0 { + if len(lkc.Data) == 0 { return ItemK8S{} } - return lkc[0] + return lkc.Data[0] } diff --git a/pkg/cloudbroker/k8s/filter_test.go b/pkg/cloudbroker/k8s/filter_test.go index e572de5..23c7233 100644 --- a/pkg/cloudbroker/k8s/filter_test.go +++ b/pkg/cloudbroker/k8s/filter_test.go @@ -3,96 +3,99 @@ package k8s import "testing" var k8sItems = ListK8S{ - ItemK8S{ - AccountID: 1, - AccountName: "test_1", - ACL: []interface{}{}, - BServiceID: 1, - CIID: 1, - Config: nil, - CreatedBy: "test_user", - CreatedTime: 132454563, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExtNetID: 1, - GID: 0, - GUID: 1, - ID: 1, - LBID: 1, - Milestones: 999999, - Name: "k8s_1", - RGID: 1, - RGName: "rg_1", - ServiceAccount: ServiceAccount{}, - SSHKey: "sample_key", - Status: "ENABLED", - TechStatus: "STARTED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 0, - WorkersGroup: []RecordK8SGroup{}, - }, - ItemK8S{ - AccountID: 2, - AccountName: "test_2", - ACL: []interface{}{}, - BServiceID: 2, - CIID: 2, - Config: nil, - CreatedBy: "test_user", - CreatedTime: 132454638, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExtNetID: 2, - GID: 0, - GUID: 2, - ID: 2, - LBID: 2, - Milestones: 999999, - Name: "k8s_2", - RGID: 2, - RGName: "rg_2", - ServiceAccount: ServiceAccount{}, - SSHKey: "sample_key", - Status: "ENABLED", - TechStatus: "STARTED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 0, - WorkersGroup: []RecordK8SGroup{}, - }, - ItemK8S{ - AccountID: 3, - AccountName: "test_3", - ACL: []interface{}{}, - BServiceID: 3, - CIID: 3, - Config: nil, - CreatedBy: "test_user", - CreatedTime: 132454682, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExtNetID: 3, - GID: 0, - GUID: 3, - ID: 3, - LBID: 3, - Milestones: 999999, - Name: "k8s_3", - RGID: 3, - RGName: "rg_3", - ServiceAccount: ServiceAccount{}, - SSHKey: "sample_key", - Status: "DISABLED", - TechStatus: "STOPPED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 0, - WorkersGroup: []RecordK8SGroup{}, + Data: []ItemK8S{ + { + AccountID: 1, + AccountName: "test_1", + ACL: []interface{}{}, + BServiceID: 1, + CIID: 1, + Config: nil, + CreatedBy: "test_user", + CreatedTime: 132454563, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExtNetID: 1, + GID: 0, + GUID: 1, + ID: 1, + LBID: 1, + Milestones: 999999, + Name: "k8s_1", + RGID: 1, + RGName: "rg_1", + ServiceAccount: ServiceAccount{}, + SSHKey: "sample_key", + Status: "ENABLED", + TechStatus: "STARTED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 0, + WorkersGroup: []RecordK8SGroup{}, + }, + { + AccountID: 2, + AccountName: "test_2", + ACL: []interface{}{}, + BServiceID: 2, + CIID: 2, + Config: nil, + CreatedBy: "test_user", + CreatedTime: 132454638, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExtNetID: 2, + GID: 0, + GUID: 2, + ID: 2, + LBID: 2, + Milestones: 999999, + Name: "k8s_2", + RGID: 2, + RGName: "rg_2", + ServiceAccount: ServiceAccount{}, + SSHKey: "sample_key", + Status: "ENABLED", + TechStatus: "STARTED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 0, + WorkersGroup: []RecordK8SGroup{}, + }, + { + AccountID: 3, + AccountName: "test_3", + ACL: []interface{}{}, + BServiceID: 3, + CIID: 3, + Config: nil, + CreatedBy: "test_user", + CreatedTime: 132454682, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExtNetID: 3, + GID: 0, + GUID: 3, + ID: 3, + LBID: 3, + Milestones: 999999, + Name: "k8s_3", + RGID: 3, + RGName: "rg_3", + ServiceAccount: ServiceAccount{}, + SSHKey: "sample_key", + Status: "DISABLED", + TechStatus: "STOPPED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 0, + WorkersGroup: []RecordK8SGroup{}, + }, }, + EntryCount: 3, } func TestFilterByID(t *testing.T) { @@ -130,11 +133,11 @@ func TestFilterByRGID(t *testing.T) { func TestFilterByStatus(t *testing.T) { actual := k8sItems.FilterByStatus("ENABLED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.Status != "ENABLED" { t.Fatal("expected Status 'ENABLED', found: ", item.Status) } @@ -144,11 +147,11 @@ func TestFilterByStatus(t *testing.T) { func TestFilterByTechStatus(t *testing.T) { actual := k8sItems.FilterByTechStatus("STARTED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.TechStatus != "STARTED" { t.Fatal("expected TechStatus 'STARTED', found: ", item.TechStatus) } @@ -158,11 +161,11 @@ func TestFilterByTechStatus(t *testing.T) { func TestFilterByCreatedBy(t *testing.T) { actual := k8sItems.FilterByCreatedBy("test_user") - if len(actual) != 3 { - t.Fatal("expected 3 found, actual: ", len(actual)) + if len(actual.Data) != 3 { + t.Fatal("expected 3 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.CreatedBy != "test_user" { t.Fatal("expected CreatedBy 'test_user', found: ", item.CreatedBy) } @@ -172,8 +175,8 @@ func TestFilterByCreatedBy(t *testing.T) { func TestFilterByDeletedBy(t *testing.T) { actual := k8sItems.FilterByDeletedBy("test_user") - if len(actual) != 0 { - t.Fatal("expected 0 found, actual: ", len(actual)) + if len(actual.Data) != 0 { + t.Fatal("expected 0 found, actual: ", len(actual.Data)) } } @@ -191,7 +194,7 @@ func TestFilterFunc(t *testing.T) { func TestSortByCreatedTime(t *testing.T) { actual := k8sItems.SortByCreatedTime(false) - if actual[0].CreatedTime != 132454563 || actual[2].CreatedTime != 132454682 { + if actual.Data[0].CreatedTime != 132454563 || actual.Data[2].CreatedTime != 132454682 { t.Fatal("expected ascending sort, seems to be inversed") } } diff --git a/pkg/cloudbroker/k8s/list.go b/pkg/cloudbroker/k8s/list.go index c5cd315..1d9484e 100644 --- a/pkg/cloudbroker/k8s/list.go +++ b/pkg/cloudbroker/k8s/list.go @@ -8,6 +8,38 @@ import ( // Request struct for get list information K8S type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by IP address + // Required: false + IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"` + + // Find by resource group ID + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by lbId + // Required: false + LBID uint64 `url:"lbId,omitempty" json:"lbId,omitempty"` + + // Find by basicServiceId + // Required: false + BasicServiceID uint64 `url:"basicServiceId,omitempty" json:"basicServiceId,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // Find by techStatus + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + // Include deleted clusters in result // Required: false IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"` @@ -22,7 +54,7 @@ type ListRequest struct { } // List gets list all kubernetes clusters -func (k K8S) List(ctx context.Context, req ListRequest) (ListK8S, error) { +func (k K8S) List(ctx context.Context, req ListRequest) (*ListK8S, error) { url := "/cloudbroker/k8s/list" @@ -38,5 +70,5 @@ func (k K8S) List(ctx context.Context, req ListRequest) (ListK8S, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/k8s/list_deleted.go b/pkg/cloudbroker/k8s/list_deleted.go index 738f74c..cbaac77 100644 --- a/pkg/cloudbroker/k8s/list_deleted.go +++ b/pkg/cloudbroker/k8s/list_deleted.go @@ -8,6 +8,34 @@ import ( // Request struct for get list deleted kubernetes cluster type ListDeletedRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by IP address + // Required: false + IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"` + + // Find by resource group ID + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by lbId + // Required: false + LBID uint64 `url:"lbId,omitempty" json:"lbId,omitempty"` + + // Find by basicServiceId + // Required: false + BasicServiceID uint64 `url:"basicServiceId,omitempty" json:"basicServiceId,omitempty"` + + // Find by techStatus + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +46,7 @@ type ListDeletedRequest struct { } // ListDeleted gets all deleted kubernetes clusters -func (k K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListK8S, error) { +func (k K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListK8S, error) { url := "/cloudbroker/k8s/listDeleted" @@ -34,5 +62,5 @@ func (k K8S) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListK8S, return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/k8s/models.go b/pkg/cloudbroker/k8s/models.go index 3cd9299..953b017 100644 --- a/pkg/cloudbroker/k8s/models.go +++ b/pkg/cloudbroker/k8s/models.go @@ -295,4 +295,10 @@ type ServiceAccount struct { } // List K8S -type ListK8S []ItemK8S +type ListK8S struct { + // Data + Data []ItemK8S `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/k8s/serialize.go b/pkg/cloudbroker/k8s/serialize.go index f95315f..6269cad 100644 --- a/pkg/cloudbroker/k8s/serialize.go +++ b/pkg/cloudbroker/k8s/serialize.go @@ -12,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (lkc ListK8S) Serialize(params ...string) (serialization.Serialized, error) { - if len(lkc) == 0 { + if len(lkc.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/k8s/sorting.go b/pkg/cloudbroker/k8s/sorting.go index a8f258b..1bad9a4 100644 --- a/pkg/cloudbroker/k8s/sorting.go +++ b/pkg/cloudbroker/k8s/sorting.go @@ -6,16 +6,16 @@ import "sort" // // If inverse param is set to true, the order is reversed. func (lkc ListK8S) SortByCreatedTime(inverse bool) ListK8S { - if len(lkc) < 2 { + if len(lkc.Data) < 2 { return lkc } - sort.Slice(lkc, func(i, j int) bool { + sort.Slice(lkc.Data, func(i, j int) bool { if inverse { - return lkc[i].CreatedTime > lkc[j].CreatedTime + return lkc.Data[i].CreatedTime > lkc.Data[j].CreatedTime } - return lkc[i].CreatedTime < lkc[j].CreatedTime + return lkc.Data[i].CreatedTime < lkc.Data[j].CreatedTime }) return lkc @@ -25,16 +25,16 @@ func (lkc ListK8S) SortByCreatedTime(inverse bool) ListK8S { // // If inverse param is set to true, the order is reversed. func (lkc ListK8S) SortByUpdatedTime(inverse bool) ListK8S { - if len(lkc) < 2 { + if len(lkc.Data) < 2 { return lkc } - sort.Slice(lkc, func(i, j int) bool { + sort.Slice(lkc.Data, func(i, j int) bool { if inverse { - return lkc[i].UpdatedTime > lkc[j].UpdatedTime + return lkc.Data[i].UpdatedTime > lkc.Data[j].UpdatedTime } - return lkc[i].UpdatedTime < lkc[j].UpdatedTime + return lkc.Data[i].UpdatedTime < lkc.Data[j].UpdatedTime }) return lkc @@ -44,16 +44,16 @@ func (lkc ListK8S) SortByUpdatedTime(inverse bool) ListK8S { // // If inverse param is set to true, the order is reversed. func (lkc ListK8S) SortByDeletedTime(inverse bool) ListK8S { - if len(lkc) < 2 { + if len(lkc.Data) < 2 { return lkc } - sort.Slice(lkc, func(i, j int) bool { + sort.Slice(lkc.Data, func(i, j int) bool { if inverse { - return lkc[i].DeletedTime > lkc[j].DeletedTime + return lkc.Data[i].DeletedTime > lkc.Data[j].DeletedTime } - return lkc[i].DeletedTime < lkc[j].DeletedTime + return lkc.Data[i].DeletedTime < lkc.Data[j].DeletedTime }) return lkc diff --git a/pkg/cloudbroker/kvmppc/create.go b/pkg/cloudbroker/kvmppc/create.go index f08df09..ab31cd3 100644 --- a/pkg/cloudbroker/kvmppc/create.go +++ b/pkg/cloudbroker/kvmppc/create.go @@ -8,6 +8,23 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) +type Interface struct { + // Network type + // Should be one of: + // - VINS + // - EXTNET + NetType string `url:"netType" json:"netType" validate:"required,kvmNetType"` + + // Network ID for connect to, + // for EXTNET - external network ID, + // for VINS - VINS ID, + NetID uint64 `url:"netId" json:"netId" validate:"required"` + + // IP address to assign to this VM when connecting to the specified network + // Required: false + IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` +} + // Request struct for create KVM PowerPC VM type CreateRequest struct { // ID of the resource group, which will own this VM @@ -45,24 +62,9 @@ type CreateRequest struct { // Required: false Pool string `url:"pool,omitempty" json:"pool,omitempty"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE - // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" + // Slice of structs with net interface description. // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility // Required: false @@ -76,10 +78,6 @@ type CreateRequest struct { // Required: false Start bool `url:"start,omitempty" json:"start,omitempty"` - // Stack ID - // Required: false - StackID uint64 `url:"stackId,omitempty" json:"stackId,omitempty"` - // System name // Required: false IS string `url:"IS,omitempty" json:"IS,omitempty"` @@ -87,10 +85,6 @@ type CreateRequest struct { // Compute purpose // Required: false IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"` - - // Reason for action - // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` } // Create creates KVM PowerPC VM based on specified OS image diff --git a/pkg/cloudbroker/kvmppc/create_blank.go b/pkg/cloudbroker/kvmppc/create_blank.go index ac41a26..851d9a7 100644 --- a/pkg/cloudbroker/kvmppc/create_blank.go +++ b/pkg/cloudbroker/kvmppc/create_blank.go @@ -40,24 +40,9 @@ type CreateBlankRequest struct { // Required: true Pool string `url:"pool" json:"pool" validate:"required"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE + // Slice of structs with net interface description. // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Text description of this VM // Required: false diff --git a/pkg/cloudbroker/kvmppc/mass_create.go b/pkg/cloudbroker/kvmppc/mass_create.go index 92b66c3..6601bc4 100644 --- a/pkg/cloudbroker/kvmppc/mass_create.go +++ b/pkg/cloudbroker/kvmppc/mass_create.go @@ -48,20 +48,9 @@ type MassCreateRequest struct { // Required: false Pool string `url:"pool,omitempty" json:"pool,omitempty"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE + // Slice of structs with net interface description. // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility // Required: false diff --git a/pkg/cloudbroker/kvmx86/create.go b/pkg/cloudbroker/kvmx86/create.go index fe6a546..42c0cb6 100644 --- a/pkg/cloudbroker/kvmx86/create.go +++ b/pkg/cloudbroker/kvmx86/create.go @@ -8,6 +8,23 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) +type Interface struct { + // Network type + // Should be one of: + // - VINS + // - EXTNET + NetType string `url:"netType" json:"netType" validate:"required,kvmNetType"` + + // Network ID for connect to, + // for EXTNET - external network ID, + // for VINS - VINS ID, + NetID uint64 `url:"netId" json:"netId" validate:"required"` + + // IP address to assign to this VM when connecting to the specified network + // Required: false + IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` +} + // Request struct for create KVM x86 VM type CreateRequest struct { // ID of the resource group, which will own this VM @@ -45,24 +62,9 @@ type CreateRequest struct { // Required: false Pool string `url:"pool,omitempty" json:"pool,omitempty"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE - // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" + // Slice of structs with net interface description. // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility // Required: false @@ -88,6 +90,10 @@ type CreateRequest struct { // Required: false IPAType string `url:"ipaType,omitempty" json:"ipaType,omitempty"` + // Custom fields for Compute. Must be dict + // Required: false + CustomField string `url:"customFields,omitempty" json:"customFields,omitempty"` + // Reason for action // Required: false Reason string `url:"reason,omitempty" json:"reason,omitempty"` diff --git a/pkg/cloudbroker/kvmx86/create_blank.go b/pkg/cloudbroker/kvmx86/create_blank.go index 6fe3a96..7016686 100644 --- a/pkg/cloudbroker/kvmx86/create_blank.go +++ b/pkg/cloudbroker/kvmx86/create_blank.go @@ -40,24 +40,9 @@ type CreateBlankRequest struct { // Required: true Pool string `url:"pool" json:"pool" validate:"required"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE + // Slice of structs with net interface description. // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Text description of this VM // Required: false diff --git a/pkg/cloudbroker/kvmx86/mass_create.go b/pkg/cloudbroker/kvmx86/mass_create.go index ad5fbaf..834ceae 100644 --- a/pkg/cloudbroker/kvmx86/mass_create.go +++ b/pkg/cloudbroker/kvmx86/mass_create.go @@ -48,24 +48,9 @@ type MassCreateRequest struct { // Required: false Pool string `url:"pool,omitempty" json:"pool,omitempty"` - // Network type - // Should be one of: - // - VINS - // - EXTNET - // - NONE + // Slice of structs with net interface description. // Required: false - NetType string `url:"netType,omitempty" json:"netType,omitempty" validate:"omitempty,kvmNetType"` - - // Network ID for connect to, - // for EXTNET - external network ID, - // for VINS - VINS ID, - // when network type is not "NONE" - // Required: false - NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` - - // IP address to assign to this VM when connecting to the specified network - // Required: false - IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` + Interfaces []Interface `url:"interfaces,omitempty" json:"interfaces,omitempty" validate:"omitempty,min=1,dive"` // Input data for cloud-init facility // Required: false diff --git a/pkg/cloudbroker/lb/backend_create.go b/pkg/cloudbroker/lb/backend_create.go index 2356ebc..2c8c2b4 100644 --- a/pkg/cloudbroker/lb/backend_create.go +++ b/pkg/cloudbroker/lb/backend_create.go @@ -67,7 +67,7 @@ type BackendCreateRequest struct { Weight uint64 `url:"weight,omitempty" json:"weight,omitempty"` } -// BackendCreate creates new backend on the specified load balancer +// BackendCreate creates new backend on the specified load balancer func (lb LB) BackendCreate(ctx context.Context, req BackendCreateRequest) (bool, error) { err := validators.ValidateRequest(req) if err != nil { diff --git a/pkg/cloudbroker/lb/create.go b/pkg/cloudbroker/lb/create.go index 7e6e56a..7b88efc 100644 --- a/pkg/cloudbroker/lb/create.go +++ b/pkg/cloudbroker/lb/create.go @@ -19,10 +19,6 @@ type CreateRequest struct { // Required: true Name string `url:"name" json:"name" validate:"required"` - // OS image ID to create load balancer from - // Required: false - ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"` - // External network to connect this load balancer to // Required: true ExtNetID uint64 `url:"extnetId" json:"extnetId" validate:"required"` diff --git a/pkg/cloudbroker/lb/filter.go b/pkg/cloudbroker/lb/filter.go index b3a3ca4..8b0fd6c 100644 --- a/pkg/cloudbroker/lb/filter.go +++ b/pkg/cloudbroker/lb/filter.go @@ -44,7 +44,7 @@ func (ll ListLB) FilterByImageID(imageID uint64) ListLB { } // FilterByK8SID returns ListLB used by specified K8S cluster. -func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient interfaces.Caller) (ListLB, error) { +func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient interfaces.Caller) (*ListLB, error) { caller := k8s.New(decortClient) req := k8s.GetRequest{ @@ -60,28 +60,32 @@ func (ll ListLB) FilterByK8SID(ctx context.Context, k8sID uint64, decortClient i return cluster.LBID == rlb.ID } - return ll.FilterFunc(predicate), nil + res := ll.FilterFunc(predicate) + + return &res, nil } // FilterFunc allows filtering ListLB based on a user-specified predicate. func (ll ListLB) FilterFunc(predicate func(RecordLB) bool) ListLB { var result ListLB - for _, item := range ll { + for _, item := range ll.Data { if predicate(item) { - result = append(result, item) + result.Data = append(result.Data, item) } } + result.EntryCount = uint64(len(result.Data)) + return result } // FindOne returns first found RecordLB // If none was found, returns an empty struct. func (ll ListLB) FindOne() RecordLB { - if len(ll) == 0 { + if len(ll.Data) == 0 { return RecordLB{} } - return ll[0] + return ll.Data[0] } diff --git a/pkg/cloudbroker/lb/filter_test.go b/pkg/cloudbroker/lb/filter_test.go index c225ef3..2229233 100644 --- a/pkg/cloudbroker/lb/filter_test.go +++ b/pkg/cloudbroker/lb/filter_test.go @@ -3,99 +3,102 @@ package lb import "testing" var lbs = ListLB{ - RecordLB{ - HAMode: true, - CKey: "", - Meta: []interface{}{}, - ACL: []interface{}{}, - Backends: []ItemBackend{}, - CreatedBy: "test_user_1", - CreatedTime: 1636667448, - DeletedBy: "", - DeletedTime: 0, - Description: "", - DPAPIPassword: "0000", - DPAPIUser: "api_user", - ExtNetID: 2522, - Frontends: []ItemFrontend{}, - GID: 212, - GUID: 1, - ID: 1, - ImageID: 2121, - Milestones: 129000, - Name: "k8s-lb-test-1", - PrimaryNode: Node{}, - RGID: 25090, - RGName: "", - SecondaryNode: Node{}, - Status: "ENABLED", - TechStatus: "STARTED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 101, - }, - RecordLB{ - HAMode: false, - CKey: "", - Meta: []interface{}{}, - ACL: []interface{}{}, - Backends: []ItemBackend{}, - CreatedBy: "test_user_2", - CreatedTime: 1636667506, - DeletedBy: "", - DeletedTime: 0, - Description: "", - DPAPIPassword: "0000", - DPAPIUser: "api_user_2", - ExtNetID: 2524, - Frontends: []ItemFrontend{}, - GID: 212, - GUID: 2, - ID: 2, - ImageID: 2129, - Milestones: 129013, - Name: "k8s-lb-test-2", - PrimaryNode: Node{}, - RGID: 25092, - RGName: "", - SecondaryNode: Node{}, - Status: "ENABLED", - TechStatus: "STOPPED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 102, - }, - RecordLB{ - HAMode: true, - CKey: "", - Meta: []interface{}{}, - ACL: []interface{}{}, - Backends: []ItemBackend{}, - CreatedBy: "te2t_user_3", - CreatedTime: 1636667534, - DeletedBy: "", - DeletedTime: 0, - Description: "", - DPAPIPassword: "0000", - DPAPIUser: "api_user_3", - ExtNetID: 2536, - Frontends: []ItemFrontend{}, - GID: 212, - GUID: 3, - ID: 3, - ImageID: 2139, - Milestones: 129025, - Name: "k8s-lb-test-3", - PrimaryNode: Node{}, - RGID: 25106, - RGName: "", - SecondaryNode: Node{}, - Status: "DISABLED", - TechStatus: "STOPPED", - UpdatedBy: "", - UpdatedTime: 0, - VINSID: 118, + Data: []RecordLB{ + { + HAMode: true, + CKey: "", + Meta: []interface{}{}, + ACL: []interface{}{}, + Backends: []ItemBackend{}, + CreatedBy: "test_user_1", + CreatedTime: 1636667448, + DeletedBy: "", + DeletedTime: 0, + Description: "", + DPAPIPassword: "0000", + DPAPIUser: "api_user", + ExtNetID: 2522, + Frontends: []ItemFrontend{}, + GID: 212, + GUID: 1, + ID: 1, + ImageID: 2121, + Milestones: 129000, + Name: "k8s-lb-test-1", + PrimaryNode: Node{}, + RGID: 25090, + RGName: "", + SecondaryNode: Node{}, + Status: "ENABLED", + TechStatus: "STARTED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 101, + }, + { + HAMode: false, + CKey: "", + Meta: []interface{}{}, + ACL: []interface{}{}, + Backends: []ItemBackend{}, + CreatedBy: "test_user_2", + CreatedTime: 1636667506, + DeletedBy: "", + DeletedTime: 0, + Description: "", + DPAPIPassword: "0000", + DPAPIUser: "api_user_2", + ExtNetID: 2524, + Frontends: []ItemFrontend{}, + GID: 212, + GUID: 2, + ID: 2, + ImageID: 2129, + Milestones: 129013, + Name: "k8s-lb-test-2", + PrimaryNode: Node{}, + RGID: 25092, + RGName: "", + SecondaryNode: Node{}, + Status: "ENABLED", + TechStatus: "STOPPED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 102, + }, + { + HAMode: true, + CKey: "", + Meta: []interface{}{}, + ACL: []interface{}{}, + Backends: []ItemBackend{}, + CreatedBy: "te2t_user_3", + CreatedTime: 1636667534, + DeletedBy: "", + DeletedTime: 0, + Description: "", + DPAPIPassword: "0000", + DPAPIUser: "api_user_3", + ExtNetID: 2536, + Frontends: []ItemFrontend{}, + GID: 212, + GUID: 3, + ID: 3, + ImageID: 2139, + Milestones: 129025, + Name: "k8s-lb-test-3", + PrimaryNode: Node{}, + RGID: 25106, + RGName: "", + SecondaryNode: Node{}, + Status: "DISABLED", + TechStatus: "STOPPED", + UpdatedBy: "", + UpdatedTime: 0, + VINSID: 118, + }, }, + EntryCount: 3, } func TestFilterByID(t *testing.T) { @@ -135,7 +138,7 @@ func TestFilterFunc(t *testing.T) { return rl.Status == "DISABLED" }) - for _, item := range actual { + for _, item := range actual.Data { if item.Status != "DISABLED" { t.Fatal("expected Status 'DISABLED', found: ", item.Status) } @@ -145,7 +148,7 @@ func TestFilterFunc(t *testing.T) { func TestSortByCreatedTime(t *testing.T) { actual := lbs.SortByCreatedTime(true) - if actual[0].CreatedTime != 1636667534 || actual[2].CreatedTime != 1636667448 { + if actual.Data[0].CreatedTime != 1636667534 || actual.Data[2].CreatedTime != 1636667448 { t.Fatal("expected descending order, found ascending") } } diff --git a/pkg/cloudbroker/lb/list.go b/pkg/cloudbroker/lb/list.go index 7e87378..66ba7c3 100644 --- a/pkg/cloudbroker/lb/list.go +++ b/pkg/cloudbroker/lb/list.go @@ -8,6 +8,38 @@ import ( // Request struct for get list of load balancers type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"` + + // Find by resource group ID + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by tech status + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // Find by frontend Ip + // Required: false + FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"` + + // Find by backend Ip + // Required: false + BackIP string `url:"backIp,omitempty" json:"backIp,omitempty"` + // Included deleted load balancers // Required: false IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"` @@ -22,7 +54,7 @@ type ListRequest struct { } // List gets list all load balancers -func (lb LB) List(ctx context.Context, req ListRequest) (ListLB, error) { +func (lb LB) List(ctx context.Context, req ListRequest) (*ListLB, error) { url := "/cloudbroker/lb/list" res, err := lb.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -37,6 +69,6 @@ func (lb LB) List(ctx context.Context, req ListRequest) (ListLB, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/lb/list_deleted.go b/pkg/cloudbroker/lb/list_deleted.go index 3c44eeb..4af9323 100644 --- a/pkg/cloudbroker/lb/list_deleted.go +++ b/pkg/cloudbroker/lb/list_deleted.go @@ -8,6 +8,34 @@ import ( // Request struct for get list of deleted load balancers type ListDeletedRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"` + + // Find by resource group ID + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by tech status + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + + // Find by frontend Ip + // Required: false + FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"` + + // Find by backend Ip + // Required: false + BackIP string `url:"backIp,omitempty" json:"backIp,omitempty"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +46,7 @@ type ListDeletedRequest struct { } // ListDeleted gets list of deleted load balancers -func (lb LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListLB, error) { +func (lb LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListLB, error) { url := "/cloudbroker/lb/listDeleted" res, err := lb.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,6 +61,6 @@ func (lb LB) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListLB, e return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/lb/models.go b/pkg/cloudbroker/lb/models.go index 456b6a6..0a86373 100644 --- a/pkg/cloudbroker/lb/models.go +++ b/pkg/cloudbroker/lb/models.go @@ -134,7 +134,13 @@ type Node struct { } // List of load balancers -type ListLB []RecordLB +type ListLB struct { + // Data + Data []RecordLB `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Detailed information about load balancer type RecordLB struct { diff --git a/pkg/cloudbroker/lb/serialize.go b/pkg/cloudbroker/lb/serialize.go index 549a310..706fef9 100644 --- a/pkg/cloudbroker/lb/serialize.go +++ b/pkg/cloudbroker/lb/serialize.go @@ -12,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (ll ListLB) Serialize(params ...string) (serialization.Serialized, error) { - if len(ll) == 0 { + if len(ll.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/lb/sorting.go b/pkg/cloudbroker/lb/sorting.go index 5ab873a..addadeb 100644 --- a/pkg/cloudbroker/lb/sorting.go +++ b/pkg/cloudbroker/lb/sorting.go @@ -6,16 +6,16 @@ import "sort" // // If inverse param is set to true, the order is reversed. func (ll ListLB) SortByCreatedTime(inverse bool) ListLB { - if len(ll) < 2 { + if len(ll.Data) < 2 { return ll } - sort.Slice(ll, func(i, j int) bool { + sort.Slice(ll.Data, func(i, j int) bool { if inverse { - return ll[i].CreatedTime > ll[j].CreatedTime + return ll.Data[i].CreatedTime > ll.Data[j].CreatedTime } - return ll[i].CreatedTime < ll[j].CreatedTime + return ll.Data[i].CreatedTime < ll.Data[j].CreatedTime }) return ll @@ -25,16 +25,16 @@ func (ll ListLB) SortByCreatedTime(inverse bool) ListLB { // // If inverse param is set to true, the order is reversed. func (ll ListLB) SortByUpdatedTime(inverse bool) ListLB { - if len(ll) < 2 { + if len(ll.Data) < 2 { return ll } - sort.Slice(ll, func(i, j int) bool { + sort.Slice(ll.Data, func(i, j int) bool { if inverse { - return ll[i].UpdatedTime > ll[j].UpdatedTime + return ll.Data[i].UpdatedTime > ll.Data[j].UpdatedTime } - return ll[i].UpdatedTime < ll[j].UpdatedTime + return ll.Data[i].UpdatedTime < ll.Data[j].UpdatedTime }) return ll @@ -44,16 +44,16 @@ func (ll ListLB) SortByUpdatedTime(inverse bool) ListLB { // // If inverse param is set to true, the order is reversed. func (ll ListLB) SortByDeletedTime(inverse bool) ListLB { - if len(ll) < 2 { + if len(ll.Data) < 2 { return ll } - sort.Slice(ll, func(i, j int) bool { + sort.Slice(ll.Data, func(i, j int) bool { if inverse { - return ll[i].DeletedTime > ll[j].DeletedTime + return ll.Data[i].DeletedTime > ll.Data[j].DeletedTime } - return ll[i].DeletedTime < ll[j].DeletedTime + return ll.Data[i].DeletedTime < ll.Data[j].DeletedTime }) return ll diff --git a/pkg/cloudbroker/pcidevice/list.go b/pkg/cloudbroker/pcidevice/list.go index a799878..dabb7bf 100644 --- a/pkg/cloudbroker/pcidevice/list.go +++ b/pkg/cloudbroker/pcidevice/list.go @@ -6,11 +6,41 @@ import ( "net/http" ) +type ListRequest struct { + // Find by id + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by computeId + // Required: false + ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by rgId + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // 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 all pci devices -func (p PCIDevice) List(ctx context.Context) (ListPCIDevices, error) { +func (p PCIDevice) List(ctx context.Context, req ListRequest) (*ListPCIDevices, error) { url := "/cloudbroker/pcidevice/list" - res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, nil) + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { return nil, err } @@ -22,5 +52,5 @@ func (p PCIDevice) List(ctx context.Context) (ListPCIDevices, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/pcidevice/models.go b/pkg/cloudbroker/pcidevice/models.go index 300feb6..0a125b0 100644 --- a/pkg/cloudbroker/pcidevice/models.go +++ b/pkg/cloudbroker/pcidevice/models.go @@ -40,4 +40,11 @@ type ItemPCIDevice struct { } // List PCI devices -type ListPCIDevices []ItemPCIDevice +type ListPCIDevices struct { + // Data + Data []ItemPCIDevice `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} + diff --git a/pkg/cloudbroker/pcidevice/serialize.go b/pkg/cloudbroker/pcidevice/serialize.go index 6a2bc35..bc0908a 100644 --- a/pkg/cloudbroker/pcidevice/serialize.go +++ b/pkg/cloudbroker/pcidevice/serialize.go @@ -11,7 +11,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (l ListPCIDevices) Serialize(params ...string) (serialization.Serialized, error) { - if len(l) == 0 { + if len(l.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/rg/affinity_groups_list.go b/pkg/cloudbroker/rg/affinity_groups_list.go index 9426da3..2bd0ac7 100644 --- a/pkg/cloudbroker/rg/affinity_groups_list.go +++ b/pkg/cloudbroker/rg/affinity_groups_list.go @@ -16,7 +16,7 @@ type AffinityGroupsListRequest struct { } // AffinityGroupsList gets all currently defined affinity groups in this resource group with compute IDs -func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListRequest) (map[string][]uint64, error) { +func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListRequest) (*ListAffinityGroup, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -31,12 +31,12 @@ func (r RG) AffinityGroupsList(ctx context.Context, req AffinityGroupsListReques return nil, err } - list := make(map[string][]uint64) + list := ListAffinityGroup{} err = json.Unmarshal(res, &list) if err != nil { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/filter.go b/pkg/cloudbroker/rg/filter.go index 936d5ef..2c1f812 100644 --- a/pkg/cloudbroker/rg/filter.go +++ b/pkg/cloudbroker/rg/filter.go @@ -67,21 +67,23 @@ func (lrg ListRG) FilterByDefNetID(defNetID int64) ListRG { func (lrg ListRG) FilterFunc(predicate func(ItemRG) bool) ListRG { var result ListRG - for _, item := range lrg { + for _, item := range lrg.Data { if predicate(item) { - result = append(result, item) + result.Data = append(result.Data, item) } } + result.EntryCount = uint64(len(result.Data)) + return result } // FindOne returns first found ItemRG. // If none was found, returns an empty struct. func (lrg ListRG) FindOne() ItemRG { - if len(lrg) == 0 { + if len(lrg.Data) == 0 { return ItemRG{} } - return lrg[0] + return lrg.Data[0] } diff --git a/pkg/cloudbroker/rg/filter_test.go b/pkg/cloudbroker/rg/filter_test.go index 36756e7..f206af6 100644 --- a/pkg/cloudbroker/rg/filter_test.go +++ b/pkg/cloudbroker/rg/filter_test.go @@ -3,140 +3,143 @@ package rg import "testing" var rgs = ListRG{ - { - AccountID: 1, - AccountName: "std", - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "ARCXDU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "sample_user_1@decs3o", + Data: []ItemRG{ + { + AccountID: 1, + AccountName: "std", + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "ARCXDU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "sample_user_1@decs3o", + }, }, - }, - CreatedBy: "sample_user_1@decs3o", - CreatedTime: 1676645305, - DefNetID: 1, - DefNetType: "NONE", - DeletedBy: "", - DeletedTime: 0, - Description: "", - GID: 212, - GUID: 7971, - ID: 7971, - LockStatus: "UNLOCKED", - Milestones: 363459, - Name: "rg_1", - RegisterComputes: false, - ResourceLimits: ResourceLimits{ - CUC: -1, - CuD: -1, - CUI: -1, - CUM: -1, - CUNP: -1, - GPUUnits: -1, - }, - Secret: "", - Status: "CREATED", - UpdatedBy: "", - UpdatedTime: 0, - VINS: []uint64{}, - VMs: []uint64{}, - ResTypes: []string{}, - UniqPools: []string{}, - }, - { - AccountID: 2, - AccountName: "std_2", - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "ARCXDU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "sample_user_1@decs3o", + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1676645305, + DefNetID: 1, + DefNetType: "NONE", + DeletedBy: "", + DeletedTime: 0, + Description: "", + GID: 212, + GUID: 7971, + ID: 7971, + LockStatus: "UNLOCKED", + Milestones: 363459, + Name: "rg_1", + RegisterComputes: false, + ResourceLimits: ResourceLimits{ + CUC: -1, + CuD: -1, + CUI: -1, + CUM: -1, + CUNP: -1, + GPUUnits: -1, }, + Secret: "", + Status: "CREATED", + UpdatedBy: "", + UpdatedTime: 0, + VINS: []uint64{}, + VMs: []uint64{}, + ResTypes: []string{}, + UniqPools: []string{}, }, - CreatedBy: "sample_user_1@decs3o", - CreatedTime: 1676645461, - DefNetID: 2, - DefNetType: "NONE", - DeletedBy: "", - DeletedTime: 0, - Description: "", - GID: 212, - GUID: 7972, - ID: 7972, - LockStatus: "UNLOCKED", - Milestones: 363468, - Name: "rg_2", - RegisterComputes: false, - ResourceLimits: ResourceLimits{ - CUC: -1, - CuD: -1, - CUI: -1, - CUM: -1, - CUNP: -1, - GPUUnits: -1, - }, - Secret: "", - Status: "CREATED", - UpdatedBy: "", - UpdatedTime: 0, - VINS: []uint64{}, - VMs: []uint64{}, - ResTypes: []string{}, - UniqPools: []string{}, - }, - { - AccountID: 3, - AccountName: "std_3", - ACL: []ACL{ - { - Explicit: true, - GUID: "", - Right: "ARCXDU", - Status: "CONFIRMED", - Type: "U", - UserGroupID: "sample_user_2@decs3o", + { + AccountID: 2, + AccountName: "std_2", + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "ARCXDU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "sample_user_1@decs3o", + }, }, + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1676645461, + DefNetID: 2, + DefNetType: "NONE", + DeletedBy: "", + DeletedTime: 0, + Description: "", + GID: 212, + GUID: 7972, + ID: 7972, + LockStatus: "UNLOCKED", + Milestones: 363468, + Name: "rg_2", + RegisterComputes: false, + ResourceLimits: ResourceLimits{ + CUC: -1, + CuD: -1, + CUI: -1, + CUM: -1, + CUNP: -1, + GPUUnits: -1, + }, + Secret: "", + Status: "CREATED", + UpdatedBy: "", + UpdatedTime: 0, + VINS: []uint64{}, + VMs: []uint64{}, + ResTypes: []string{}, + UniqPools: []string{}, }, - CreatedBy: "sample_user_2@decs3o", - CreatedTime: 1676645548, - DefNetID: 3, - DefNetType: "NONE", - DeletedBy: "", - DeletedTime: 0, - Description: "", - GID: 212, - GUID: 7973, - ID: 7973, - LockStatus: "kjLOCKED", - Milestones: 363471, - Name: "rg_3", - RegisterComputes: false, - ResourceLimits: ResourceLimits{ - CUC: -1, - CuD: -1, - CUI: -1, - CUM: -1, - CUNP: -1, - GPUUnits: -1, - }, - Secret: "", - Status: "DISABLED", - UpdatedBy: "", - UpdatedTime: 0, - VINS: []uint64{}, - VMs: []uint64{ - 48500, + { + AccountID: 3, + AccountName: "std_3", + ACL: []ACL{ + { + Explicit: true, + GUID: "", + Right: "ARCXDU", + Status: "CONFIRMED", + Type: "U", + UserGroupID: "sample_user_2@decs3o", + }, + }, + CreatedBy: "sample_user_2@decs3o", + CreatedTime: 1676645548, + DefNetID: 3, + DefNetType: "NONE", + DeletedBy: "", + DeletedTime: 0, + Description: "", + GID: 212, + GUID: 7973, + ID: 7973, + LockStatus: "kjLOCKED", + Milestones: 363471, + Name: "rg_3", + RegisterComputes: false, + ResourceLimits: ResourceLimits{ + CUC: -1, + CuD: -1, + CUI: -1, + CUM: -1, + CUNP: -1, + GPUUnits: -1, + }, + Secret: "", + Status: "DISABLED", + UpdatedBy: "", + UpdatedTime: 0, + VINS: []uint64{}, + VMs: []uint64{ + 48500, + }, + ResTypes: []string{}, + UniqPools: []string{}, }, - ResTypes: []string{}, - UniqPools: []string{}, }, + EntryCount: 3, } func TestFilterByID(t *testing.T) { @@ -158,11 +161,11 @@ func TestFilterByName(t *testing.T) { func TestFilterByCreatedBy(t *testing.T) { actual := rgs.FilterByCreatedBy("sample_user_1@decs3o") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.CreatedBy != "sample_user_1@decs3o" { t.Fatal("expected CreatedBy 'sample_user_1@decs3o', found: ", item.CreatedBy) } @@ -172,11 +175,11 @@ func TestFilterByCreatedBy(t *testing.T) { func TestFilterByStatus(t *testing.T) { actual := rgs.FilterByStatus("CREATED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.Status != "CREATED" { t.Fatal("expected Status 'ENABLED', found: ", item.Status) } @@ -186,11 +189,11 @@ func TestFilterByStatus(t *testing.T) { func TestFilterByLockStatus(t *testing.T) { actual := rgs.FilterByLockStatus("UNLOCKED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.LockStatus != "UNLOCKED" { t.Fatal("expected LockStatus 'UNLOCKED', found: ", item.LockStatus) } @@ -200,11 +203,11 @@ func TestFilterByLockStatus(t *testing.T) { func TestFilterByDefNetType(t *testing.T) { actual := rgs.FilterByDefNetType("NONE") - if len(actual) != 3 { - t.Fatal("expected 3 found, actual: ", len(actual)) + if len(actual.Data) != 3 { + t.Fatal("expected 3 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.DefNetType != "NONE" { t.Fatal("expected DefNetType 'NONE', found: ", item.DefNetType) } @@ -224,11 +227,11 @@ func TestFilterFunc(t *testing.T) { return len(ir.VMs) > 0 }) - if len(actual) < 1 { - t.Fatal("expected 1 found, actual: ", len(actual)) + if len(actual.Data) < 1 { + t.Fatal("expected 1 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if len(item.VMs) < 1 { t.Fatal("expected VMs to contain at least 1 element, found empty") } @@ -238,7 +241,7 @@ func TestFilterFunc(t *testing.T) { func TestSortByCreatedTime(t *testing.T) { actual := rgs.SortByCreatedTime(true) - if actual[0].CreatedTime != 1676645548 || actual[2].CreatedTime != 1676645305 { + if actual.Data[0].CreatedTime != 1676645548 || actual.Data[2].CreatedTime != 1676645305 { t.Fatal("expected descending order, found ascending") } } diff --git a/pkg/cloudbroker/rg/get_resource_consumption.go b/pkg/cloudbroker/rg/get_resource_consumption.go new file mode 100644 index 0000000..fd26aa2 --- /dev/null +++ b/pkg/cloudbroker/rg/get_resource_consumption.go @@ -0,0 +1,42 @@ +package rg + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for get detailed information about resource consumption for ResGroup +type GetResourceConsumptionRequest struct { + // Resource group ID + // Required: true + RGID uint64 `url:"rgId" json:"rgId" validate:"required"` +} + +// GetResourceConsumption gets resource consumption of the resource group +func (r RG) GetResourceConsumption(ctx context.Context, req GetResourceConsumptionRequest) (*ItemResourceConsumption, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/rg/getResourceConsumption" + + res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + info := ItemResourceConsumption{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/rg/list.go b/pkg/cloudbroker/rg/list.go index 2cf6067..183ca6b 100644 --- a/pkg/cloudbroker/rg/list.go +++ b/pkg/cloudbroker/rg/list.go @@ -8,6 +8,34 @@ import ( // Request struct for get list of resource groups type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by name account + // Required: false + AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"` + + // Find by created after time (unix timestamp) + // Required: false + CreatedAfter uint64 `url:"createdAfter,omitempty" json:"createdAfter,omitempty"` + + // Find by created before time (unix timestamp) + // Required: false + CreatedBefore uint64 `url:"createdBefore,omitempty" json:"createdBefore,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + // Included deleted resource groups // Required: false IncludeDeleted bool `url:"includedeleted,omitempty" json:"includedeleted,omitempty"` @@ -22,7 +50,7 @@ type ListRequest struct { } // List gets list of all resource groups the user has access to -func (r RG) List(ctx context.Context, req ListRequest) (ListRG, error) { +func (r RG) List(ctx context.Context, req ListRequest) (*ListRG, error) { url := "/cloudbroker/rg/list" res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -37,5 +65,5 @@ func (r RG) List(ctx context.Context, req ListRequest) (ListRG, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/list_computes.go b/pkg/cloudbroker/rg/list_computes.go index 8928c3d..7a55288 100644 --- a/pkg/cloudbroker/rg/list_computes.go +++ b/pkg/cloudbroker/rg/list_computes.go @@ -14,13 +14,49 @@ type ListComputesRequest struct { // Required: true RGID uint64 `url:"rgId" json:"rgId" validate:"required"` - // Reason for action + // Find by compute id // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` + ComputeID uint64 `url:"computeId,omitempty" json:"computeId,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // ID an account + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by tech status + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // Find by ip address + // Required: false + IPAddress string `url:"ipAddress,omitempty" json:"ipAddress,omitempty"` + + // Find by external network name + // Required: false + ExtNetName string `url:"extNetName,omitempty" json:"extNetName,omitempty"` + + // Find by external network id + // Required: false + ExtNetID uint64 `url:"extNetId,omitempty" json:"extNetId,omitempty"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` } // ListComputes gets list of all compute instances under specified resource group, accessible by the user -func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (ListComputes, error) { +func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (*ListComputes, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -42,5 +78,5 @@ func (r RG) ListComputes(ctx context.Context, req ListComputesRequest) (ListComp return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/list_deleted.go b/pkg/cloudbroker/rg/list_deleted.go index 23f8bbe..d5e54ea 100644 --- a/pkg/cloudbroker/rg/list_deleted.go +++ b/pkg/cloudbroker/rg/list_deleted.go @@ -8,6 +8,34 @@ import ( // Request struct for get list deleted resource groups type ListDeletedRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by name account + // Required: false + AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"` + + // Find by created after time (unix timestamp) + // Required: false + CreatedAfter uint64 `url:"createdAfter,omitempty" json:"createdAfter,omitempty"` + + // Find by created before time (unix timestamp) + // Required: false + CreatedBefore uint64 `url:"createdBefore,omitempty" json:"createdBefore,omitempty"` + + // Find by status lock + // Required: false + LockStatus string `url:"lockStatus,omitempty" json:"lockStatus,omitempty"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +46,7 @@ type ListDeletedRequest struct { } // ListDeleted gets list all deleted resource groups the user has access to -func (r RG) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListRG, error) { +func (r RG) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListRG, error) { url := "/cloudbroker/rg/listDeleted" res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +61,5 @@ func (r RG) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListRG, er return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/list_lb.go b/pkg/cloudbroker/rg/list_lb.go index c5800e9..0183e1d 100644 --- a/pkg/cloudbroker/rg/list_lb.go +++ b/pkg/cloudbroker/rg/list_lb.go @@ -13,10 +13,46 @@ type ListLBRequest struct { // Resource group ID // Required: true RGID uint64 `url:"rgId" json:"rgId" validate:"required"` + + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountID,omitempty" json:"accountID,omitempty"` + + // Find by tech status + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + + // Find by status + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // Find by frontend Ip + // Required: false + FrontIP string `url:"frontIp,omitempty" json:"frontIp,omitempty"` + + // Find by backend Ip + // Required: false + BackIP string `url:"backIp,omitempty" json:"backIp,omitempty"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` } // ListLB gets list all load balancers in the specified resource group, accessible by the user -func (r RG) ListLB(ctx context.Context, req ListLBRequest) (ListLB, error) { +func (r RG) ListLB(ctx context.Context, req ListLBRequest) (*ListLB, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -38,5 +74,5 @@ func (r RG) ListLB(ctx context.Context, req ListLBRequest) (ListLB, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/list_pfw.go b/pkg/cloudbroker/rg/list_pfw.go index 2dd13eb..c98370f 100644 --- a/pkg/cloudbroker/rg/list_pfw.go +++ b/pkg/cloudbroker/rg/list_pfw.go @@ -16,7 +16,7 @@ type ListPFWRequest struct { } // ListPFW gets list port forward rules for the specified resource group -func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (ListPFW, error) { +func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (*ListPFW, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -38,5 +38,5 @@ func (r RG) ListPFW(ctx context.Context, req ListPFWRequest) (ListPFW, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/list_resource_consumption.go b/pkg/cloudbroker/rg/list_resource_consumption.go new file mode 100644 index 0000000..6ae20df --- /dev/null +++ b/pkg/cloudbroker/rg/list_resource_consumption.go @@ -0,0 +1,26 @@ +package rg + +import ( + "context" + "encoding/json" + "net/http" +) + +// ListResourceConsumption gets resource consumptions of the resource groups +func (r RG) ListResourceConsumption(ctx context.Context) (*ListResourceConsumption, error) { + url := "/cloudbroker/rg/listResourceConsumption" + + res, err := r.client.DecortApiCall(ctx, http.MethodPost, url, nil) + if err != nil { + return nil, err + } + + list := ListResourceConsumption{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} diff --git a/pkg/cloudbroker/rg/list_vins.go b/pkg/cloudbroker/rg/list_vins.go index f8c6121..7980d6a 100644 --- a/pkg/cloudbroker/rg/list_vins.go +++ b/pkg/cloudbroker/rg/list_vins.go @@ -14,13 +14,33 @@ type ListVINSRequest struct { // Required: true RGID uint64 `url:"rgId" json:"rgId" validate:"required"` - // Reason for action + // Find by name // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` + Name string `url:"name,omitempty" json:"name,omitempty"` + + // ID an account + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by ip extnet address + // Required: false + ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"` + + // Find by vins id + // Required: false + VINSID uint64 `url:"vinsId,omitempty" json:"vinsId,omitempty"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` } // ListVINS gets list all ViNSes under specified resource group, accessible by the user -func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, error) { +func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (*ListVINS, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -42,5 +62,5 @@ func (r RG) ListVINS(ctx context.Context, req ListVINSRequest) (ListVINS, error) return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/rg/models.go b/pkg/cloudbroker/rg/models.go index 92816cc..e8628ba 100644 --- a/pkg/cloudbroker/rg/models.go +++ b/pkg/cloudbroker/rg/models.go @@ -30,7 +30,7 @@ type Reservation struct { DiskSize float64 `json:"disksize"` // Max disk size - DiskSizeMax uint64 `json:"disksizemax"` + DiskSizeMax float64 `json:"disksizemax"` // External IPs ExtIPs int64 `json:"extips"` @@ -54,16 +54,26 @@ type DiskUsage struct { DiskSize float64 `json:"disksize"` // Disk size max - DiskSizeMax uint64 `json:"disksizemax"` + DiskSizeMax float64 `json:"disksizemax"` } // Resources usage information -type Resources struct { +type ItemResourceConsumption struct { // Current information - Current Reservation `json:"Current"` + Consumed Reservation `json:"Consumed"` // Reserved information Reserved Reservation `json:"Reserved"` + + RGID uint64 `json:"rgid"` +} + +type ListResourceConsumption struct { + // Data + Data []ItemResourceConsumption `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` } // Access Control List @@ -98,6 +108,9 @@ type ResourceLimits struct { // CUD CuD float64 `json:"CU_D"` + // CUDM + CUDM float64 `json:"CU_DM"` + // CUI CUI float64 `json:"CU_I"` @@ -113,9 +126,6 @@ type ResourceLimits struct { // Detailed information about resource group type RecordRG struct { - // Resource information - Resources Resources `json:"Resources"` - // Main information about resource group ItemRG } @@ -158,6 +168,9 @@ type ItemRG struct { // Description Description string `json:"desc"` + // Dirty + Dirty bool `json:"dirty"` + // Grid ID GID uint64 `json:"gid"` @@ -208,7 +221,13 @@ type ItemRG struct { } // List resource groups -type ListRG []ItemRG +type ListRG struct { + // Data + Data []ItemRG `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Main information about affinity group type ItemAffinityGroupCompute struct { @@ -337,7 +356,13 @@ type ItemCompute struct { } // List computes -type ListComputes []ItemCompute +type ListComputes struct { + // Data + Data []ItemCompute `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Main information about VINS type ItemVINS struct { @@ -394,7 +419,13 @@ type ItemVINS struct { } // List VINSes -type ListVINS []ItemVINS +type ListVINS struct { + // Data + Data []ItemVINS `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Main information about port forward type ItemPFW struct { @@ -424,7 +455,13 @@ type ItemPFW struct { } // List PFWs -type ListPFW []ItemPFW +type ListPFW struct { + // Data + Data []ItemPFW `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Server settings type ServerSettings struct { @@ -640,4 +677,18 @@ type ItemLB struct { } // List load balancers -type ListLB []ItemLB +type ListLB struct { + // Data + Data []ItemLB `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} + +type ListAffinityGroup struct { + // Data + Data map[string][]uint64 `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/rg/serialize.go b/pkg/cloudbroker/rg/serialize.go index d56a0d7..4eb4e87 100644 --- a/pkg/cloudbroker/rg/serialize.go +++ b/pkg/cloudbroker/rg/serialize.go @@ -12,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (lrg ListRG) Serialize(params ...string) (serialization.Serialized, error) { - if len(lrg) == 0 { + if len(lrg.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/rg/sorting.go b/pkg/cloudbroker/rg/sorting.go index 399753b..37dc53a 100644 --- a/pkg/cloudbroker/rg/sorting.go +++ b/pkg/cloudbroker/rg/sorting.go @@ -6,16 +6,16 @@ import "sort" // // If inverse param is set to true, the order is reversed. func (lrg ListRG) SortByCreatedTime(inverse bool) ListRG { - if len(lrg) < 2 { + if len(lrg.Data) < 2 { return lrg } - sort.Slice(lrg, func(i, j int) bool { + sort.Slice(lrg.Data, func(i, j int) bool { if inverse { - return lrg[i].CreatedTime > lrg[j].CreatedTime + return lrg.Data[i].CreatedTime > lrg.Data[j].CreatedTime } - return lrg[i].CreatedTime < lrg[j].CreatedTime + return lrg.Data[i].CreatedTime < lrg.Data[j].CreatedTime }) return lrg @@ -25,16 +25,16 @@ func (lrg ListRG) SortByCreatedTime(inverse bool) ListRG { // // If inverse param is set to true, the order is reversed. func (lrg ListRG) SortByUpdatedTime(inverse bool) ListRG { - if len(lrg) < 2 { + if len(lrg.Data) < 2 { return lrg } - sort.Slice(lrg, func(i, j int) bool { + sort.Slice(lrg.Data, func(i, j int) bool { if inverse { - return lrg[i].UpdatedTime > lrg[j].UpdatedTime + return lrg.Data[i].UpdatedTime > lrg.Data[j].UpdatedTime } - return lrg[i].UpdatedTime < lrg[j].UpdatedTime + return lrg.Data[i].UpdatedTime < lrg.Data[j].UpdatedTime }) return lrg @@ -44,16 +44,16 @@ func (lrg ListRG) SortByUpdatedTime(inverse bool) ListRG { // // If inverse param is set to true, the order is reversed. func (lrg ListRG) SortByDeletedTime(inverse bool) ListRG { - if len(lrg) < 2 { + if len(lrg.Data) < 2 { return lrg } - sort.Slice(lrg, func(i, j int) bool { + sort.Slice(lrg.Data, func(i, j int) bool { if inverse { - return lrg[i].DeletedTime > lrg[j].DeletedTime + return lrg.Data[i].DeletedTime > lrg.Data[j].DeletedTime } - return lrg[i].DeletedTime < lrg[j].DeletedTime + return lrg.Data[i].DeletedTime < lrg.Data[j].DeletedTime }) return lrg diff --git a/pkg/cloudbroker/sep/filter.go b/pkg/cloudbroker/sep/filter.go index b0c6058..d3876fc 100644 --- a/pkg/cloudbroker/sep/filter.go +++ b/pkg/cloudbroker/sep/filter.go @@ -49,21 +49,23 @@ func (lsep ListSEP) FilterByType(sepType string) ListSEP { func (lsep ListSEP) FilterFunc(predicate func(RecordSEP) bool) ListSEP { var result ListSEP - for _, item := range lsep { + for _, item := range lsep.Data { if predicate(item) { - result = append(result, item) + result.Data = append(result.Data, item) } } + result.EntryCount = uint64(len(result.Data)) + return result } // FindOne returns first found RecordSEP // If none was found, returns an empty struct. func (lsep ListSEP) FindOne() RecordSEP { - if len(lsep) == 0 { + if len(lsep.Data) == 0 { return RecordSEP{} } - return lsep[0] + return lsep.Data[0] } diff --git a/pkg/cloudbroker/sep/filter_test.go b/pkg/cloudbroker/sep/filter_test.go index d3f4fc5..9ea2bd3 100644 --- a/pkg/cloudbroker/sep/filter_test.go +++ b/pkg/cloudbroker/sep/filter_test.go @@ -3,110 +3,113 @@ package sep import "testing" var seps = ListSEP{ - { - CKey: "", - Meta: []interface{}{ - "osismodel", - "cloudbroker", - "sep", - 1, - }, - Config: map[string]interface{}{ - "API_IPs": []string{ - "10.212.3.61", - "10.212.3.62", - "10.212.3.63", + Data: []RecordSEP{ + { + CKey: "", + Meta: []interface{}{ + "osismodel", + "cloudbroker", + "sep", + 1, }, - }, - ConsumedBy: []uint64{ - 27, - }, - Description: "", - GID: 212, - GUID: 1, - ID: 1, - Milestones: 278329, - Name: "sep_1", - ObjStatus: "CREATED", - ProvidedBy: []uint64{ - 24, - 35, - 29, - }, - SharedWith: []uint64{}, - TechStatus: "ENABLED", - Type: "DES", - }, - { - CKey: "", - Meta: []interface{}{ - "osismodel", - "cloudbroker", - "sep", - 1, - }, - Config: map[string]interface{}{ - "API_IPs": []string{ - "10.212.3.64", - "10.212.3.65", - "10.212.3.66", + Config: map[string]interface{}{ + "API_IPs": []string{ + "10.212.3.61", + "10.212.3.62", + "10.212.3.63", + }, }, - }, - ConsumedBy: []uint64{ - 32, - 26, - }, - Description: "", - GID: 212, - GUID: 2, - ID: 2, - Milestones: 278337, - Name: "sep_2", - ObjStatus: "CREATED", - ProvidedBy: []uint64{ - 36, - 42, - 35, - }, - SharedWith: []uint64{}, - TechStatus: "ENABLED", - Type: "DES", - }, - { - CKey: "", - Meta: []interface{}{ - "osismodel", - "cloudbroker", - "sep", - 1, - }, - Config: map[string]interface{}{ - "API_IPs": []string{ - "10.212.3.67", - "10.212.3.68", - "10.212.3.69", + ConsumedBy: []uint64{ + 27, + }, + Description: "", + GID: 212, + GUID: 1, + ID: 1, + Milestones: 278329, + Name: "sep_1", + ObjStatus: "CREATED", + ProvidedBy: []uint64{ + 24, + 35, + 29, }, + SharedWith: []uint64{}, + TechStatus: "ENABLED", + Type: "DES", }, - ConsumedBy: []uint64{ - 38, - 28, + { + CKey: "", + Meta: []interface{}{ + "osismodel", + "cloudbroker", + "sep", + 1, + }, + Config: map[string]interface{}{ + "API_IPs": []string{ + "10.212.3.64", + "10.212.3.65", + "10.212.3.66", + }, + }, + ConsumedBy: []uint64{ + 32, + 26, + }, + Description: "", + GID: 212, + GUID: 2, + ID: 2, + Milestones: 278337, + Name: "sep_2", + ObjStatus: "CREATED", + ProvidedBy: []uint64{ + 36, + 42, + 35, + }, + SharedWith: []uint64{}, + TechStatus: "ENABLED", + Type: "DES", }, - Description: "", - GID: 212, - GUID: 3, - ID: 3, - Milestones: 278345, - Name: "sep_3", - ObjStatus: "DESTROYED", - ProvidedBy: []uint64{ - 49, - 48, - 41, + { + CKey: "", + Meta: []interface{}{ + "osismodel", + "cloudbroker", + "sep", + 1, + }, + Config: map[string]interface{}{ + "API_IPs": []string{ + "10.212.3.67", + "10.212.3.68", + "10.212.3.69", + }, + }, + ConsumedBy: []uint64{ + 38, + 28, + }, + Description: "", + GID: 212, + GUID: 3, + ID: 3, + Milestones: 278345, + Name: "sep_3", + ObjStatus: "DESTROYED", + ProvidedBy: []uint64{ + 49, + 48, + 41, + }, + SharedWith: []uint64{}, + TechStatus: "DISABLED", + Type: "DES", }, - SharedWith: []uint64{}, - TechStatus: "DISABLED", - Type: "DES", }, + EntryCount: 3, } func TestFilterByID(t *testing.T) { @@ -128,11 +131,11 @@ func TestFilterByName(t *testing.T) { func TestFilterByObjStatus(t *testing.T) { actual := seps.FilterByObjStatus("CREATED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.ObjStatus != "CREATED" { t.Fatal("expected ObjStatus 'CREATED', found: ", item.ObjStatus) } @@ -142,11 +145,11 @@ func TestFilterByObjStatus(t *testing.T) { func TestFilterByTechStatus(t *testing.T) { actual := seps.FilterByTechStatus("ENABLED") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.TechStatus != "ENABLED" { t.Fatal("expected TechStatus 'ENABLED', found: ", item.TechStatus) } @@ -156,11 +159,11 @@ func TestFilterByTechStatus(t *testing.T) { func TestFilterByType(t *testing.T) { actual := seps.FilterByType("DES") - if len(actual) != 3 { - t.Fatal("expected 3 found, actual: ", len(actual)) + if len(actual.Data) != 3 { + t.Fatal("expected 3 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.Type != "DES" { t.Fatal("expected Type 'DES', found: ", item.Type) } @@ -172,11 +175,11 @@ func TestFilterFunc(t *testing.T) { return len(rs.ConsumedBy) > 1 }) - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if len(item.ConsumedBy) <= 1 { t.Fatal("expected ConsumedBy to contain more than 1 element, found: ", len(item.ConsumedBy)) } diff --git a/pkg/cloudbroker/sep/list.go b/pkg/cloudbroker/sep/list.go index 91682d9..60d119e 100644 --- a/pkg/cloudbroker/sep/list.go +++ b/pkg/cloudbroker/sep/list.go @@ -8,6 +8,34 @@ import ( // Request struct for get list of SEPs type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by gId + // Required: false + GID uint64 `url:"gId,omitempty" json:"gId,omitempty"` + + // Find by sep type + // Required: false + Type string `url:"type,omitempty" json:"type,omitempty"` + + // Find by provided physical node id + // Required: false + ProvidedBy uint64 `url:"providedBy,omitempty" json:"providedBy,omitempty"` + + // Find by techStatus + // Required: false + TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"` + + // Find by consumed physical node id + // Required: false + ConsumedBy uint64 `url:"consumedBy,omitempty" json:"consumedBy,omitempty"` + // Page size // Required: false Size uint64 `url:"size,omitempty" json:"size,omitempty"` @@ -18,7 +46,7 @@ type ListRequest struct { } // List gets list of SEPs -func (s SEP) List(ctx context.Context, req ListRequest) (ListSEP, error) { +func (s SEP) List(ctx context.Context, req ListRequest) (*ListSEP, error) { url := "/cloudbroker/sep/list" res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +61,5 @@ func (s SEP) List(ctx context.Context, req ListRequest) (ListSEP, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/sep/models.go b/pkg/cloudbroker/sep/models.go index e8b058c..17c2e6f 100644 --- a/pkg/cloudbroker/sep/models.go +++ b/pkg/cloudbroker/sep/models.go @@ -124,4 +124,10 @@ type RecordSEP struct { } // List SEPs -type ListSEP []RecordSEP +type ListSEP struct { + // Data + Data []RecordSEP `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/sep/serialize.go b/pkg/cloudbroker/sep/serialize.go index 8e6b638..383e520 100644 --- a/pkg/cloudbroker/sep/serialize.go +++ b/pkg/cloudbroker/sep/serialize.go @@ -12,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (lsep ListSEP) Serialize(params ...string) (serialization.Serialized, error) { - if len(lsep) == 0 { + if len(lsep.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/tasks/list.go b/pkg/cloudbroker/tasks/list.go index 89a753c..aca846b 100644 --- a/pkg/cloudbroker/tasks/list.go +++ b/pkg/cloudbroker/tasks/list.go @@ -18,7 +18,7 @@ type ListRequest struct { } // List gets list user API task with status PROCESSING -func (t Tasks) List(ctx context.Context, req ListRequest) (ListTasks, error) { +func (t Tasks) List(ctx context.Context, req ListRequest) (*ListTasks, error) { url := "/cloudbroker/tasks/list" res, err := t.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +33,5 @@ func (t Tasks) List(ctx context.Context, req ListRequest) (ListTasks, error) { return nil, err } - return item, nil + return &item, nil } diff --git a/pkg/cloudbroker/tasks/models.go b/pkg/cloudbroker/tasks/models.go index 7709926..d4d0e84 100644 --- a/pkg/cloudbroker/tasks/models.go +++ b/pkg/cloudbroker/tasks/models.go @@ -45,6 +45,13 @@ func (r *InfoResult) UnmarshalJSON(b []byte) error { // Detailed information about task type RecordTask struct { + // Updated by + UpdatedBy string `json:"updatedBy"` + + ItemTask +} + +type ItemTask struct { // Audit ID AuditID string `json:"auditId"` @@ -74,4 +81,10 @@ type RecordTask struct { } // List of tasks -type ListTasks []RecordTask +type ListTasks struct { + // Data + Data []ItemTask `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/vgpu/list.go b/pkg/cloudbroker/vgpu/list.go index 63d91f9..53f8b7f 100644 --- a/pkg/cloudbroker/vgpu/list.go +++ b/pkg/cloudbroker/vgpu/list.go @@ -8,6 +8,38 @@ import ( // Request struct for getting 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"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +50,7 @@ type ListRequest struct { } // List gets list all VGPU -func (v VGPU) List(ctx context.Context, req ListRequest) (ListVGPU, error) { +func (v VGPU) List(ctx context.Context, req ListRequest) (*ListVGPU, error) { url := "/cloudbroker/vgpu/list" res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +65,5 @@ func (v VGPU) List(ctx context.Context, req ListRequest) (ListVGPU, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vgpu/models.go b/pkg/cloudbroker/vgpu/models.go index 2e1c89e..c7fa695 100644 --- a/pkg/cloudbroker/vgpu/models.go +++ b/pkg/cloudbroker/vgpu/models.go @@ -63,4 +63,10 @@ type ItemVGPU struct { } // List of VGPU -type ListVGPU []ItemVGPU +type ListVGPU struct { + // Data + Data []ItemVGPU `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/vgpu/serialize.go b/pkg/cloudbroker/vgpu/serialize.go index 64e3475..f0c36ab 100644 --- a/pkg/cloudbroker/vgpu/serialize.go +++ b/pkg/cloudbroker/vgpu/serialize.go @@ -2,6 +2,7 @@ package vgpu import ( "encoding/json" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/serialization" ) @@ -11,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (l ListVGPU) Serialize(params ...string) (serialization.Serialized, error) { - if len(l) == 0 { + if len(l.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/vins/extnet_connect.go b/pkg/cloudbroker/vins/extnet_connect.go index c85de26..cabe706 100644 --- a/pkg/cloudbroker/vins/extnet_connect.go +++ b/pkg/cloudbroker/vins/extnet_connect.go @@ -15,8 +15,8 @@ type ExtNetConnectRequest struct { VINSID uint64 `url:"vinsId" json:"vinsId" validate:"required"` // External network ID - // Required: true - NetID uint64 `url:"netId" json:"netId" validate:"required"` + // Required: false + NetID uint64 `url:"netId,omitempty" json:"netId,omitempty"` // Directly set IP address // Required: false diff --git a/pkg/cloudbroker/vins/extnet_list.go b/pkg/cloudbroker/vins/extnet_list.go index b2bc394..fe52d4d 100644 --- a/pkg/cloudbroker/vins/extnet_list.go +++ b/pkg/cloudbroker/vins/extnet_list.go @@ -13,14 +13,10 @@ type ExtNetListRequest struct { // VINS ID // Required: true VINSID uint64 `url:"vinsId" json:"vinsId" validate:"required"` - - // Reason for action - // Required: false - Reason string `url:"reason,omitempty" json:"reason,omitempty"` } // ExtNetList show list of VINS external network connections -func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (ListExtNets, error) { +func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (*ListExtNets, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -42,5 +38,5 @@ func (v VINS) ExtNetList(ctx context.Context, req ExtNetListRequest) (ListExtNet return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vins/filter.go b/pkg/cloudbroker/vins/filter.go index e46092f..d635887 100644 --- a/pkg/cloudbroker/vins/filter.go +++ b/pkg/cloudbroker/vins/filter.go @@ -58,21 +58,23 @@ func (lv ListVINS) FilterByDeletedBy(deletedBy string) ListVINS { func (lv ListVINS) FilterFunc(predicate func(ItemVINS) bool) ListVINS { var result ListVINS - for _, item := range lv { + for _, item := range lv.Data { if predicate(item) { - result = append(result, item) + result.Data = append(result.Data, item) } } + result.EntryCount = uint64(len(result.Data)) + return result } // FindOne returns first found ItemVINS // If none was found, returns an empty struct. func (lv ListVINS) FindOne() ItemVINS { - if len(lv) == 0 { + if len(lv.Data) == 0 { return ItemVINS{} } - return lv[0] + return lv.Data[0] } diff --git a/pkg/cloudbroker/vins/filter_test.go b/pkg/cloudbroker/vins/filter_test.go index 1ebe3bc..65443e1 100644 --- a/pkg/cloudbroker/vins/filter_test.go +++ b/pkg/cloudbroker/vins/filter_test.go @@ -3,144 +3,147 @@ package vins import "testing" var vinsItems = ListVINS{ - { - AccountID: 1, - AccountName: "std", - CreatedBy: "sample_user_1@decs3o", - CreatedTime: 1676898844, - DefaultGW: "", - DefaultQOS: QOS{ - ERate: 0, - GUID: "", - InBurst: 0, - InRate: 0, + Data: []ItemVINS{ + { + AccountID: 1, + AccountName: "std", + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1676898844, + DefaultGW: "", + DefaultQOS: QOS{ + ERate: 0, + GUID: "", + InBurst: 0, + InRate: 0, + }, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExternalIP: "", + GID: 212, + GUID: 1, + ID: 1, + LockStatus: "UNLOCKED", + ManagerID: 0, + ManagerType: "", + Milestones: 363485, + Name: "vins01", + NetMask: 24, + Network: "192.168.1.0/24", + PreReservationsNum: 32, + PriVNFDevID: 29557, + Redundant: false, + RGID: 7971, + RGName: "rg_01", + SecVNFDevID: 0, + Status: "ENABLED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + VNFs: ItemVNFs{ + DHCP: 51997, + DNS: 0, + FW: 0, + GW: 0, + NAT: 0, + VPN: 0, + }, + VXLANID: 3544, }, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExternalIP: "", - GID: 212, - GUID: 1, - ID: 1, - LockStatus: "UNLOCKED", - ManagerID: 0, - ManagerType: "", - Milestones: 363485, - Name: "vins01", - NetMask: 24, - Network: "192.168.1.0/24", - PreReservationsNum: 32, - PriVNFDevID: 29557, - Redundant: false, - RGID: 7971, - RGName: "rg_01", - SecVNFDevID: 0, - Status: "ENABLED", - UpdatedBy: "", - UpdatedTime: 0, - UserManaged: true, - VNFs: ItemVNFs{ - DHCP: 51997, - DNS: 0, - FW: 0, - GW: 0, - NAT: 0, - VPN: 0, + { + AccountID: 2, + AccountName: "std2", + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1676898948, + DefaultGW: "", + DefaultQOS: QOS{ + ERate: 0, + GUID: "", + InBurst: 0, + InRate: 0, + }, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExternalIP: "", + GID: 212, + GUID: 2, + ID: 2, + LockStatus: "LOCKED", + ManagerID: 0, + ManagerType: "", + Milestones: 363508, + Name: "vins02", + NetMask: 24, + Network: "192.168.2.0/24", + PreReservationsNum: 32, + PriVNFDevID: 29558, + Redundant: false, + RGID: 7972, + RGName: "rg_02", + SecVNFDevID: 0, + Status: "ENABLED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + VNFs: ItemVNFs{ + DHCP: 51998, + DNS: 0, + FW: 0, + GW: 0, + NAT: 0, + VPN: 0, + }, + VXLANID: 3545, }, - VXLANID: 3544, - }, - { - AccountID: 2, - AccountName: "std2", - CreatedBy: "sample_user_1@decs3o", - CreatedTime: 1676898948, - DefaultGW: "", - DefaultQOS: QOS{ - ERate: 0, - GUID: "", - InBurst: 0, - InRate: 0, - }, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExternalIP: "", - GID: 212, - GUID: 2, - ID: 2, - LockStatus: "LOCKED", - ManagerID: 0, - ManagerType: "", - Milestones: 363508, - Name: "vins02", - NetMask: 24, - Network: "192.168.2.0/24", - PreReservationsNum: 32, - PriVNFDevID: 29558, - Redundant: false, - RGID: 7972, - RGName: "rg_02", - SecVNFDevID: 0, - Status: "ENABLED", - UpdatedBy: "", - UpdatedTime: 0, - UserManaged: true, - VNFs: ItemVNFs{ - DHCP: 51998, - DNS: 0, - FW: 0, - GW: 0, - NAT: 0, - VPN: 0, - }, - VXLANID: 3545, - }, - { - AccountID: 3, - AccountName: "std3", - CreatedBy: "sample_user_2@decs3o", - CreatedTime: 1676899026, - DefaultGW: "", - DefaultQOS: QOS{ - ERate: 0, - GUID: "", - InBurst: 0, - InRate: 0, - }, - DeletedBy: "", - DeletedTime: 0, - Description: "", - ExternalIP: "", - GID: 212, - GUID: 3, - ID: 3, - LockStatus: "UNLOCKED", - ManagerID: 0, - ManagerType: "", - Milestones: 363549, - Name: "vins03", - NetMask: 24, - Network: "192.168.3.0/24", - PreReservationsNum: 32, - PriVNFDevID: 29559, - Redundant: false, - RGID: 7973, - RGName: "rg_03", - SecVNFDevID: 0, - Status: "DISABLED", - UpdatedBy: "", - UpdatedTime: 0, - UserManaged: true, - VNFs: ItemVNFs{ - DHCP: 51999, - DNS: 0, - FW: 0, - GW: 0, - NAT: 0, - VPN: 0, + { + AccountID: 3, + AccountName: "std3", + CreatedBy: "sample_user_2@decs3o", + CreatedTime: 1676899026, + DefaultGW: "", + DefaultQOS: QOS{ + ERate: 0, + GUID: "", + InBurst: 0, + InRate: 0, + }, + DeletedBy: "", + DeletedTime: 0, + Description: "", + ExternalIP: "", + GID: 212, + GUID: 3, + ID: 3, + LockStatus: "UNLOCKED", + ManagerID: 0, + ManagerType: "", + Milestones: 363549, + Name: "vins03", + NetMask: 24, + Network: "192.168.3.0/24", + PreReservationsNum: 32, + PriVNFDevID: 29559, + Redundant: false, + RGID: 7973, + RGName: "rg_03", + SecVNFDevID: 0, + Status: "DISABLED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + VNFs: ItemVNFs{ + DHCP: 51999, + DNS: 0, + FW: 0, + GW: 0, + NAT: 0, + VPN: 0, + }, + VXLANID: 3546, }, - VXLANID: 3546, }, + EntryCount: 3, } func TestFilterByID(t *testing.T) { @@ -170,11 +173,11 @@ func TestFilterByAccountID(t *testing.T) { func TestFilterByCreatedBy(t *testing.T) { actual := vinsItems.FilterByCreatedBy("sample_user_1@decs3o") - if len(actual) != 2 { - t.Fatal("expected 2 found, actual: ", len(actual)) + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) } - for _, item := range actual { + for _, item := range actual.Data { if item.CreatedBy != "sample_user_1@decs3o" { t.Fatal("expected CreatedBy 'sample_user_1@decs3o', found: ", item.CreatedBy) } @@ -195,7 +198,7 @@ func TestFilterFunc(t *testing.T) { func TestSortByCreatedTime(t *testing.T) { actual := vinsItems.SortByCreatedTime(false) - if actual[0].CreatedTime != 1676898844 || actual[2].CreatedTime != 1676899026 { + if actual.Data[0].CreatedTime != 1676898844 || actual.Data[2].CreatedTime != 1676899026 { t.Fatal("expected ascending order, found descending") } } diff --git a/pkg/cloudbroker/vins/ip_list.go b/pkg/cloudbroker/vins/ip_list.go index 16697f4..136adea 100644 --- a/pkg/cloudbroker/vins/ip_list.go +++ b/pkg/cloudbroker/vins/ip_list.go @@ -16,7 +16,7 @@ type IPListRequest struct { } // IPList show DHCP IP reservations on VINS -func (v VINS) IPList(ctx context.Context, req IPListRequest) (ListIPs, error) { +func (v VINS) IPList(ctx context.Context, req IPListRequest) (*ListIPs, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -38,5 +38,5 @@ func (v VINS) IPList(ctx context.Context, req IPListRequest) (ListIPs, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vins/list.go b/pkg/cloudbroker/vins/list.go index 03d06c5..4da7d5d 100644 --- a/pkg/cloudbroker/vins/list.go +++ b/pkg/cloudbroker/vins/list.go @@ -8,6 +8,30 @@ import ( // Request struct for get list of VINSes type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by resource group id + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by external network IP + // Required: false + ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"` + + // Include deleted + // Required: false + IncludeDeleted bool `url:"includeDeleted,omitempty" json:"includeDeleted,omitempty"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +42,7 @@ type ListRequest struct { } // List gets list of VINSes -func (v VINS) List(ctx context.Context, req ListRequest) (ListVINS, error) { +func (v VINS) List(ctx context.Context, req ListRequest) (*ListVINS, error) { url := "/cloudbroker/vins/list" res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +57,5 @@ func (v VINS) List(ctx context.Context, req ListRequest) (ListVINS, error) { return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vins/list_deleted.go b/pkg/cloudbroker/vins/list_deleted.go index ae70919..8a78582 100644 --- a/pkg/cloudbroker/vins/list_deleted.go +++ b/pkg/cloudbroker/vins/list_deleted.go @@ -8,6 +8,26 @@ import ( // Request struct for get list of deleted VINSes type ListDeletedRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by account ID + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by resource group id + // Required: false + RGID uint64 `url:"rgId,omitempty" json:"rgId,omitempty"` + + // Find by external network IP + // Required: false + ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -18,7 +38,7 @@ type ListDeletedRequest struct { } // ListDeleted gets list of deleted VINSes -func (v VINS) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListVINS, error) { +func (v VINS) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListVINS, error) { url := "/cloudbroker/vins/listDeleted" res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -33,5 +53,5 @@ func (v VINS) ListDeleted(ctx context.Context, req ListDeletedRequest) (ListVINS return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vins/models.go b/pkg/cloudbroker/vins/models.go index 3f20491..af4a994 100644 --- a/pkg/cloudbroker/vins/models.go +++ b/pkg/cloudbroker/vins/models.go @@ -43,7 +43,13 @@ type ItemExtNet struct { } // List of external networks -type ListExtNets []ItemExtNet +type ListExtNets struct { + // Data + Data []ItemExtNet `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // MGMT type MGMT struct { @@ -110,6 +116,9 @@ type ItemInterface struct { // Default GW DefGW string `json:"defGw"` + // Enabled + Enabled bool `json:"enabled"` + // FLIPGroup ID FLIPGroupID uint64 `json:"flipgroupId"` @@ -428,12 +437,27 @@ type RecordVINS struct { // Account ID AccountID uint64 `json:"accountId"` + // Account name + AccountName string `json:"accountName"` + + // Created by + CreatedBy string `json:"createdBy"` + + // Created time + CreatedTime uint64 `json:"createdTime"` + // Default GW DefaultGW string `json:"defaultGW"` // Default QOS DefaultQOS QOS `json:"defaultQos"` + // Deleted by + DeletedBy string `json:"deletedBy"` + + // Deleted time + DeletedTime uint64 `json:"deletedTime"` + // Description Description string `json:"desc"` @@ -476,12 +500,21 @@ type RecordVINS struct { // Resource group ID RGID uint64 `json:"rgId"` + // Resource group name + RGName string `json:"rgName"` + // SecVNFDevID SecVNFDevID uint64 `json:"secVnfDevId"` // Status Status string `json:"status"` + // Updated by + UpdatedBy string `json:"updatedBy"` + + // Updated time + UpdatedTime uint64 `json:"updatedTime"` + // User managed UserManaged bool `json:"userManaged"` @@ -517,7 +550,13 @@ type ItemIP struct { } // List of information about IPs -type ListIPs []ItemIP +type ListIPs struct { + // Data + Data []ItemIP `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Main information about NAT rule type ItemNATRule struct { @@ -547,7 +586,13 @@ type ItemNATRule struct { } // List NAT rules -type ListNATRules []ItemNATRule +type ListNATRules struct { + // Data + Data []ItemNATRule `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} // Shorted information about VNF type ItemVNFs struct { @@ -670,4 +715,12 @@ type ItemVINS struct { } // List of VINS -type ListVINS []ItemVINS +type ListVINS struct { + // Data + Data []ItemVINS `json:"data"` + + // Entry count + EntryCount uint64 `json:"entryCount"` +} + +type SearchVINS []ItemVINS diff --git a/pkg/cloudbroker/vins/nat_rule_del.go b/pkg/cloudbroker/vins/nat_rule_del.go index ff1dca0..58a06e4 100644 --- a/pkg/cloudbroker/vins/nat_rule_del.go +++ b/pkg/cloudbroker/vins/nat_rule_del.go @@ -17,7 +17,7 @@ type NATRuleDelRequest struct { // ID of the rule to delete. // Pass -1 to clear all rules at once // Required: true - RuleID uint64 `url:"ruleId" json:"ruleId" validate:"required"` + RuleID int64 `url:"ruleId" json:"ruleId" validate:"required"` // Reason for action // Required: false diff --git a/pkg/cloudbroker/vins/nat_rule_list.go b/pkg/cloudbroker/vins/nat_rule_list.go index fc0312a..aa0afab 100644 --- a/pkg/cloudbroker/vins/nat_rule_list.go +++ b/pkg/cloudbroker/vins/nat_rule_list.go @@ -20,7 +20,7 @@ type NATRuleListRequest struct { } // NATRuleList gets list of NAT (port forwarding) rules -func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (ListNATRules, error) { +func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (*ListNATRules, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { @@ -42,5 +42,5 @@ func (v VINS) NATRuleList(ctx context.Context, req NATRuleListRequest) (ListNATR return nil, err } - return list, nil + return &list, nil } diff --git a/pkg/cloudbroker/vins/search.go b/pkg/cloudbroker/vins/search.go index 59b68e5..7c80fce 100644 --- a/pkg/cloudbroker/vins/search.go +++ b/pkg/cloudbroker/vins/search.go @@ -30,7 +30,7 @@ type SearchRequest struct { } // Search search VINSes -func (v VINS) Search(ctx context.Context, req SearchRequest) (ListVINS, error) { +func (v VINS) Search(ctx context.Context, req SearchRequest) (SearchVINS, error) { url := "/cloudbroker/vins/search" res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) @@ -38,7 +38,7 @@ func (v VINS) Search(ctx context.Context, req SearchRequest) (ListVINS, error) { return nil, err } - list := ListVINS{} + list := SearchVINS{} err = json.Unmarshal(res, &list) if err != nil { diff --git a/pkg/cloudbroker/vins/serialize.go b/pkg/cloudbroker/vins/serialize.go index 7ff8242..adbe5bb 100644 --- a/pkg/cloudbroker/vins/serialize.go +++ b/pkg/cloudbroker/vins/serialize.go @@ -12,7 +12,7 @@ import ( // - First argument -> prefix // - Second argument -> indent func (lv ListVINS) Serialize(params ...string) (serialization.Serialized, error) { - if len(lv) == 0 { + if len(lv.Data) == 0 { return []byte{}, nil } diff --git a/pkg/cloudbroker/vins/sorting.go b/pkg/cloudbroker/vins/sorting.go index df7c7c0..80d898c 100644 --- a/pkg/cloudbroker/vins/sorting.go +++ b/pkg/cloudbroker/vins/sorting.go @@ -6,16 +6,16 @@ import "sort" // // If inverse param is set to true, the order is reversed. func (lv ListVINS) SortByCreatedTime(inverse bool) ListVINS { - if len(lv) < 2 { + if len(lv.Data) < 2 { return lv } - sort.Slice(lv, func(i, j int) bool { + sort.Slice(lv.Data, func(i, j int) bool { if inverse { - return lv[i].CreatedTime > lv[j].CreatedTime + return lv.Data[i].CreatedTime > lv.Data[j].CreatedTime } - return lv[i].CreatedTime < lv[j].CreatedTime + return lv.Data[i].CreatedTime < lv.Data[j].CreatedTime }) return lv @@ -25,16 +25,16 @@ func (lv ListVINS) SortByCreatedTime(inverse bool) ListVINS { // // If inverse param is set to true, the order is reversed. func (lv ListVINS) SortByUpdatedTime(inverse bool) ListVINS { - if len(lv) < 2 { + if len(lv.Data) < 2 { return lv } - sort.Slice(lv, func(i, j int) bool { + sort.Slice(lv.Data, func(i, j int) bool { if inverse { - return lv[i].UpdatedTime > lv[j].UpdatedTime + return lv.Data[i].UpdatedTime > lv.Data[j].UpdatedTime } - return lv[i].UpdatedTime < lv[j].UpdatedTime + return lv.Data[i].UpdatedTime < lv.Data[j].UpdatedTime }) return lv @@ -44,16 +44,16 @@ func (lv ListVINS) SortByUpdatedTime(inverse bool) ListVINS { // // If inverse param is set to true, the order is reversed. func (lv ListVINS) SortByDeletedTime(inverse bool) ListVINS { - if len(lv) < 2 { + if len(lv.Data) < 2 { return lv } - sort.Slice(lv, func(i, j int) bool { + sort.Slice(lv.Data, func(i, j int) bool { if inverse { - return lv[i].DeletedTime > lv[j].DeletedTime + return lv.Data[i].DeletedTime > lv.Data[j].DeletedTime } - return lv[i].DeletedTime < lv[j].DeletedTime + return lv.Data[i].DeletedTime < lv.Data[j].DeletedTime }) return lv