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{})