Files
moby/daemon/libnetwork/config/config.go
Albin Kerouanton 2436458227 libnet/d/bridge: Register: pass a Configuration struct
Libnetwork passes a map[string]any to the bridge driver's Register
function. This forces the daemon to convert its configuration into a
map, and the driver to convert that map back into a struct.

This is unnecessary complexity, and makes it harder to track down where
and how bridge driver configuration fields are set.

Refactor libnetwork to let the daemon register the bridge.Configuration
directly through a new option `OptionBridgeConfig`.

The bridge driver now takes a `Configuration` param that needs no
special treatment.

Signed-off-by: Albin Kerouanton <albinker@gmail.com>
2025-09-03 12:10:10 +02:00

159 lines
4.7 KiB
Go

package config
import (
"context"
"strings"
"github.com/containerd/log"
"github.com/moby/moby/v2/daemon/libnetwork/cluster"
"github.com/moby/moby/v2/daemon/libnetwork/datastore"
"github.com/moby/moby/v2/daemon/libnetwork/ipamutils"
"github.com/moby/moby/v2/pkg/plugingetter"
)
const (
warningThNetworkControlPlaneMTU = 1500
minimumNetworkControlPlaneMTU = 500
)
// Config encapsulates configurations of various Libnetwork components
type Config struct {
PlatformConfig
DataDir string
// ExecRoot is the base-path for libnetwork external key listeners
// (created in "<ExecRoot>/libnetwork/<Controller-Short-ID>.sock"),
// and is passed as "-exec-root: argument for "libnetwork-setkey".
//
// It is only used on Linux, but referenced in some "unix" files
// (linux and freebsd).
//
// FIXME(thaJeztah): ExecRoot is only used for Controller.startExternalKeyListener(), but "libnetwork-setkey" is only implemented on Linux.
ExecRoot string
DefaultNetwork string
DefaultDriver string
Labels []string
ClusterProvider cluster.Provider
NetworkControlPlaneMTU int
DefaultAddressPool []*ipamutils.NetworkToSplit
DatastoreBucket string
ActiveSandboxes map[string]any
PluginGetter plugingetter.PluginGetter
FirewallBackend string
Rootless bool
EnableUserlandProxy bool
UserlandProxyPath string
}
// New creates a new Config and initializes it with the given Options.
func New(opts ...Option) *Config {
cfg := &Config{
DatastoreBucket: datastore.DefaultBucket,
}
for _, opt := range opts {
if opt != nil {
opt(cfg)
}
}
return cfg
}
// Option is an option setter function type used to pass various configurations
// to the controller
type Option func(c *Config)
// OptionDefaultNetwork function returns an option setter for a default network
func OptionDefaultNetwork(dn string) Option {
return func(c *Config) {
log.G(context.TODO()).Debugf("Option DefaultNetwork: %s", dn)
c.DefaultNetwork = strings.TrimSpace(dn)
}
}
// OptionDefaultDriver function returns an option setter for default driver
func OptionDefaultDriver(dd string) Option {
return func(c *Config) {
log.G(context.TODO()).Debugf("Option DefaultDriver: %s", dd)
c.DefaultDriver = strings.TrimSpace(dd)
}
}
// OptionDefaultAddressPoolConfig function returns an option setter for default address pool
func OptionDefaultAddressPoolConfig(addressPool []*ipamutils.NetworkToSplit) Option {
return func(c *Config) {
c.DefaultAddressPool = addressPool
}
}
// OptionDataDir function returns an option setter for data folder
func OptionDataDir(dataDir string) Option {
return func(c *Config) {
c.DataDir = dataDir
}
}
// OptionExecRoot function returns an option setter for exec root folder.
//
// On Linux, it sets both the controller's ExecRoot and osl.basePath, whereas
// on FreeBSD, it only sets the controller's ExecRoot. It is a no-op on other
// platforms.
func OptionExecRoot(execRoot string) Option {
return optionExecRoot(execRoot)
}
// OptionPluginGetter returns a plugingetter for remote drivers.
func OptionPluginGetter(pg plugingetter.PluginGetter) Option {
return func(c *Config) {
c.PluginGetter = pg
}
}
// OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU
func OptionNetworkControlPlaneMTU(exp int) Option {
return func(c *Config) {
log.G(context.TODO()).Debugf("Network Control Plane MTU: %d", exp)
if exp < warningThNetworkControlPlaneMTU {
log.G(context.TODO()).Warnf("Received a MTU of %d, this value is very low, the network control plane can misbehave,"+
" defaulting to minimum value (%d)", exp, minimumNetworkControlPlaneMTU)
if exp < minimumNetworkControlPlaneMTU {
exp = minimumNetworkControlPlaneMTU
}
}
c.NetworkControlPlaneMTU = exp
}
}
// OptionActiveSandboxes function returns an option setter for passing the sandboxes
// which were active during previous daemon life
func OptionActiveSandboxes(sandboxes map[string]any) Option {
return func(c *Config) {
c.ActiveSandboxes = sandboxes
}
}
// OptionFirewallBackend returns an option setter for selection of the firewall backend.
func OptionFirewallBackend(val string) Option {
return func(c *Config) {
c.FirewallBackend = val
}
}
// OptionRootless returns an option setter that indicates whether the daemon is
// running in rootless mode.
func OptionRootless(rootless bool) Option {
return func(c *Config) {
c.Rootless = rootless
}
}
// OptionUserlandProxy returns an option setter that indicates whether the
// userland proxy is enabled, and sets the path to the proxy binary.
func OptionUserlandProxy(enabled bool, proxyPath string) Option {
return func(c *Config) {
c.EnableUserlandProxy = enabled
c.UserlandProxyPath = proxyPath
}
}