Skip to content

Commit 35d1288

Browse files
eofffprismagod
andauthored
feat(vmclass): add defaultCoreFraction field (#1783)
Signed-off-by: Valeriy Khorunzhin <valeriy.khorunzhin@flant.com> Co-authored-by: Vladislav Panfilov <97229646+prismagod@users.noreply.github.com>
1 parent 15c4b5c commit 35d1288

File tree

15 files changed

+220
-6
lines changed

15 files changed

+220
-6
lines changed

api/core/v1alpha2/virtual_machine.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,9 @@ type CPUSpec struct {
165165
Cores int `json:"cores"`
166166

167167
// Guaranteed share of CPU that will be allocated to the VM. Specified as a percentage.
168-
// +kubebuilder:default:="100%"
169-
// +kubebuilder:validation:Enum:={"5%", "10%", "25%", "50%", "100%"}
168+
// The range of available values is defined in the VirtualMachineClass sizing policy.
169+
// If not specified, the default value from the VirtualMachineClass will be used.
170+
// +kubebuilder:validation:Pattern=`^(100|[1-9][0-9]?|[1-9])%$`
170171
CoreFraction string `json:"coreFraction,omitempty"`
171172
}
172173

api/core/v1alpha2/virtual_machine_class.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ type SizingPolicy struct {
119119
Memory *SizingPolicyMemory `json:"memory,omitempty"`
120120
// Allowed values of the `coreFraction` parameter.
121121
CoreFractions []CoreFractionValue `json:"coreFractions,omitempty"`
122+
// Default core fraction value for the VirtualMachineClass.
123+
// This value will be used when creating a VM without an explicitly specified coreFraction.
124+
DefaultCoreFraction *CoreFractionValue `json:"defaultCoreFraction,omitempty"`
122125
// Allowed values of the `dedicatedCores` parameter.
123126
DedicatedCores []bool `json:"dedicatedCores,omitempty"`
124127
// The policy applies for a specified range of the number of CPU cores.

api/core/v1alpha2/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/core/v1alpha3/virtual_machine_class.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ type SizingPolicy struct {
117117
Memory *SizingPolicyMemory `json:"memory,omitempty"`
118118
// Allowed values of the `coreFraction` parameter in percentages (e.g., "5%", "10%", "25%", "50%", "100%").
119119
CoreFractions []CoreFractionValue `json:"coreFractions,omitempty"`
120+
// Default core fraction value for the VirtualMachineClass.
121+
DefaultCoreFraction *CoreFractionValue `json:"defaultCoreFraction,omitempty"`
120122
// Allowed values of the `dedicatedCores` parameter.
121123
DedicatedCores []bool `json:"dedicatedCores,omitempty"`
122124
// The policy applies for a specified range of the number of CPU cores.

api/core/v1alpha3/virtual_machine_class_conversion.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,20 @@ func convertSpecV3ToV2(v3Spec VirtualMachineClassSpec) (v1alpha2.VirtualMachineC
124124
}
125125
}
126126

127+
if v3Policy.DefaultCoreFraction != nil {
128+
fractionStr := string(*v3Policy.DefaultCoreFraction)
129+
if !regexp.MustCompile(`^([1-9]|[1-9][0-9]|100)%$`).MatchString(fractionStr) {
130+
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)
131+
}
132+
fractionStr = fractionStr[:len(fractionStr)-1]
133+
fractionInt, err := strconv.Atoi(fractionStr)
134+
if err != nil {
135+
return v1alpha2.VirtualMachineClassSpec{}, fmt.Errorf("failed to parse default core fraction: %w", err)
136+
}
137+
v2Fraction := v1alpha2.CoreFractionValue(fractionInt)
138+
v2Policy.DefaultCoreFraction = &v2Fraction
139+
}
140+
127141
v2Spec.SizingPolicies[i] = v2Policy
128142
}
129143
}
@@ -191,6 +205,11 @@ func convertSpecV2ToV3(v2Spec v1alpha2.VirtualMachineClassSpec) VirtualMachineCl
191205
}
192206
}
193207

