diff --git a/pkg/network/infraconfigurators/BUILD.bazel b/pkg/network/infraconfigurators/BUILD.bazel index 55fcc408a276..bf86feb5d5c6 100644 --- a/pkg/network/infraconfigurators/BUILD.bazel +++ b/pkg/network/infraconfigurators/BUILD.bazel @@ -6,7 +6,6 @@ go_library( "bridge.go", "common.go", "generated_mock_common.go", - "macvtap.go", "masquerade.go", ], importpath = "kubevirt.io/kubevirt/pkg/network/infraconfigurators", diff --git a/pkg/network/infraconfigurators/macvtap.go b/pkg/network/infraconfigurators/macvtap.go deleted file mode 100644 index b9a95a398490..000000000000 --- a/pkg/network/infraconfigurators/macvtap.go +++ /dev/null @@ -1,70 +0,0 @@ -package infraconfigurators - -import ( - "net" - "strconv" - - "github.com/vishvananda/netlink" - - v1 "kubevirt.io/client-go/api/v1" - "kubevirt.io/client-go/log" - "kubevirt.io/kubevirt/pkg/network/cache" - netdriver "kubevirt.io/kubevirt/pkg/network/driver" - virtnetlink "kubevirt.io/kubevirt/pkg/network/link" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" -) - -type MacvtapPodNetworkConfigurator struct { - podInterfaceName string - podNicLink netlink.Link - vmiSpecIface *v1.Interface - vmMac *net.HardwareAddr - launcherPID int - handler netdriver.NetworkHandler -} - -func NewMacvtapPodNetworkConfigurator(podIfaceName string, vmiSpecIface *v1.Interface, handler netdriver.NetworkHandler) *MacvtapPodNetworkConfigurator { - return &MacvtapPodNetworkConfigurator{ - podInterfaceName: podIfaceName, - vmiSpecIface: vmiSpecIface, - handler: handler, - } -} - -func (b *MacvtapPodNetworkConfigurator) DiscoverPodNetworkInterface(podIfaceName string) error { - link, err := b.handler.LinkByName(b.podInterfaceName) - if err != nil { - log.Log.Reason(err).Errorf("failed to get a link for interface: %s", podIfaceName) - return err - } - b.podNicLink = link - - b.vmMac, err = virtnetlink.RetrieveMacAddressFromVMISpecIface(b.vmiSpecIface) - if err != nil { - return err - } - if b.vmMac == nil { - b.vmMac = &b.podNicLink.Attrs().HardwareAddr - } - - return nil -} - -func (b *MacvtapPodNetworkConfigurator) PreparePodNetworkInterface() error { - return nil -} - -func (b *MacvtapPodNetworkConfigurator) GenerateDomainIfaceSpec() api.Interface { - return api.Interface{ - MAC: &api.MAC{MAC: b.vmMac.String()}, - MTU: &api.MTU{Size: strconv.Itoa(b.podNicLink.Attrs().MTU)}, - Target: &api.InterfaceTarget{ - Device: b.podNicLink.Attrs().Name, - Managed: "no", - }, - } -} - -func (b *MacvtapPodNetworkConfigurator) GenerateNonRecoverableDHCPConfig() *cache.DHCPConfig { - return nil -} diff --git a/pkg/virt-launcher/virtwrap/network/podinterface.go b/pkg/virt-launcher/virtwrap/network/podinterface.go index 43a223ad7718..2ee47be0beff 100644 --- a/pkg/virt-launcher/virtwrap/network/podinterface.go +++ b/pkg/virt-launcher/virtwrap/network/podinterface.go @@ -34,11 +34,12 @@ type LibvirtSpecGenerator interface { generate() error } -func newMacvtapLibvirtSpecGenerator(iface *v1.Interface, domain *api.Domain, cachedDomainInterface api.Interface) *MacvtapLibvirtSpecGenerator { +func newMacvtapLibvirtSpecGenerator(iface *v1.Interface, domain *api.Domain, podInterfaceName string, handler netdriver.NetworkHandler) *MacvtapLibvirtSpecGenerator { return &MacvtapLibvirtSpecGenerator{ - vmiSpecIface: iface, - domain: domain, - cachedDomainInterface: cachedDomainInterface, + vmiSpecIface: iface, + domain: domain, + podInterfaceName: podInterfaceName, + handler: handler, } } @@ -178,9 +179,10 @@ func (b *SlirpLibvirtSpecGenerator) generate() error { } type MacvtapLibvirtSpecGenerator struct { - vmiSpecIface *v1.Interface - domain *api.Domain - cachedDomainInterface api.Interface + vmiSpecIface *v1.Interface + domain *api.Domain + podInterfaceName string + handler netdriver.NetworkHandler } func (b *MacvtapLibvirtSpecGenerator) generate() error { @@ -201,5 +203,25 @@ func (b *MacvtapLibvirtSpecGenerator) generate() error { } func (b *MacvtapLibvirtSpecGenerator) discoverDomainIfaceSpec() (*api.Interface, error) { - return &b.cachedDomainInterface, nil + podNicLink, err := b.handler.LinkByName(b.podInterfaceName) + if err != nil { + log.Log.Reason(err).Errorf("failed to get a link for interface: %s", b.podInterfaceName) + return nil, err + } + mac, err := virtnetlink.RetrieveMacAddressFromVMISpecIface(b.vmiSpecIface) + if err != nil { + return nil, err + } + if mac == nil { + mac = &podNicLink.Attrs().HardwareAddr + } + + return &api.Interface{ + MAC: &api.MAC{MAC: mac.String()}, + MTU: &api.MTU{Size: strconv.Itoa(podNicLink.Attrs().MTU)}, + Target: &api.InterfaceTarget{ + Device: b.podInterfaceName, + Managed: "no", + }, + }, nil } diff --git a/pkg/virt-launcher/virtwrap/network/podinterface_test.go b/pkg/virt-launcher/virtwrap/network/podinterface_test.go index 006a162dfb9b..5985a82dc6fa 100644 --- a/pkg/virt-launcher/virtwrap/network/podinterface_test.go +++ b/pkg/virt-launcher/virtwrap/network/podinterface_test.go @@ -655,17 +655,14 @@ var _ = Describe("Pod Network", func() { mockNetwork.EXPECT().LinkByName(podnic.podInterfaceName).Return(macvtapInterface, nil) }) - XIt("Should pass a non-privileged macvtap interface to qemu", func() { - // TODO the test fails in this commit since the domainCache is not stored anywhere, the next commit is removing the domain cache usgae so it will fix the test + It("Should pass a non-privileged macvtap interface to qemu", func() { domain := NewDomainWithMacvtapInterface("default") api.NewDefaulter(runtime.GOARCH).SetObjectDefaults_Domain(domain) - driver, err := podnic.newLibvirtSpecGenerator(domain) + specGenerator, err := podnic.newLibvirtSpecGenerator(domain) Expect(err).ToNot(HaveOccurred(), "should have identified the correct binding mechanism") - Expect(podnic.infraConfigurator.DiscoverPodNetworkInterface(podnic.podInterfaceName)).To(Succeed()) - Expect(podnic.infraConfigurator.PreparePodNetworkInterface()).To(Succeed()) - Expect(driver.generate()).To(Succeed()) + Expect(specGenerator.generate()).To(Succeed()) Expect(len(domain.Spec.Devices.Interfaces)).To(Equal(1), "should have a single interface") Expect(domain.Spec.Devices.Interfaces[0].Target).To(Equal(&api.InterfaceTarget{Device: podnic.podInterfaceName, Managed: "no"}), "should have an unmanaged interface") diff --git a/pkg/virt-launcher/virtwrap/network/podnic.go b/pkg/virt-launcher/virtwrap/network/podnic.go index 83a7e13665e6..0e0700446bd6 100644 --- a/pkg/virt-launcher/virtwrap/network/podnic.go +++ b/pkg/virt-launcher/virtwrap/network/podnic.go @@ -71,11 +71,6 @@ func newPhase1PodNIC(vmi *v1.VirtualMachineInstance, network *v1.Network, handle podnic.vmiSpecNetwork, *podnic.launcherPID, podnic.handler) - } else if podnic.vmiSpecIface.Macvtap != nil { - podnic.infraConfigurator = infraconfigurators.NewMacvtapPodNetworkConfigurator( - podnic.podInterfaceName, - podnic.vmiSpecIface, - podnic.handler) } return podnic, nil } @@ -287,11 +282,7 @@ func (l *podNIC) newLibvirtSpecGenerator(domain *api.Domain) (LibvirtSpecGenerat return newSlirpLibvirtSpecGenerator(l.vmiSpecIface, domain), nil } if l.vmiSpecIface.Macvtap != nil { - cachedDomainIface, err := l.cachedDomainInterface() - if err != nil { - return nil, err - } - return newMacvtapLibvirtSpecGenerator(l.vmiSpecIface, domain, *cachedDomainIface), nil + return newMacvtapLibvirtSpecGenerator(l.vmiSpecIface, domain, l.podInterfaceName, l.handler), nil } return nil, fmt.Errorf("Not implemented") }