config.go 4.7 KB

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