From a958594ab8c951290b285190cdb65f6d93f6598b Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Wed, 3 Dec 2025 22:42:29 +0300 Subject: [PATCH 01/10] t Signed-off-by: Valeriy Khorunzhin --- api/core/v1alpha2/virtual_machine.go | 5 +- api/core/v1alpha2/virtual_machine_class.go | 3 + api/core/v1alpha3/virtual_machine_class.go | 2 + .../virtual_machine_class_conversion.go | 19 ++++ crds/doc-ru-virtualmachineclasses.yaml | 4 + crds/virtualmachineclasses.yaml | 13 +++ crds/virtualmachines.yaml | 5 +- .../vm/internal/defaulter/core_fraction.go | 91 +++++++++++++++++++ .../pkg/controller/vm/vm_webhook.go | 1 + .../default_core_fraction_validator.go | 69 ++++++++++++++ .../pkg/controller/vmclass/vmclass_webhook.go | 1 + 11 files changed, 208 insertions(+), 5 deletions(-) create mode 100644 images/virtualization-artifact/pkg/controller/vm/internal/defaulter/core_fraction.go create mode 100644 images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go diff --git a/api/core/v1alpha2/virtual_machine.go b/api/core/v1alpha2/virtual_machine.go index bd658aa1c9..b7895501f5 100644 --- a/api/core/v1alpha2/virtual_machine.go +++ b/api/core/v1alpha2/virtual_machine.go @@ -165,8 +165,9 @@ type CPUSpec struct { Cores int `json:"cores"` // Guaranteed share of CPU that will be allocated to the VM. Specified as a percentage. - // +kubebuilder:default:="100%" - // +kubebuilder:validation:Enum:={"5%", "10%", "25%", "50%", "100%"} + // The range of available values is defined in the VirtualMachineClass sizing policy. + // If not specified, the default value from the VirtualMachineClass will be used. + // +kubebuilder:validation:Pattern=`^(100|[1-9][0-9]?|[1-9])%$` CoreFraction string `json:"coreFraction,omitempty"` } diff --git a/api/core/v1alpha2/virtual_machine_class.go b/api/core/v1alpha2/virtual_machine_class.go index c9adab88bc..fb7a13a76e 100644 --- a/api/core/v1alpha2/virtual_machine_class.go +++ b/api/core/v1alpha2/virtual_machine_class.go @@ -119,6 +119,9 @@ type SizingPolicy struct { Memory *SizingPolicyMemory `json:"memory,omitempty"` // Allowed values of the `coreFraction` parameter. CoreFractions []CoreFractionValue `json:"coreFractions,omitempty"` + // Default core fraction value for the VirtualMachineClass. + // This value will be used when creating a VM without an explicitly specified coreFraction. + DefaultCoreFraction *CoreFractionValue `json:"defaultCoreFraction,omitempty"` // Allowed values of the `dedicatedCores` parameter. DedicatedCores []bool `json:"dedicatedCores,omitempty"` // The policy applies for a specified range of the number of CPU cores. diff --git a/api/core/v1alpha3/virtual_machine_class.go b/api/core/v1alpha3/virtual_machine_class.go index 9c64b253f4..6a2c99b436 100644 --- a/api/core/v1alpha3/virtual_machine_class.go +++ b/api/core/v1alpha3/virtual_machine_class.go @@ -117,6 +117,8 @@ type SizingPolicy struct { Memory *SizingPolicyMemory `json:"memory,omitempty"` // Allowed values of the `coreFraction` parameter in percentages (e.g., "5%", "10%", "25%", "50%", "100%"). CoreFractions []CoreFractionValue `json:"coreFractions,omitempty"` + // Default core fraction value for the VirtualMachineClass. + DefaultCoreFraction *CoreFractionValue `json:"defaultCoreFraction,omitempty"` // Allowed values of the `dedicatedCores` parameter. DedicatedCores []bool `json:"dedicatedCores,omitempty"` // The policy applies for a specified range of the number of CPU cores. diff --git a/api/core/v1alpha3/virtual_machine_class_conversion.go b/api/core/v1alpha3/virtual_machine_class_conversion.go index 6697b2fea0..54297bd615 100644 --- a/api/core/v1alpha3/virtual_machine_class_conversion.go +++ b/api/core/v1alpha3/virtual_machine_class_conversion.go @@ -124,6 +124,20 @@ func convertSpecV3ToV2(v3Spec VirtualMachineClassSpec) (v1alpha2.VirtualMachineC } } + if v3Policy.DefaultCoreFraction != nil { + fractionStr := string(*v3Policy.DefaultCoreFraction) + if !regexp.MustCompile(`^([1-9]|[1-9][0-9]|100)%$`).MatchString(fractionStr) { + return v1alpha2.VirtualMachineClassSpec{}, fmt.Errorf("spec.sizingPolicies[%d].defaultCoreFraction: value must be a percentage between 1%% and 100%% (e.g., 5%%, 10%%, 50%%), got %q", i, fractionStr) + } + fractionStr = fractionStr[:len(fractionStr)-1] + fractionInt, err := strconv.Atoi(fractionStr) + if err != nil { + return v1alpha2.VirtualMachineClassSpec{}, fmt.Errorf("failed to parse default core fraction: %w", err) + } + v2Fraction := v1alpha2.CoreFractionValue(fractionInt) + v2Policy.DefaultCoreFraction = &v2Fraction + } + v2Spec.SizingPolicies[i] = v2Policy } } @@ -191,6 +205,11 @@ func convertSpecV2ToV3(v2Spec v1alpha2.VirtualMachineClassSpec) VirtualMachineCl } } + if v2Policy.DefaultCoreFraction != nil { + v3Fraction := CoreFractionValue(fmt.Sprintf("%d%%", *v2Policy.DefaultCoreFraction)) + v3Policy.DefaultCoreFraction = &v3Fraction + } + v3Spec.SizingPolicies[i] = v3Policy } } diff --git a/crds/doc-ru-virtualmachineclasses.yaml b/crds/doc-ru-virtualmachineclasses.yaml index c0abe39ad8..9ff1a6fbb0 100644 --- a/crds/doc-ru-virtualmachineclasses.yaml +++ b/crds/doc-ru-virtualmachineclasses.yaml @@ -134,6 +134,10 @@ spec: coreFractions: description: | Допустимые значения параметра `coreFraction` в процентах (например, "5%", "10%", "25%", "50%", "100%"). + defaultCoreFraction: + description: | + Значение coreFraction по умолчанию для VirtualMachineClass. + Это значение будет использовано при создании ВМ без явно указанного coreFraction. cores: description: | Политика применяется для заданного диапазона числа ядер CPU. diff --git a/crds/virtualmachineclasses.yaml b/crds/virtualmachineclasses.yaml index 86e4d7c978..edac91519f 100644 --- a/crds/virtualmachineclasses.yaml +++ b/crds/virtualmachineclasses.yaml @@ -281,6 +281,13 @@ spec: items: type: boolean type: array + defaultCoreFraction: + description: |- + Default core fraction value for the VirtualMachineClass. + This value will be used when creating a VM without an explicitly specified coreFraction. + maximum: 100 + minimum: 1 + type: integer memory: description: Memory sizing policy. properties: @@ -334,6 +341,9 @@ spec: x-kubernetes-int-or-string: true type: object type: object + x-kubernetes-validations: + - message: The defaultCoreFraction must be one of the values in coreFractions + rule: "!has(self.defaultCoreFraction) || self.defaultCoreFraction in self.coreFractions" type: array tolerations: description: |- @@ -775,6 +785,9 @@ spec: items: type: boolean type: array + defaultCoreFraction: + description: Default core fraction value for the VirtualMachineClass. + type: string memory: description: Memory sizing policy. properties: diff --git a/crds/virtualmachines.yaml b/crds/virtualmachines.yaml index 7bbcd0e69a..7d4093375a 100644 --- a/crds/virtualmachines.yaml +++ b/crds/virtualmachines.yaml @@ -38,7 +38,7 @@ spec: properties: spec: x-kubernetes-validations: - - rule: "self.cpu.coreFraction.endsWith('%') && int(self.cpu.coreFraction.replace('%', '')) >= 1 && int(self.cpu.coreFraction.replace('%', '')) <= 100" + - rule: "!has(self.cpu.coreFraction) || (self.cpu.coreFraction.endsWith('%') && int(self.cpu.coreFraction.replace('%', '')) >= 1 && int(self.cpu.coreFraction.replace('%', '')) <= 100)" message: "Core fraction must be between 1% and 100%." type: object required: @@ -888,9 +888,8 @@ spec: description: Number of cores. coreFraction: type: string - default: "100%" description: | - Guaranteed share of CPU time that will be allocated to the VM. Specified as a percentage. The range of available values is set in the `sizePolicy` parameter of the VirtualMachineClass; if it is not set, use values within the 1–100% range. + Guaranteed share of CPU time that will be allocated to the VM. Specified as a percentage. The range of available values is set in the `sizePolicy` parameter of the VirtualMachineClass. If not specified, the default value from the VirtualMachineClass sizing policy will be used. If no default is set in the class, "100%" will be applied. memory: type: object diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/defaulter/core_fraction.go b/images/virtualization-artifact/pkg/controller/vm/internal/defaulter/core_fraction.go new file mode 100644 index 0000000000..cd94393274 --- /dev/null +++ b/images/virtualization-artifact/pkg/controller/vm/internal/defaulter/core_fraction.go @@ -0,0 +1,91 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package defaulter + +import ( + "context" + "fmt" + + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/deckhouse/virtualization/api/core/v1alpha2" + "github.com/deckhouse/virtualization/api/core/v1alpha3" +) + +type CoreFractionDefaulter struct { + client client.Client +} + +func NewCoreFractionDefaulter(client client.Client) *CoreFractionDefaulter { + return &CoreFractionDefaulter{ + client: client, + } +} + +func (d *CoreFractionDefaulter) Default(ctx context.Context, vm *v1alpha2.VirtualMachine) error { + // Skip if coreFraction is already set. + if vm.Spec.CPU.CoreFraction != "" { + return nil + } + + // Skip if vmClassName is not set (will be handled by validation later). + if vm.Spec.VirtualMachineClassName == "" { + return nil + } + + // Get the VMClass. + vmClass := &v1alpha3.VirtualMachineClass{} + err := d.client.Get(ctx, types.NamespacedName{Name: vm.Spec.VirtualMachineClassName}, vmClass) + if err != nil { + return fmt.Errorf("failed to get VirtualMachineClass %q: %w", vm.Spec.VirtualMachineClassName, err) + } + + // Find the matching sizing policy based on CPU cores. + defaultCoreFraction := d.getDefaultCoreFraction(vm, vmClass) + if defaultCoreFraction != "" { + vm.Spec.CPU.CoreFraction = defaultCoreFraction + } + + return nil +} + +// getDefaultCoreFraction finds the default core fraction from the VMClass sizing policy +// that matches the VM's CPU cores count. +func (d *CoreFractionDefaulter) getDefaultCoreFraction(vm *v1alpha2.VirtualMachine, vmClass *v1alpha3.VirtualMachineClass) string { + const defaultValue = "100%" + + if vmClass == nil || len(vmClass.Spec.SizingPolicies) == 0 { + return defaultValue + } + + for _, sp := range vmClass.Spec.SizingPolicies { + if sp.Cores == nil { + continue + } + + // Check if VM's cores fall within this policy's range. + if vm.Spec.CPU.Cores >= sp.Cores.Min && vm.Spec.CPU.Cores <= sp.Cores.Max { + if sp.DefaultCoreFraction != nil { + return string(*sp.DefaultCoreFraction) + } + return defaultValue + } + } + + return defaultValue +} diff --git a/images/virtualization-artifact/pkg/controller/vm/vm_webhook.go b/images/virtualization-artifact/pkg/controller/vm/vm_webhook.go index ccd2bd0301..3107d3741f 100644 --- a/images/virtualization-artifact/pkg/controller/vm/vm_webhook.go +++ b/images/virtualization-artifact/pkg/controller/vm/vm_webhook.go @@ -131,6 +131,7 @@ func NewDefaulter(client client.Client, vmClassService *service.VirtualMachineCl return &Defaulter{ defaulters: []VirtualMachineDefaulter{ defaulter.NewVirtualMachineClassNameDefaulter(client, vmClassService), + defaulter.NewCoreFractionDefaulter(client), }, log: log.With("webhook", "mutating"), } diff --git a/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go new file mode 100644 index 0000000000..3918089134 --- /dev/null +++ b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go @@ -0,0 +1,69 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package validators + +import ( + "context" + "fmt" + + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + + "github.com/deckhouse/virtualization/api/core/v1alpha2" +) + +type DefaultCoreFractionValidator struct{} + +func NewDefaultCoreFractionValidator() *DefaultCoreFractionValidator { + return &DefaultCoreFractionValidator{} +} + +func (v *DefaultCoreFractionValidator) ValidateCreate(_ context.Context, vmclass *v1alpha2.VirtualMachineClass) (admission.Warnings, error) { + return nil, v.validate(vmclass) +} + +func (v *DefaultCoreFractionValidator) ValidateUpdate(_ context.Context, _, newVMClass *v1alpha2.VirtualMachineClass) (admission.Warnings, error) { + return nil, v.validate(newVMClass) +} + +func (v *DefaultCoreFractionValidator) validate(vmclass *v1alpha2.VirtualMachineClass) error { + for i, policy := range vmclass.Spec.SizingPolicies { + if policy.DefaultCoreFraction == nil { + continue + } + + if len(policy.CoreFractions) == 0 { + continue + } + + if !containsCoreFraction(policy.CoreFractions, *policy.DefaultCoreFraction) { + return fmt.Errorf("vmclass %s sizingPolicy[%d]: defaultCoreFraction %d is not in the allowed coreFractions list %v", + vmclass.Name, i, *policy.DefaultCoreFraction, policy.CoreFractions) + } + } + + return nil +} + +func containsCoreFraction(fractions []v1alpha2.CoreFractionValue, value v1alpha2.CoreFractionValue) bool { + for _, f := range fractions { + if f == value { + return true + } + } + return false +} + diff --git a/images/virtualization-artifact/pkg/controller/vmclass/vmclass_webhook.go b/images/virtualization-artifact/pkg/controller/vmclass/vmclass_webhook.go index d42e1bd314..1bbf861f2d 100644 --- a/images/virtualization-artifact/pkg/controller/vmclass/vmclass_webhook.go +++ b/images/virtualization-artifact/pkg/controller/vmclass/vmclass_webhook.go @@ -48,6 +48,7 @@ func NewValidator(client client.Client, log *log.Logger, recorder eventrecord.Ev validators.NewSizingPoliciesValidator(client), validators.NewPolicyChangesValidator(recorder), validators.NewSingleDefaultClassValidator(client, vmClassService), + validators.NewDefaultCoreFractionValidator(), }, log: log.With("webhook", "validation"), } From 0bbab48548eb09326de025a263c1becfcbdbd88d Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Wed, 3 Dec 2025 22:54:52 +0300 Subject: [PATCH 02/10] t1 Signed-off-by: Valeriy Khorunzhin --- crds/virtualmachineclasses.yaml | 3 --- .../internal/validators/default_core_fraction_validator.go | 1 - 2 files changed, 4 deletions(-) diff --git a/crds/virtualmachineclasses.yaml b/crds/virtualmachineclasses.yaml index edac91519f..58caf23455 100644 --- a/crds/virtualmachineclasses.yaml +++ b/crds/virtualmachineclasses.yaml @@ -341,9 +341,6 @@ spec: x-kubernetes-int-or-string: true type: object type: object - x-kubernetes-validations: - - message: The defaultCoreFraction must be one of the values in coreFractions - rule: "!has(self.defaultCoreFraction) || self.defaultCoreFraction in self.coreFractions" type: array tolerations: description: |- diff --git a/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go index 3918089134..c5a2c91779 100644 --- a/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go +++ b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go @@ -66,4 +66,3 @@ func containsCoreFraction(fractions []v1alpha2.CoreFractionValue, value v1alpha2 } return false } - From 620ec37e1f4b146c4655ac16e00feb4cf4cc6fc8 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Wed, 3 Dec 2025 23:06:18 +0300 Subject: [PATCH 03/10] regenerate Signed-off-by: Valeriy Khorunzhin --- api/core/v1alpha2/zz_generated.deepcopy.go | 5 +++++ api/core/v1alpha3/zz_generated.deepcopy.go | 5 +++++ .../api/generated/openapi/zz_generated.openapi.go | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/api/core/v1alpha2/zz_generated.deepcopy.go b/api/core/v1alpha2/zz_generated.deepcopy.go index fd1ae399fa..e1ad5e58e5 100644 --- a/api/core/v1alpha2/zz_generated.deepcopy.go +++ b/api/core/v1alpha2/zz_generated.deepcopy.go @@ -756,6 +756,11 @@ func (in *SizingPolicy) DeepCopyInto(out *SizingPolicy) { *out = make([]CoreFractionValue, len(*in)) copy(*out, *in) } + if in.DefaultCoreFraction != nil { + in, out := &in.DefaultCoreFraction, &out.DefaultCoreFraction + *out = new(CoreFractionValue) + **out = **in + } if in.DedicatedCores != nil { in, out := &in.DedicatedCores, &out.DedicatedCores *out = make([]bool, len(*in)) diff --git a/api/core/v1alpha3/zz_generated.deepcopy.go b/api/core/v1alpha3/zz_generated.deepcopy.go index 668a5a7b32..cceddbbd05 100644 --- a/api/core/v1alpha3/zz_generated.deepcopy.go +++ b/api/core/v1alpha3/zz_generated.deepcopy.go @@ -165,6 +165,11 @@ func (in *SizingPolicy) DeepCopyInto(out *SizingPolicy) { *out = make([]CoreFractionValue, len(*in)) copy(*out, *in) } + if in.DefaultCoreFraction != nil { + in, out := &in.DefaultCoreFraction, &out.DefaultCoreFraction + *out = new(CoreFractionValue) + **out = **in + } if in.DedicatedCores != nil { in, out := &in.DedicatedCores, &out.DedicatedCores *out = make([]bool, len(*in)) diff --git a/images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go b/images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go index 49c9e19501..0e08b8ca39 100644 --- a/images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go +++ b/images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go @@ -318,6 +318,13 @@ func schema_virtualization_api_core_v1alpha3_SizingPolicy(ref common.ReferenceCa }, }, }, + "defaultCoreFraction": { + SchemaProps: spec.SchemaProps{ + Description: "Default core fraction value for the VirtualMachineClass.", + Type: []string{"string"}, + Format: "", + }, + }, "dedicatedCores": { SchemaProps: spec.SchemaProps{ Description: "Allowed values of the `dedicatedCores` parameter.", From 364306ee75c5c8dfbbd3dc81944d9b0f6cb3ec1c Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Mon, 8 Dec 2025 12:19:58 +0300 Subject: [PATCH 04/10] fix doc Signed-off-by: Valeriy Khorunzhin --- crds/doc-ru-virtualmachines.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crds/doc-ru-virtualmachines.yaml b/crds/doc-ru-virtualmachines.yaml index ed1af13a0e..7618e00339 100644 --- a/crds/doc-ru-virtualmachines.yaml +++ b/crds/doc-ru-virtualmachines.yaml @@ -383,7 +383,7 @@ spec: properties: coreFraction: description: | - Гарантированная доля времени CPU, которая будет выделена ВМ. Указывается в процентах. Диапазон доступных значений задаётся параметром `sizePolicy` в используемом VirtualMachineClass; если он не указан, используйте значения в диапазоне 1–100%. + Гарантированная доля времени CPU, которая будет выделена ВМ. Указывается в процентах. Диапазон доступных значений задаётся параметром `sizePolicy` в используемом VirtualMachineClass; если он не указан, используйте значения в диапазоне 1–100%. Если значение не указано, используется значение по умолчанию, которое задаётся параметром `sizePolicy` в используемом VirtualMachineClass. cores: description: | Количество ядер. From e785adb402fa7c610fa9842bc830741268afa8b9 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Mon, 8 Dec 2025 16:40:45 +0300 Subject: [PATCH 05/10] resolve Signed-off-by: Valeriy Khorunzhin --- .../validators/default_core_fraction_validator.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go index c5a2c91779..fe7bb45587 100644 --- a/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go +++ b/images/virtualization-artifact/pkg/controller/vmclass/internal/validators/default_core_fraction_validator.go @@ -19,6 +19,7 @@ package validators import ( "context" "fmt" + "slices" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -49,7 +50,7 @@ func (v *DefaultCoreFractionValidator) validate(vmclass *v1alpha2.VirtualMachine continue } - if !containsCoreFraction(policy.CoreFractions, *policy.DefaultCoreFraction) { + if !slices.Contains(policy.CoreFractions, *policy.DefaultCoreFraction) { return fmt.Errorf("vmclass %s sizingPolicy[%d]: defaultCoreFraction %d is not in the allowed coreFractions list %v", vmclass.Name, i, *policy.DefaultCoreFraction, policy.CoreFractions) } @@ -57,12 +58,3 @@ func (v *DefaultCoreFractionValidator) validate(vmclass *v1alpha2.VirtualMachine return nil } - -func containsCoreFraction(fractions []v1alpha2.CoreFractionValue, value v1alpha2.CoreFractionValue) bool { - for _, f := range fractions { - if f == value { - return true - } - } - return false -} From 5dbde72c901579f07f4470940b4c173371ff6905 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Tue, 9 Dec 2025 11:28:35 +0300 Subject: [PATCH 06/10] Update crds/doc-ru-virtualmachineclasses.yaml Co-authored-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> Signed-off-by: Valeriy Khorunzhin --- crds/doc-ru-virtualmachineclasses.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crds/doc-ru-virtualmachineclasses.yaml b/crds/doc-ru-virtualmachineclasses.yaml index 9ff1a6fbb0..4676803064 100644 --- a/crds/doc-ru-virtualmachineclasses.yaml +++ b/crds/doc-ru-virtualmachineclasses.yaml @@ -136,8 +136,8 @@ spec: Допустимые значения параметра `coreFraction` в процентах (например, "5%", "10%", "25%", "50%", "100%"). defaultCoreFraction: description: | - Значение coreFraction по умолчанию для VirtualMachineClass. - Это значение будет использовано при создании ВМ без явно указанного coreFraction. + Значение `coreFraction` по умолчанию для VirtualMachineClass. + Используется при создании ВМ, если `coreFraction` не задан явно. cores: description: | Политика применяется для заданного диапазона числа ядер CPU. From c78a89a0dd475d77a3c3e3c99411f547e98af4c1 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Tue, 9 Dec 2025 11:28:44 +0300 Subject: [PATCH 07/10] Update crds/virtualmachineclasses.yaml Co-authored-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> Signed-off-by: Valeriy Khorunzhin --- crds/virtualmachineclasses.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crds/virtualmachineclasses.yaml b/crds/virtualmachineclasses.yaml index 58caf23455..6e9b8af5df 100644 --- a/crds/virtualmachineclasses.yaml +++ b/crds/virtualmachineclasses.yaml @@ -283,8 +283,8 @@ spec: type: array defaultCoreFraction: description: |- - Default core fraction value for the VirtualMachineClass. - This value will be used when creating a VM without an explicitly specified coreFraction. + Default `coreFraction` value for the VirtualMachineClass. + Used when creating a VM when `coreFraction` is not specified. maximum: 100 minimum: 1 type: integer From 88e1ebae136dc4e0a81e9191622646235e96aa06 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Tue, 9 Dec 2025 11:28:52 +0300 Subject: [PATCH 08/10] Update crds/virtualmachineclasses.yaml Co-authored-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> Signed-off-by: Valeriy Khorunzhin --- crds/virtualmachineclasses.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crds/virtualmachineclasses.yaml b/crds/virtualmachineclasses.yaml index 6e9b8af5df..91390c4a4e 100644 --- a/crds/virtualmachineclasses.yaml +++ b/crds/virtualmachineclasses.yaml @@ -783,7 +783,7 @@ spec: type: boolean type: array defaultCoreFraction: - description: Default core fraction value for the VirtualMachineClass. + description: Default `coreFraction` value for the VirtualMachineClass. type: string memory: description: Memory sizing policy. From 8aaa8e941ddca6869b4c77dbeb52b425514338c3 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Tue, 9 Dec 2025 11:29:02 +0300 Subject: [PATCH 09/10] Update crds/doc-ru-virtualmachines.yaml Co-authored-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> Signed-off-by: Valeriy Khorunzhin --- crds/doc-ru-virtualmachines.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crds/doc-ru-virtualmachines.yaml b/crds/doc-ru-virtualmachines.yaml index 7618e00339..1979a58ba6 100644 --- a/crds/doc-ru-virtualmachines.yaml +++ b/crds/doc-ru-virtualmachines.yaml @@ -383,7 +383,10 @@ spec: properties: coreFraction: description: | - Гарантированная доля времени CPU, которая будет выделена ВМ. Указывается в процентах. Диапазон доступных значений задаётся параметром `sizePolicy` в используемом VirtualMachineClass; если он не указан, используйте значения в диапазоне 1–100%. Если значение не указано, используется значение по умолчанию, которое задаётся параметром `sizePolicy` в используемом VirtualMachineClass. + Гарантированная доля времени CPU, выделяемая ВМ. Указывается в процентах. + Допустимый диапазон значений определяется параметром `sizePolicy` в используемом VirtualMachineClass. Если `sizePolicy` не задан, используйте значения в диапазоне `1–100%`. + Если значение параметра не указано, применяется значение по умолчанию из `sizePolicy` используемого VirtualMachineClass. + Если значение по умолчанию в классе не задано, применяется `100%`. cores: description: | Количество ядер. From a0a7e776d84cca3f5612fc14b7b9974de92b633d Mon Sep 17 00:00:00 2001 From: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:31:15 +0400 Subject: [PATCH 10/10] Review Signed-off-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com> --- crds/virtualmachines.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crds/virtualmachines.yaml b/crds/virtualmachines.yaml index 7d4093375a..51f85339cc 100644 --- a/crds/virtualmachines.yaml +++ b/crds/virtualmachines.yaml @@ -889,7 +889,10 @@ spec: coreFraction: type: string description: | - Guaranteed share of CPU time that will be allocated to the VM. Specified as a percentage. The range of available values is set in the `sizePolicy` parameter of the VirtualMachineClass. If not specified, the default value from the VirtualMachineClass sizing policy will be used. If no default is set in the class, "100%" will be applied. + Guaranteed share of CPU time allocated to the VM. Specified as a percentage. + The allowed range is defined by `sizePolicy` in the selected VirtualMachineClass. If `sizePolicy` is not set, use values in the `1–100%` range. + If the parameter is not specified, the default value from the class `sizePolicy` is used. + If no default is set in the class, `100%` is applied. memory: type: object