Skip to content

Commit

Permalink
Clean up agent net util code (#6282)
Browse files Browse the repository at this point in the history
Signed-off-by: Jianjun Shen <[email protected]>
  • Loading branch information
jianjuns authored May 10, 2024
1 parent 4646348 commit 28b88b3
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 129 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
//go:build linux
// +build linux

// Copyright 2023 Antrea Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
//go:build linux
// +build linux

// Copyright 2023 Antrea Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down
46 changes: 46 additions & 0 deletions pkg/agent/secondarynetwork/init_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//go:build windows
// +build windows

// Copyright 2024 Antrea Authors
//
// 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 secondarynetwork

import (
"errors"

"github.com/TomCodeLV/OVSDB-golang-lib/pkg/ovsdb"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
componentbaseconfig "k8s.io/component-base/config"

agentconfig "antrea.io/antrea/pkg/config/agent"
"antrea.io/antrea/pkg/util/channel"
)

func Initialize(
clientConnectionConfig componentbaseconfig.ClientConnectionConfiguration,
kubeAPIServerOverride string,
k8sClient clientset.Interface,
podInformer cache.SharedIndexInformer,
nodeName string,
podUpdateSubscriber channel.Subscriber,
stopCh <-chan struct{},
secNetConfig *agentconfig.SecondaryNetworkConfig, ovsdb *ovsdb.OVSDB) error {
return errors.New("not supported on Windows")
}

func RestoreHostInterfaceConfiguration(secNetConfig *agentconfig.SecondaryNetworkConfig) {
// Not supported on Windows.
}
21 changes: 1 addition & 20 deletions pkg/agent/util/net.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,25 +263,6 @@ func GetIPNetDeviceByCIDRs(cidrsList []string) (v4IPNet, v6IPNet *net.IPNet, lin
return nil, nil, nil, fmt.Errorf("unable to find local IP and device")
}

func GetAllIPNetsByName(ifaceName string) ([]*net.IPNet, error) {
ips := []*net.IPNet{}
adapter, err := netInterfaceByName(ifaceName)
if err != nil {
return nil, err
}
addrs, _ := netInterfaceAddrs(adapter)
for _, addr := range addrs {
if ip, ipNet, err := net.ParseCIDR(addr.String()); err != nil {
klog.Warningf("Unable to parse addr %+v, err=%+v", addr, err)
} else if !ip.IsLinkLocalUnicast() {
ipNet.IP = ip
ips = append(ips, ipNet)
}
}
klog.InfoS("Found IPs on interface", "IPs", ips, "interface", ifaceName)
return ips, nil
}

func GetIPv4Addr(ips []net.IP) net.IP {
for _, ip := range ips {
if ip.To4() != nil {
Expand Down Expand Up @@ -434,7 +415,7 @@ func GenerateRandomMAC() net.HardwareAddr {
return buf
}

func GetIPNetsByLink(link *net.Interface) ([]*net.IPNet, error) {
func getIPNetsByLink(link *net.Interface) ([]*net.IPNet, error) {
addrList, err := netInterfaceAddrs(link)
if err != nil {
return nil, err
Expand Down
102 changes: 44 additions & 58 deletions pkg/agent/util/net_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import (
)

var (
// netlinkUtil is introduced for testing.
netlinkUtil utilnetlink.Interface = &netlink.Handle{}

// Declared variables which are meant to be overridden for testing.
Expand Down Expand Up @@ -265,7 +264,7 @@ func GetInterfaceConfig(ifName string) (*net.Interface, []*net.IPNet, []interfac
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to get interface by name %s: %v", ifName, err)
}
addrs, err := GetIPNetsByLink(iface)
addrs, err := getIPNetsByLink(iface)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to get address for interface %s: %v", ifName, err)
}
Expand Down Expand Up @@ -379,19 +378,6 @@ func renameHostInterface(oriName string, newName string) error {
return nil
}

func interfaceExists(name string) (bool, error) {
intfs, err := netInterfaces()
if err != nil {
return false, err
}
for _, intf := range intfs {
if intf.Name == name {
return true, nil
}
}
return false, nil
}

// PrepareHostInterfaceConnection prepares host interface connection to the OVS bridge client by:
// 1. Renaming the host interface (a bridged suffix will be added to it).
// 2. Creating an internal port (original name of the host interface will be used here).
Expand Down Expand Up @@ -475,55 +461,55 @@ func PrepareHostInterfaceConnection(
func RestoreHostInterfaceConfiguration(brName string, interfaceName string) {
klog.V(4).InfoS("Restoring bridge config to host interface")
bridgedName := GenerateUplinkInterfaceName(interfaceName)
// restore if interface eth0~ exists
if exists, err := interfaceExists(bridgedName); err != nil {
klog.ErrorS(err, "Failed to check if interface exists", "interface", bridgedName)
// restore only when interface eth0~ exists
if !HostInterfaceExists(bridgedName) {
return
} else if exists {
// get interface config
var interfaceIPs []*net.IPNet
var interfaceRoutes []interface{}
if exists, err = interfaceExists(interfaceName); err != nil {
klog.ErrorS(err, "Failed to check if interface exists", "interface", interfaceName)
} else if exists {
_, interfaceIPs, interfaceRoutes, err = GetInterfaceConfig(interfaceName)
if err != nil {
klog.ErrorS(err, "Failed to get interface config", "interface", interfaceName)
}
}

// delete internal port (eth0)
if err = deleteOVSPort(brName, interfaceName); err != nil {
klog.ErrorS(err, "Delete OVS port failed", "port", bridgedName)
}
// get interface config
var err error
var interfaceIPs []*net.IPNet
var interfaceRoutes []interface{}
if HostInterfaceExists(interfaceName) {
_, interfaceIPs, interfaceRoutes, err = GetInterfaceConfig(interfaceName)
if err != nil {
klog.ErrorS(err, "Failed to get interface config", "interface", interfaceName)
}
// remove host interface (eth0~) from bridge
if err = deleteOVSPort(brName, bridgedName); err != nil {

// delete internal port (eth0)
if err = deleteOVSPort(brName, interfaceName); err != nil {
klog.ErrorS(err, "Delete OVS port failed", "port", bridgedName)
return
}
}
// remove host interface (eth0~) from bridge
if err = deleteOVSPort(brName, bridgedName); err != nil {
klog.ErrorS(err, "Delete OVS port failed", "port", bridgedName)
return
}

// rename host interface(eth0~ -> eth0)
if err = RenameInterface(bridgedName, interfaceName); err != nil {
klog.ErrorS(err, "Restore host interface name failed", "from", bridgedName, "to", interfaceName)
} else {
var link netlink.Link
if link, err = netlink.LinkByName(interfaceName); err != nil {
klog.ErrorS(err, "Failed to get link", "interface", interfaceName)
} else {
if len(interfaceIPs) > 0 {
// restore IPs to eth0
if err = ConfigureLinkAddresses(link.Attrs().Index, interfaceIPs); err != nil {
klog.ErrorS(err, "Restore IPs to host interface failed", "interface", interfaceName)
}
}
if len(interfaceRoutes) > 0 {
// restore routes to eth0
if err = ConfigureLinkRoutes(link, interfaceRoutes); err != nil {
klog.ErrorS(err, "Restore routes to host interface failed", "interface", interfaceName)
}
}
}
// rename host interface(eth0~ -> eth0)
if err = RenameInterface(bridgedName, interfaceName); err != nil {
klog.ErrorS(err, "Restore host interface name failed", "from", bridgedName, "to", interfaceName)
return
}
var link netlink.Link
if link, err = netlink.LinkByName(interfaceName); err != nil {
klog.ErrorS(err, "Failed to get link", "interface", interfaceName)
return
}
if len(interfaceIPs) > 0 {
// restore IPs to eth0
if err = ConfigureLinkAddresses(link.Attrs().Index, interfaceIPs); err != nil {
klog.ErrorS(err, "Restore IPs to host interface failed", "interface", interfaceName)
return
}
}
if len(interfaceRoutes) > 0 {
// restore routes to eth0
if err = ConfigureLinkRoutes(link, interfaceRoutes); err != nil {
klog.ErrorS(err, "Restore routes to host interface failed", "interface", interfaceName)
return
}
klog.V(4).InfoS("Finished restoring bridge config to host interface", "interface", interfaceName, "bridge", brName)
}
klog.V(2).InfoS("Finished restoring bridge config to host interface", "interface", interfaceName, "bridge", brName)
}
44 changes: 1 addition & 43 deletions pkg/agent/util/net_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,48 +226,6 @@ func TestGetIPNetDeviceFromIP(t *testing.T) {
}
}

func TestGetAllIPNetsByName(t *testing.T) {
tests := []struct {
name string
testNetInterfaceName string
testNetInterface net.Interface
testNetInterfaceErr error
wantIPNets []*net.IPNet
}{
{
name: "IPv4",
testNetInterfaceName: "0",
wantIPNets: []*net.IPNet{&ipv4PublicIPNet},
},
{
name: "IPv6",
testNetInterfaceName: "1",
wantIPNets: []*net.IPNet{
{
IP: ipv6Global,
Mask: net.CIDRMask(128, 128),
},
},
},
{
name: "Invalid",
testNetInterfaceName: "0",
testNetInterfaceErr: testInvalidErr,
},
}

for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
tc.testNetInterface = generateNetInterface(tc.testNetInterfaceName)
defer mockNetInterfaceByName(&tc.testNetInterface, tc.testNetInterfaceErr)()
defer mockNetInterfaceAddrs(tc.testNetInterface, nil)()
gotIPNets, gotErr := GetAllIPNetsByName(tc.name)
assert.Equal(t, tc.wantIPNets, gotIPNets)
assert.Equal(t, tc.testNetInterfaceErr, gotErr)
})
}
}

func TestGetIPNetDeviceByName(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -544,7 +502,7 @@ func TestGetIPNetsByLink(t *testing.T) {
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
defer mockNetInterfaceAddrs(testNetInterface, tc.testNetInterfaceErr)()
gotIPNets, gotErr := GetIPNetsByLink(&testNetInterface)
gotIPNets, gotErr := getIPNetsByLink(&testNetInterface)
assert.Equal(t, tc.wantIPNets, gotIPNets)
assert.Equal(t, tc.testNetInterfaceErr, gotErr)
})
Expand Down
9 changes: 1 addition & 8 deletions pkg/agent/util/net_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ import (
ps "antrea.io/antrea/pkg/agent/util/powershell"
antreasyscall "antrea.io/antrea/pkg/agent/util/syscall"
binding "antrea.io/antrea/pkg/ovs/openflow"
"antrea.io/antrea/pkg/ovs/ovsconfig"
iputil "antrea.io/antrea/pkg/util/ip"
)

Expand Down Expand Up @@ -996,7 +995,7 @@ func GetInterfaceConfig(ifName string) (*net.Interface, []*net.IPNet, []interfac
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to get interface %s: %v", ifName, err)
}
addrs, err := GetIPNetsByLink(iface)
addrs, err := getIPNetsByLink(iface)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to get address for interface %s: %v", iface.Name, err)
}
Expand Down Expand Up @@ -1326,9 +1325,3 @@ func adapterAddresses() ([]*windows.IpAdapterAddresses, error) {
}
return aas, nil
}

func PrepareHostInterfaceConnection(_ ovsconfig.OVSBridgeClient, ifaceName string, _ int32, _ map[string]interface{}) (string, bool, error) {
return ifaceName, false, nil
}

func RestoreHostInterfaceConfiguration(_ string, _ string) {}

0 comments on commit 28b88b3

Please sign in to comment.