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  }