github.com/rish1988/moby@v25.0.2+incompatible/libnetwork/config/config.go (about) 1 // FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16: 2 //go:build go1.19 3 4 package config 5 6 import ( 7 "context" 8 "strings" 9 10 "github.com/containerd/log" 11 "github.com/docker/docker/libnetwork/cluster" 12 "github.com/docker/docker/libnetwork/datastore" 13 "github.com/docker/docker/libnetwork/ipamutils" 14 "github.com/docker/docker/libnetwork/netlabel" 15 "github.com/docker/docker/pkg/plugingetter" 16 ) 17 18 const ( 19 warningThNetworkControlPlaneMTU = 1500 20 minimumNetworkControlPlaneMTU = 500 21 ) 22 23 // Config encapsulates configurations of various Libnetwork components 24 type Config struct { 25 DataDir string 26 // ExecRoot is the base-path for libnetwork external key listeners 27 // (created in "<ExecRoot>/libnetwork/<Controller-Short-ID>.sock"), 28 // and is passed as "-exec-root: argument for "libnetwork-setkey". 29 // 30 // It is only used on Linux, but referenced in some "unix" files 31 // (linux and freebsd). 32 // 33 // FIXME(thaJeztah): ExecRoot is only used for Controller.startExternalKeyListener(), but "libnetwork-setkey" is only implemented on Linux. 34 ExecRoot string 35 DefaultNetwork string 36 DefaultDriver string 37 Labels []string 38 driverCfg map[string]map[string]any 39 ClusterProvider cluster.Provider 40 NetworkControlPlaneMTU int 41 DefaultAddressPool []*ipamutils.NetworkToSplit 42 Scope datastore.ScopeCfg 43 ActiveSandboxes map[string]interface{} 44 PluginGetter plugingetter.PluginGetter 45 } 46 47 // New creates a new Config and initializes it with the given Options. 48 func New(opts ...Option) *Config { 49 cfg := &Config{ 50 driverCfg: make(map[string]map[string]any), 51 } 52 53 for _, opt := range opts { 54 if opt != nil { 55 opt(cfg) 56 } 57 } 58 59 // load default scope configs which don't have explicit user specified configs. 60 if cfg.Scope == (datastore.ScopeCfg{}) { 61 cfg.Scope = datastore.DefaultScope(cfg.DataDir) 62 } 63 return cfg 64 } 65 66 func (c *Config) DriverConfig(name string) map[string]any { 67 return c.driverCfg[name] 68 } 69 70 // Option is an option setter function type used to pass various configurations 71 // to the controller 72 type Option func(c *Config) 73 74 // OptionDefaultNetwork function returns an option setter for a default network 75 func OptionDefaultNetwork(dn string) Option { 76 return func(c *Config) { 77 log.G(context.TODO()).Debugf("Option DefaultNetwork: %s", dn) 78 c.DefaultNetwork = strings.TrimSpace(dn) 79 } 80 } 81 82 // OptionDefaultDriver function returns an option setter for default driver 83 func OptionDefaultDriver(dd string) Option { 84 return func(c *Config) { 85 log.G(context.TODO()).Debugf("Option DefaultDriver: %s", dd) 86 c.DefaultDriver = strings.TrimSpace(dd) 87 } 88 } 89 90 // OptionDefaultAddressPoolConfig function returns an option setter for default address pool 91 func OptionDefaultAddressPoolConfig(addressPool []*ipamutils.NetworkToSplit) Option { 92 return func(c *Config) { 93 c.DefaultAddressPool = addressPool 94 } 95 } 96 97 // OptionDriverConfig returns an option setter for driver configuration. 98 func OptionDriverConfig(networkType string, config map[string]any) Option { 99 return func(c *Config) { 100 c.driverCfg[networkType] = config 101 } 102 } 103 104 // OptionLabels function returns an option setter for labels 105 func OptionLabels(labels []string) Option { 106 return func(c *Config) { 107 for _, label := range labels { 108 if strings.HasPrefix(label, netlabel.Prefix) { 109 c.Labels = append(c.Labels, label) 110 } 111 } 112 } 113 } 114 115 // OptionDataDir function returns an option setter for data folder 116 func OptionDataDir(dataDir string) Option { 117 return func(c *Config) { 118 c.DataDir = dataDir 119 } 120 } 121 122 // OptionExecRoot function returns an option setter for exec root folder. 123 // 124 // On Linux, it sets both the controller's ExecRoot and osl.basePath, whereas 125 // on FreeBSD, it only sets the controller's ExecRoot. It is a no-op on other 126 // platforms. 127 func OptionExecRoot(execRoot string) Option { 128 return optionExecRoot(execRoot) 129 } 130 131 // OptionPluginGetter returns a plugingetter for remote drivers. 132 func OptionPluginGetter(pg plugingetter.PluginGetter) Option { 133 return func(c *Config) { 134 c.PluginGetter = pg 135 } 136 } 137 138 // OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU 139 func OptionNetworkControlPlaneMTU(exp int) Option { 140 return func(c *Config) { 141 log.G(context.TODO()).Debugf("Network Control Plane MTU: %d", exp) 142 if exp < warningThNetworkControlPlaneMTU { 143 log.G(context.TODO()).Warnf("Received a MTU of %d, this value is very low, the network control plane can misbehave,"+ 144 " defaulting to minimum value (%d)", exp, minimumNetworkControlPlaneMTU) 145 if exp < minimumNetworkControlPlaneMTU { 146 exp = minimumNetworkControlPlaneMTU 147 } 148 } 149 c.NetworkControlPlaneMTU = exp 150 } 151 } 152 153 // OptionActiveSandboxes function returns an option setter for passing the sandboxes 154 // which were active during previous daemon life 155 func OptionActiveSandboxes(sandboxes map[string]interface{}) Option { 156 return func(c *Config) { 157 c.ActiveSandboxes = sandboxes 158 } 159 }