Files
podman/libpod/network/devices.go
Paul Holzinger ddeaaa47c8 Drop dependency on iproute
We only use the `ip` util to remove a network interface. We can do
this directly via the netlink lib, no need to call a external binary.

[NO TESTS NEEDED]

Fixes #11403

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2021-09-02 10:28:08 +02:00

60 lines
1.5 KiB
Go

package network
import (
"fmt"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v3/pkg/util"
"github.com/sirupsen/logrus"
"github.com/vishvananda/netlink"
)
// GetFreeDeviceName returns a device name that is unused; used when no network
// name is provided by user
func GetFreeDeviceName(config *config.Config) (string, error) {
var (
deviceNum uint
deviceName string
)
networkNames, err := GetNetworkNamesFromFileSystem(config)
if err != nil {
return "", err
}
liveNetworksNames, err := GetLiveNetworkNames()
if err != nil {
return "", err
}
bridgeNames, err := GetBridgeNamesFromFileSystem(config)
if err != nil {
return "", err
}
for {
deviceName = fmt.Sprintf("%s%d", CNIDeviceName, deviceNum)
logrus.Debugf("checking if device name %q exists in other cni networks", deviceName)
if util.StringInSlice(deviceName, networkNames) {
deviceNum++
continue
}
logrus.Debugf("checking if device name %q exists in live networks", deviceName)
if util.StringInSlice(deviceName, liveNetworksNames) {
deviceNum++
continue
}
logrus.Debugf("checking if device name %q already exists as a bridge name ", deviceName)
if !util.StringInSlice(deviceName, bridgeNames) {
break
}
deviceNum++
}
return deviceName, nil
}
// RemoveInterface removes an interface by the given name
func RemoveInterface(interfaceName string) error {
link, err := netlink.LinkByName(interfaceName)
if err != nil {
return err
}
return netlink.LinkDel(link)
}