123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- package config
- import (
- "context"
- "strings"
- "github.com/containerd/log"
- "github.com/docker/docker/libnetwork/cluster"
- "github.com/docker/docker/libnetwork/datastore"
- "github.com/docker/docker/libnetwork/ipamutils"
- "github.com/docker/docker/libnetwork/netlabel"
- "github.com/docker/docker/pkg/plugingetter"
- )
- const (
- warningThNetworkControlPlaneMTU = 1500
- minimumNetworkControlPlaneMTU = 500
- )
- // Config encapsulates configurations of various Libnetwork components
- type Config struct {
- 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
- driverCfg map[string]map[string]any
- ClusterProvider cluster.Provider
- NetworkControlPlaneMTU int
- DefaultAddressPool []*ipamutils.NetworkToSplit
- Scope datastore.ScopeCfg
- ActiveSandboxes map[string]interface{}
- PluginGetter plugingetter.PluginGetter
- }
- // New creates a new Config and initializes it with the given Options.
- func New(opts ...Option) *Config {
- cfg := &Config{
- driverCfg: make(map[string]map[string]any),
- }
- for _, opt := range opts {
- if opt != nil {
- opt(cfg)
- }
- }
- // load default scope configs which don't have explicit user specified configs.
- if cfg.Scope == (datastore.ScopeCfg{}) {
- cfg.Scope = datastore.DefaultScope(cfg.DataDir)
- }
- return cfg
- }
- func (c *Config) DriverConfig(name string) map[string]any {
- return c.driverCfg[name]
- }
- // 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
- }
- }
- // OptionDriverConfig returns an option setter for driver configuration.
- func OptionDriverConfig(networkType string, config map[string]any) Option {
- return func(c *Config) {
- c.driverCfg[networkType] = config
- }
- }
- // OptionLabels function returns an option setter for labels
- func OptionLabels(labels []string) Option {
- return func(c *Config) {
- for _, label := range labels {
- if strings.HasPrefix(label, netlabel.Prefix) {
- c.Labels = append(c.Labels, label)
- }
- }
- }
- }
- // 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]interface{}) Option {
- return func(c *Config) {
- c.ActiveSandboxes = sandboxes
- }
- }
|