diff --git a/CHANGELOG.md b/CHANGELOG.md index 906f0e6..cda04dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 1.16.8 +## Version 1.16.9 ### Deprecated @@ -33,70 +33,74 @@ ### Добавлено -#### apiaccess +#### Общее | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1123 | Вычисляемое поле `BasisMPM` в структуру ответа `CloudBrokerEndpoints` в cloudbroker/apiaccess | +| BGOS-1146 | Значение `aerodisk` в валидаторе `sepTypeValues` | +| BGOS-1146 | Значение `AERODISK` в валидаторе `sepTypesValues` | -#### basismpm +#### audit | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1123 | Структура запроса `StartRequest` и метод `Start` в cloudbroker/basismpm | -| BGOS-1123 | Структура запроса `StatusRequest` и метод `Status` в cloudbroker/basismpm | -| BGOS-1123 | Структура запроса `StopRequest` и метод `Stop` в cloudbroker/basismpm | -| BGOS-1123 | Структура запроса `UpdateRequest` и метод `Update` в cloudbroker/basismpm | -| BGOS-1123 | Структуры ответа `MemInfo` и `RecordBasisMPM` в cloudbroker/basismpm | +| BGOS-1147 | Вычисляемое поле `VMFolderID` в структуру ответа `ItemAudit` в cloudapi/audit | +| BGOS-1147 | Вычисляемое поле `VMFolderID` в структуры ответа `ItemAudit` и `RecordAudit` в cloudbroker/audit | +#### compute +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1138 | Метод `MassPinToNode` и структура запроса `MassPinToNodeRequest` в cloudbroker/compute | + +#### grid +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1148 | Вычисляемые поля `SDNWeb` и `BVPWeb` в структуры ответа `RecordGrid` и `ItemGridList` в cloudbroker/grid | +| BGOS-1148 | Структуры ответа `SDNWeb` и `BVPWeb` в cloudbroker/grid | #### image | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1124 | Структура запроса `CreateFromDiskRequest` и методы `CreateFromDisk` и `CreateFromDiskAsync` в cloudapi/image | -| BGOS-1124 | Структура запроса `CreateFromDiskRequest` и методы `CreateFromDisk` и `CreateFromDiskAsync` в cloudbroker/image | +| BGOS-1140 | Опциональные поля `AccountID` и `SEPType` в структуру запроса `ListRequest` в cloudapi/image | +| BGOS-1140 | Опциональные поля `AccountID` и `SEPType` в структуру запроса `ListRequest` в cloudbroker/image | +| BGOS-1143 | Вычисляемое поле `RealSize` в структуру ответа `RecordImage` в cloudapi/image | +| BGOS-1143 | Вычисляемое поле `LinksTo` в структуру ответа `ItemImage` в cloudapi/image | +| BGOS-1143 | Вычисляемое поле `RealSize` в структуру ответа `RecordImage` в cloudbroker/image | +| BGOS-1143 | Вычисляемые поля `RealSize`, `CKey` и `Meta` в структуру ответа `ItemImage` в cloudbroker/image | -#### compute +#### locations | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1126 | Вычисляемые поля `PreviousReservesComputeResources` и `TakeOverResources` в структуру ответа `Resolution` в cloudbroker/compute | -| BGOS-1126 | Опциональное поле `TakeOverResources` в структуру запроса `MigrateV2ResolveRequest` в cloudbroker/compute | -| BGOS-1126 | Вычисляемое поле `Message` в структуру ответа `MigrateV2ResolveRecord` в cloudbroker/compute | -| BGOS-1126 | Вычисляемые поля `DisksCompleted`, `CompletedDisks`, `DisksTotal` и `CurrentDisk` в структуру ответа `ProgressDisks` в cloudbroker/compute | -| BGOS-1126 | Структуры ответа `CompletedDisk` и `CurrentDisk` в cloudbroker/compute | +| BGOS-1139 | Вычисляемые поля `SDNWeb` и `BVPWeb` в структуру ответа `ItemLocation` в cloudapi/locations | - -#### zone +#### rg | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1127 | Вычисляемое поле `DRSPortSeed` в структуры ответа `ItemZone` и `RecordZone` в cloudbroker/zone | +| BGOS-1141 | Вычисляемое поле `Policies` в структуру ответа `Reservation` в cloudbroker/rg | +| BGOS-1141 | Структуры ответа `PolicyUsage` и `ResourceConsumptionLimits` в cloudbroker/rg | +| BGOS-1141 | Вычисляемое поле `Policies` в структуры ответа `Resource`, `RecordResourceUsage` в cloudapi/rg | +| BGOS-1141 | Структуры ответа `PolicyUsage` и `ResourceConsumptionLimits` в cloudapi/rg | + +#### vins +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1142 | Вычисляемое поле `AutoAssignable` в структуру ответа `ItemReservation` в cloudapi/vins | ### Изменено -#### compute +#### basismpm | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1126 | Тип вычисляемого поля `UpdatedAt` с `uint64` на `float64` в структуре ответа `Observation` в cloudbroker/compute | -| BGOS-1126 | Тип вычисляемых полей `SampledAt`, `Percent` и `BytesPerSecond` с `uint64` на `float64` в структуре ответа `Memory` в cloudbroker/compute | -| BGOS-1126 | Тип вычисляемых полей `SampledAt`, `Percent` и `BytesPerSecond` с `uint64` на `float64` в структуре ответа `ProgressDisks` в cloudbroker/compute | -| BGOS-1126 | Тип вычисляемых полей `SampledAt`, `Percent` и `BytesPerSecond` с `uint64` на `float64` в структуре ответа `SystemDisk` в cloudbroker/compute | -| BGOS-1126 | Тип опционального поля `Storage` со `Storage` на `*Storage` в структуре запроса `MigrateV2Request` в cloudbroker/compute | -| BGOS-1126 | Тип поля `Targets` с опционального на обязательный в структуре запроса `Storage` в cloudbroker/compute | -| BGOS-1126 | Тэги `url` и `json` поля `Targets` с `targets` на `targets` в структуре запроса `Storage` в cloudbroker/compute | +| BGOS-1144 | Тип опциональных полей `PressureThreshold`, `DeflateThreshold`, `BufferPCT`, `GuaranteedPCT`, `ShrinkThresholdPCT`, `BalloonMaxShrinkPCT` и `BalloonMaxGrowPCT` с `uint64` на `float64` в структурах запроса `StartRequest` и `UpdateRequest` в cloudbroker/basismpm | -#### disks +#### rg | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1128 | Тэги `url` и `json` поля `KeepCurrentIOTune` с `keep_current_iot` на `keep_current_iotune` в структуре запроса `ChangeDiskStoragePolicyRequest` в cloudbroker/disks | -| BGOS-1128 | Тэги `url` и `json` поля `KeepCurrentIOTune` с `keep_current_iot` на `keep_current_iotune` в структуре запроса `ChangeDiskStoragePolicyRequest` в cloudapi/disks | - -#### client sdk -| Идентификатор задачи | Описание | -| --- | --- | -| BGOS-1134 | При получении от сервера ответа с HTTP-кодом ошибки клиенты `DecortClient`, `LegacyDecortClient` и `BVSDecortClient` теперь возвращают ошибку типа `HTTPError` с полями `StatusCode` и `Body`. Для проверки статусов добавлены функции `IsNotFound` и `HasStatusCode` | +| BGOS-1141 | Тип вычисляемого поля `ResourceLimits` с `ResourceLimits` на `ResourceConsumptionLimits` в структуре ответа `ItemResourceConsumption` в cloudbroker/rg | +| BGOS-1141 | Тип вычисляемого поля `ResourceLimits` с `ResourceLimits` на `ResourceConsumptionLimits` в структуре ответа `ItemResourceConsumption` в cloudapi/rg | ### Исправлено -#### client sdk +#### rg | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1135 | Исправлена ошибка в сообщении об ошибке при отсутствии времени истечения токена в клиенте | +| BGOS-1141 | JSON-тэг поля `RGID` с `rgid` на `id` в структуре ответа `ItemResourceConsumption` в cloudapi/rg | diff --git a/internal/validators/custom.go b/internal/validators/custom.go index f311a99..a56b443 100644 --- a/internal/validators/custom.go +++ b/internal/validators/custom.go @@ -508,24 +508,24 @@ func migrateV2ModeValidator(fe validator.FieldLevel) bool { // pressureThresholdValidator checks if PressureThreshold is in range from 5 to 50 func pressureThresholdValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(pressureThresholdMin) && fieldValue <= uint64(pressureThresholdMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(pressureThresholdMin) && fieldValue <= float64(pressureThresholdMax) } // deflateThresholdValidator checks if DeflateThreshold is in range from 10 to 70 func deflateThresholdValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(deflateThresholdMin) && fieldValue <= uint64(deflateThresholdMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(deflateThresholdMin) && fieldValue <= float64(deflateThresholdMax) } func bufferPCTValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(bufferPCTMin) && fieldValue <= uint64(bufferPCTMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(bufferPCTMin) && fieldValue <= float64(bufferPCTMax) } func guaranteedPCTValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(guaranteedPCTMin) && fieldValue <= uint64(guaranteedPCTMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(guaranteedPCTMin) && fieldValue <= float64(guaranteedPCTMax) } func guaranteedABSMinValidator(fe validator.FieldLevel) bool { @@ -534,18 +534,18 @@ func guaranteedABSMinValidator(fe validator.FieldLevel) bool { } func shrinkThresholdPCTValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(shrinkThresholdPCTMin) && fieldValue <= uint64(shrinkThresholdPCTMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(shrinkThresholdPCTMin) && fieldValue <= float64(shrinkThresholdPCTMax) } func balloonMaxShrinkPCTValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(balloonMaxShrinkPCTMin) && fieldValue <= uint64(balloonMaxShrinkPCTMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(balloonMaxShrinkPCTMin) && fieldValue <= float64(balloonMaxShrinkPCTMax) } func balloonMaxGrowPCTValidator(fe validator.FieldLevel) bool { - fieldValue := fe.Field().Uint() - return fieldValue >= uint64(balloonMaxGrowPCTMin) && fieldValue <= uint64(balloonMaxGrowPCTMax) + fieldValue := fe.Field().Float() + return fieldValue >= float64(balloonMaxGrowPCTMin) && fieldValue <= float64(balloonMaxGrowPCTMax) } func vmChangeCooldownValidator(fe validator.FieldLevel) bool { @@ -567,3 +567,8 @@ func logLevelValidator(fe validator.FieldLevel) bool { fieldValue := fe.Field().String() return IsInSlice(fieldValue, logLevelValues) } + +func sepTypesValidator(fe validator.FieldLevel) bool { + fieldValue := fe.Field().String() + return IsInSlice(fieldValue, sepTypesValues) +} diff --git a/internal/validators/messages.go b/internal/validators/messages.go index 6ba8e2a..8fb0c89 100644 --- a/internal/validators/messages.go +++ b/internal/validators/messages.go @@ -367,6 +367,12 @@ func errorMessage(fe validator.FieldError) string { prefix, fe.Field(), joinValues(sepTechStatusValues)) + + case "sepTypes": + return fmt.Sprintf("%s %s must be one of the following: %s", + prefix, + fe.Field(), + joinValues(sepTypesValues)) } return fe.Error() diff --git a/internal/validators/validator.go b/internal/validators/validator.go index f8ef250..b82a2cc 100644 --- a/internal/validators/validator.go +++ b/internal/validators/validator.go @@ -398,5 +398,10 @@ func registerAllValidators(validate *validator.Validate) error { return err } + err = validate.RegisterValidation("sepTypes", sepTypesValidator) + if err != nil { + return err + } + return nil } diff --git a/internal/validators/values.go b/internal/validators/values.go index f5457b9..0e2bb26 100644 --- a/internal/validators/values.go +++ b/internal/validators/values.go @@ -63,7 +63,7 @@ var ( loaderTypeValues = []string{"linux", "windows", "unknown"} - sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des", "ustor"} + sepTypeValues = []string{"hitachi", "dorado", "tatlin", "shared", "local", "des", "ustor", "aerodisk"} languageValues = []string{"ru", "en"} @@ -88,6 +88,8 @@ var ( migrateV2ModeValues = []string{"compute", "disks", "compute_and_disks"} logLevelValues = []string{"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"} + + sepTypesValues = []string{"DES", "DORADO", "HITACHI", "LOCAL", "SHARED", "TATLIN", "USTOR", "AERODISK"} ) const ( diff --git a/pkg/cloudapi/audit/models.go b/pkg/cloudapi/audit/models.go index ef99fdb..7d9e78e 100644 --- a/pkg/cloudapi/audit/models.go +++ b/pkg/cloudapi/audit/models.go @@ -122,6 +122,9 @@ type ItemAudit struct { // Persistent disk IDs associated with the operation DiskIDs []uint64 `json:"disk_ids"` + // VM folder ID + VMFolderID uint64 `json:"vmfolder_id"` + // API task ID for asynchronous calls APITask string `json:"apitask"` } diff --git a/pkg/cloudapi/image/list.go b/pkg/cloudapi/image/list.go index c316d8d..ca6734e 100644 --- a/pkg/cloudapi/image/list.go +++ b/pkg/cloudapi/image/list.go @@ -59,6 +59,14 @@ type ListRequest struct { // Required: false SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"` + // Sort by account ID + // Required: false + AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"` + + // Sort by sep type + // Required: false + SEPType string `url:"sep_type,omitempty" json:"sep_type,omitempty" validate:"omitempty,sepTypes"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` diff --git a/pkg/cloudapi/image/models.go b/pkg/cloudapi/image/models.go index 45fe0f9..d077395 100644 --- a/pkg/cloudapi/image/models.go +++ b/pkg/cloudapi/image/models.go @@ -32,6 +32,9 @@ type ItemImage struct { // Link to LinkTo uint64 `json:"linkTo"` + // Links to + LinksTo []uint64 `json:"linksTo"` + // Name Name string `json:"name"` @@ -214,4 +217,7 @@ type RecordImage struct { // Version Version string `json:"version"` + + // Real size of the image + RealSize uint64 `json:"real_size"` } diff --git a/pkg/cloudapi/locations/models.go b/pkg/cloudapi/locations/models.go index 623bee2..95ca3c8 100644 --- a/pkg/cloudapi/locations/models.go +++ b/pkg/cloudapi/locations/models.go @@ -46,6 +46,12 @@ type ItemLocation struct { // Are VM Folders enabled VMFoldersEnabled bool `json:"vm_folders_enabled"` + + // SDN Web config + SDNWeb SDNWeb `json:"sdn_web"` + + // BVP Web config + BVPWeb BVPWeb `json:"bvp_web"` } // List of locations @@ -56,3 +62,27 @@ type ListLocations struct { // Entry count EntryCount uint64 `json:"entryCount"` } + +// SDN Web config +type SDNWeb struct { + // Whether the config is enabled + Enabled bool `json:"enabled"` + + // URL + URL string `json:"url"` + + // Number of the port + Port uint64 `json:"port"` +} + +// BVP Web config +type BVPWeb struct { + // Whether the config is enabled + Enabled bool `json:"enabled"` + + // URL + URL string `json:"url"` + + // Number of ther port + Port uint64 `json:"port"` +} diff --git a/pkg/cloudapi/rg/models.go b/pkg/cloudapi/rg/models.go index 5cfe453..89f9467 100644 --- a/pkg/cloudapi/rg/models.go +++ b/pkg/cloudapi/rg/models.go @@ -22,6 +22,9 @@ type Resource struct { // SEPs SEPs map[string]map[string]DiskUsage `json:"seps"` + + // Policies + Policies map[string]PolicyUsage `json:"policies"` } // Disk usage @@ -33,6 +36,21 @@ type DiskUsage struct { DiskSizeMax float64 `json:"disksizemax"` } +// Policy usage +type PolicyUsage struct { + // Disk size + DiskSize float64 `json:"disksize"` + + // Max disk size + DiskSizeMax float64 `json:"disksizemax"` + + // Limit + Limit float64 `json:"limit"` + + // SEPs + SEPs map[string]map[string]DiskUsage `json:"seps"` +} + // Information about resources type Resources struct { // Current information about resources @@ -51,10 +69,31 @@ type ItemResourceConsumption struct { Reserved Resource `json:"reserved"` // Resource limits - ResourceLimits ResourceLimits `json:"resourceLimits"` + ResourceLimits ResourceConsumptionLimits `json:"resourceLimits"` // Resource group ID - RGID uint64 `json:"rgid"` + RGID uint64 `json:"id"` +} + +// Resource limits of resource consumption +type ResourceConsumptionLimits struct { + // CUC + CUC float64 `json:"CU_C"` + + // CUD + CUD float64 `json:"CU_D"` + + // CUDM + CUDM float64 `json:"CU_DM"` + + // CUI + CUI float64 `json:"CU_I"` + + // CUM + CUM float64 `json:"CU_M"` + + // GPU units + GPUUnits float64 `json:"gpu_units"` } type ListResourceConsumption struct { @@ -892,4 +931,7 @@ type RecordResourceUsage struct { // SEPs SEPs map[string]map[string]DiskUsage `json:"seps"` + + // Policies + Policies map[string]PolicyUsage `json:"policies"` } diff --git a/pkg/cloudapi/vins/models.go b/pkg/cloudapi/vins/models.go index 10c0de8..2e61f17 100644 --- a/pkg/cloudapi/vins/models.go +++ b/pkg/cloudapi/vins/models.go @@ -844,6 +844,9 @@ type ItemReservation struct { // Account ID AccountID uint64 `json:"account_id"` + // Whether reservation is auto assignable + AutoAssignable bool `json:"auto_assignable"` + // IP IP string `json:"ip"` diff --git a/pkg/cloudbroker/audit/models.go b/pkg/cloudbroker/audit/models.go index cbf6729..28b5d87 100644 --- a/pkg/cloudbroker/audit/models.go +++ b/pkg/cloudbroker/audit/models.go @@ -77,6 +77,9 @@ type ItemAudit struct { // Persistent disk IDs associated with the operation DiskIDs []uint64 `json:"disk_ids"` + // VM folder ID + VMFolderID uint64 `json:"vmfolder_id"` + // API task ID for asynchronous calls APITask string `json:"apitask"` } @@ -146,6 +149,9 @@ type RecordAudit struct { // Compute ID ComputeID uint64 `json:"compute_id"` + + // VM folder ID + VMFolderID uint64 `json:"vmfolder_id"` } // List of Linked Jobs diff --git a/pkg/cloudbroker/basismpm/start.go b/pkg/cloudbroker/basismpm/start.go index b497985..0910a45 100644 --- a/pkg/cloudbroker/basismpm/start.go +++ b/pkg/cloudbroker/basismpm/start.go @@ -18,12 +18,12 @@ type StartRequest struct { // Memory pressure threshold (%) // Required: false // Default: 20 - PressureThreshold uint64 `url:"pressure_threshold,omitempty" json:"pressure_threshold,omitempty" validate:"omitempty,pressureThreshold"` + PressureThreshold float64 `url:"pressure_threshold,omitempty" json:"pressure_threshold,omitempty" validate:"omitempty,pressureThreshold"` // Deflate threshold (%) // Required: false // Default: 30 - DeflateThreshold uint64 `url:"deflate_threshold,omitempty" json:"deflate_threshold,omitempty" validate:"omitempty,deflateThreshold"` + DeflateThreshold float64 `url:"deflate_threshold,omitempty" json:"deflate_threshold,omitempty" validate:"omitempty,deflateThreshold"` // Host reserved memory // Required: false @@ -33,12 +33,12 @@ type StartRequest struct { // Buffer percentage (%) // Required: false // Default: 20 - BufferPCT uint64 `url:"buffer_pct,omitempty" json:"buffer_pct,omitempty" validate:"omitempty,bufferPCT"` + BufferPCT float64 `url:"buffer_pct,omitempty" json:"buffer_pct,omitempty" validate:"omitempty,bufferPCT"` // Guaranteed memory percentage (%) // Required: false // Default: 25 - GuaranteedPCT uint64 `url:"guaranteed_pct,omitempty" json:"guaranteed_pct,omitempty" validate:"omitempty,guaranteedPCT"` + GuaranteedPCT float64 `url:"guaranteed_pct,omitempty" json:"guaranteed_pct,omitempty" validate:"omitempty,guaranteedPCT"` // Absolute minimum guaranteed memory (MB) // Required: false @@ -48,17 +48,17 @@ type StartRequest struct { // Shrink threshold percentage (%) // Required: false // Default: 50 - ShrinkThresholdPCT uint64 `url:"shrink_threshold_pct,omitempty" json:"shrink_threshold_pct,omitempty" validate:"omitempty,shrinkThresholdPCT"` + ShrinkThresholdPCT float64 `url:"shrink_threshold_pct,omitempty" json:"shrink_threshold_pct,omitempty" validate:"omitempty,shrinkThresholdPCT"` // Max shrink percentage per cycle (%) // Required: false // Default: 10 - BalloonMaxShrinkPCT uint64 `url:"balloon_max_shrink_pct,omitempty" json:"balloon_max_shrink_pct,omitempty" validate:"omitempty,balloonMaxShrinkPCT"` + BalloonMaxShrinkPCT float64 `url:"balloon_max_shrink_pct,omitempty" json:"balloon_max_shrink_pct,omitempty" validate:"omitempty,balloonMaxShrinkPCT"` // Max grow percentage per cycle (%) // Required: false // Default: 10 - BalloonMaxGrowPCT uint64 `url:"balloon_max_grow_pct,omitempty" json:"balloon_max_grow_pct,omitempty" validate:"omitempty,balloonMaxGrowPCT"` + BalloonMaxGrowPCT float64 `url:"balloon_max_grow_pct,omitempty" json:"balloon_max_grow_pct,omitempty" validate:"omitempty,balloonMaxGrowPCT"` // VM change cooldown (seconds) // Required: false diff --git a/pkg/cloudbroker/basismpm/update.go b/pkg/cloudbroker/basismpm/update.go index 4649817..98bb17f 100644 --- a/pkg/cloudbroker/basismpm/update.go +++ b/pkg/cloudbroker/basismpm/update.go @@ -18,12 +18,12 @@ type UpdateRequest struct { // Memory pressure threshold (%) // Required: false // Default: 20 - PressureThreshold uint64 `url:"pressure_threshold,omitempty" json:"pressure_threshold,omitempty" validate:"omitempty,pressureThreshold"` + PressureThreshold float64 `url:"pressure_threshold,omitempty" json:"pressure_threshold,omitempty" validate:"omitempty,pressureThreshold"` // Deflate threshold (%) // Required: false // Default: 30 - DeflateThreshold uint64 `url:"deflate_threshold,omitempty" json:"deflate_threshold,omitempty" validate:"omitempty,deflateThreshold"` + DeflateThreshold float64 `url:"deflate_threshold,omitempty" json:"deflate_threshold,omitempty" validate:"omitempty,deflateThreshold"` // Host reserved memory // Required: false @@ -33,12 +33,12 @@ type UpdateRequest struct { // Buffer percentage (%) // Required: false // Default: 20 - BufferPCT uint64 `url:"buffer_pct,omitempty" json:"buffer_pct,omitempty" validate:"omitempty,bufferPCT"` + BufferPCT float64 `url:"buffer_pct,omitempty" json:"buffer_pct,omitempty" validate:"omitempty,bufferPCT"` // Guaranteed memory percentage (%) // Required: false // Default: 25 - GuaranteedPCT uint64 `url:"guaranteed_pct,omitempty" json:"guaranteed_pct,omitempty" validate:"omitempty,guaranteedPCT"` + GuaranteedPCT float64 `url:"guaranteed_pct,omitempty" json:"guaranteed_pct,omitempty" validate:"omitempty,guaranteedPCT"` // Absolute minimum guaranteed memory (MB) // Required: false @@ -48,17 +48,17 @@ type UpdateRequest struct { // Shrink threshold percentage (%) // Required: false // Default: 50 - ShrinkThresholdPCT uint64 `url:"shrink_threshold_pct,omitempty" json:"shrink_threshold_pct,omitempty" validate:"omitempty,shrinkThresholdPCT"` + ShrinkThresholdPCT float64 `url:"shrink_threshold_pct,omitempty" json:"shrink_threshold_pct,omitempty" validate:"omitempty,shrinkThresholdPCT"` // Max shrink percentage per cycle (%) // Required: false // Default: 10 - BalloonMaxShrinkPCT uint64 `url:"balloon_max_shrink_pct,omitempty" json:"balloon_max_shrink_pct,omitempty" validate:"omitempty,balloonMaxShrinkPCT"` + BalloonMaxShrinkPCT float64 `url:"balloon_max_shrink_pct,omitempty" json:"balloon_max_shrink_pct,omitempty" validate:"omitempty,balloonMaxShrinkPCT"` // Max grow percentage per cycle (%) // Required: false // Default: 10 - BalloonMaxGrowPCT uint64 `url:"balloon_max_grow_pct,omitempty" json:"balloon_max_grow_pct,omitempty" validate:"omitempty,balloonMaxGrowPCT"` + BalloonMaxGrowPCT float64 `url:"balloon_max_grow_pct,omitempty" json:"balloon_max_grow_pct,omitempty" validate:"omitempty,balloonMaxGrowPCT"` // VM change cooldown (seconds) // Required: false diff --git a/pkg/cloudbroker/compute/mass_pin_to_node.go b/pkg/cloudbroker/compute/mass_pin_to_node.go new file mode 100644 index 0000000..cc3f5c1 --- /dev/null +++ b/pkg/cloudbroker/compute/mass_pin_to_node.go @@ -0,0 +1,64 @@ +package compute + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type Pin struct { + // ID of the compute instance + // Required: true + ComputeID uint64 `url:"compute_id" json:"compute_id" validate:"required"` + + // Target node ID. Required for stopped computes. + // For started computes it is optional; + // if it differs from the current node, allow_migration must be true, + // otherwise the compute is reported with migration_not_allowed error. + // Required: false + NodeID uint64 `url:"node_id,omitempty" json:"node_id,omitempty"` +} + +// MassPinToNodeRequest to pin multiple computes to nodes in a single call +type MassPinToNodeRequest struct { + // Computes to pin, at most 200 items per request + // Required: true + Pins []Pin `url:"pins" json:"pins" validate:"required,min=1,max=200,dive"` + + // Allow live migration of started computes to the requested node_id + // Default: false + // Required: false + AllowMigration interface{} `url:"allow_migration,omitempty" json:"allow_migration,omitempty" validate:"omitempty,isBool"` + + // Start compute after node exits from MAINTENANCE state + // Default: false + // Required: false + AutoStart interface{} `url:"auto_start,omitempty" json:"auto_start,omitempty" validate:"omitempty,isBool"` +} + +// MassPinToNode pins multiple computes to nodes in a single call +func (c Compute) MassPinToNode(ctx context.Context, req MassPinToNodeRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/compute/mass_pin_to_node" + + res, err := c.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudbroker/grid/models.go b/pkg/cloudbroker/grid/models.go index 9475df7..4aa6821 100644 --- a/pkg/cloudbroker/grid/models.go +++ b/pkg/cloudbroker/grid/models.go @@ -120,6 +120,12 @@ type RecordGrid struct { // Whether VM folders are enabled VMFoldersEnabled bool `json:"vm_folders_enabled"` + + // SDN Web config + SDNWeb SDNWeb `json:"sdn_web"` + + // BVP Web config + BVPWeb BVPWeb `json:"bvp_web"` } // Information about grid @@ -171,6 +177,36 @@ type ItemGridList struct { // Whether VM folders are enabled VMFoldersEnabled bool `json:"vm_folders_enabled"` + + // SDN Web config + SDNWeb SDNWeb `json:"sdn_web"` + + // BVP Web config + BVPWeb BVPWeb `json:"bvp_web"` +} + +// SDN Web config +type SDNWeb struct { + // Whether the config is enabled + Enabled bool `json:"enabled"` + + // URL + URL string `json:"url"` + + // Number of the port + Port uint64 `json:"port"` +} + +// BVP Web config +type BVPWeb struct { + // Whether the config is enabled + Enabled bool `json:"enabled"` + + // URL + URL string `json:"url"` + + // Number of the port + Port uint64 `json:"port"` } // List Grids diff --git a/pkg/cloudbroker/image/list.go b/pkg/cloudbroker/image/list.go index 0f619de..6494303 100644 --- a/pkg/cloudbroker/image/list.go +++ b/pkg/cloudbroker/image/list.go @@ -59,6 +59,14 @@ type ListRequest struct { // Required: false SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"` + // Sort by account ID + // Required: false + AccountID uint64 `url:"account_id,omitempty" json:"account_id,omitempty"` + + // Sort by sep type + // Required: false + SEPType string `url:"sep_type,omitempty" json:"sep_type,omitempty" validate:"omitempty,sepTypes"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` diff --git a/pkg/cloudbroker/image/models.go b/pkg/cloudbroker/image/models.go index e2a1109..683733a 100644 --- a/pkg/cloudbroker/image/models.go +++ b/pkg/cloudbroker/image/models.go @@ -89,6 +89,9 @@ type RecordImage struct { // Purge attempts PurgeAttempts uint64 `json:"purgeAttempts"` + // Real size if the image + RealSize uint64 `json:"real_size"` + // Reference ID ReferenceID string `json:"referenceId"` @@ -277,6 +280,15 @@ type ItemImage struct { // Virtual Virtual bool `json:"virtual"` + + // Real size of the image + RealSize uint64 `json:"real_size"` + + // CKey + CKey string `json:"_ckey"` + + // Meta info + Meta interface{} `json:"_meta"` } // List images diff --git a/pkg/cloudbroker/rg/models.go b/pkg/cloudbroker/rg/models.go index 516d0ec..e4a9f3c 100644 --- a/pkg/cloudbroker/rg/models.go +++ b/pkg/cloudbroker/rg/models.go @@ -43,6 +43,9 @@ type Reservation struct { // SEPs SEPs map[string]map[string]DiskUsage `json:"seps"` + + // Policies + Policies map[string]PolicyUsage `json:"policies"` } // Disk usage @@ -54,6 +57,21 @@ type DiskUsage struct { DiskSizeMax float64 `json:"disksizemax"` } +// Policy usage +type PolicyUsage struct { + // Disk size + DiskSize float64 `json:"disksize"` + + // Max disk size + DiskSizeMax float64 `json:"disksizemax"` + + // Limit + Limit float64 `json:"limit"` + + // SEPs + SEPs map[string]map[string]DiskUsage `json:"seps"` +} + // Resources usage information type ItemResourceConsumption struct { // Current information @@ -63,12 +81,33 @@ type ItemResourceConsumption struct { Reserved Reservation `json:"Reserved"` // Resource limits - ResourceLimits ResourceLimits `json:"resourceLimits"` + ResourceLimits ResourceConsumptionLimits `json:"resourceLimits"` // Resource group ID RGID uint64 `json:"id"` } +// Resource limits of resource consumption +type ResourceConsumptionLimits struct { + // CUC + CUC float64 `json:"CU_C"` + + // CUD + CuD float64 `json:"CU_D"` + + // CUDM + CUDM float64 `json:"CU_DM"` + + // CUI + CUI float64 `json:"CU_I"` + + // CUM + CUM float64 `json:"CU_M"` + + // GPU units + GPUUnits float64 `json:"gpu_units"` +} + type ListResourceConsumption struct { // Data Data []ItemResourceConsumption `json:"data"` diff --git a/pkg/cloudbroker/sep/add_pool.go b/pkg/cloudbroker/sep/add_pool.go index 7bef494..c1e8d50 100644 --- a/pkg/cloudbroker/sep/add_pool.go +++ b/pkg/cloudbroker/sep/add_pool.go @@ -16,7 +16,7 @@ type AddPoolRequest struct { SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"` // Pool structure which contains fields such as "name", "usage_limit", "types", "system", "accessAccountIds", "accessResGroupIds". Added fields for other pool types: Des, Ovs - "uris" list of "ip, port". - // Dorado, Tatlin - "vdisk_discard". Hitachi - "id", "snapshotable", "snapshot_pool_id", "minLdevId", "maxLdevId", "clone_technology", "vdisk_discard". Shared - "description", "wwns", "allocate_type", "stripes", "metadata_size", "metadatatalun", "vdisk_discard" Local - "description", "node_consumer", "block_disk". + // Dorado, Tatlin - "vdisk_discard". Hitachi - "id", "snapshotable", "snapshot_pool_id", "minLdevId", "maxLdevId", "clone_technology", "vdisk_discard". Shared - "description", "wwns", "allocate_type", "stripes", "metadata_size", "metadatatalun", "vdisk_discard" Local - "description", "node_consumer", "block_disk", Aerodisk – "provision", "clone_technology", "disk_block_size", "read_only".. // Required: true Pool string `url:"pool" json:"pool" validate:"required"` } diff --git a/tests/platform_upgrade/request_map.go b/tests/platform_upgrade/request_map.go index 73aa09a..ff6619e 100644 --- a/tests/platform_upgrade/request_map.go +++ b/tests/platform_upgrade/request_map.go @@ -713,6 +713,7 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/compute/migrate_v2_abort": compute_cb.MigrateV2AbortRequest{}, "/restmachine/cloudbroker/compute/migrate_v2_cleanup": compute_cb.MigrateV2CleanupRequest{}, "/restmachine/cloudbroker/compute/migrate_v2": compute_cb.MigrateV2Request{}, + "/restmachine/cloudbroker/compute/mass_pin_to_node": compute_cb.MassPinToNodeRequest{}, // disks "/restmachine/cloudbroker/disks/change_disk_storage_policy": disks_cb.ChangeDiskStoragePolicyRequest{},