diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index 56727559e9..b391bf772c 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -849,14 +849,15 @@ func (daemon *Daemon) initNetworkController(cfg *config.Config, activeSandboxes return err } - daemon.netController, err = libnetwork.New(netOptions...) + ctx := context.TODO() + daemon.netController, err = libnetwork.New(ctx, netOptions...) if err != nil { return fmt.Errorf("error obtaining controller instance: %v", err) } if len(activeSandboxes) > 0 { - log.G(context.TODO()).Info("there are running containers, updated network configuration will not take affect") - } else if err := configureNetworking(daemon.netController, cfg); err != nil { + log.G(ctx).Info("there are running containers, updated network configuration will not take affect") + } else if err := configureNetworking(ctx, daemon.netController, cfg); err != nil { return err } @@ -865,17 +866,17 @@ func (daemon *Daemon) initNetworkController(cfg *config.Config, activeSandboxes return nil } -func configureNetworking(controller *libnetwork.Controller, conf *config.Config) error { +func configureNetworking(ctx context.Context, controller *libnetwork.Controller, conf *config.Config) error { // Create predefined network "none" if n, _ := controller.NetworkByName(network.NetworkNone); n == nil { - if _, err := controller.NewNetwork(context.TODO(), "null", network.NetworkNone, "", libnetwork.NetworkOptionPersist(true)); err != nil { + if _, err := controller.NewNetwork(ctx, "null", network.NetworkNone, "", libnetwork.NetworkOptionPersist(true)); err != nil { return errors.Wrapf(err, `error creating default %q network`, network.NetworkNone) } } // Create predefined network "host" if n, _ := controller.NetworkByName(network.NetworkHost); n == nil { - if _, err := controller.NewNetwork(context.TODO(), "host", network.NetworkHost, "", libnetwork.NetworkOptionPersist(true)); err != nil { + if _, err := controller.NewNetwork(ctx, "host", network.NetworkHost, "", libnetwork.NetworkOptionPersist(true)); err != nil { return errors.Wrapf(err, `error creating default %q network`, network.NetworkHost) } } @@ -892,7 +893,7 @@ func configureNetworking(controller *libnetwork.Controller, conf *config.Config) if !conf.DisableBridge { // Initialize default driver "bridge" - if err := initBridgeDriver(controller, conf.BridgeConfig); err != nil { + if err := initBridgeDriver(ctx, controller, conf.BridgeConfig); err != nil { return err } } else { @@ -981,7 +982,7 @@ type defBrOpts interface { defGw() (gw net.IP, optName, auxAddrLabel string) } -func initBridgeDriver(controller *libnetwork.Controller, cfg config.BridgeConfig) error { +func initBridgeDriver(ctx context.Context, controller *libnetwork.Controller, cfg config.BridgeConfig) error { bridgeName, userManagedBridge := getDefaultBridgeName(cfg) netOption := map[string]string{ bridge.BridgeName: bridgeName, @@ -1009,7 +1010,7 @@ func initBridgeDriver(controller *libnetwork.Controller, cfg config.BridgeConfig } // Initialize default network on "bridge" with the same name - _, err = controller.NewNetwork(context.TODO(), "bridge", network.NetworkBridge, "", + _, err = controller.NewNetwork(ctx, "bridge", network.NetworkBridge, "", libnetwork.NetworkOptionEnableIPv4(true), libnetwork.NetworkOptionEnableIPv6(cfg.EnableIPv6), libnetwork.NetworkOptionDriverOpts(netOption), diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index 5de9e5bfbd..212eba3b50 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -237,7 +237,7 @@ func (daemon *Daemon) initNetworkController(daemonCfg *config.Config, activeSand if err != nil { return err } - daemon.netController, err = libnetwork.New(netOptions...) + daemon.netController, err = libnetwork.New(context.TODO(), netOptions...) if err != nil { return errors.Wrap(err, "error obtaining controller instance") } diff --git a/daemon/oci_linux_test.go b/daemon/oci_linux_test.go index b33fa365e9..b1ed1a6283 100644 --- a/daemon/oci_linux_test.go +++ b/daemon/oci_linux_test.go @@ -28,7 +28,7 @@ func setupFakeDaemon(t *testing.T, c *container.Container) *Daemon { err := os.MkdirAll(rootfs, 0o755) assert.NilError(t, err) - netController, err := libnetwork.New(nwconfig.OptionDataDir(t.TempDir())) + netController, err := libnetwork.New(context.Background(), nwconfig.OptionDataDir(t.TempDir())) assert.NilError(t, err) d := &Daemon{ diff --git a/daemon/reload_test.go b/daemon/reload_test.go index 8fdf3e1fcd..40c884c93b 100644 --- a/daemon/reload_test.go +++ b/daemon/reload_test.go @@ -1,6 +1,7 @@ package daemon // import "github.com/docker/docker/daemon" import ( + "context" "os" "testing" @@ -310,7 +311,7 @@ func TestDaemonReloadNetworkDiagnosticPort(t *testing.T) { if err != nil { t.Fatal(err) } - controller, err := libnetwork.New(netOptions...) + controller, err := libnetwork.New(context.Background(), netOptions...) if err != nil { t.Fatal(err) } diff --git a/libnetwork/controller.go b/libnetwork/controller.go index 7b244603d0..990c0f7a3e 100644 --- a/libnetwork/controller.go +++ b/libnetwork/controller.go @@ -54,6 +54,7 @@ import ( "time" "github.com/containerd/log" + "github.com/docker/docker/internal/otelutil" "github.com/docker/docker/libnetwork/cluster" "github.com/docker/docker/libnetwork/config" "github.com/docker/docker/libnetwork/datastore" @@ -140,7 +141,13 @@ type Controller struct { } // New creates a new instance of network controller. -func New(cfgOptions ...config.Option) (*Controller, error) { +func New(ctx context.Context, cfgOptions ...config.Option) (_ *Controller, retErr error) { + ctx, span := otel.Tracer("").Start(ctx, "libnetwork.New") + defer func() { + otelutil.RecordStatus(span, retErr) + span.End() + }() + cfg := config.New(cfgOptions...) store, err := datastore.New(cfg.DataDir, cfg.DatastoreBucket) if err != nil { @@ -179,8 +186,8 @@ func New(cfgOptions ...config.Option) (*Controller, error) { c.WalkNetworks(func(nw *Network) bool { if n := nw; n.hasSpecialDriver() && !n.ConfigOnly() { - if err := n.getController().addNetwork(context.TODO(), n); err != nil { - log.G(context.TODO()).Warnf("Failed to populate network %q with driver %q", nw.Name(), nw.Type()) + if err := n.getController().addNetwork(ctx, n); err != nil { + log.G(ctx).Warnf("Failed to populate network %q with driver %q", nw.Name(), nw.Type()) } } return false @@ -192,12 +199,12 @@ func New(cfgOptions ...config.Option) (*Controller, error) { c.reservePools() if err := c.sandboxRestore(c.cfg.ActiveSandboxes); err != nil { - log.G(context.TODO()).WithError(err).Error("error during sandbox cleanup") + log.G(ctx).WithError(err).Error("error during sandbox cleanup") } // Cleanup resources if err := c.cleanupLocalEndpoints(); err != nil { - log.G(context.TODO()).WithError(err).Warnf("error during endpoint cleanup") + log.G(ctx).WithError(err).Warnf("error during endpoint cleanup") } c.networkCleanup() diff --git a/libnetwork/endpoint_store_test.go b/libnetwork/endpoint_store_test.go index 2b0bb5c054..a2f04adc0e 100644 --- a/libnetwork/endpoint_store_test.go +++ b/libnetwork/endpoint_store_test.go @@ -13,7 +13,7 @@ import ( func TestEndpointStore(t *testing.T) { configOption := config.OptionDataDir(t.TempDir()) - c, err := New(configOption) + c, err := New(context.Background(), configOption) assert.NilError(t, err) defer c.Stop() diff --git a/libnetwork/firewall_linux_test.go b/libnetwork/firewall_linux_test.go index 23006558d8..9bdbf27742 100644 --- a/libnetwork/firewall_linux_test.go +++ b/libnetwork/firewall_linux_test.go @@ -1,6 +1,7 @@ package libnetwork import ( + "context" "fmt" "strings" "testing" @@ -60,6 +61,7 @@ func TestUserChain(t *testing.T) { defer resetIptables(t) c, err := New( + context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDriverConfig("bridge", map[string]any{ netlabel.GenericData: options.Generic{ diff --git a/libnetwork/libnetwork_internal_test.go b/libnetwork/libnetwork_internal_test.go index 0d4c6edcd7..994b5d7abb 100644 --- a/libnetwork/libnetwork_internal_test.go +++ b/libnetwork/libnetwork_internal_test.go @@ -322,7 +322,7 @@ func compareNwLists(a, b []*net.IPNet) bool { func TestAuxAddresses(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir())) + c, err := New(context.Background(), config.OptionDataDir(t.TempDir())) if err != nil { t.Fatal(err) } @@ -398,7 +398,7 @@ func TestUpdateSvcRecord(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - ctrlr, err := New(config.OptionDataDir(t.TempDir())) + ctrlr, err := New(context.Background(), config.OptionDataDir(t.TempDir())) assert.NilError(t, err) defer ctrlr.Stop() @@ -477,7 +477,7 @@ func TestSRVServiceQuery(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir()), + c, err := New(context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDefaultAddressPoolConfig(ipamutils.GetLocalScopeDefaultNetworks())) if err != nil { t.Fatal(err) @@ -578,7 +578,7 @@ func TestServiceVIPReuse(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir()), + c, err := New(context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDefaultAddressPoolConfig(ipamutils.GetLocalScopeDefaultNetworks())) if err != nil { t.Fatal(err) @@ -699,7 +699,7 @@ func TestIpamReleaseOnNetDriverFailures(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir())) + c, err := New(context.Background(), config.OptionDataDir(t.TempDir())) if err != nil { t.Fatal(err) } diff --git a/libnetwork/libnetwork_linux_test.go b/libnetwork/libnetwork_linux_test.go index 3262919ffb..345ec4715a 100644 --- a/libnetwork/libnetwork_linux_test.go +++ b/libnetwork/libnetwork_linux_test.go @@ -46,6 +46,7 @@ const ( func newController(t *testing.T) *libnetwork.Controller { t.Helper() c, err := libnetwork.New( + context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDriverConfig(bridgeNetType, map[string]interface{}{ netlabel.GenericData: options.Generic{ @@ -888,7 +889,7 @@ func TestInvalidRemoteDriver(t *testing.T) { err = os.WriteFile(filepath.Join(specPath, "invalid-network-driver.spec"), []byte(server.URL), 0o644) assert.NilError(t, err) - ctrlr, err := libnetwork.New(config.OptionDataDir(t.TempDir())) + ctrlr, err := libnetwork.New(context.Background(), config.OptionDataDir(t.TempDir())) assert.NilError(t, err) defer ctrlr.Stop() diff --git a/libnetwork/network_store_test.go b/libnetwork/network_store_test.go index dba88916f8..414bab6312 100644 --- a/libnetwork/network_store_test.go +++ b/libnetwork/network_store_test.go @@ -13,7 +13,7 @@ import ( func TestNetworkStore(t *testing.T) { configOption := config.OptionDataDir(t.TempDir()) - c, err := New(configOption) + c, err := New(context.Background(), configOption) assert.NilError(t, err) defer c.Stop() diff --git a/libnetwork/resolver_unix_test.go b/libnetwork/resolver_unix_test.go index 9f02ff5eee..da83ac2e87 100644 --- a/libnetwork/resolver_unix_test.go +++ b/libnetwork/resolver_unix_test.go @@ -16,7 +16,7 @@ import ( // test only works on linux func TestDNSIPQuery(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir()), + c, err := New(context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDefaultAddressPoolConfig(ipamutils.GetLocalScopeDefaultNetworks())) if err != nil { t.Fatal(err) @@ -114,7 +114,8 @@ func TestDNSProxyServFail(t *testing.T) { osctx := netnsutils.SetupTestOSContextEx(t) defer osctx.Cleanup(t) - c, err := New(config.OptionDataDir(t.TempDir()), + c, err := New(context.Background(), + config.OptionDataDir(t.TempDir()), config.OptionDefaultAddressPoolConfig(ipamutils.GetLocalScopeDefaultNetworks())) if err != nil { t.Fatal(err) diff --git a/libnetwork/sandbox_dns_unix_test.go b/libnetwork/sandbox_dns_unix_test.go index d02f015cbf..0097e10305 100644 --- a/libnetwork/sandbox_dns_unix_test.go +++ b/libnetwork/sandbox_dns_unix_test.go @@ -13,7 +13,7 @@ import ( ) func TestDNSOptions(t *testing.T) { - c, err := New(config.OptionDataDir(t.TempDir())) + c, err := New(context.Background(), config.OptionDataDir(t.TempDir())) assert.NilError(t, err) sb, err := c.NewSandbox(context.Background(), "cnt1", nil) diff --git a/libnetwork/sandbox_unix_test.go b/libnetwork/sandbox_unix_test.go index 590ca888f5..cc4c65c57b 100644 --- a/libnetwork/sandbox_unix_test.go +++ b/libnetwork/sandbox_unix_test.go @@ -22,6 +22,7 @@ import ( func getTestEnv(t *testing.T, opts ...[]NetworkOption) (*Controller, []*Network) { const netType = "bridge" c, err := New( + context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDriverConfig(netType, map[string]any{ netlabel.GenericData: options.Generic{"EnableIPForwarding": true}, diff --git a/libnetwork/service_common_unix_test.go b/libnetwork/service_common_unix_test.go index 76f9719069..ab24c535c8 100644 --- a/libnetwork/service_common_unix_test.go +++ b/libnetwork/service_common_unix_test.go @@ -15,7 +15,7 @@ import ( func TestCleanupServiceDiscovery(t *testing.T) { defer netnsutils.SetupTestOSContext(t)() - c, err := New(config.OptionDataDir(t.TempDir()), + c, err := New(context.Background(), config.OptionDataDir(t.TempDir()), config.OptionDefaultAddressPoolConfig(ipamutils.GetLocalScopeDefaultNetworks())) assert.NilError(t, err) defer c.Stop() diff --git a/libnetwork/store_linux_test.go b/libnetwork/store_linux_test.go index 9cc2712476..0897148146 100644 --- a/libnetwork/store_linux_test.go +++ b/libnetwork/store_linux_test.go @@ -17,7 +17,7 @@ func TestBoltdbBackend(t *testing.T) { func TestNoPersist(t *testing.T) { configOption := config.OptionDataDir(t.TempDir()) - testController, err := New(configOption) + testController, err := New(context.Background(), configOption) if err != nil { t.Fatalf("Error creating new controller: %v", err) } @@ -34,7 +34,7 @@ func TestNoPersist(t *testing.T) { // Create a new controller using the same database-file. The network // should not have persisted. - testController, err = New(configOption) + testController, err = New(context.Background(), configOption) if err != nil { t.Fatalf("Error creating new controller: %v", err) } diff --git a/libnetwork/store_test.go b/libnetwork/store_test.go index 6854d045e9..6997718ce9 100644 --- a/libnetwork/store_test.go +++ b/libnetwork/store_test.go @@ -18,7 +18,7 @@ func testLocalBackend(t *testing.T, path, bucket string) { }), } - testController, err := New(cfgOptions...) + testController, err := New(context.Background(), cfgOptions...) if err != nil { t.Fatalf("Error new controller: %v", err) } @@ -52,7 +52,7 @@ func testLocalBackend(t *testing.T, path, bucket string) { testController.Stop() // test restore of local store - testController, err = New(cfgOptions...) + testController, err = New(context.Background(), cfgOptions...) if err != nil { t.Fatalf("Error creating controller: %v", err) }