diff --git a/pkg/cli/agent/agent.go b/pkg/cli/agent/agent.go index 624d96ab4d..501ac1bc0c 100644 --- a/pkg/cli/agent/agent.go +++ b/pkg/cli/agent/agent.go @@ -11,8 +11,8 @@ import ( "github.com/k3s-io/k3s/pkg/agent" "github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/datadir" - "github.com/k3s-io/k3s/pkg/netutil" "github.com/k3s-io/k3s/pkg/token" + "github.com/k3s-io/k3s/pkg/util" "github.com/k3s-io/k3s/pkg/version" "github.com/rancher/wrangler/pkg/signals" "github.com/sirupsen/logrus" @@ -60,7 +60,7 @@ func Run(ctx *cli.Context) error { } if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP) == 0 { - cmds.AgentConfig.NodeIP.Set(netutil.GetIPFromInterface(cmds.AgentConfig.FlannelIface)) + cmds.AgentConfig.NodeIP.Set(util.GetIPFromInterface(cmds.AgentConfig.FlannelIface)) } logrus.Info("Starting " + version.Program + " agent " + ctx.App.Version) diff --git a/pkg/cli/server/server.go b/pkg/cli/server/server.go index 50ca805687..0797ab0bc1 100644 --- a/pkg/cli/server/server.go +++ b/pkg/cli/server/server.go @@ -18,7 +18,6 @@ import ( "github.com/k3s-io/k3s/pkg/daemons/config" "github.com/k3s-io/k3s/pkg/datadir" "github.com/k3s-io/k3s/pkg/etcd" - "github.com/k3s-io/k3s/pkg/netutil" "github.com/k3s-io/k3s/pkg/rootless" "github.com/k3s-io/k3s/pkg/server" "github.com/k3s-io/k3s/pkg/token" @@ -201,7 +200,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont } if cmds.AgentConfig.FlannelIface != "" && len(cmds.AgentConfig.NodeIP) == 0 { - cmds.AgentConfig.NodeIP.Set(netutil.GetIPFromInterface(cmds.AgentConfig.FlannelIface)) + cmds.AgentConfig.NodeIP.Set(util.GetIPFromInterface(cmds.AgentConfig.FlannelIface)) } if serverConfig.ControlConfig.PrivateIP == "" && len(cmds.AgentConfig.NodeIP) != 0 { diff --git a/pkg/netutil/iface.go b/pkg/netutil/iface.go deleted file mode 100644 index c6d9b44af7..0000000000 --- a/pkg/netutil/iface.go +++ /dev/null @@ -1,65 +0,0 @@ -package netutil - -import ( - "fmt" - "net" - - "github.com/pkg/errors" - "github.com/sirupsen/logrus" -) - -func GetIPFromInterface(ifaceName string) string { - ip, err := getIPFromInterface(ifaceName) - if err != nil { - logrus.Warn(errors.Wrap(err, "unable to get global unicast ip from interface name")) - } else { - logrus.Infof("Found ip %s from iface %s", ip, ifaceName) - } - return ip -} - -func getIPFromInterface(ifaceName string) (string, error) { - iface, err := net.InterfaceByName(ifaceName) - if err != nil { - return "", err - } - addrs, err := iface.Addrs() - if err != nil { - return "", err - } - if iface.Flags&net.FlagUp == 0 { - return "", fmt.Errorf("the interface %s is not up", ifaceName) - } - - globalUnicasts := []string{} - globalUnicastsIPv6 := []string{} - for _, addr := range addrs { - ip, _, err := net.ParseCIDR(addr.String()) - if err != nil { - return "", errors.Wrapf(err, "unable to parse CIDR for interface %s", iface.Name) - } - // if not IPv4 adding it on IPv6 list - if ip.To4() == nil { - if ip.IsGlobalUnicast() { - globalUnicastsIPv6 = append(globalUnicastsIPv6, ip.String()) - } - continue - } - if ip.IsGlobalUnicast() { - globalUnicasts = append(globalUnicasts, ip.String()) - } - } - - if len(globalUnicasts) > 1 { - return "", fmt.Errorf("multiple global unicast addresses defined for %s, please set ip from one of %v", ifaceName, globalUnicasts) - } - if len(globalUnicasts) == 1 && len(globalUnicastsIPv6) == 0 { - return globalUnicasts[0], nil - } else if len(globalUnicastsIPv6) > 0 && len(globalUnicasts) == 1 { - return globalUnicasts[0] + "," + globalUnicastsIPv6[0], nil - } else if len(globalUnicastsIPv6) > 0 { - return globalUnicastsIPv6[0], nil - } - - return "", fmt.Errorf("can't find ip for interface %s", ifaceName) -} diff --git a/pkg/util/net.go b/pkg/util/net.go index 4eda2c1190..5a949a20a9 100644 --- a/pkg/util/net.go +++ b/pkg/util/net.go @@ -7,6 +7,7 @@ import ( "os" "strings" + "github.com/sirupsen/logrus" "github.com/urfave/cli" apinet "k8s.io/apimachinery/pkg/util/net" ) @@ -299,3 +300,61 @@ func IPStringToIPNet(address string) (*net.IPNet, error) { _, cidr, err := net.ParseCIDR(address) return cidr, err } + +// GetIPFromInterface is the public function that returns the IP of an interface +func GetIPFromInterface(ifaceName string) string { + ip, err := getIPFromInterface(ifaceName) + if err != nil { + logrus.Warn(fmt.Errorf("unable to get global unicast ip from interface name: %w", err)) + } else { + logrus.Infof("Found ip %s from iface %s", ip, ifaceName) + } + return ip +} + +// getIPFromInterface is the private function that returns de IP of an interface +func getIPFromInterface(ifaceName string) (string, error) { + iface, err := net.InterfaceByName(ifaceName) + if err != nil { + return "", err + } + addrs, err := iface.Addrs() + if err != nil { + return "", err + } + if iface.Flags&net.FlagUp == 0 { + return "", fmt.Errorf("the interface %s is not up", ifaceName) + } + + globalUnicasts := []string{} + globalUnicastsIPv6 := []string{} + for _, addr := range addrs { + ip, _, err := net.ParseCIDR(addr.String()) + if err != nil { + return "", fmt.Errorf("unable to parse CIDR for interface %s: %w", iface.Name, err) + } + // if not IPv4 adding it on IPv6 list + if ip.To4() == nil { + if ip.IsGlobalUnicast() { + globalUnicastsIPv6 = append(globalUnicastsIPv6, ip.String()) + } + continue + } + if ip.IsGlobalUnicast() { + globalUnicasts = append(globalUnicasts, ip.String()) + } + } + + if len(globalUnicasts) > 1 { + return "", fmt.Errorf("multiple global unicast addresses defined for %s, please set ip from one of %v", ifaceName, globalUnicasts) + } + if len(globalUnicasts) == 1 && len(globalUnicastsIPv6) == 0 { + return globalUnicasts[0], nil + } else if len(globalUnicastsIPv6) > 0 && len(globalUnicasts) == 1 { + return globalUnicasts[0] + "," + globalUnicastsIPv6[0], nil + } else if len(globalUnicastsIPv6) > 0 { + return globalUnicastsIPv6[0], nil + } + + return "", fmt.Errorf("can't find ip for interface %s", ifaceName) +}