github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/libnetwork/config/config.go (about)

     1  package config
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/docker/docker/libnetwork/cluster"
     7  	"github.com/docker/docker/libnetwork/datastore"
     8  	"github.com/docker/docker/libnetwork/ipamutils"
     9  	"github.com/docker/docker/libnetwork/netlabel"
    10  	"github.com/docker/docker/libnetwork/osl"
    11  	"github.com/docker/docker/pkg/plugingetter"
    12  	"github.com/docker/libkv/store"
    13  	"github.com/sirupsen/logrus"
    14  )
    15  
    16  const (
    17  	warningThNetworkControlPlaneMTU = 1500
    18  	minimumNetworkControlPlaneMTU   = 500
    19  )
    20  
    21  // Config encapsulates configurations of various Libnetwork components
    22  type Config struct {
    23  	DataDir                string
    24  	ExecRoot               string
    25  	DefaultNetwork         string
    26  	DefaultDriver          string
    27  	Labels                 []string
    28  	DriverCfg              map[string]interface{}
    29  	ClusterProvider        cluster.Provider
    30  	NetworkControlPlaneMTU int
    31  	DefaultAddressPool     []*ipamutils.NetworkToSplit
    32  	Scopes                 map[string]*datastore.ScopeCfg
    33  	ActiveSandboxes        map[string]interface{}
    34  	PluginGetter           plugingetter.PluginGetter
    35  }
    36  
    37  // New creates a new Config and initializes it with the given Options.
    38  func New(opts ...Option) *Config {
    39  	cfg := &Config{
    40  		DriverCfg: make(map[string]interface{}),
    41  		Scopes:    make(map[string]*datastore.ScopeCfg),
    42  	}
    43  
    44  	for _, opt := range opts {
    45  		if opt != nil {
    46  			opt(cfg)
    47  		}
    48  	}
    49  
    50  	// load default scope configs which don't have explicit user specified configs.
    51  	for k, v := range datastore.DefaultScopes(cfg.DataDir) {
    52  		if _, ok := cfg.Scopes[k]; !ok {
    53  			cfg.Scopes[k] = v
    54  		}
    55  	}
    56  	return cfg
    57  }
    58  
    59  // Option is an option setter function type used to pass various configurations
    60  // to the controller
    61  type Option func(c *Config)
    62  
    63  // OptionDefaultNetwork function returns an option setter for a default network
    64  func OptionDefaultNetwork(dn string) Option {
    65  	return func(c *Config) {
    66  		logrus.Debugf("Option DefaultNetwork: %s", dn)
    67  		c.DefaultNetwork = strings.TrimSpace(dn)
    68  	}
    69  }
    70  
    71  // OptionDefaultDriver function returns an option setter for default driver
    72  func OptionDefaultDriver(dd string) Option {
    73  	return func(c *Config) {
    74  		logrus.Debugf("Option DefaultDriver: %s", dd)
    75  		c.DefaultDriver = strings.TrimSpace(dd)
    76  	}
    77  }
    78  
    79  // OptionDefaultAddressPoolConfig function returns an option setter for default address pool
    80  func OptionDefaultAddressPoolConfig(addressPool []*ipamutils.NetworkToSplit) Option {
    81  	return func(c *Config) {
    82  		c.DefaultAddressPool = addressPool
    83  	}
    84  }
    85  
    86  // OptionDriverConfig returns an option setter for driver configuration.
    87  func OptionDriverConfig(networkType string, config map[string]interface{}) Option {
    88  	return func(c *Config) {
    89  		c.DriverCfg[networkType] = config
    90  	}
    91  }
    92  
    93  // OptionLabels function returns an option setter for labels
    94  func OptionLabels(labels []string) Option {
    95  	return func(c *Config) {
    96  		for _, label := range labels {
    97  			if strings.HasPrefix(label, netlabel.Prefix) {
    98  				c.Labels = append(c.Labels, label)
    99  			}
   100  		}
   101  	}
   102  }
   103  
   104  // OptionDataDir function returns an option setter for data folder
   105  func OptionDataDir(dataDir string) Option {
   106  	return func(c *Config) {
   107  		c.DataDir = dataDir
   108  	}
   109  }
   110  
   111  // OptionExecRoot function returns an option setter for exec root folder
   112  func OptionExecRoot(execRoot string) Option {
   113  	return func(c *Config) {
   114  		c.ExecRoot = execRoot
   115  		osl.SetBasePath(execRoot)
   116  	}
   117  }
   118  
   119  // OptionPluginGetter returns a plugingetter for remote drivers.
   120  func OptionPluginGetter(pg plugingetter.PluginGetter) Option {
   121  	return func(c *Config) {
   122  		c.PluginGetter = pg
   123  	}
   124  }
   125  
   126  // OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU
   127  func OptionNetworkControlPlaneMTU(exp int) Option {
   128  	return func(c *Config) {
   129  		logrus.Debugf("Network Control Plane MTU: %d", exp)
   130  		if exp < warningThNetworkControlPlaneMTU {
   131  			logrus.Warnf("Received a MTU of %d, this value is very low, the network control plane can misbehave,"+
   132  				" defaulting to minimum value (%d)", exp, minimumNetworkControlPlaneMTU)
   133  			if exp < minimumNetworkControlPlaneMTU {
   134  				exp = minimumNetworkControlPlaneMTU
   135  			}
   136  		}
   137  		c.NetworkControlPlaneMTU = exp
   138  	}
   139  }
   140  
   141  // IsValidName validates configuration objects supported by libnetwork
   142  func IsValidName(name string) bool {
   143  	return strings.TrimSpace(name) != ""
   144  }
   145  
   146  // OptionLocalKVProvider function returns an option setter for kvstore provider
   147  func OptionLocalKVProvider(provider string) Option {
   148  	return func(c *Config) {
   149  		logrus.Debugf("Option OptionLocalKVProvider: %s", provider)
   150  		if _, ok := c.Scopes[datastore.LocalScope]; !ok {
   151  			c.Scopes[datastore.LocalScope] = &datastore.ScopeCfg{}
   152  		}
   153  		c.Scopes[datastore.LocalScope].Client.Provider = strings.TrimSpace(provider)
   154  	}
   155  }
   156  
   157  // OptionLocalKVProviderURL function returns an option setter for kvstore url
   158  func OptionLocalKVProviderURL(url string) Option {
   159  	return func(c *Config) {
   160  		logrus.Debugf("Option OptionLocalKVProviderURL: %s", url)
   161  		if _, ok := c.Scopes[datastore.LocalScope]; !ok {
   162  			c.Scopes[datastore.LocalScope] = &datastore.ScopeCfg{}
   163  		}
   164  		c.Scopes[datastore.LocalScope].Client.Address = strings.TrimSpace(url)
   165  	}
   166  }
   167  
   168  // OptionLocalKVProviderConfig function returns an option setter for kvstore config
   169  func OptionLocalKVProviderConfig(config *store.Config) Option {
   170  	return func(c *Config) {
   171  		logrus.Debugf("Option OptionLocalKVProviderConfig: %v", config)
   172  		if _, ok := c.Scopes[datastore.LocalScope]; !ok {
   173  			c.Scopes[datastore.LocalScope] = &datastore.ScopeCfg{}
   174  		}
   175  		c.Scopes[datastore.LocalScope].Client.Config = config
   176  	}
   177  }
   178  
   179  // OptionActiveSandboxes function returns an option setter for passing the sandboxes
   180  // which were active during previous daemon life
   181  func OptionActiveSandboxes(sandboxes map[string]interface{}) Option {
   182  	return func(c *Config) {
   183  		c.ActiveSandboxes = sandboxes
   184  	}
   185  }