Skip to content

Commit ff29e41

Browse files
committed
chore(vm): increase performance
Signed-off-by: Isteb4k <dmitry.rakitin@flant.com>
1 parent c25e4c7 commit ff29e41

40 files changed

Lines changed: 697 additions & 84 deletions

images/virtualization-artifact/cmd/virtualization-controller/main.go

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ import (
4646
"github.com/deckhouse/virtualization-controller/pkg/controller/livemigration"
4747
mc "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig"
4848
mcapi "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig/api"
49+
"github.com/deckhouse/virtualization-controller/pkg/controller/supervm"
4950
"github.com/deckhouse/virtualization-controller/pkg/controller/vd"
5051
"github.com/deckhouse/virtualization-controller/pkg/controller/vdsnapshot"
5152
"github.com/deckhouse/virtualization-controller/pkg/controller/vi"
52-
"github.com/deckhouse/virtualization-controller/pkg/controller/vm"
5353
"github.com/deckhouse/virtualization-controller/pkg/controller/vmbda"
5454
"github.com/deckhouse/virtualization-controller/pkg/controller/vmclass"
5555
"github.com/deckhouse/virtualization-controller/pkg/controller/vmip"
@@ -313,77 +313,79 @@ func main() {
313313
os.Exit(1)
314314
}
315315

316-
cviLogger := logger.NewControllerLogger(cvi.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
316+
logFactory := logger.NewFactory(logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
317+
318+
cviLogger := logFactory(cvi.ControllerName)
317319
if _, err = cvi.NewController(ctx, mgr, cviLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.Requirements, dvcrSettings, controllerNamespace); err != nil {
318320
log.Error(err.Error())
319321
os.Exit(1)
320322
}
321323

322-
vdLogger := logger.NewControllerLogger(vd.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
324+
vdLogger := logFactory(vd.ControllerName)
323325
if _, err = vd.NewController(ctx, mgr, vdLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.Requirements, dvcrSettings, vdStorageClassSettings); err != nil {
324326
log.Error(err.Error())
325327
os.Exit(1)
326328
}
327329

328-
viLogger := logger.NewControllerLogger(vi.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
330+
viLogger := logFactory(vi.ControllerName)
329331
if _, err = vi.NewController(ctx, mgr, viLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.BounderImage, importSettings.Requirements, dvcrSettings, viStorageClassSettings); err != nil {
330332
log.Error(err.Error())
331333
os.Exit(1)
332334
}
333335

334-
vmLogger := logger.NewControllerLogger(vm.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
335-
if err = vm.SetupController(ctx, mgr, vmLogger, dvcrSettings, firmwareImage); err != nil {
336+
supervmLogger := logFactory(supervm.ControllerName)
337+
if err = supervm.SetupController(ctx, mgr, dvcrSettings, firmwareImage, logFactory, supervmLogger); err != nil {
336338
log.Error(err.Error())
337339
os.Exit(1)
338340
}
339-
if err = vm.SetupGC(mgr, vmLogger, gcSettings.VMIMigration); err != nil {
341+
if err = supervm.SetupGC(mgr, supervmLogger, gcSettings.VMIMigration); err != nil {
340342
log.Error(err.Error())
341343
os.Exit(1)
342344
}
343345

344-
vmbdaLogger := logger.NewControllerLogger(vmbda.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
346+
vmbdaLogger := logFactory(vmbda.ControllerName)
345347
if _, err = vmbda.NewController(ctx, mgr, virtClient, vmbdaLogger, controllerNamespace); err != nil {
346348
log.Error(err.Error())
347349
os.Exit(1)
348350
}
349351

350-
vmipLogger := logger.NewControllerLogger(vmip.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
352+
vmipLogger := logFactory(vmip.ControllerName)
351353
if _, err = vmip.NewController(ctx, mgr, virtClient, vmipLogger, virtualMachineCIDRs); err != nil {
352354
log.Error(err.Error())
353355
os.Exit(1)
354356
}
355357

356-
vmipleaseLogger := logger.NewControllerLogger(vmiplease.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
358+
vmipleaseLogger := logFactory(vmiplease.ControllerName)
357359
if _, err = vmiplease.NewController(ctx, mgr, vmipleaseLogger, virtualMachineIPLeasesRetentionDuration); err != nil {
358360
log.Error(err.Error())
359361
os.Exit(1)
360362
}
361363

362-
vmclassLogger := logger.NewControllerLogger(vmclass.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
364+
vmclassLogger := logFactory(vmclass.ControllerName)
363365
if _, err = vmclass.NewController(ctx, mgr, controllerNamespace, vmclassLogger); err != nil {
364366
log.Error(err.Error())
365367
os.Exit(1)
366368
}
367369

368-
vdsnapshotLogger := logger.NewControllerLogger(vdsnapshot.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
370+
vdsnapshotLogger := logFactory(vdsnapshot.ControllerName)
369371
if _, err = vdsnapshot.NewController(ctx, mgr, vdsnapshotLogger, virtClient); err != nil {
370372
log.Error(err.Error())
371373
os.Exit(1)
372374
}
373375

374-
vmsnapshotLogger := logger.NewControllerLogger(vmsnapshot.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
376+
vmsnapshotLogger := logFactory(vmsnapshot.ControllerName)
375377
if err = vmsnapshot.NewController(ctx, mgr, vmsnapshotLogger, virtClient); err != nil {
376378
log.Error(err.Error())
377379
os.Exit(1)
378380
}
379381

380-
vmrestoreLogger := logger.NewControllerLogger(vmrestore.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
382+
vmrestoreLogger := logFactory(vmrestore.ControllerName)
381383
if err = vmrestore.NewController(ctx, mgr, vmrestoreLogger); err != nil {
382384
log.Error(err.Error())
383385
os.Exit(1)
384386
}
385387

386-
vmopLogger := logger.NewControllerLogger(vmop.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
388+
vmopLogger := logFactory(vmop.ControllerName)
387389
if err = vmop.SetupController(ctx, mgr, vmopLogger); err != nil {
388390
log.Error(err.Error())
389391
os.Exit(1)
@@ -393,7 +395,7 @@ func main() {
393395
os.Exit(1)
394396
}
395397

396-
liveMigrationLogger := logger.NewControllerLogger(livemigration.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
398+
liveMigrationLogger := logFactory(livemigration.ControllerName)
397399
if err = livemigration.SetupController(ctx, mgr, liveMigrationLogger); err != nil {
398400
log.Error(err.Error())
399401
os.Exit(1)
@@ -404,31 +406,31 @@ func main() {
404406
os.Exit(1)
405407
}
406408

407-
workloadUpdaterLogger := logger.NewControllerLogger(workloadupdater.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
409+
workloadUpdaterLogger := logFactory(workloadupdater.ControllerName)
408410
if err = workloadupdater.SetupController(ctx, mgr, workloadUpdaterLogger, firmwareImage, controllerNamespace, virtControllerName); err != nil {
409411
log.Error(err.Error())
410412
os.Exit(1)
411413
}
412414

413-
evacuationLogger := logger.NewControllerLogger(evacuation.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
415+
evacuationLogger := logFactory(evacuation.ControllerName)
414416
if err = evacuation.SetupController(ctx, mgr, virtClient, evacuationLogger); err != nil {
415417
log.Error(err.Error())
416418
os.Exit(1)
417419
}
418420

419-
volumeMigrationLogger := logger.NewControllerLogger(volumemigration.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
421+
volumeMigrationLogger := logFactory(volumemigration.ControllerName)
420422
if err = volumemigration.SetupController(ctx, mgr, volumeMigrationLogger); err != nil {
421423
log.Error(err.Error())
422424
os.Exit(1)
423425
}
424426

425-
vmmacLogger := logger.NewControllerLogger(vmmac.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
427+
vmmacLogger := logFactory(vmmac.ControllerName)
426428
if _, err = vmmac.NewController(ctx, mgr, vmmacLogger, clusterUUID, virtClient); err != nil {
427429
log.Error(err.Error())
428430
os.Exit(1)
429431
}
430432

431-
vmmacleaseLogger := logger.NewControllerLogger(vmmaclease.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList)
433+
vmmacleaseLogger := logFactory(vmmaclease.ControllerName)
432434
if _, err = vmmaclease.NewController(ctx, mgr, vmmacleaseLogger); err != nil {
433435
log.Error(err.Error())
434436
os.Exit(1)

images/virtualization-artifact/pkg/controller/vm/gc.go renamed to images/virtualization-artifact/pkg/controller/supervm/gc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package vm
17+
package supervm
1818

1919
import (
2020
"context"
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
Copyright 2025 Flant JSC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package defaulter_test
18+
19+
import (
20+
"testing"
21+
22+
. "github.com/onsi/ginkgo/v2"
23+
. "github.com/onsi/gomega"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
"sigs.k8s.io/controller-runtime/pkg/client"
26+
27+
"github.com/deckhouse/virtualization-controller/pkg/common/annotations"
28+
"github.com/deckhouse/virtualization-controller/pkg/common/testutil"
29+
"github.com/deckhouse/virtualization-controller/pkg/controller/service"
30+
"github.com/deckhouse/virtualization-controller/pkg/controller/supervm/internal/defaulter"
31+
"github.com/deckhouse/virtualization/api/core/v1alpha2"
32+
)
33+
34+
func TestDefaulters(t *testing.T) {
35+
RegisterFailHandler(Fail)
36+
RunSpecs(t, "VM Defaulters Suite")
37+
}
38+
39+
var _ = Describe("Set default class in virtualMachineClasName", func() {
40+
var (
41+
ctx = testutil.ContextBackgroundWithNoOpLogger()
42+
classDefaulter *defaulter.VirtualMachineClassNameDefaulter
43+
)
44+
45+
setup := func(objs ...client.Object) {
46+
GinkgoHelper()
47+
fakeClient, err := testutil.NewFakeClientWithObjects(objs...)
48+
Expect(err).Should(BeNil())
49+
vmClassService := service.NewVirtualMachineClassService(fakeClient)
50+
classDefaulter = defaulter.NewVirtualMachineClassNameDefaulter(fakeClient, vmClassService)
51+
}
52+
53+
newVMClass := func(name string) *v1alpha2.VirtualMachineClass {
54+
return &v1alpha2.VirtualMachineClass{
55+
TypeMeta: metav1.TypeMeta{
56+
Kind: v1alpha2.VirtualMachineClassKind,
57+
APIVersion: v1alpha2.SchemeGroupVersion.String(),
58+
},
59+
ObjectMeta: metav1.ObjectMeta{
60+
Name: name,
61+
},
62+
Spec: v1alpha2.VirtualMachineClassSpec{},
63+
Status: v1alpha2.VirtualMachineClassStatus{},
64+
}
65+
}
66+
67+
newDefaultVMClass := func(name string) *v1alpha2.VirtualMachineClass {
68+
vmClass := newVMClass(name)
69+
vmClass.Annotations = map[string]string{
70+
annotations.AnnVirtualMachineClassDefault: "true",
71+
}
72+
return vmClass
73+
}
74+
75+
newVMWithEmptyClass := func(name string) *v1alpha2.VirtualMachine {
76+
return &v1alpha2.VirtualMachine{
77+
TypeMeta: metav1.TypeMeta{
78+
Kind: v1alpha2.VirtualMachineKind,
79+
APIVersion: v1alpha2.SchemeGroupVersion.String(),
80+
},
81+
ObjectMeta: metav1.ObjectMeta{
82+
Name: name,
83+
},
84+
Spec: v1alpha2.VirtualMachineSpec{},
85+
Status: v1alpha2.VirtualMachineStatus{},
86+
}
87+
}
88+
89+
newVM := func(name, className string) *v1alpha2.VirtualMachine {
90+
vm := newVMWithEmptyClass(name)
91+
vm.Spec.VirtualMachineClassName = className
92+
return vm
93+
}
94+
95+
AfterEach(func() {
96+
classDefaulter = nil
97+
})
98+
99+
Context("creating VM with empty virtualMachineClassName", func() {
100+
It("should keep virtualMachineClassName empty if no default class", func() {
101+
// Initialize fake client with some classes.
102+
name := "single-custom-class"
103+
setup(
104+
newVMClass("generic"),
105+
newVMClass(name),
106+
)
107+
108+
vm := newVMWithEmptyClass("vm-with-empty-class")
109+
err := classDefaulter.Default(ctx, vm)
110+
Expect(err).Should(BeNil())
111+
Expect(vm.Spec.VirtualMachineClassName).Should(BeEmpty())
112+
})
113+
114+
It("should set virtualMachineClassName if default class is present", func() {
115+
// Initialize fake client with existing non default class.
116+
className := "single-default-class"
117+
setup(
118+
newVMClass("generic"),
119+
newDefaultVMClass(className),
120+
)
121+
122+
vm := newVMWithEmptyClass("vm-with-empty-class")
123+
err := classDefaulter.Default(ctx, vm)
124+
Expect(err).Should(BeNil())
125+
Expect(vm.Spec.VirtualMachineClassName).Should(Equal(className))
126+
})
127+
})
128+
129+
Context("creating VM with virtualMachineClassName", func() {
130+
It("should not change virtualMachineClassName if no default class", func() {
131+
// Initialize fake client with some classes.
132+
name := "single-custom-class"
133+
setup(
134+
newVMClass("generic"),
135+
newVMClass(name),
136+
)
137+
138+
vm := newVM("vm-with-empty-class", "generic")
139+
err := classDefaulter.Default(ctx, vm)
140+
Expect(err).Should(BeNil())
141+
Expect(vm.Spec.VirtualMachineClassName).Should(Equal("generic"))
142+
})
143+
144+
It("should not change virtualMachineClassName if default class is present", func() {
145+
// Initialize fake client with existing non default class.
146+
className := "single-default-class"
147+
setup(
148+
newVMClass("generic"),
149+
newDefaultVMClass(className),
150+
)
151+
152+
vm := newVM("vm-with-empty-class", "generic")
153+
err := classDefaulter.Default(ctx, vm)
154+
Expect(err).Should(BeNil())
155+
Expect(vm.Spec.VirtualMachineClassName).Should(Equal("generic"))
156+
})
157+
})
158+
})
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
Copyright 2025 Flant JSC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package defaulter
18+
19+
import (
20+
"context"
21+
"fmt"
22+
23+
"sigs.k8s.io/controller-runtime/pkg/client"
24+
25+
"github.com/deckhouse/virtualization-controller/pkg/controller/service"
26+
"github.com/deckhouse/virtualization/api/core/v1alpha2"
27+
)
28+
29+
type VirtualMachineClassNameDefaulter struct {
30+
client client.Client
31+
vmClassService *service.VirtualMachineClassService
32+
}
33+
34+
func NewVirtualMachineClassNameDefaulter(client client.Client, vmClassService *service.VirtualMachineClassService) *VirtualMachineClassNameDefaulter {
35+
return &VirtualMachineClassNameDefaulter{
36+
client: client,
37+
vmClassService: vmClassService,
38+
}
39+
}
40+
41+
func (v *VirtualMachineClassNameDefaulter) Default(ctx context.Context, vm *v1alpha2.VirtualMachine) error {
42+
// Ignore if virtualMachineClassName is set.
43+
if vm.Spec.VirtualMachineClassName != "" {
44+
return nil
45+
}
46+
47+
// Detect and assign default class name.
48+
classes := &v1alpha2.VirtualMachineClassList{}
49+
err := v.client.List(ctx, classes)
50+
if err != nil {
51+
return fmt.Errorf("failed to list virtual machine classes: %w", err)
52+
}
53+
54+
defaultClass, err := v.vmClassService.GetDefault(classes)
55+
if err != nil {
56+
return err
57+
}
58+
59+
// "No default class" is not a mutating error, validators will complain
60+
// about missing field during validation phase later.
61+
if defaultClass == nil {
62+
return nil
63+
}
64+
65+
vm.Spec.VirtualMachineClassName = defaultClass.GetName()
66+
return nil
67+
}

0 commit comments

Comments
 (0)