Skip to content

Commit 952a0e5

Browse files
Isteb4kdna787
authored andcommitted
test(vm): set additional network interfaces
Signed-off-by: Isteb4k <dmitry.rakitin@flant.com>
1 parent 9413575 commit 952a0e5

4 files changed

Lines changed: 114 additions & 2 deletions

File tree

images/virtualization-artifact/pkg/common/annotations/annotations.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ const (
7373
// AnnVmStartRequested is an annotation on KVVM that represents a request to start a virtual machine.
7474
AnnVmStartRequested = AnnAPIGroupV + "/vm-start-requested"
7575

76+
// AnnAdditionalNetworkInterfaces example: "name1:multus,name2:macvtap"
77+
AnnAdditionalNetworkInterfaces = AnnAPIGroup + "/additional-network-interfaces"
78+
7679
// AnnVmRestartRequested is an annotation on KVVM that represents a request to restart a virtual machine.
7780
AnnVmRestartRequested = AnnAPIGroupV + "/vm-restart-requested"
7881

images/virtualization-artifact/pkg/controller/kvbuilder/kvvm.go

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package kvbuilder
1919
import (
2020
"fmt"
2121
"maps"
22+
"strings"
2223

2324
corev1 "k8s.io/api/core/v1"
2425
"k8s.io/apimachinery/pkg/api/resource"
@@ -517,7 +518,12 @@ func (b *KVVM) GetOSSettings() map[string]interface{} {
517518
}
518519
}
519520

520-
func (b *KVVM) SetNetworkInterface(name string) {
521+
func (b *KVVM) SetNetworkInterface(vm *virtv2.VirtualMachine, name string) {
522+
hasMacvtap := strings.Contains(vm.GetAnnotations()[annotations.AnnAdditionalNetworkInterfaces], "macvtap")
523+
if hasMacvtap {
524+
return
525+
}
526+
521527
devPreset := DeviceOptionsPresets.Find(b.opts.EnableParavirtualization)
522528

523529
net := virtv1.Network{
@@ -546,6 +552,98 @@ func (b *KVVM) SetNetworkInterface(name string) {
546552
)
547553
}
548554

555+
func (b *KVVM) SetMacvtapInterfaces(vm *virtv2.VirtualMachine) {
556+
anis := vm.GetAnnotations()[annotations.AnnAdditionalNetworkInterfaces]
557+
if anis == "" {
558+
return
559+
}
560+
561+
var networks []string
562+
563+
for _, network := range strings.Split(anis, ",") {
564+
iname := strings.Split(network, ":")
565+
if iname[1] == "macvtap" {
566+
networks = append(networks, iname[0])
567+
}
568+
}
569+
570+
for _, network := range networks {
571+
net := virtv1.Network{
572+
Name: network,
573+
NetworkSource: virtv1.NetworkSource{
574+
Pod: &virtv1.PodNetwork{},
575+
},
576+
}
577+
b.Resource.Spec.Template.Spec.Networks = array.SetArrayElem(
578+
b.Resource.Spec.Template.Spec.Networks, net,
579+
func(v1, v2 virtv1.Network) bool {
580+
return v1.Name == v2.Name
581+
}, true,
582+
)
583+
584+
iface := virtv1.Interface{
585+
Name: network,
586+
Binding: &virtv1.PluginBinding{
587+
Name: "macvtap",
588+
},
589+
}
590+
591+
b.Resource.Spec.Template.Spec.Domain.Devices.Interfaces = array.SetArrayElem(
592+
b.Resource.Spec.Template.Spec.Domain.Devices.Interfaces, iface,
593+
func(v1, v2 virtv1.Interface) bool {
594+
return v1.Name == v2.Name
595+
}, true,
596+
)
597+
}
598+
}
599+
600+
func (b *KVVM) SetMultusInterfaces(vm *virtv2.VirtualMachine) {
601+
anis := vm.GetAnnotations()[annotations.AnnAdditionalNetworkInterfaces]
602+
if anis == "" {
603+
return
604+
}
605+
606+
var networks []string
607+
608+
for _, network := range strings.Split(anis, ",") {
609+
iname := strings.Split(network, ":")
610+
if iname[1] == "multus" {
611+
networks = append(networks, iname[0])
612+
}
613+
}
614+
615+
for _, network := range networks {
616+
net := virtv1.Network{
617+
Name: network,
618+
NetworkSource: virtv1.NetworkSource{
619+
Multus: &virtv1.MultusNetwork{
620+
NetworkName: network,
621+
},
622+
},
623+
}
624+
b.Resource.Spec.Template.Spec.Networks = array.SetArrayElem(
625+
b.Resource.Spec.Template.Spec.Networks, net,
626+
func(v1, v2 virtv1.Network) bool {
627+
return v1.Name == v2.Name
628+
}, true,
629+
)
630+
631+
iface := virtv1.Interface{
632+
Name: network,
633+
InterfaceBindingMethod: virtv1.InterfaceBindingMethod{
634+
Bridge: &virtv1.InterfaceBridge{},
635+
},
636+
}
637+
638+
b.Resource.Spec.Template.Spec.Domain.Devices.Interfaces = array.SetArrayElem(
639+
b.Resource.Spec.Template.Spec.Domain.Devices.Interfaces, iface,
640+
func(v1, v2 virtv1.Interface) bool {
641+
return v1.Name == v2.Name
642+
}, true,
643+
)
644+
}
645+
}
646+
549647
func (b *KVVM) SetBootloader(bootloader virtv2.BootloaderType) error {
550648
if b.Resource.Spec.Template.Spec.Domain.Firmware == nil {
551649
b.Resource.Spec.Template.Spec.Domain.Firmware = &virtv1.Firmware{}

images/virtualization-artifact/pkg/controller/kvbuilder/kvvm_utils.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,13 @@ func ApplyVirtualMachineSpec(
104104
}
105105

106106
kvvm.SetMetadata(vm.ObjectMeta)
107-
kvvm.SetNetworkInterface(NetworkInterfaceName)
107+
108+
kvvm.Resource.Spec.Template.Spec.Networks = []virtv1.Network{}
109+
kvvm.Resource.Spec.Template.Spec.Domain.Devices.Interfaces = []virtv1.Interface{}
110+
kvvm.SetNetworkInterface(vm, NetworkInterfaceName)
111+
kvvm.SetMultusInterfaces(vm)
112+
kvvm.SetMacvtapInterfaces(vm)
113+
108114
kvvm.SetTablet("default-0")
109115
kvvm.SetNodeSelector(vm.Spec.NodeSelector, class.Spec.NodeSelector.MatchLabels)
110116
kvvm.SetTolerations(vm.Spec.Tolerations, class.Spec.Tolerations)

images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"sigs.k8s.io/controller-runtime/pkg/client"
3030
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3131

32+
"github.com/deckhouse/virtualization-controller/pkg/common/annotations"
3233
"github.com/deckhouse/virtualization-controller/pkg/common/object"
3334
vmutil "github.com/deckhouse/virtualization-controller/pkg/common/vm"
3435
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
@@ -535,6 +536,10 @@ func (h *SyncKvvmHandler) applyVMChangesToKVVM(ctx context.Context, s state.Virt
535536
return err
536537
}
537538

539+
if s.VirtualMachine().Current().GetAnnotations()[annotations.AnnAdditionalNetworkInterfaces] != "" {
540+
action = vmchange.ActionRestart
541+
}
542+
538543
switch action {
539544
case vmchange.ActionRestart:
540545
h.recorder.WithLogging(log).Event(current, corev1.EventTypeNormal, virtv2.ReasonVMChangesApplied, "Apply disruptive changes with restart")

0 commit comments

Comments
 (0)