From 0c44daa241301395a1ac89caf1a366f11978c501 Mon Sep 17 00:00:00 2001 From: Alexey Fetisov Date: Fri, 18 Apr 2025 11:42:00 +0300 Subject: [PATCH] v1.11.2 --- CHANGELOG.md | 20 +- README.md | 5 +- internal/validators/validator.go | 5 + pkg/cloudapi/prometheus.go | 8 + pkg/cloudapi/prometheus/compute_cpu_load.go | 57 ++++ .../prometheus/compute_memory_available.go | 53 ++++ .../prometheus/compute_memory_unused.go | 53 ++++ .../prometheus/compute_memory_usable.go | 53 ++++ .../prometheus/compute_memory_usage.go | 53 ++++ .../prometheus/compute_memory_used.go | 53 ++++ pkg/cloudapi/prometheus/compute_read_bytes.go | 57 ++++ .../prometheus/compute_read_requests.go | 57 ++++ .../prometheus/compute_receive_bytes.go | 57 ++++ .../prometheus/compute_receive_packets.go | 57 ++++ .../prometheus/compute_transmit_bytes.go | 57 ++++ .../prometheus/compute_transmit_packets.go | 57 ++++ .../prometheus/compute_write_bytes.go | 57 ++++ .../prometheus/compute_write_requests.go | 57 ++++ pkg/cloudapi/prometheus/computes.go | 77 ++++++ pkg/cloudapi/prometheus/models.go | 40 +++ pkg/cloudapi/prometheus/prometheus.go | 15 + pkg/cloudbroker/bservice.go | 8 + pkg/cloudbroker/bservice/bservice.go | 15 + pkg/cloudbroker/bservice/filter.go | 71 +++++ pkg/cloudbroker/bservice/filter_test.go | 155 +++++++++++ pkg/cloudbroker/bservice/get.go | 46 ++++ pkg/cloudbroker/bservice/list.go | 87 ++++++ pkg/cloudbroker/bservice/models.go | 257 ++++++++++++++++++ pkg/cloudbroker/bservice/sorting.go | 60 ++++ .../prometheus/compute_memory_available.go | 2 +- .../prometheus/compute_memory_unused.go | 2 +- .../prometheus/compute_memory_usable.go | 2 +- .../prometheus/compute_memory_usage.go | 2 +- .../prometheus/compute_memory_used.go | 2 +- .../prometheus/compute_read_bytes.go | 4 +- .../prometheus/compute_read_requests.go | 4 +- .../prometheus/compute_receive_bytes.go | 4 +- .../prometheus/compute_receive_packets.go | 4 +- .../prometheus/compute_transmit_bytes.go | 4 +- .../prometheus/compute_transmit_packets.go | 4 +- .../prometheus/compute_write_bytes.go | 4 +- .../prometheus/compute_write_requests.go | 4 +- pkg/cloudbroker/prometheus/computes.go | 4 +- tests/platform_upgrade/cloud_test.go | 22 ++ 44 files changed, 1685 insertions(+), 30 deletions(-) create mode 100644 pkg/cloudapi/prometheus.go create mode 100644 pkg/cloudapi/prometheus/compute_cpu_load.go create mode 100644 pkg/cloudapi/prometheus/compute_memory_available.go create mode 100644 pkg/cloudapi/prometheus/compute_memory_unused.go create mode 100644 pkg/cloudapi/prometheus/compute_memory_usable.go create mode 100644 pkg/cloudapi/prometheus/compute_memory_usage.go create mode 100644 pkg/cloudapi/prometheus/compute_memory_used.go create mode 100644 pkg/cloudapi/prometheus/compute_read_bytes.go create mode 100644 pkg/cloudapi/prometheus/compute_read_requests.go create mode 100644 pkg/cloudapi/prometheus/compute_receive_bytes.go create mode 100644 pkg/cloudapi/prometheus/compute_receive_packets.go create mode 100644 pkg/cloudapi/prometheus/compute_transmit_bytes.go create mode 100644 pkg/cloudapi/prometheus/compute_transmit_packets.go create mode 100644 pkg/cloudapi/prometheus/compute_write_bytes.go create mode 100644 pkg/cloudapi/prometheus/compute_write_requests.go create mode 100644 pkg/cloudapi/prometheus/computes.go create mode 100644 pkg/cloudapi/prometheus/models.go create mode 100644 pkg/cloudapi/prometheus/prometheus.go create mode 100644 pkg/cloudbroker/bservice.go create mode 100644 pkg/cloudbroker/bservice/bservice.go create mode 100644 pkg/cloudbroker/bservice/filter.go create mode 100644 pkg/cloudbroker/bservice/filter_test.go create mode 100644 pkg/cloudbroker/bservice/get.go create mode 100644 pkg/cloudbroker/bservice/list.go create mode 100644 pkg/cloudbroker/bservice/models.go create mode 100644 pkg/cloudbroker/bservice/sorting.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 3910713..dff7588 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,21 @@ -## Version 1.11.1 +## Version 1.11.2 -### Исправлено +### Добавлено -#### compute +#### bservice +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-366 | Метод `Get` структура запроса `GetRequest` и структура ответа `RecordBasicService` в cloudbroker/bservice | +| BGOS-366 | Метод `List` структура запроса `ListRequest` и структура ответа `ListBasicServices` в cloudbroker/bservice | + +#### prometheus | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-429 | Исправлена ошибка десериализации в структурах `ItemComputeDisk` в cloudapi/compute, `ItemDisk` в cloudapi/compute | +| BGOS-406 | Добавлена группа ручек `prometheus` в cloudapi | + +### Исправлено -#### disks +#### compute | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-429 | Исправлена ошибка десериализации в структурах `ItemDisk`, `RecordDisk `в cloudapi/disks, `InfoDisk` в cloudbroker/disks | +| BGOS-433 | Исправлена ошибка валидации поля LoaderType для всех структур в cloudapi/compute и в cloudbroker/compute | diff --git a/README.md b/README.md index 8639945..deaebf0 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `KVMx86` - создание виртуальной машины x86; - `LB` - управление балансировщиками нагрузки; - `Locations` - получение информации о grid площадки; +- `Prometheus` - получение статистики prometheus; - `RG` - управление ресурсными группами аккаунта; - `SEP` - управление storage endpoint (sep); - `Stack` - получение информации о вычислительных узлах; @@ -299,8 +300,9 @@ func main() { - `pkg/cloudapi/kvmx86` - для `KVMX86` - `pkg/cloudapi/lb` - для `LB` - `pkg/cloudapi/locations` - для `Locations` + - `pkg/cloudapi/prometheus` - для `Prometheus` - `pkg/cloudapi/rg` - для `RG` - - `pkg/cloudbroker/sep` - для `SEP` + - `pkg/cloudapi/sep` - для `SEP` - `pkg/cloudapi/stack` - для `Stack` - `pkg/cloudapi/tasks` - для `Tasks` - `pkg/cloudapi/vfpool` - для `VFPool` @@ -486,6 +488,7 @@ func main() { - `.KVMx86()` - для работы с `KVMX86` - `.LB()` - для работы с `LB` - `.Locations()` - для работы с `Locations` + - `.Prometheus()` - для работы с `Prometheus` - `.RG()` - для работы с `RG` - `.SEP()` - для работы с `SEP` - `.Stack()` - для работы с `Stack` diff --git a/internal/validators/validator.go b/internal/validators/validator.go index c3a8795..5e9cf29 100644 --- a/internal/validators/validator.go +++ b/internal/validators/validator.go @@ -271,6 +271,11 @@ func registerAllValidators(validate *validator.Validate) error { return err } + err = validate.RegisterValidation("loaderType", loaderTypeValidator) + if err != nil { + return err + } + err = validate.RegisterValidation("language", languageValidator) if err != nil { return err diff --git a/pkg/cloudapi/prometheus.go b/pkg/cloudapi/prometheus.go new file mode 100644 index 0000000..aeae0e4 --- /dev/null +++ b/pkg/cloudapi/prometheus.go @@ -0,0 +1,8 @@ +package cloudapi + +import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/prometheus" + +// Accessing the Resmon method group +func (ca *CloudAPI) Prometheus() *prometheus.Prometheus { + return prometheus.New(ca.client) +} diff --git a/pkg/cloudapi/prometheus/compute_cpu_load.go b/pkg/cloudapi/prometheus/compute_cpu_load.go new file mode 100644 index 0000000..1ee461a --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_cpu_load.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeCPULoadRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Per-second CPU time consumed by Compute in percent, average over the time step specified +func (p Prometheus) ComputeCPULoad(ctx context.Context, req ComputeCPULoadRequest) (*PrometheusData, error) { + res, err := p.ComputeCPULoadRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeCPULoadRaw(ctx context.Context, req ComputeCPULoadRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeCPUload" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_memory_available.go b/pkg/cloudapi/prometheus/compute_memory_available.go new file mode 100644 index 0000000..ad191a7 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_memory_available.go @@ -0,0 +1,53 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeMemoryAvailableRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` +} + +// Available Memory +func (p Prometheus) ComputeMemoryAvailable(ctx context.Context, req ComputeMemoryAvailableRequest) (*PrometheusData, error) { + res, err := p.ComputeMemoryAvailableRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeMemoryAvailableRaw(ctx context.Context, req ComputeMemoryAvailableRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeMemoryAvailable" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_memory_unused.go b/pkg/cloudapi/prometheus/compute_memory_unused.go new file mode 100644 index 0000000..910d4b4 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_memory_unused.go @@ -0,0 +1,53 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeMemoryUnusedRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` +} + +// Unused Memory +func (p Prometheus) ComputeMemoryUnused(ctx context.Context, req ComputeMemoryUnusedRequest) (*PrometheusData, error) { + res, err := p.ComputeMemoryUnusedRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeMemoryUnusedRaw(ctx context.Context, req ComputeMemoryUnusedRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeMemoryUnused" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_memory_usable.go b/pkg/cloudapi/prometheus/compute_memory_usable.go new file mode 100644 index 0000000..7768382 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_memory_usable.go @@ -0,0 +1,53 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeMemoryUsableRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` +} + +// Usable Memory +func (p Prometheus) ComputeMemoryUsable(ctx context.Context, req ComputeMemoryUsableRequest) (*PrometheusData, error) { + res, err := p.ComputeMemoryUsableRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeMemoryUsableRaw(ctx context.Context, req ComputeMemoryUsableRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeMemoryUsable" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_memory_usage.go b/pkg/cloudapi/prometheus/compute_memory_usage.go new file mode 100644 index 0000000..c232628 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_memory_usage.go @@ -0,0 +1,53 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeMemoryUsageRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` +} + +// Memory Usage +func (p Prometheus) ComputeMemoryUsage(ctx context.Context, req ComputeMemoryUsageRequest) (*PrometheusData, error) { + res, err := p.ComputeMemoryUsageRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeMemoryUsageRaw(ctx context.Context, req ComputeMemoryUsageRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeMemoryUsage" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_memory_used.go b/pkg/cloudapi/prometheus/compute_memory_used.go new file mode 100644 index 0000000..94e5396 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_memory_used.go @@ -0,0 +1,53 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeMemoryUsedRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` +} + +// Used Memory +func (p Prometheus) ComputeMemoryUsed(ctx context.Context, req ComputeMemoryUsedRequest) (*PrometheusData, error) { + res, err := p.ComputeMemoryUsedRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeMemoryUsedRaw(ctx context.Context, req ComputeMemoryUsedRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeMemoryUsed" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_read_bytes.go b/pkg/cloudapi/prometheus/compute_read_bytes.go new file mode 100644 index 0000000..3a2a542 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_read_bytes.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeReadBytesRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Read Bytes +func (p Prometheus) ComputeReadBytes(ctx context.Context, req ComputeReadBytesRequest) (*PrometheusData, error) { + res, err := p.ComputeReadBytesRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeReadBytesRaw(ctx context.Context, req ComputeReadBytesRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeReadBytes" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_read_requests.go b/pkg/cloudapi/prometheus/compute_read_requests.go new file mode 100644 index 0000000..aaa0cc0 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_read_requests.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeReadRequestsRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Read Requests +func (p Prometheus) ComputeReadRequests(ctx context.Context, req ComputeReadRequestsRequest) (*PrometheusData, error) { + res, err := p.ComputeReadRequestsRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeReadRequestsRaw(ctx context.Context, req ComputeReadRequestsRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeReadRequests" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_receive_bytes.go b/pkg/cloudapi/prometheus/compute_receive_bytes.go new file mode 100644 index 0000000..8ac24ac --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_receive_bytes.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeReceiveBytesRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Receive Bytes +func (p Prometheus) ComputeReceiveBytes(ctx context.Context, req ComputeReceiveBytesRequest) (*PrometheusData, error) { + res, err := p.ComputeReceiveBytesRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeReceiveBytesRaw(ctx context.Context, req ComputeReceiveBytesRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeReceiveBytes" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_receive_packets.go b/pkg/cloudapi/prometheus/compute_receive_packets.go new file mode 100644 index 0000000..3a34475 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_receive_packets.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeReceivePacketsRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Receive Packets +func (p Prometheus) ComputeReceivePackets(ctx context.Context, req ComputeReceivePacketsRequest) (*PrometheusData, error) { + res, err := p.ComputeReceivePacketsRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeReceivePacketsRaw(ctx context.Context, req ComputeReceivePacketsRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeReceivePackets" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_transmit_bytes.go b/pkg/cloudapi/prometheus/compute_transmit_bytes.go new file mode 100644 index 0000000..fc76536 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_transmit_bytes.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeTransmitBytesRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Transmit Bytes +func (p Prometheus) ComputeTransmitBytes(ctx context.Context, req ComputeTransmitBytesRequest) (*PrometheusData, error) { + res, err := p.ComputeTransmitBytesRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeTransmitBytesRaw(ctx context.Context, req ComputeTransmitBytesRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeTransmitBytes" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_transmit_packets.go b/pkg/cloudapi/prometheus/compute_transmit_packets.go new file mode 100644 index 0000000..c486cee --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_transmit_packets.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeTransmitPacketsRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Transmit Packets +func (p Prometheus) ComputeTransmitPackets(ctx context.Context, req ComputeTransmitPacketsRequest) (*PrometheusData, error) { + res, err := p.ComputeTransmitPacketsRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeTransmitPacketsRaw(ctx context.Context, req ComputeTransmitPacketsRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeTransmitPackets" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_write_bytes.go b/pkg/cloudapi/prometheus/compute_write_bytes.go new file mode 100644 index 0000000..3c37a67 --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_write_bytes.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeWriteBytesRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Write Bytes +func (p Prometheus) ComputeWriteBytes(ctx context.Context, req ComputeWriteBytesRequest) (*PrometheusData, error) { + res, err := p.ComputeWriteBytesRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeWriteBytesRaw(ctx context.Context, req ComputeWriteBytesRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeWriteBytes" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/compute_write_requests.go b/pkg/cloudapi/prometheus/compute_write_requests.go new file mode 100644 index 0000000..283567f --- /dev/null +++ b/pkg/cloudapi/prometheus/compute_write_requests.go @@ -0,0 +1,57 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type ComputeWriteRequestsRequest struct { + // Compute ID + // Required: true + ComputeID uint64 `url:"computeId" json:"computeId" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Write Requests +func (p Prometheus) ComputeWriteRequests(ctx context.Context, req ComputeWriteRequestsRequest) (*PrometheusData, error) { + res, err := p.ComputeWriteRequestsRaw(ctx, req) + if err != nil { + return nil, err + } + + info := PrometheusData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputeWriteRequestsRaw(ctx context.Context, req ComputeWriteRequestsRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computeWriteRequests" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/computes.go b/pkg/cloudapi/prometheus/computes.go new file mode 100644 index 0000000..014eb08 --- /dev/null +++ b/pkg/cloudapi/prometheus/computes.go @@ -0,0 +1,77 @@ +package prometheus + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +const ( + ComputeCPULoad = "computeCPUload" + ComputeMemoryUsage = "computeMemoryUsage" + ComputeMemoryUsable = "computeMemoryUsable" + ComputeMemoryUnused = "computeMemoryUnused" + ComputeMemoryUsed = "computeMemoryUsed" + ComputeMemoryAvailable = "computeMemoryAvailable" + ComputeReadBytes = "computeReadBytes" + ComputeReadRequests = "computeReadRequests" + ComputeReceiveBytes = "computeReceiveBytes" + ComputeTransmitBytes = "computeTransmitBytes" + ComputeTransmitPackets = "computeTransmitPackets" + ComputeWriteBytes = "computeWriteBytes" + ComputeWriteRequests = "computeWriteRequests" +) + +type ComputesRequest struct { + // List of compute IDs to fetch metrics for + // Required: true + ComputeIDs []uint64 `url:"computeIds" json:"computeIds" validate:"required"` + + // List of compute IDs to fetch metrics for + // Required: true + MetricIDs []string `url:"metricIds" json:"metricIds" validate:"required"` + + // Time to loads of statistic in seconds + // Required: false + ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` + + // The reading interval in seconds + // Required: false + Step uint64 `url:"step,omitempty" json:"step,omitempty"` + + // Number of zeros after the decimal point + // Required: false + DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` +} + +// Get multiple metrics for multiple compute instances +func (p Prometheus) Computes(ctx context.Context, req ComputesRequest) (*ComputesData, error) { + res, err := p.ComputesRaw(ctx, req) + if err != nil { + return nil, err + } + + info := ComputesData{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets information about compute as an array of bytes +func (p Prometheus) ComputesRaw(ctx context.Context, req ComputesRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/prometheus/computes" + + res, err := p.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/prometheus/models.go b/pkg/cloudapi/prometheus/models.go new file mode 100644 index 0000000..76ee3bc --- /dev/null +++ b/pkg/cloudapi/prometheus/models.go @@ -0,0 +1,40 @@ +package prometheus + +// PrometheusData represents an array of data points +type PrometheusData []PrometheusPoint + +// PrometheusPoint represents a single data point +type PrometheusPoint struct { + // Value of the metric at a specific point in time + Value float64 `json:"value"` + + // Timestamp the Unix timestamp. + Timestamp uint64 `json:"timestamp"` +} + +// ComputesData represents an array of data points for computes +type ComputesData []ItemCompute + +// ItemCompute represents a single data of compute +type ItemCompute struct { + // Compute ID + ComputeID uint64 `json:"computeId"` + + // Array of metrics + Metrics []ItemMetric `json:"metrics"` + + // Error + Error string `json:"error"` +} + +// ItemMetric represents a single data point of metric +type ItemMetric struct { + // Metric ID + MetricID string `json:"metricId"` + + // Data represents an array of data points + Data PrometheusData `json:"data"` + + // Error + Error string `json:"error"` +} diff --git a/pkg/cloudapi/prometheus/prometheus.go b/pkg/cloudapi/prometheus/prometheus.go new file mode 100644 index 0000000..80e4b73 --- /dev/null +++ b/pkg/cloudapi/prometheus/prometheus.go @@ -0,0 +1,15 @@ +package prometheus + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" +) + +type Prometheus struct { + client interfaces.Caller +} + +func New(client interfaces.Caller) *Prometheus { + return &Prometheus{ + client: client, + } +} diff --git a/pkg/cloudbroker/bservice.go b/pkg/cloudbroker/bservice.go new file mode 100644 index 0000000..e239323 --- /dev/null +++ b/pkg/cloudbroker/bservice.go @@ -0,0 +1,8 @@ +package cloudbroker + +import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/bservice" + +// Accessing the BService method group +func (ca *CloudBroker) BService() *bservice.BService { + return bservice.New(ca.client) +} diff --git a/pkg/cloudbroker/bservice/bservice.go b/pkg/cloudbroker/bservice/bservice.go new file mode 100644 index 0000000..23a9d97 --- /dev/null +++ b/pkg/cloudbroker/bservice/bservice.go @@ -0,0 +1,15 @@ +package bservice + +import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" + +// Structure for creating request to bservice +type BService struct { + client interfaces.Caller +} + +// Builder for bservice endpoints +func New(client interfaces.Caller) *BService { + return &BService{ + client, + } +} diff --git a/pkg/cloudbroker/bservice/filter.go b/pkg/cloudbroker/bservice/filter.go new file mode 100644 index 0000000..f503212 --- /dev/null +++ b/pkg/cloudbroker/bservice/filter.go @@ -0,0 +1,71 @@ +package bservice + +// FilterByID returns ListBasicServices with specified ID. +func (lbs ListBasicServices) FilterByID(id uint64) ListBasicServices { + predicate := func(ibs ItemBasicService) bool { + return ibs.ID == id + } + + return lbs.FilterFunc(predicate) +} + +// FilterByName returns ListBasicServices with specified Name. +func (lbs ListBasicServices) FilterByName(name string) ListBasicServices { + predicate := func(ibs ItemBasicService) bool { + return ibs.Name == name + } + + return lbs.FilterFunc(predicate) +} + +// FilterByRGID returns ListBasicServices with specified RGID. +func (lbs ListBasicServices) FilterByRGID(rgID uint64) ListBasicServices { + predicate := func(ibs ItemBasicService) bool { + return ibs.RGID == rgID + } + + return lbs.FilterFunc(predicate) +} + +// FilterByStatus returns ListBasicServices with specified Status. +func (lbs ListBasicServices) FilterByStatus(status string) ListBasicServices { + predicate := func(ibs ItemBasicService) bool { + return ibs.Status == status + } + + return lbs.FilterFunc(predicate) +} + +// FilterByTechStatus returns ListBasicServices with specified TechStatus. +func (lbs ListBasicServices) FilterByTechStatus(techStatus string) ListBasicServices { + predicate := func(ibs ItemBasicService) bool { + return ibs.TechStatus == techStatus + } + + return lbs.FilterFunc(predicate) +} + +// FilterFunc allows filtering ListResourceGroups based on a user-specified predicate. +func (lbs ListBasicServices) FilterFunc(predicate func(ItemBasicService) bool) ListBasicServices { + var result ListBasicServices + + for _, item := range lbs.Data { + if predicate(item) { + result.Data = append(result.Data, item) + } + } + + result.EntryCount = uint64(len(lbs.Data)) + + return result +} + +// FindOne returns first found ItemBasicService +// If none was found, returns an empty struct. +func (lbs ListBasicServices) FindOne() ItemBasicService { + if lbs.EntryCount == 0 { + return ItemBasicService{} + } + + return lbs.Data[0] +} diff --git a/pkg/cloudbroker/bservice/filter_test.go b/pkg/cloudbroker/bservice/filter_test.go new file mode 100644 index 0000000..70e2949 --- /dev/null +++ b/pkg/cloudbroker/bservice/filter_test.go @@ -0,0 +1,155 @@ +package bservice + +import "testing" + +var bservices = ListBasicServices{ + Data: []ItemBasicService{ + { + AccountID: 1, + AccountName: "std_1", + BaseDomain: "", + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1677743675, + DeletedBy: "", + DeletedTime: 0, + GID: 212, + Groups: []uint64{}, + GUID: 1, + ID: 1, + Name: "bservice_1", + ParentSrvID: 0, + ParentSrvType: "", + RGID: 7971, + RGName: "rg_1", + SSHUser: "", + Status: "CREATED", + TechStatus: "STOPPED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + }, + { + AccountID: 2, + AccountName: "std_2", + BaseDomain: "", + CreatedBy: "sample_user_1@decs3o", + CreatedTime: 1677743736, + DeletedBy: "", + DeletedTime: 0, + GID: 212, + Groups: []uint64{}, + GUID: 2, + ID: 2, + Name: "bservice_2", + ParentSrvID: 0, + ParentSrvType: "", + RGID: 7972, + RGName: "rg_2", + SSHUser: "", + Status: "CREATED", + TechStatus: "STOPPED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + }, + { + AccountID: 3, + AccountName: "std_3", + BaseDomain: "", + CreatedBy: "sample_user_2@decs3o", + CreatedTime: 1677743830, + DeletedBy: "", + DeletedTime: 0, + GID: 212, + Groups: []uint64{}, + GUID: 3, + ID: 3, + Name: "bservice_3", + ParentSrvID: 0, + ParentSrvType: "", + RGID: 7973, + RGName: "rg_3", + SSHUser: "", + Status: "ENABLED", + TechStatus: "STARTED", + UpdatedBy: "", + UpdatedTime: 0, + UserManaged: true, + }, + }, + EntryCount: 3, +} + +func TestFilterByID(t *testing.T) { + actual := bservices.FilterByID(1).FindOne() + + if actual.ID != 1 { + t.Fatal("expected ID 1, found: ", actual.ID) + } +} + +func TestFilterByName(t *testing.T) { + actual := bservices.FilterByName("bservice_3").FindOne() + + if actual.Name != "bservice_3" { + t.Fatal("expected Name 'bservice_3', found: ", actual.Name) + } +} + +func TestFilterByRGID(t *testing.T) { + actual := bservices.FilterByRGID(7971).FindOne() + + if actual.RGID != 7971 { + t.Fatal("expected RGID 7971, found: ", actual.RGID) + } +} + +func TestFilterByStatus(t *testing.T) { + actual := bservices.FilterByStatus("CREATED") + + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) + } + + for _, item := range actual.Data { + if item.Status != "CREATED" { + t.Fatal("expected Status 'CREATED', found: ", item.Status) + } + } +} + +func TestFilterByTechStatus(t *testing.T) { + actual := bservices.FilterByTechStatus("STOPPED") + + if len(actual.Data) != 2 { + t.Fatal("expected 2 found, actual: ", len(actual.Data)) + } + + for _, item := range actual.Data { + if item.TechStatus != "STOPPED" { + t.Fatal("expected TechStatus 'STOPPED', found: ", item.TechStatus) + } + } +} + +func TestFilterFunc(t *testing.T) { + actual := bservices.FilterFunc(func(ibs ItemBasicService) bool { + return ibs.CreatedBy == "sample_user_2@decs3o" + }) + + if len(actual.Data) > 1 { + t.Fatal("expected 1 found, actual: ", len(actual.Data)) + } + + if actual.FindOne().CreatedBy != "sample_user_2@decs3o" { + t.Fatal("expected 'sample_user_2@decs3o', found: ", actual.FindOne().CreatedBy) + } +} + +func TestSortByCreatedTime(t *testing.T) { + actual := bservices.SortByCreatedTime(true) + + if actual.Data[0].CreatedTime != 1677743830 || actual.Data[2].CreatedTime != 1677743675 { + t.Fatal("expected descending order, found ascending") + } +} diff --git a/pkg/cloudbroker/bservice/get.go b/pkg/cloudbroker/bservice/get.go new file mode 100644 index 0000000..5e2b66e --- /dev/null +++ b/pkg/cloudbroker/bservice/get.go @@ -0,0 +1,46 @@ +package bservice + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// GetRequest struct to get detailed information about service +type GetRequest struct { + // ID of the service to query information + // Required: true + ServiceID uint64 `url:"serviceId" json:"serviceId" validate:"required"` +} + +// Get gets detailed specifications for the BasicService as a RecordBasicService struct +func (b BService) Get(ctx context.Context, req GetRequest) (*RecordBasicService, error) { + res, err := b.GetRaw(ctx, req) + if err != nil { + return nil, err + } + + info := RecordBasicService{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets detailed specifications for the BasicService as an array of bytes +func (b BService) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/bservice/get" + + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/bservice/list.go b/pkg/cloudbroker/bservice/list.go new file mode 100644 index 0000000..9f2ee7a --- /dev/null +++ b/pkg/cloudbroker/bservice/list.go @@ -0,0 +1,87 @@ +package bservice + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ListRequest struct to get list of BasicService instances +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"` + + // ID of the account to query for BasicService instances + // Required: false + AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"` + + // Find by resource group name + // Required: false + RGName string `url:"rgName,omitempty" json:"rgName,omitempty"` + + // ID of the resource group to query for BasicService instances + // 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 account name + // Required: false + AccountName string `url:"accountName,omitempty" json:"accountName,omitempty"` + + // Sort by one of supported fields, format +|-(field) + // Required: false + SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// List gets list of BasicService instances associated with the specified Resource Group as a ListBasicServices struct +func (b BService) List(ctx context.Context, req ListRequest) (*ListBasicServices, error) { + + res, err := b.ListRaw(ctx, req) + if err != nil { + return nil, err + } + + list := ListBasicServices{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} + +// ListRaw gets list of BasicService instances associated with the specified Resource Group as an array of bytes +func (b BService) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) { + + if err := validators.ValidateRequest(req); err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/bservice/list" + + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/bservice/models.go b/pkg/cloudbroker/bservice/models.go new file mode 100644 index 0000000..fc176a9 --- /dev/null +++ b/pkg/cloudbroker/bservice/models.go @@ -0,0 +1,257 @@ +package bservice + +// Detailed info about BasicService +type RecordBasicService struct { + // Account ID + AccountID uint64 `json:"accountId"` + + // Account name + AccountName string `json:"accountName"` + + // Base domain + BaseDomain string `json:"baseDomain"` + + // List Computes + Computes ListComputes `json:"computes"` + + // Number of cores + CPUTotal uint64 `json:"cpuTotal"` + + // Created by + CreatedBy string `json:"createdBy"` + + // Created time + CreatedTime uint64 `json:"createdTime"` + + // Deleted by + DeletedBy string `json:"deletedBy"` + + // Deleted time + DeletedTime uint64 `json:"deletedTime"` + + // Amount of disk space used, GB + DiskTotal uint64 `json:"diskTotal"` + + // Grid ID + GID uint64 `json:"gid"` + + // List of Service Compute Groups + Groups ListGroups `json:"groups"` + + // GUID + GUID uint64 `json:"guid"` + + // ID + ID uint64 `json:"id"` + + // Milestones + Milestones uint64 `json:"milestones"` + + // Name + Name string `json:"name"` + + // Parent service ID + ParentSrvID uint64 `json:"parentSrvId"` + + // Parent service type + ParentSrvType string `json:"parentSrvType"` + + // Total amount of RAM, MB + RAMTotal uint64 `json:"ramTotal"` + + // Resource group ID + RGID uint64 `json:"rgId"` + + // Resource group name + RGName string `json:"rgName"` + + // List of snapshots + Snapshots ListSnapshots `json:"snapshots"` + + // SSH key for connection + SSHKey string `json:"sshKey"` + + // Username for SSH connection + SSHUser string `json:"sshUser"` + + // status + Status string `json:"status"` + + // TechStatus + TechStatus string `json:"techStatus"` + + // Updated by + UpdatedBy string `json:"updatedBy"` + + // Updated time + UpdatedTime uint64 `json:"updatedTime"` + + // Whether user controlled + UserManaged bool `json:"userManaged"` +} + +// List of Groups +type ListGroups []ItemGroup + +// Main information about Group +type ItemGroup struct { + // Amount of computes + Computes uint64 `json:"computes"` + + // Consistency + Consistency bool `json:"consistency"` + + // Group ID + ID uint64 `json:"id"` + + // Group name + Name string `json:"name"` + + // Status + Status string `json:"status"` + + // TechStatus + TechStatus string `json:"techStatus"` +} + +// List of Computes +type ListComputes []ItemCompute + +// Main information about Compute +type ItemCompute struct { + // Account ID + AccountID uint64 `json:"accountId"` + + // Architecture + Architecture string `json:"arch"` + + // Compute group ID + CompGroupID uint64 `json:"compgroupId"` + + // Compute group name + CompGroupName string `json:"compgroupName"` + + // compute group role + CompGroupRole string `json:"compgroupRole"` + + // ID + ID uint64 `json:"id"` + + // Name + Name string `json:"name"` + + // Resource group ID + RGID uint64 `json:"rgId"` + + // StackID + StackID uint64 `json:"stackId"` + + // Status + Status string `json:"status"` + + // Tech status + TechStatus string `json:"techStatus"` +} + +// List of Snapshot +type ListSnapshots []ItemSnapshot + +// Main information about Snapshot +type ItemSnapshot struct { + // GUID + GUID string `json:"guid"` + + // Label + Label string `json:"label"` + + // Timestamp + Timestamp uint64 `json:"timestamp"` + + // Valid or not + Valid bool `json:"valid"` +} + +// List of BasicServices +type ListBasicServices struct { + Data []ItemBasicService `json:"data"` + + EntryCount uint64 `json:"entryCount"` +} + +// Main information about BasicService +type ItemBasicService struct { + // Account ID + AccountID uint64 `json:"accountId"` + + // Account name + AccountName string `json:"accountName"` + + // Base domain + BaseDomain string `json:"baseDomain"` + + // Created by + CreatedBy string `json:"createdBy"` + + // Created time + CreatedTime uint64 `json:"createdTime"` + + // Deleted by + DeletedBy string `json:"deletedBy"` + + // Deleted time + DeletedTime uint64 `json:"deletedTime"` + + // Grid ID + GID uint64 `json:"gid"` + + // List of group IDs + Groups []uint64 `json:"groups"` + + // GUID + GUID uint64 `json:"guid"` + + // ID + ID uint64 `json:"id"` + + // Name + Name string `json:"name"` + + // Milestones + Milestones uint64 `json:"milestones"` + + // Parent service ID + ParentSrvID uint64 `json:"parentSrvId"` + + // Parent service type + ParentSrvType string `json:"parentSrvType"` + + // Resource group ID + RGID uint64 `json:"rgId"` + + // Resource group name + RGName string `json:"rgName"` + + // List of snapshots + Snapshots ListSnapshots `json:"snapshots"` + + // SSH key for connection + SSHKey string `json:"sshKey"` + + // SSH user + SSHUser string `json:"sshUser"` + + // Status + Status string `json:"status"` + + // TechStatus + TechStatus string `json:"techStatus"` + + // Updated by + UpdatedBy string `json:"updatedBy"` + + // Updated time + UpdatedTime uint64 `json:"updatedTime"` + + // User Managed or not + UserManaged bool `json:"userManaged"` +} diff --git a/pkg/cloudbroker/bservice/sorting.go b/pkg/cloudbroker/bservice/sorting.go new file mode 100644 index 0000000..3fdaed1 --- /dev/null +++ b/pkg/cloudbroker/bservice/sorting.go @@ -0,0 +1,60 @@ +package bservice + +import "sort" + +// SortByCreatedTime sorts ListBasicServices by the CreatedTime field in ascending order. +// +// If inverse param is set to true, the order is reversed. +func (lbs ListBasicServices) SortByCreatedTime(inverse bool) ListBasicServices { + if lbs.EntryCount < 2 { + return lbs + } + + sort.Slice(lbs.Data, func(i, j int) bool { + if inverse { + return lbs.Data[i].CreatedTime > lbs.Data[j].CreatedTime + } + + return lbs.Data[i].CreatedTime < lbs.Data[j].CreatedTime + }) + + return lbs +} + +// SortByUpdatedTime sorts ListBasicServices by the UpdatedTime field in ascending order. +// +// If inverse param is set to true, the order is reversed. +func (lbs ListBasicServices) SortByUpdatedTime(inverse bool) ListBasicServices { + if lbs.EntryCount < 2 { + return lbs + } + + sort.Slice(lbs.Data, func(i, j int) bool { + if inverse { + return lbs.Data[i].UpdatedTime > lbs.Data[j].UpdatedTime + } + + return lbs.Data[i].UpdatedTime < lbs.Data[j].UpdatedTime + }) + + return lbs +} + +// SortByDeletedTime sorts ListBasicServices by the DeletedTime field in ascending order. +// +// If inverse param is set to true, the order is reversed. +func (lbs ListBasicServices) SortByDeletedTime(inverse bool) ListBasicServices { + if lbs.EntryCount < 2 { + return lbs + } + + sort.Slice(lbs.Data, func(i, j int) bool { + if inverse { + return lbs.Data[i].DeletedTime > lbs.Data[j].DeletedTime + } + + return lbs.Data[i].DeletedTime < lbs.Data[j].DeletedTime + }) + + return lbs +} diff --git a/pkg/cloudbroker/prometheus/compute_memory_available.go b/pkg/cloudbroker/prometheus/compute_memory_available.go index e0379f3..ff352a0 100644 --- a/pkg/cloudbroker/prometheus/compute_memory_available.go +++ b/pkg/cloudbroker/prometheus/compute_memory_available.go @@ -18,7 +18,7 @@ type ComputeMemoryAvailableRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_memory_unused.go b/pkg/cloudbroker/prometheus/compute_memory_unused.go index c8819d2..8343812 100644 --- a/pkg/cloudbroker/prometheus/compute_memory_unused.go +++ b/pkg/cloudbroker/prometheus/compute_memory_unused.go @@ -18,7 +18,7 @@ type ComputeMemoryUnusedRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_memory_usable.go b/pkg/cloudbroker/prometheus/compute_memory_usable.go index 7c3ced4..4329384 100644 --- a/pkg/cloudbroker/prometheus/compute_memory_usable.go +++ b/pkg/cloudbroker/prometheus/compute_memory_usable.go @@ -18,7 +18,7 @@ type ComputeMemoryUsableRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_memory_usage.go b/pkg/cloudbroker/prometheus/compute_memory_usage.go index 94ef234..b901152 100644 --- a/pkg/cloudbroker/prometheus/compute_memory_usage.go +++ b/pkg/cloudbroker/prometheus/compute_memory_usage.go @@ -18,7 +18,7 @@ type ComputeMemoryUsageRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_memory_used.go b/pkg/cloudbroker/prometheus/compute_memory_used.go index 92ea98d..83f6d77 100644 --- a/pkg/cloudbroker/prometheus/compute_memory_used.go +++ b/pkg/cloudbroker/prometheus/compute_memory_used.go @@ -18,7 +18,7 @@ type ComputeMemoryUsedRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_read_bytes.go b/pkg/cloudbroker/prometheus/compute_read_bytes.go index 5a471cf..56d81bb 100644 --- a/pkg/cloudbroker/prometheus/compute_read_bytes.go +++ b/pkg/cloudbroker/prometheus/compute_read_bytes.go @@ -18,11 +18,11 @@ type ComputeReadBytesRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_read_requests.go b/pkg/cloudbroker/prometheus/compute_read_requests.go index 3c1941a..9572fd3 100644 --- a/pkg/cloudbroker/prometheus/compute_read_requests.go +++ b/pkg/cloudbroker/prometheus/compute_read_requests.go @@ -18,11 +18,11 @@ type ComputeReadRequestsRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_receive_bytes.go b/pkg/cloudbroker/prometheus/compute_receive_bytes.go index d19d50e..46cc440 100644 --- a/pkg/cloudbroker/prometheus/compute_receive_bytes.go +++ b/pkg/cloudbroker/prometheus/compute_receive_bytes.go @@ -18,11 +18,11 @@ type ComputeReceiveBytesRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_receive_packets.go b/pkg/cloudbroker/prometheus/compute_receive_packets.go index 66b0f8a..bbfdb3b 100644 --- a/pkg/cloudbroker/prometheus/compute_receive_packets.go +++ b/pkg/cloudbroker/prometheus/compute_receive_packets.go @@ -18,11 +18,11 @@ type ComputeReceivePacketsRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_transmit_bytes.go b/pkg/cloudbroker/prometheus/compute_transmit_bytes.go index 96cfb91..4363d2f 100644 --- a/pkg/cloudbroker/prometheus/compute_transmit_bytes.go +++ b/pkg/cloudbroker/prometheus/compute_transmit_bytes.go @@ -18,11 +18,11 @@ type ComputeTransmitBytesRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_transmit_packets.go b/pkg/cloudbroker/prometheus/compute_transmit_packets.go index 707d9ee..1119431 100644 --- a/pkg/cloudbroker/prometheus/compute_transmit_packets.go +++ b/pkg/cloudbroker/prometheus/compute_transmit_packets.go @@ -18,11 +18,11 @@ type ComputeTransmitPacketsRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_write_bytes.go b/pkg/cloudbroker/prometheus/compute_write_bytes.go index 9adb12f..ca93ce6 100644 --- a/pkg/cloudbroker/prometheus/compute_write_bytes.go +++ b/pkg/cloudbroker/prometheus/compute_write_bytes.go @@ -18,11 +18,11 @@ type ComputeWriteBytesRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/compute_write_requests.go b/pkg/cloudbroker/prometheus/compute_write_requests.go index 64b6b05..2b6a051 100644 --- a/pkg/cloudbroker/prometheus/compute_write_requests.go +++ b/pkg/cloudbroker/prometheus/compute_write_requests.go @@ -18,11 +18,11 @@ type ComputeWriteRequestsRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/pkg/cloudbroker/prometheus/computes.go b/pkg/cloudbroker/prometheus/computes.go index 7b1b790..ab8b4fc 100644 --- a/pkg/cloudbroker/prometheus/computes.go +++ b/pkg/cloudbroker/prometheus/computes.go @@ -38,11 +38,11 @@ type ComputesRequest struct { ForLast uint64 `url:"forLast,omitempty" json:"forLast,omitempty"` // The reading interval in seconds - // Required: true + // Required: false Step uint64 `url:"step,omitempty" json:"step,omitempty"` // Number of zeros after the decimal point - // Required: true + // Required: false DecimalPlaces uint64 `url:"decimalPlaces,omitempty" json:"decimalPlaces,omitempty"` } diff --git a/tests/platform_upgrade/cloud_test.go b/tests/platform_upgrade/cloud_test.go index c6e1e9a..563d78f 100644 --- a/tests/platform_upgrade/cloud_test.go +++ b/tests/platform_upgrade/cloud_test.go @@ -27,7 +27,9 @@ import ( account_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account" audit_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/audit" + bservice_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/bservice" compute_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute" + disks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/disks" extnet_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/extnet" flipgroup_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/flipgroup" grid_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/grid" @@ -393,6 +395,26 @@ func TestGetListCloudbroker(t *testing.T) { t.Errorf("Can not test Audit get because Audit list is empty") } + // Bservice + // List + bytes, err = client.CloudBroker().BService().ListRaw(context.Background(), bservice_cb.ListRequest{}) + if err != nil { + t.Error(err) + } + testLogs = append(testLogs, getResult("Bservice list", bytes, bservice_cb.ListBasicServices{}, t)) + // Get + listBServ, _ := client.CloudBroker().BService().List(context.Background(), bservice_cb.ListRequest{}) + if len(listBServ.Data) > 0 { + id := listBServ.Data[0].ID + bytes, err = client.CloudBroker().BService().GetRaw(context.Background(), bservice_cb.GetRequest{ServiceID: id}) + if err != nil { + t.Error(err) + } + testLogs = append(testLogs, getResult("Bservice get", bytes, bservice_cb.RecordBasicService{}, t)) + } else { + t.Errorf("Can not test Bservice get because bservice list is empty") + } + // Compute // List bytes, err = client.CloudBroker().Compute().ListRaw(context.Background(), compute_cb.ListRequest{})