| 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 | |
| } | |
| } |