208+
if v2Policy.DefaultCoreFraction != nil {
209+
v3Fraction := CoreFractionValue(fmt.Sprintf("%d%%", *v2Policy.DefaultCoreFraction))
210+
v3Policy.DefaultCoreFraction = &v3Fraction
211+
}
212+
194213
v3Spec.SizingPolicies[i] = v3Policy
195214
}
196215
}

api/core/v1alpha3/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crds/doc-ru-virtualmachineclasses.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ spec:
134134
coreFractions:
135135
description: |
136136
Допустимые значения параметра `coreFraction` в процентах (например, "5%", "10%", "25%", "50%", "100%").
137+
defaultCoreFraction:
138+
description: |
139+
Значение `coreFraction` по умолчанию для VirtualMachineClass.
140+
Используется при создании ВМ, если `coreFraction` не задан явно.
137141
cores:
138142
description: |
139143
Политика применяется для заданного диапазона числа ядер CPU.

crds/doc-ru-virtualmachines.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,10 @@ spec:
383383
properties:
384384
coreFraction:
385385
description: |
386-
Гарантированная доля времени CPU, которая будет выделена ВМ. Указывается в процентах. Диапазон доступных значений задаётся параметром `sizePolicy` в используемом VirtualMachineClass; если он не указан, используйте значения в диапазоне 1–100%.
386+
Гарантированная доля времени CPU, выделяемая ВМ. Указывается в процентах.
387+
Допустимый диапазон значений определяется параметром `sizePolicy` в используемом VirtualMachineClass. Если `sizePolicy` не задан, используйте значения в диапазоне `1–100%`.
388+
Если значение параметра не указано, применяется значение по умолчанию из `sizePolicy` используемого VirtualMachineClass.
389+
Если значение по умолчанию в классе не задано, применяется `100%`.
387390
cores:
388391
description: |
389392
Количество ядер.

crds/virtualmachineclasses.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,13 @@ spec:
281281
items:
282282
type: boolean
283283
type: array
284+
defaultCoreFraction:
285+
description: |-
286+
Default `coreFraction` value for the VirtualMachineClass.
287+
Used when creating a VM when `coreFraction` is not specified.
288+
maximum: 100
289+
minimum: 1
290+
type: integer
284291
memory:
285292
description: Memory sizing policy.
286293
properties:
@@ -775,6 +782,9 @@ spec:
775782
items:
776783
type: boolean
777784
type: array
785+
defaultCoreFraction:
786+
description: Default `coreFraction` value for the VirtualMachineClass.
787+
type: string
778788
memory:
779789
description: Memory sizing policy.
780790
properties:

crds/virtualmachines.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ spec:
3838
properties:
3939
spec:
4040
x-kubernetes-validations:
41-
- rule: "self.cpu.coreFraction.endsWith('%') && int(self.cpu.coreFraction.replace('%', '')) >= 1 && int(self.cpu.coreFraction.replace('%', '')) <= 100"
41+
- rule: "!has(self.cpu.coreFraction) || (self.cpu.coreFraction.endsWith('%') && int(self.cpu.coreFraction.replace('%', '')) >= 1 && int(self.cpu.coreFraction.replace('%', '')) <= 100)"
4242
message: "Core fraction must be between 1% and 100%."
4343
type: object
4444
required:
@@ -888,9 +888,11 @@ spec:
888888
description: Number of cores.
889889
coreFraction:
890890
type: string
891-
default: "100%"
892891
description: |
893-
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.
892+
Guaranteed share of CPU time allocated to the VM. Specified as a percentage.
893+
The allowed range is defined by `sizePolicy` in the selected VirtualMachineClass. If `sizePolicy` is not set, use values in the `1–100%` range.
894+
If the parameter is not specified, the default value from the class `sizePolicy` is used.
895+
If no default is set in the class, `100%` is applied.
894896
895897
memory:
896898
type: object

0 commit comments

Comments
 (0)