From 95b45eff5df658ca9ac316f733d81edc7889128b Mon Sep 17 00:00:00 2001 From: Doug Smith Date: Mon, 19 Dec 2022 12:37:34 -0500 Subject: [PATCH] Updates config options and tests for socketfile and cniconfdir between thin/thick (#1002) --- cmd/multus-daemon/main.go | 8 ++++++ pkg/server/config/generator.go | 19 +++++++++++++++ pkg/server/config/generator_test.go | 38 +++++++++++++++++++++++++++++ pkg/server/config/manager.go | 7 +++--- 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/cmd/multus-daemon/main.go b/cmd/multus-daemon/main.go index 27c80a598..009fd41c3 100644 --- a/cmd/multus-daemon/main.go +++ b/cmd/multus-daemon/main.go @@ -56,6 +56,7 @@ const ( defaultMultusMasterCNIFile = "" defaultMultusNamespaceIsolation = false defaultMultusReadinessIndicatorFile = "" + defaultSocketDir = "/run/multus/" ) func main() { @@ -75,6 +76,7 @@ func main() { logMaxBackups := flag.Int("multus-log-max-backups", defaultMultusLogMaxBackups, "The maximum number of old log files to retain") logCompress := flag.Bool("multus-log-compress", defaultMultusLogCompress, "Compress determines if the rotated log files should be compressed using gzip") cniVersion := flag.String("cni-version", "", "Allows you to specify CNI spec version. Used only with --multus-conf-file=auto.") + socketDir := flag.String("socket-dir", defaultSocketDir, "Specifies the directory where the socket file resides.") forceCNIVersion := flag.Bool("force-cni-version", false, "Force to use given CNI version. only for kind-e2e testing") // this is only for kind-e2e readinessIndicator := flag.String("readiness-indicator-file", "", "Which file should be used as the readiness indicator. Used only with --multus-conf-file=auto.") overrideNetworkName := flag.Bool("override-network-name", false, "Used when we need overrides the name of the multus configuration with the name of the delegated primary CNI") @@ -136,6 +138,12 @@ func main() { configurationOptions, config.WithReadinessFileIndicator(*readinessIndicator)) } + configurationOptions = append( + configurationOptions, config.WithCniConfigDir(*cniConfigDir)) + + configurationOptions = append( + configurationOptions, config.WithSocketDir(*socketDir)) + // logOptions var logOptionFuncs []config.LogOptionFunc diff --git a/pkg/server/config/generator.go b/pkg/server/config/generator.go index b2d0bb98d..4a29faf8f 100644 --- a/pkg/server/config/generator.go +++ b/pkg/server/config/generator.go @@ -54,6 +54,8 @@ type MultusConf struct { ReadinessIndicatorFile string `json:"readinessindicatorfile,omitempty"` Type string `json:"type"` CniDir string `json:"cniDir,omitempty"` + CniConfigDir string `json:"cniConfigDir,omitempty"` + SocketDir string `json:"socketDir,omitempty"` } // LogOptions specifies the configuration of the log @@ -222,6 +224,23 @@ func WithCniDir(cniDir string) Option { } } +// WithCniConfigDir mutates the inner state to set the +// multus CNI configuration directory +func WithCniConfigDir(confDir string) Option { + return func(conf *MultusConf) error { + conf.CniConfigDir = confDir + return nil + } +} + +// WithSocketDir mutates the socket directory +func WithSocketDir(sockDir string) Option { + return func(conf *MultusConf) error { + conf.SocketDir = sockDir + return nil + } +} + func withClusterNetwork(clusterNetwork string) Option { return func(conf *MultusConf) error { conf.ClusterNetwork = clusterNetwork diff --git a/pkg/server/config/generator_test.go b/pkg/server/config/generator_test.go index 27af2f333..800cdcc51 100644 --- a/pkg/server/config/generator_test.go +++ b/pkg/server/config/generator_test.go @@ -262,6 +262,44 @@ var _ = Describe("Configuration Generator", func() { Expect(multusConfig.Generate()).Should(MatchJSON(expectedResult)) }) + It("generates a multus config with CNI configuration directory", func() { + cniConfigDir := "/host/etc/cni/net.d" + multusConfig, err := newMultusConfigWithDelegates( + primaryCNIName, + cniVersion, + primaryCNIFile, + WithCniConfigDir(cniConfigDir)) + Expect(err).NotTo(HaveOccurred()) + expectedResult := fmt.Sprintf(` + { + "cniVersion":"0.4.0", + "clusterNetwork":"%s", + "name":"multus-cni-network", + "cniConfigDir":"/host/etc/cni/net.d", + "type":"myCNI" + }`, primaryCNIFile) + Expect(multusConfig.Generate()).Should(MatchJSON(expectedResult)) + }) + + It("generates a multus config with a custom socket directory", func() { + socketDir := "/var/run/multus/multussock/" + multusConfig, err := newMultusConfigWithDelegates( + primaryCNIName, + cniVersion, + primaryCNIFile, + WithSocketDir(socketDir)) + Expect(err).NotTo(HaveOccurred()) + expectedResult := fmt.Sprintf(` + { + "cniVersion":"0.4.0", + "clusterNetwork":"%s", + "name":"multus-cni-network", + "socketDir":"/var/run/multus/multussock/", + "type":"myCNI" + }`, primaryCNIFile) + Expect(multusConfig.Generate()).Should(MatchJSON(expectedResult)) + }) + It("multus config with global namespace", func() { const globalNamespace = "come-along-ns" multusConfig, err := newMultusConfigWithDelegates( diff --git a/pkg/server/config/manager.go b/pkg/server/config/manager.go index 9e961bc22..db0ff624b 100644 --- a/pkg/server/config/manager.go +++ b/pkg/server/config/manager.go @@ -42,8 +42,8 @@ type Manager struct { primaryCNIConfigPath string } -// NewManager returns a config manager object, configured to persist the -// configuration to `multusAutoconfigDir`. This constructor will auto-discover +// NewManager returns a config manager object, configured to read the +// primary CNI configuration in `multusAutoconfigDir`. This constructor will auto-discover // the primary CNI for which it will delegate. func NewManager(config MultusConf, multusAutoconfigDir string, forceCNIVersion bool) (*Manager, error) { defaultCNIPluginName, err := getPrimaryCNIPluginName(multusAutoconfigDir) @@ -108,7 +108,7 @@ func newManager(config MultusConf, multusConfigDir, defaultCNIPluginName string, configWatcher: watcher, multusConfig: &config, multusConfigDir: multusConfigDir, - multusConfigFilePath: cniPluginConfigFilePath(multusConfigDir, multusConfigFileName), + multusConfigFilePath: cniPluginConfigFilePath(config.CniConfigDir, multusConfigFileName), primaryCNIConfigPath: cniPluginConfigFilePath(multusConfigDir, defaultCNIPluginName), } @@ -217,6 +217,7 @@ func (m Manager) MonitorPluginConfiguration(shutDown <-chan struct{}, done chan< // PersistMultusConfig persists the provided configuration to the disc, with // Read / Write permissions. The output file path is `/00-multus.conf` func (m Manager) PersistMultusConfig(config string) error { + logging.Debugf("Writing Multus CNI configuration @ %s", m.multusConfigFilePath) return os.WriteFile(m.multusConfigFilePath, []byte(config), UserRWPermission) }