config.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package config
  2. import (
  3. "context"
  4. "strings"
  5. "github.com/containerd/containerd/log"
  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. )
  13. const (
  14. warningThNetworkControlPlaneMTU = 1500
  15. minimumNetworkControlPlaneMTU = 500
  16. )
  17. // Config encapsulates configurations of various Libnetwork components
  18. type Config struct {
  19. DataDir string
  20. ExecRoot string
  21. DefaultNetwork string
  22. DefaultDriver string
  23. Labels []string
  24. driverCfg map[string]map[string]any
  25. ClusterProvider cluster.Provider
  26. NetworkControlPlaneMTU int
  27. DefaultAddressPool []*ipamutils.NetworkToSplit
  28. Scope datastore.ScopeCfg
  29. ActiveSandboxes map[string]interface{}
  30. PluginGetter plugingetter.PluginGetter
  31. }
  32. // New creates a new Config and initializes it with the given Options.
  33. func New(opts ...Option) *Config {
  34. cfg := &Config{
  35. driverCfg: make(map[string]map[string]any),
  36. }
  37. for _, opt := range opts {
  38. if opt != nil {
  39. opt(cfg)
  40. }
  41. }
  42. // load default scope configs which don't have explicit user specified configs.
  43. if cfg.Scope == (datastore.ScopeCfg{}) {
  44. cfg.Scope = datastore.DefaultScope(cfg.DataDir)
  45. }
  46. return cfg
  47. }
  48. func (c *Config) DriverConfig(name string) map[string]any {
  49. return c.driverCfg[name]
  50. }
  51. // Option is an option setter function type used to pass various configurations
  52. // to the controller
  53. type Option func(c *Config)
  54. // OptionDefaultNetwork function returns an option setter for a default network
  55. func OptionDefaultNetwork(dn string) Option {
  56. return func(c *Config) {
  57. log.G(context.TODO()).Debugf("Option DefaultNetwork: %s", dn)
  58. c.DefaultNetwork = strings.TrimSpace(dn)
  59. }
  60. }
  61. // OptionDefaultDriver function returns an option setter for default driver
  62. func OptionDefaultDriver(dd string) Option {
  63. return func(c *Config) {
  64. log.G(context.TODO()).Debugf("Option DefaultDriver: %s", dd)
  65. c.DefaultDriver = strings.TrimSpace(dd)
  66. }
  67. }
  68. // OptionDefaultAddressPoolConfig function returns an option setter for default address pool
  69. func OptionDefaultAddressPoolConfig(addressPool []*ipamutils.NetworkToSplit) Option {
  70. return func(c *Config) {
  71. c.DefaultAddressPool = addressPool
  72. }
  73. }
  74. // OptionDriverConfig returns an option setter for driver configuration.
  75. func OptionDriverConfig(networkType string, config map[string]any) Option {
  76. return func(c *Config) {
  77. c.driverCfg[networkType] = config
  78. }
  79. }
  80. // OptionLabels function returns an option setter for labels
  81. func OptionLabels(labels []string) Option {
  82. return func(c *Config) {
  83. for _, label := range labels {
  84. if strings.HasPrefix(label, netlabel.Prefix) {
  85. c.Labels = append(c.Labels, label)
  86. }
  87. }
  88. }
  89. }
  90. // OptionDataDir function returns an option setter for data folder
  91. func OptionDataDir(dataDir string) Option {
  92. return func(c *Config) {
  93. c.DataDir = dataDir
  94. }
  95. }
  96. // OptionExecRoot function returns an option setter for exec root folder
  97. func OptionExecRoot(execRoot string) Option {
  98. return func(c *Config) {
  99. c.ExecRoot = execRoot
  100. osl.SetBasePath(execRoot)
  101. }
  102. }
  103. // OptionPluginGetter returns a plugingetter for remote drivers.
  104. func OptionPluginGetter(pg plugingetter.PluginGetter) Option {
  105. return func(c *Config) {
  106. c.PluginGetter = pg
  107. }
  108. }
  109. // OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU
  110. func OptionNetworkControlPlaneMTU(exp int) Option {
  111. return func(c *Config) {
  112. log.G(context.TODO()).Debugf("Network Control Plane MTU: %d", exp)
  113. if exp < warningThNetworkControlPlaneMTU {
  114. log.G(context.TODO()).Warnf("Received a MTU of %d, this value is very low, the network control plane can misbehave,"+
  115. " defaulting to minimum value (%d)", exp, minimumNetworkControlPlaneMTU)
  116. if exp < minimumNetworkControlPlaneMTU {
  117. exp = minimumNetworkControlPlaneMTU
  118. }
  119. }
  120. c.NetworkControlPlaneMTU = exp
  121. }
  122. }
  123. // OptionActiveSandboxes function returns an option setter for passing the sandboxes
  124. // which were active during previous daemon life
  125. func OptionActiveSandboxes(sandboxes map[string]interface{}) Option {
  126. return func(c *Config) {
  127. c.ActiveSandboxes = sandboxes
  128. }
  129. }