diff --git a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go index f0def7c2db..39a12314bd 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go @@ -408,7 +408,7 @@ func CreateOSReleaseFile(seq runtime.Sequence, data interface{}) (runtime.TaskEx // SetupDiscoveryNetwork represents the task for setting up the initial network. func SetupDiscoveryNetwork(seq runtime.Sequence, data interface{}) (runtime.TaskExecutionFunc, string) { return func(ctx context.Context, logger *log.Logger, r runtime.Runtime) (err error) { - nwd, err := networkd.New(r.Config()) + nwd, err := networkd.New(logger, r.Config()) if err != nil { return err } @@ -585,7 +585,7 @@ func ValidateConfig(seq runtime.Sequence, data interface{}) (runtime.TaskExecuti // ResetNetwork resets the network. func ResetNetwork(seq runtime.Sequence, data interface{}) (runtime.TaskExecutionFunc, string) { return func(ctx context.Context, logger *log.Logger, r runtime.Runtime) (err error) { - nwd, err := networkd.New(r.Config()) + nwd, err := networkd.New(logger, r.Config()) if err != nil { return err } diff --git a/internal/app/networkd/main.go b/internal/app/networkd/main.go index adc7b21d28..f10112c79c 100644 --- a/internal/app/networkd/main.go +++ b/internal/app/networkd/main.go @@ -6,7 +6,6 @@ package main import ( "context" - "flag" "log" "os" "os/signal" @@ -25,21 +24,11 @@ import ( func init() { // Explicitly disable memory profiling to save around 1.4MiB of memory. runtime.MemProfileRate = 0 - - log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds | log.Ltime) - - flag.Parse() } func main() { - if err := run(); err != nil { - log.Fatal(err) - } - - log.Println("networkd stopped") -} + logger := log.New(os.Stderr, "", log.Lshortfile|log.Ldate|log.Lmicroseconds|log.Ltime) -func run() error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -55,16 +44,24 @@ func run() error { } }() - var eg errgroup.Group + if err := run(ctx, logger); err != nil { + logger.Fatal(err) + } - log.Println("starting initial network configuration") + logger.Println("networkd stopped") +} + +func run(ctx context.Context, logger *log.Logger) error { + var eg errgroup.Group config, err := configloader.NewFromStdin() if err != nil { return err } - nwd, err := networkd.New(config) + logger.Println("starting initial network configuration") + + nwd, err := networkd.New(logger, config) if err != nil { return err } @@ -73,16 +70,21 @@ func run() error { return err } + registrator, err := reg.NewRegistrator(logger, nwd) + if err != nil { + return err + } + if err = nwd.RunControllers(ctx, &eg); err != nil { return err } - log.Println("completed initial network configuration") + logger.Println("completed initial network configuration") nwd.Renew(ctx) server := factory.NewServer( - reg.NewRegistrator(nwd), + registrator, factory.WithDefaultLog(), ) diff --git a/internal/app/networkd/pkg/address/address.go b/internal/app/networkd/pkg/address/address.go index d5d8e09422..f72b731573 100644 --- a/internal/app/networkd/pkg/address/address.go +++ b/internal/app/networkd/pkg/address/address.go @@ -6,6 +6,7 @@ package address import ( "context" + "log" "net" "time" ) @@ -15,7 +16,7 @@ import ( // supported. type Addressing interface { Address() *net.IPNet - Discover(context.Context, *net.Interface) error + Discover(context.Context, *log.Logger, *net.Interface) error Family() int Hostname() string Link() *net.Interface diff --git a/internal/app/networkd/pkg/address/dhcp4.go b/internal/app/networkd/pkg/address/dhcp4.go index b45a590cd2..6e1461cb5d 100644 --- a/internal/app/networkd/pkg/address/dhcp4.go +++ b/internal/app/networkd/pkg/address/dhcp4.go @@ -45,9 +45,9 @@ func (d *DHCP4) Link() *net.Interface { } // Discover handles the DHCP client exchange stores the DHCP Ack. -func (d *DHCP4) Discover(ctx context.Context, link *net.Interface) error { +func (d *DHCP4) Discover(ctx context.Context, logger *log.Logger, link *net.Interface) error { d.NetIf = link - err := d.discover(ctx) + err := d.discover(ctx, logger) return err } @@ -186,7 +186,7 @@ func (d *DHCP4) Hostname() (hostname string) { } // discover handles the actual DHCP conversation. -func (d *DHCP4) discover(ctx context.Context) error { +func (d *DHCP4) discover(ctx context.Context, logger *log.Logger) error { opts := []dhcpv4.OptionCode{ dhcpv4.OptionClasslessStaticRoute, dhcpv4.OptionDomainNameServer, @@ -228,7 +228,7 @@ func (d *DHCP4) discover(ctx context.Context) error { if err != nil { // TODO: Make this a well defined error so we can make it not fatal - log.Printf("failed dhcp request for %q: %v", d.NetIf.Name, err) + logger.Printf("failed dhcp request for %q: %v", d.NetIf.Name, err) // clear offer if request fails to start with discover sequence next time d.Offer = nil @@ -236,7 +236,7 @@ func (d *DHCP4) discover(ctx context.Context) error { return err } - log.Printf("DHCP ACK on %q: %s", d.NetIf.Name, collapseSummary(lease.ACK.Summary())) + logger.Printf("DHCP ACK on %q: %s", d.NetIf.Name, collapseSummary(lease.ACK.Summary())) d.Ack = lease.ACK d.Offer = lease.Offer diff --git a/internal/app/networkd/pkg/address/dhcp6.go b/internal/app/networkd/pkg/address/dhcp6.go index d7602122a2..60b638ac3b 100644 --- a/internal/app/networkd/pkg/address/dhcp6.go +++ b/internal/app/networkd/pkg/address/dhcp6.go @@ -38,9 +38,9 @@ func (d *DHCP6) Link() *net.Interface { } // Discover handles the DHCP client exchange stores the DHCP Ack. -func (d *DHCP6) Discover(ctx context.Context, link *net.Interface) error { +func (d *DHCP6) Discover(ctx context.Context, logger *log.Logger, link *net.Interface) error { d.NetIf = link - err := d.discover(ctx) + err := d.discover(ctx, logger) return err } @@ -119,16 +119,16 @@ func (d *DHCP6) Hostname() (hostname string) { } // discover handles the actual DHCP conversation. -func (d *DHCP6) discover(ctx context.Context) error { - if err := waitIPv6LinkReady(d.NetIf); err != nil { - log.Printf("failed waiting for IPv6 readiness: %s", err) +func (d *DHCP6) discover(ctx context.Context, logger *log.Logger) error { + if err := waitIPv6LinkReady(logger, d.NetIf); err != nil { + logger.Printf("failed waiting for IPv6 readiness: %s", err) return err } cli, err := nclient6.New(d.NetIf.Name) if err != nil { - log.Printf("failed to create dhcp6 client: %s", err) + logger.Printf("failed to create dhcp6 client: %s", err) return err } @@ -139,19 +139,19 @@ func (d *DHCP6) discover(ctx context.Context) error { reply, err := cli.RapidSolicit(ctx) if err != nil { // TODO: Make this a well defined error so we can make it not fatal - log.Printf("failed dhcp6 request for %q: %v", d.NetIf.Name, err) + logger.Printf("failed dhcp6 request for %q: %v", d.NetIf.Name, err) return err } - log.Printf("DHCP6 REPLY on %q: %s", d.NetIf.Name, collapseSummary(reply.Summary())) + logger.Printf("DHCP6 REPLY on %q: %s", d.NetIf.Name, collapseSummary(reply.Summary())) d.Reply = reply return nil } -func waitIPv6LinkReady(iface *net.Interface) error { +func waitIPv6LinkReady(logger *log.Logger, iface *net.Interface) error { conn, err := rtnetlink.Dial(nil) if err != nil { return err @@ -160,7 +160,7 @@ func waitIPv6LinkReady(iface *net.Interface) error { defer conn.Close() //nolint:errcheck return retry.Constant(30*time.Second, retry.WithUnits(100*time.Millisecond)).Retry(func() error { - ready, err := isIPv6LinkReady(iface, conn) + ready, err := isIPv6LinkReady(logger, iface, conn) if err != nil { return retry.UnexpectedError(err) } @@ -175,7 +175,7 @@ func waitIPv6LinkReady(iface *net.Interface) error { // isIPv6LinkReady returns true if the interface has a link-local address // which is not tentative. -func isIPv6LinkReady(iface *net.Interface, conn *rtnetlink.Conn) (bool, error) { +func isIPv6LinkReady(logger *log.Logger, iface *net.Interface, conn *rtnetlink.Conn) (bool, error) { addrs, err := conn.Address.List() if err != nil { return false, err @@ -192,7 +192,7 @@ func isIPv6LinkReady(iface *net.Interface, conn *rtnetlink.Conn) (bool, error) { if addr.Attributes.Address.IsLinkLocalUnicast() && (addr.Flags&unix.IFA_F_TENTATIVE == 0) { if addr.Flags&unix.IFA_F_DADFAILED != 0 { - log.Printf("DADFAILED for %v, continuing anyhow", addr.Attributes.Address) + logger.Printf("DADFAILED for %v, continuing anyhow", addr.Attributes.Address) } return true, nil diff --git a/internal/app/networkd/pkg/address/static.go b/internal/app/networkd/pkg/address/static.go index 3b7bb0a5da..ac2487a9fb 100644 --- a/internal/app/networkd/pkg/address/static.go +++ b/internal/app/networkd/pkg/address/static.go @@ -6,6 +6,7 @@ package address import ( "context" + "log" "net" "time" @@ -28,7 +29,7 @@ type Static struct { // Discover doesnt do anything in the static configuration since all // the necessary configuration data is supplied via config. -func (s *Static) Discover(ctx context.Context, link *net.Interface) error { +func (s *Static) Discover(ctx context.Context, logger *log.Logger, link *net.Interface) error { s.NetIf = link return nil diff --git a/internal/app/networkd/pkg/networkd/misc.go b/internal/app/networkd/pkg/networkd/misc.go index 696574c0a6..3cbaf1d8e3 100644 --- a/internal/app/networkd/pkg/networkd/misc.go +++ b/internal/app/networkd/pkg/networkd/misc.go @@ -24,7 +24,7 @@ import ( // we need to. // //nolint:gocyclo -func filterInterfaces(interfaces []net.Interface) (filtered []net.Interface, err error) { +func filterInterfaces(logger *log.Logger, interfaces []net.Interface) (filtered []net.Interface, err error) { var conn *rtnetlink.Conn for _, iface := range interfaces { @@ -52,15 +52,15 @@ func filterInterfaces(interfaces []net.Interface) (filtered []net.Interface, err for _, iface := range filtered { link, err := conn.Link.Get(uint32(iface.Index)) if err != nil { - log.Printf("error getting link %q", iface.Name) + logger.Printf("error getting link %q", iface.Name) continue } if link.Flags&unix.IFF_UP == unix.IFF_UP && !(link.Flags&unix.IFF_RUNNING == unix.IFF_RUNNING) { - log.Printf("no carrier for link %q", iface.Name) + logger.Printf("no carrier for link %q", iface.Name) } else { - log.Printf("link %q has carrier signal", iface.Name) + logger.Printf("link %q has carrier signal", iface.Name) filtered[n] = iface n++ } @@ -72,7 +72,7 @@ func filterInterfaces(interfaces []net.Interface) (filtered []net.Interface, err } // writeResolvConf generates a /etc/resolv.conf with the specified nameservers. -func writeResolvConf(resolvers []string) (err error) { +func writeResolvConf(logger *log.Logger, resolvers []string) (err error) { var resolvconf strings.Builder for idx, resolver := range resolvers { @@ -82,7 +82,7 @@ func writeResolvConf(resolvers []string) (err error) { } if _, err = resolvconf.WriteString(fmt.Sprintf("nameserver %s\n", resolver)); err != nil { - log.Println("failed to add some resolver to resolvconf:", resolver) + logger.Println("failed to add some resolver to resolvconf:", resolver) return err } @@ -96,7 +96,7 @@ func writeResolvConf(resolvers []string) (err error) { } } - log.Println("writing resolvconf") + logger.Println("writing resolvconf") return ioutil.WriteFile("/etc/resolv.conf", []byte(resolvconf.String()), 0o644) } diff --git a/internal/app/networkd/pkg/networkd/netconf.go b/internal/app/networkd/pkg/networkd/netconf.go index 6eebd91b95..7acac610da 100644 --- a/internal/app/networkd/pkg/networkd/netconf.go +++ b/internal/app/networkd/pkg/networkd/netconf.go @@ -22,7 +22,7 @@ import ( // buildOptions translates the supplied config to nic.Option used for // configuring the interface. //nolint:gocyclo,cyclop -func buildOptions(device config.Device, hostname string) (name string, opts []nic.Option, err error) { +func buildOptions(logger *log.Logger, device config.Device, hostname string) (name string, opts []nic.Option, err error) { opts = append(opts, nic.WithName(device.Interface())) if device.Ignore() || procfs.ProcCmdline().Get(constants.KernelParamNetworkInterfaceIgnore).Contains(device.Interface()) { @@ -59,7 +59,7 @@ func buildOptions(device config.Device, hostname string) (name string, opts []ni default: // Allow master interface without any addressing if VLANs exist if len(device.Vlans()) > 0 { - log.Printf("no addressing for master device %s", device.Interface()) + logger.Printf("no addressing for master device %s", device.Interface()) opts = append(opts, nic.WithNoAddressing()) } else { diff --git a/internal/app/networkd/pkg/networkd/netconf_test.go b/internal/app/networkd/pkg/networkd/netconf_test.go index a39d7b176c..0def707dad 100644 --- a/internal/app/networkd/pkg/networkd/netconf_test.go +++ b/internal/app/networkd/pkg/networkd/netconf_test.go @@ -6,7 +6,9 @@ package networkd import ( + "log" "net" + "os" "testing" "github.com/stretchr/testify/suite" @@ -28,7 +30,7 @@ func TestNetconfSuite(t *testing.T) { func (suite *NetconfSuite) TestBaseNetconf() { for _, device := range sampleConfig() { - _, opts, err := buildOptions(device, "") + _, opts, err := buildOptions(log.New(os.Stderr, "", log.LstdFlags), device, "") suite.Require().NoError(err) _, err = nic.New(opts...) diff --git a/internal/app/networkd/pkg/networkd/networkd.go b/internal/app/networkd/pkg/networkd/networkd.go index a66ee3aa82..ab9aef4bae 100644 --- a/internal/app/networkd/pkg/networkd/networkd.go +++ b/internal/app/networkd/pkg/networkd/networkd.go @@ -48,12 +48,14 @@ type Networkd struct { sync.Mutex ready bool + + logger *log.Logger } // New takes the supplied configuration and creates an abstract representation // of all interfaces (as nic.NetworkInterface). //nolint:gocyclo,cyclop -func New(config config.Provider) (*Networkd, error) { +func New(logger *log.Logger, config config.Provider) (*Networkd, error) { var ( hostname string option *string @@ -71,10 +73,10 @@ func New(config config.Provider) (*Networkd, error) { // Gather settings for all config driven interfaces if config != nil { - log.Println("parsing configuration file") + logger.Println("parsing configuration file") for _, device := range config.Machine().Network().Devices() { - name, opts, err := buildOptions(device, config.Machine().Network().Hostname()) + name, opts, err := buildOptions(logger, device, config.Machine().Network().Hostname()) if err != nil { result = multierror.Append(result, err) @@ -95,7 +97,7 @@ func New(config config.Provider) (*Networkd, error) { } } - log.Println("discovering local interfaces") + logger.Println("discovering local interfaces") // Gather already present interfaces localInterfaces, err := net.Interfaces() @@ -107,7 +109,7 @@ func New(config config.Provider) (*Networkd, error) { // Add locally discovered interfaces to our list of interfaces // if they are not already present - filtered, err := filterInterfaces(localInterfaces) + filtered, err := filterInterfaces(logger, localInterfaces) if err != nil { result = multierror.Append(result, err) @@ -177,7 +179,13 @@ func New(config config.Provider) (*Networkd, error) { } } - return &Networkd{Interfaces: interfaces, Config: config, hostname: hostname, resolvers: resolvers}, result.ErrorOrNil() + return &Networkd{ + Interfaces: interfaces, + Config: config, + hostname: hostname, + resolvers: resolvers, + logger: logger, + }, result.ErrorOrNil() } // Configure handles the lifecycle for an interface. This includes creation, @@ -191,14 +199,14 @@ func (n *Networkd) Configure(ctx context.Context) (err error) { // interfaces exist prior to bonding for _, bonded := range []bool{false, true} { if bonded { - log.Println("configuring bonded interfaces") + n.logger.Println("configuring bonded interfaces") } else { - log.Println("configuring non-bonded interfaces") + n.logger.Println("configuring non-bonded interfaces") } if err = n.configureLinks(ctx, bonded); err != nil { // Treat errors as non-fatal - log.Println(err) + n.logger.Println(err) } } @@ -232,7 +240,7 @@ func (n *Networkd) Configure(ctx context.Context) (err error) { return err } - if err = writeResolvConf(resolvers); err != nil { + if err = writeResolvConf(n.logger, resolvers); err != nil { return err } @@ -246,7 +254,7 @@ func (n *Networkd) Configure(ctx context.Context) (err error) { // configured by DHCP. func (n *Networkd) Renew(ctx context.Context) { for _, iface := range n.Interfaces { - iface.Renew(ctx) + iface.Renew(ctx, n.logger) } } @@ -260,7 +268,7 @@ func (n *Networkd) Reset() { // RunControllers spins up additional controllers in the errgroup. func (n *Networkd) RunControllers(ctx context.Context, eg *errgroup.Group) error { for _, iface := range n.Interfaces { - if err := iface.RunControllers(ctx, eg); err != nil { + if err := iface.RunControllers(ctx, n.logger, eg); err != nil { return err } } @@ -420,7 +428,7 @@ func (n *Networkd) configureLinks(ctx context.Context, bonded bool) error { go func(netif *nic.NetworkInterface) { if !netif.IsIgnored() { - log.Printf("setting up %s", netif.Name) + n.logger.Printf("setting up %s", netif.Name) } errCh <- func() error { @@ -429,7 +437,7 @@ func (n *Networkd) configureLinks(ctx context.Context, bonded bool) error { return fmt.Errorf("error creating nic %q: %w", netif.Name, err) } - if err := netif.CreateSub(); err != nil { + if err := netif.CreateSub(n.logger); err != nil { return fmt.Errorf("error creating sub interface nic %q: %w", netif.Name, err) } @@ -437,11 +445,11 @@ func (n *Networkd) configureLinks(ctx context.Context, bonded bool) error { return fmt.Errorf("error configuring nic %q: %w", netif.Name, err) } - if err := netif.Addressing(); err != nil { + if err := netif.Addressing(n.logger); err != nil { return fmt.Errorf("error configuring addressing %q: %w", netif.Name, err) } - if err := netif.AddressingSub(); err != nil { + if err := netif.AddressingSub(n.logger); err != nil { return fmt.Errorf("error configuring addressing %q: %w", netif.Name, err) } diff --git a/internal/app/networkd/pkg/networkd/networkd_test.go b/internal/app/networkd/pkg/networkd/networkd_test.go index 3a10d95a10..84142ee9f9 100644 --- a/internal/app/networkd/pkg/networkd/networkd_test.go +++ b/internal/app/networkd/pkg/networkd/networkd_test.go @@ -6,7 +6,9 @@ package networkd import ( + "log" "net" + "os" "testing" "github.com/insomniacslk/dhcp/dhcpv4" @@ -28,7 +30,7 @@ func TestNetworkdSuite(t *testing.T) { } func (suite *NetworkdSuite) TestNetworkd() { - nwd, err := New(sampleConfigFile()) + nwd, err := New(log.New(os.Stderr, "", log.LstdFlags), sampleConfigFile()) suite.Require().NoError(err) suite.Require().Contains(nwd.Interfaces, "eth0") @@ -49,7 +51,7 @@ func (suite *NetworkdSuite) TestHostname() { sampleConfig config.Provider ) - nwd, err = New(nil) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), nil) suite.Require().NoError(err) // Default test @@ -63,7 +65,7 @@ func (suite *NetworkdSuite) TestHostname() { // Static with hostname sampleConfig = sampleConfigFile() - nwd, err = New(sampleConfig) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), sampleConfig) suite.Require().NoError(err) hostname, _, addr, err = nwd.decideHostname() @@ -74,7 +76,7 @@ func (suite *NetworkdSuite) TestHostname() { // Static for computed hostname ( talos-ip ) sampleConfig.(*v1alpha1.Config).MachineConfig.MachineNetwork.NetworkHostname = "" - nwd, err = New(sampleConfig) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), sampleConfig) suite.Require().NoError(err) hostname, _, addr, err = nwd.decideHostname() @@ -85,7 +87,7 @@ func (suite *NetworkdSuite) TestHostname() { // Static for hostname too long sampleConfig.(*v1alpha1.Config).MachineConfig.MachineNetwork.NetworkHostname = "somereallyreallyreallylongstringthathasmorethan63charactersbecauseweneedtotestit" - nwd, err = New(sampleConfig) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), sampleConfig) suite.Require().NoError(err) //nolint:dogsled @@ -95,7 +97,7 @@ func (suite *NetworkdSuite) TestHostname() { // Static for hostname vs domain name sampleConfig.(*v1alpha1.Config).MachineConfig.MachineNetwork.NetworkHostname = "dadjokes.biz.dev.com.org.io" - nwd, err = New(sampleConfig) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), sampleConfig) suite.Require().NoError(err) hostname, domainname, _, err = nwd.decideHostname() @@ -106,7 +108,7 @@ func (suite *NetworkdSuite) TestHostname() { // DHCP addressing tests // DHCP with OptionHostName - nwd, err = New(dhcpConfigFile()) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), dhcpConfigFile()) suite.Require().NoError(err) nwd.Interfaces["eth0"].AddressMethod = []address.Addressing{ @@ -127,7 +129,7 @@ func (suite *NetworkdSuite) TestHostname() { suite.Assert().Equal(addr.String(), "192.168.0.11") // DHCP without OptionHostName - nwd, err = New(dhcpConfigFile()) + nwd, err = New(log.New(os.Stderr, "", log.LstdFlags), dhcpConfigFile()) suite.Require().NoError(err) nwd.Interfaces["eth0"].AddressMethod = []address.Addressing{ diff --git a/internal/app/networkd/pkg/nic/nic.go b/internal/app/networkd/pkg/nic/nic.go index 3bc5591850..493a13471d 100644 --- a/internal/app/networkd/pkg/nic/nic.go +++ b/internal/app/networkd/pkg/nic/nic.go @@ -158,13 +158,13 @@ func (n *NetworkInterface) Create() error { } // CreateSub create VLAN devices that belongs to a master device. -func (n *NetworkInterface) CreateSub() error { +func (n *NetworkInterface) CreateSub(logger *log.Logger) error { var info *rtnetlink.LinkInfo // Create all the VLAN devices for _, vlan := range n.Vlans { name := n.Name + "." + strconv.Itoa(int(vlan.ID)) - log.Printf("setting up %s", name) + logger.Printf("setting up %s", name) iface, err := net.InterfaceByName(name) if err == nil { @@ -175,7 +175,7 @@ func (n *NetworkInterface) CreateSub() error { data, err := vlan.VlanSettings.Encode() if err != nil { - log.Println("failed to encode vlan link parameters: " + err.Error()) + logger.Println("failed to encode vlan link parameters: " + err.Error()) continue } @@ -185,14 +185,14 @@ func (n *NetworkInterface) CreateSub() error { info = &rtnetlink.LinkInfo{Kind: "vlan", Data: data} if err = n.createSubLink(name, info, &masterIdx); err != nil { - log.Println("failed to create vlan link " + err.Error()) + logger.Println("failed to create vlan link " + err.Error()) return err } iface, err = net.InterfaceByName(name) if err != nil { - log.Println("failed to get vlan interface ") + logger.Println("failed to get vlan interface ") return err } @@ -253,13 +253,13 @@ func (n *NetworkInterface) Configure(ctx context.Context) (err error) { } // RunControllers is used to run additional controllers per interface. -func (n *NetworkInterface) RunControllers(ctx context.Context, eg *errgroup.Group) (err error) { +func (n *NetworkInterface) RunControllers(ctx context.Context, logger *log.Logger, eg *errgroup.Group) (err error) { if n.VirtualIP != nil { if n.vipController, err = vip.New(n.VirtualIP.String(), n.Link.Name); err != nil { return fmt.Errorf("failed to create the VirtualIP controller for %q on %q: %w", n.VirtualIP, n.Link.Name, err) } - if err = n.vipController.Start(ctx, eg); err != nil { + if err = n.vipController.Start(ctx, logger, eg); err != nil { return fmt.Errorf("failed to start the VirtualIP controller for %q on %q: %w", n.VirtualIP, n.Link.Name, err) } } @@ -294,13 +294,13 @@ func (n *NetworkInterface) waitForLinkToBeUp(linkDev *net.Interface) error { // Addressing handles the address method for a configured interface ( dhcp/static ). // This is inclusive of the address itself as well as any defined routes. -func (n *NetworkInterface) Addressing() error { +func (n *NetworkInterface) Addressing(logger *log.Logger) error { if n.IsIgnored() { return nil } for _, method := range n.AddressMethod { - if err := n.configureInterface(method, n.Link); err != nil { + if err := n.configureInterface(logger, method, n.Link); err != nil { // Treat as non fatal error when failing to configure an interface continue } @@ -311,15 +311,15 @@ func (n *NetworkInterface) Addressing() error { // AddressingSub handles the address method for a configured sub interface ( dhcp/static ). // This is inclusive of the address itself as well as any defined routes. -func (n *NetworkInterface) AddressingSub() error { +func (n *NetworkInterface) AddressingSub(logger *log.Logger) error { if n.IsIgnored() { return nil } for _, vlan := range n.Vlans { for _, method := range vlan.AddressMethod { - if err := n.configureInterface(method, vlan.Link); err != nil { - log.Println("failed to configure address on vlan link: " + err.Error()) + if err := n.configureInterface(logger, method, vlan.Link); err != nil { + logger.Println("failed to configure address on vlan link: " + err.Error()) // Treat as non fatal error when failing to configure an interface continue } @@ -330,13 +330,13 @@ func (n *NetworkInterface) AddressingSub() error { } // Renew is the mechanism for keeping a dhcp lease active. -func (n *NetworkInterface) Renew(ctx context.Context) { +func (n *NetworkInterface) Renew(ctx context.Context, logger *log.Logger) { for _, method := range n.AddressMethod { if method.TTL() == 0 { continue } - go n.renew(ctx, method) + go n.renew(ctx, logger, method) } } @@ -344,7 +344,7 @@ func (n *NetworkInterface) Renew(ctx context.Context) { // up to date. We attempt to do our first reconfiguration halfway through // address TTL. If that fails, we'll continue to attempt to retry every // halflife. -func (n *NetworkInterface) renew(ctx context.Context, method address.Addressing) { +func (n *NetworkInterface) renew(ctx context.Context, logger *log.Logger, method address.Addressing) { const minRenewDuration = 5 * time.Second // protect from renewing too often renewDuration := method.TTL() / 2 @@ -358,8 +358,8 @@ func (n *NetworkInterface) renew(ctx context.Context, method address.Addressing) return } - if err = n.configureInterface(method, n.Link); err != nil { - log.Printf("failure to renew address for %q: %s", n.Name, err) + if err = n.configureInterface(logger, method, n.Link); err != nil { + logger.Printf("failure to renew address for %q: %s", n.Name, err) renewDuration = (renewDuration / 2) } else { @@ -375,10 +375,10 @@ func (n *NetworkInterface) renew(ctx context.Context, method address.Addressing) // configureInterface handles the actual address discovery mechanism and // netlink interaction to configure the interface. //nolint:gocyclo,cyclop -func (n *NetworkInterface) configureInterface(method address.Addressing, link *net.Interface) error { +func (n *NetworkInterface) configureInterface(logger *log.Logger, method address.Addressing, link *net.Interface) error { var err error - discoverErr := method.Discover(context.Background(), link) + discoverErr := method.Discover(context.Background(), logger, link) // Set link MTU in any case if err = n.setMTU(method.Link().Index, method.MTU()); err != nil { diff --git a/internal/app/networkd/pkg/reg/reg.go b/internal/app/networkd/pkg/reg/reg.go index fdb336c6e7..7b490f110e 100644 --- a/internal/app/networkd/pkg/reg/reg.go +++ b/internal/app/networkd/pkg/reg/reg.go @@ -28,19 +28,22 @@ import ( type Registrator struct { Networkd *networkd.Networkd Conn *rtnetlink.Conn + + logger *log.Logger } // NewRegistrator builds new Registrator instance. -func NewRegistrator(n *networkd.Networkd) *Registrator { +func NewRegistrator(logger *log.Logger, n *networkd.Networkd) (*Registrator, error) { nlConn, err := rtnetlink.Dial(nil) if err != nil { - log.Fatal(err) + return nil, err } return &Registrator{ Networkd: n, Conn: nlConn, - } + logger: logger, + }, nil } // Register implements the factory.Registrator interface. @@ -61,10 +64,10 @@ func (r *Registrator) Routes(ctx context.Context, in *empty.Empty) (reply *netwo for _, rMesg := range list { ifaceData, err := r.Conn.Link.Get((rMesg.Attributes.OutIface)) if err != nil { - log.Printf("failed to get interface details for interface index %d: %v", rMesg.Attributes.OutIface, err) + r.logger.Printf("failed to get interface details for interface index %d: %v", rMesg.Attributes.OutIface, err) // TODO: Remove once we get this sorted on why there's a // failure here - log.Printf("%+v", rMesg) + r.logger.Printf("%+v", rMesg) continue } diff --git a/internal/app/networkd/pkg/reg/reg_test.go b/internal/app/networkd/pkg/reg/reg_test.go index f6285a2597..5720016354 100644 --- a/internal/app/networkd/pkg/reg/reg_test.go +++ b/internal/app/networkd/pkg/reg/reg_test.go @@ -9,6 +9,7 @@ import ( "context" "fmt" "io/ioutil" + "log" "net" "os" "testing" @@ -85,11 +86,13 @@ func (suite *NetworkdSuite) TestInterfaces() { func (suite *NetworkdSuite) fakeNetworkdRPC() (*networkd.Networkd, *grpc.Server, net.Listener) { // Create networkd instance - n, err := networkd.New(nil) + n, err := networkd.New(log.New(os.Stderr, "", log.LstdFlags), nil) suite.Assert().NoError(err) // Create gRPC server - api := NewRegistrator(n) + api, err := NewRegistrator(log.New(os.Stderr, "", log.LstdFlags), n) + suite.Require().NoError(err) + server := factory.NewServer(api) tmpfile, err := ioutil.TempFile("", "networkd") suite.Assert().NoError(err) diff --git a/internal/app/networkd/pkg/vip/vip.go b/internal/app/networkd/pkg/vip/vip.go index c669bae352..449c3265af 100644 --- a/internal/app/networkd/pkg/vip/vip.go +++ b/internal/app/networkd/pkg/vip/vip.go @@ -25,7 +25,7 @@ const campaignRetryInterval = time.Second // A Controller provides a control interface for Virtual IP addressing. type Controller interface { // Start activates the Virtual IP address controller. - Start(ctx context.Context, eg *errgroup.Group) error + Start(ctx context.Context, logger *log.Logger, eg *errgroup.Group) error } type vipController struct { @@ -52,14 +52,14 @@ func New(ip, iface string) (Controller, error) { } // Start implements the Controller interface. -func (c *vipController) Start(ctx context.Context, eg *errgroup.Group) error { +func (c *vipController) Start(ctx context.Context, logger *log.Logger, eg *errgroup.Group) error { netController, err := vip.NewConfig(c.ip.String(), c.iface.Name, false) if err != nil { return err } eg.Go(func() error { - c.maintain(ctx, netController) + c.maintain(ctx, logger, netController) return nil }) @@ -71,10 +71,10 @@ func (c *vipController) etcdElectionKey() string { return fmt.Sprintf("%s:vip:election:%s", constants.EtcdRootTalosKey, c.ip.String()) } -func (c *vipController) maintain(ctx context.Context, netController vip.Network) { +func (c *vipController) maintain(ctx context.Context, logger *log.Logger, netController vip.Network) { for ctx.Err() == nil { - if err := c.campaign(ctx, netController); err != nil { - log.Printf("campaign failure: %s", err) + if err := c.campaign(ctx, logger, netController); err != nil { + logger.Printf("campaign failure: %s", err) time.Sleep(campaignRetryInterval) @@ -84,7 +84,7 @@ func (c *vipController) maintain(ctx context.Context, netController vip.Network) } //nolint:gocyclo,cyclop -func (c *vipController) campaign(ctx context.Context, netController vip.Network) error { +func (c *vipController) campaign(ctx context.Context, logger *log.Logger, netController vip.Network) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -114,7 +114,7 @@ func (c *vipController) campaign(ctx context.Context, netController vip.Network) return fmt.Errorf("failed getting current leader: %w", err) } } else if string(node.Kvs[0].Value) == hostname { - log.Printf("vip: resigning from previous election") + logger.Printf("vip: resigning from previous election") // we are still leader from the previous election, attempt to resign to force new election resumedElection := concurrency.ResumeElection(sess, c.etcdElectionKey(), string(node.Kvs[0].Key), node.Kvs[0].CreateRevision) @@ -136,7 +136,7 @@ func (c *vipController) campaign(ctx context.Context, netController vip.Network) return fmt.Errorf("failed to conduct campaign: %w", err) } case <-sess.Done(): - log.Printf("vip: session closed") + logger.Printf("vip: session closed") } defer func() { @@ -152,10 +152,10 @@ func (c *vipController) campaign(ctx context.Context, netController vip.Network) } defer func() { - log.Printf("vip: removing shared IP %q on interface %q", c.ip.String(), c.iface.Name) + logger.Printf("vip: removing shared IP %q on interface %q", c.ip.String(), c.iface.Name) if err = netController.DeleteIP(); err != nil { - log.Printf("vip: error removing shared IP: %s", err) + logger.Printf("vip: error removing shared IP: %s", err) } }() @@ -167,7 +167,7 @@ func (c *vipController) campaign(ctx context.Context, netController vip.Network) } } - log.Printf("vip: enabled shared IP %q on interface %q", c.ip.String(), c.iface.Name) + logger.Printf("vip: enabled shared IP %q on interface %q", c.ip.String(), c.iface.Name) observe := election.Observe(ctx) @@ -175,7 +175,7 @@ observeLoop: for { select { case <-sess.Done(): - log.Printf("vip: session closed") + logger.Printf("vip: session closed") break observeLoop case <-ctx.Done(): @@ -186,7 +186,7 @@ observeLoop: } if string(resp.Kvs[0].Value) != hostname { - log.Printf("vip: detected new leader %q", string(resp.Kvs[0].Value)) + logger.Printf("vip: detected new leader %q", string(resp.Kvs[0].Value)) break observeLoop }