diff --git a/cmd/config/set_management_configuration.go b/cmd/config/set_management_configuration.go index bcca48a2e..eb3724b16 100644 --- a/cmd/config/set_management_configuration.go +++ b/cmd/config/set_management_configuration.go @@ -15,9 +15,8 @@ package config import ( - "fmt" - "github.com/spf13/cobra" + "github.com/spf13/pflag" "opendev.org/airship/airshipctl/pkg/config" "opendev.org/airship/airshipctl/pkg/remote/redfish" @@ -32,74 +31,67 @@ const ( flagUseProxy = "use-proxy" flagUseProxyDescription = "Use the proxy configuration specified in the local environment" + + flagSystemActionRetries = "system-action-retries" + flagSystemActionRetriesDescription = "Set the number of attempts to poll a host for a status" + + flagSystemRebootDelay = "system-reboot-delay" + flagSystemRebootDelayDescription = "Set the number of seconds to wait between power actions (e.g. shutdown, startup)" ) // NewSetManagementConfigCommand creates a command for creating and modifying clusters // in the airshipctl config file. func NewSetManagementConfigCommand(cfgFactory config.Factory) *cobra.Command { - var insecure bool - var managementType string - var useProxy bool - + o := &config.ManagementConfiguration{} cmd := &cobra.Command{ Use: "set-management-config NAME", Short: "Modify an out-of-band management configuration", Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := cfgFactory() - if err != nil { - return err - } - name := args[0] - managementCfg, err := cfg.GetManagementConfiguration(name) - if err != nil { - return err - } - - var modified bool - if cmd.Flags().Changed(flagInsecure) && insecure != managementCfg.Insecure { - modified = true - managementCfg.Insecure = insecure - - fmt.Fprintf(cmd.OutOrStdout(), - "Option 'insecure' set to '%t' for management configuration '%s'.\n", - managementCfg.Insecure, name) - } - - if cmd.Flags().Changed(flagManagementType) && managementType != managementCfg.Type { - modified = true - if err = managementCfg.SetType(managementType); err != nil { - return err - } - - fmt.Fprintf(cmd.OutOrStdout(), - "Option 'type' set to '%s' for management configuration '%s'.\n", - managementCfg.Type, name) - } - - if cmd.Flags().Changed(flagUseProxy) && useProxy != managementCfg.UseProxy { - modified = true - managementCfg.UseProxy = useProxy - - fmt.Fprintf(cmd.OutOrStdout(), - "Option 'useproxy' set to '%t' for management configuration '%s'\n", - managementCfg.UseProxy, name) - } - - if !modified { - fmt.Fprintf(cmd.OutOrStdout(), - "Management configuration '%s' not modified. No new settings.\n", name) - return nil - } - - return cfg.PersistConfig(true) - }, + RunE: setManagementConfigRunE(cfgFactory, o), } - flags := cmd.Flags() - flags.BoolVar(&insecure, flagInsecure, false, flagInsecureDescription) - flags.StringVar(&managementType, flagManagementType, redfish.ClientType, flagManagementTypeDescription) - flags.BoolVar(&useProxy, flagUseProxy, true, flagUseProxyDescription) - + addSetManagementConfigFlags(cmd, o) return cmd } + +func addSetManagementConfigFlags(cmd *cobra.Command, o *config.ManagementConfiguration) { + flags := cmd.Flags() + + flags.BoolVar(&o.Insecure, flagInsecure, false, flagInsecureDescription) + flags.StringVar(&o.Type, flagManagementType, redfish.ClientType, flagManagementTypeDescription) + flags.BoolVar(&o.UseProxy, flagUseProxy, true, flagUseProxyDescription) + flags.IntVar(&o.SystemActionRetries, flagSystemActionRetries, + config.DefaultSystemActionRetries, flagSystemActionRetriesDescription) + flags.IntVar(&o.SystemRebootDelay, flagSystemRebootDelay, + config.DefaultSystemRebootDelay, flagSystemRebootDelayDescription) +} + +func setManagementConfigRunE(cfgFactory config.Factory, o *config.ManagementConfiguration) func( + cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + // Go through all the flags that have been set + var opts []config.ManagementConfigOption + fn := func(flag *pflag.Flag) { + switch flag.Name { + case flagInsecure: + opts = append(opts, config.SetManagementConfigInsecure(o.Insecure)) + case flagManagementType: + opts = append(opts, config.SetManagementConfigMgmtType(o.Type)) + case flagUseProxy: + opts = append(opts, config.SetManagementConfigUseProxy(o.UseProxy)) + case flagSystemActionRetries: + opts = append(opts, config.SetManagementConfigSystemActionRetries(o.SystemActionRetries)) + case flagSystemRebootDelay: + opts = append(opts, config.SetManagementConfigSystemRebootDelay(o.SystemRebootDelay)) + } + } + cmd.Flags().Visit(fn) + + options := &config.RunSetManagementConfigOptions{ + CfgFactory: cfgFactory, + MgmtCfgName: args[0], + Writer: cmd.OutOrStdout(), + } + return options.RunSetManagementConfig(opts...) + } +} diff --git a/cmd/config/set_management_configuration_test.go b/cmd/config/set_management_configuration_test.go index 071a2e85e..80dcd23e0 100644 --- a/cmd/config/set_management_configuration_test.go +++ b/cmd/config/set_management_configuration_test.go @@ -15,164 +15,22 @@ package config_test import ( - "fmt" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - cmd "opendev.org/airship/airshipctl/cmd/config" - "opendev.org/airship/airshipctl/pkg/config" - redfishdell "opendev.org/airship/airshipctl/pkg/remote/redfish/vendors/dell" "opendev.org/airship/airshipctl/testutil" ) func TestConfigSetManagementConfigurationCmd(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - settings := func() (*config.Config, error) { - return conf, nil - } - cmdTests := []*testutil.CmdTest{ { Name: "config-cmd-set-management-config-with-help", CmdLine: "--help", Cmd: cmd.NewSetManagementConfigCommand(nil), }, - { - Name: "config-cmd-set-management-config-no-args", - CmdLine: "", - Cmd: cmd.NewSetManagementConfigCommand(nil), - Error: fmt.Errorf("accepts %d arg(s), received %d", 1, 0), - }, - { - Name: "config-cmd-set-management-config-excess-args", - CmdLine: "arg1 arg2", - Cmd: cmd.NewSetManagementConfigCommand(nil), - Error: fmt.Errorf("accepts %d arg(s), received %d", 1, 2), - }, - { - Name: "config-cmd-set-management-config-not-found", - CmdLine: fmt.Sprintf("%s-test", config.AirshipDefaultContext), - Cmd: cmd.NewSetManagementConfigCommand(settings), - Error: config.ErrManagementConfigurationNotFound{ - Name: fmt.Sprintf("%s-test", config.AirshipDefaultContext), - }, - }, } for _, tt := range cmdTests { testutil.RunTest(t, tt) } } - -func TestConfigSetManagementConfigurationInsecure(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - conf.ManagementConfiguration[config.AirshipDefaultManagementConfiguration] = config.NewManagementConfiguration() - - settings := func() (*config.Config, error) { - return conf, nil - } - - require.False(t, conf.ManagementConfiguration[config.AirshipDefaultContext].Insecure) - - testutil.RunTest(t, &testutil.CmdTest{ - Name: "config-cmd-set-management-config-change-insecure", - CmdLine: fmt.Sprintf("%s --insecure=true", config.AirshipDefaultContext), - Cmd: cmd.NewSetManagementConfigCommand(settings), - }) - testutil.RunTest(t, &testutil.CmdTest{ - Name: "config-cmd-set-management-config-no-change", - CmdLine: fmt.Sprintf("%s --insecure=true", config.AirshipDefaultContext), - Cmd: cmd.NewSetManagementConfigCommand(settings), - }) - - assert.True(t, conf.ManagementConfiguration[config.AirshipDefaultContext].Insecure) -} - -func TestConfigSetManagementConfigurationType(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - conf.ManagementConfiguration[config.AirshipDefaultManagementConfiguration] = config.NewManagementConfiguration() - - settings := func() (*config.Config, error) { - return conf, nil - } - - require.NotEqual(t, redfishdell.ClientType, - conf.ManagementConfiguration[config.AirshipDefaultContext].Type) - - cmdTests := []*testutil.CmdTest{ - { - Name: "config-cmd-set-management-config-unknown-type", - CmdLine: fmt.Sprintf("%s --management-type=foo", config.AirshipDefaultContext), - Cmd: cmd.NewSetManagementConfigCommand(settings), - Error: config.ErrUnknownManagementType{Type: "foo"}, - }, - { - Name: "config-cmd-set-management-config-change-type", - CmdLine: fmt.Sprintf("%s --management-type=%s", config.AirshipDefaultContext, - redfishdell.ClientType), - Cmd: cmd.NewSetManagementConfigCommand(settings), - }, - } - - for _, tt := range cmdTests { - testutil.RunTest(t, tt) - } - - assert.Equal(t, redfishdell.ClientType, - conf.ManagementConfiguration[config.AirshipDefaultContext].Type) -} - -func TestConfigSetManagementConfigurationUseProxy(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - conf.ManagementConfiguration[config.AirshipDefaultManagementConfiguration] = config.NewManagementConfiguration() - - settings := func() (*config.Config, error) { - return conf, nil - } - - require.False(t, conf.ManagementConfiguration[config.AirshipDefaultContext].UseProxy) - - testutil.RunTest(t, &testutil.CmdTest{ - Name: "config-cmd-set-management-config-change-use-proxy", - CmdLine: fmt.Sprintf("%s --use-proxy=true", config.AirshipDefaultContext), - Cmd: cmd.NewSetManagementConfigCommand(settings), - }) - - assert.True(t, conf.ManagementConfiguration[config.AirshipDefaultContext].UseProxy) -} - -func TestConfigSetManagementConfigurationMultipleOptions(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - conf.ManagementConfiguration[config.AirshipDefaultManagementConfiguration] = config.NewManagementConfiguration() - - settings := func() (*config.Config, error) { - return conf, nil - } - - require.NotEqual(t, redfishdell.ClientType, - conf.ManagementConfiguration[config.AirshipDefaultContext].Type) - require.False(t, conf.ManagementConfiguration[config.AirshipDefaultContext].UseProxy) - - testutil.RunTest(t, &testutil.CmdTest{ - Name: "config-cmd-set-management-config-change-type", - CmdLine: fmt.Sprintf("%s --management-type=%s --use-proxy=true", config.AirshipDefaultContext, - redfishdell.ClientType), - Cmd: cmd.NewSetManagementConfigCommand(settings), - }) - - assert.Equal(t, redfishdell.ClientType, - conf.ManagementConfiguration[config.AirshipDefaultContext].Type) - assert.True(t, conf.ManagementConfiguration[config.AirshipDefaultContext].UseProxy) -} diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-excess-args.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-excess-args.golden deleted file mode 100644 index 7aab308db..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-excess-args.golden +++ /dev/null @@ -1,10 +0,0 @@ -Error: accepts 1 arg(s), received 2 -Usage: - set-management-config NAME [flags] - -Flags: - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) - diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-no-args.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-no-args.golden deleted file mode 100644 index 6710716d8..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-no-args.golden +++ /dev/null @@ -1,10 +0,0 @@ -Error: accepts 1 arg(s), received 0 -Usage: - set-management-config NAME [flags] - -Flags: - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) - diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-not-found.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-not-found.golden deleted file mode 100644 index ded746177..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-not-found.golden +++ /dev/null @@ -1,10 +0,0 @@ -Error: Unknown management configuration 'default-test'. -Usage: - set-management-config NAME [flags] - -Flags: - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) - diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-with-help.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-with-help.golden index 800abe719..197729208 100644 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-with-help.golden +++ b/cmd/config/testdata/TestConfigSetManagementConfigurationCmdGoldenOutput/config-cmd-set-management-config-with-help.golden @@ -4,7 +4,9 @@ Usage: set-management-config NAME [flags] Flags: - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) + -h, --help help for set-management-config + --insecure Ignore SSL certificate verification on out-of-band management requests + --management-type string Set the out-of-band management type (default "redfish") + --system-action-retries int Set the number of attempts to poll a host for a status (default 30) + --system-reboot-delay int Set the number of seconds to wait between power actions (e.g. shutdown, startup) (default 30) + --use-proxy Use the proxy configuration specified in the local environment (default true) diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-change-insecure.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-change-insecure.golden deleted file mode 100644 index 94d743d1d..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-change-insecure.golden +++ /dev/null @@ -1 +0,0 @@ -Option 'insecure' set to 'true' for management configuration 'default'. diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-no-change.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-no-change.golden deleted file mode 100644 index 33d7fd879..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationInsecureGoldenOutput/config-cmd-set-management-config-no-change.golden +++ /dev/null @@ -1 +0,0 @@ -Management configuration 'default' not modified. No new settings. diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationMultipleOptionsGoldenOutput/config-cmd-set-management-config-change-type.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationMultipleOptionsGoldenOutput/config-cmd-set-management-config-change-type.golden deleted file mode 100644 index 65ee457e1..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationMultipleOptionsGoldenOutput/config-cmd-set-management-config-change-type.golden +++ /dev/null @@ -1,2 +0,0 @@ -Option 'type' set to 'redfish-dell' for management configuration 'default'. -Option 'useproxy' set to 'true' for management configuration 'default' diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-change-type.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-change-type.golden deleted file mode 100644 index ebcd15167..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-change-type.golden +++ /dev/null @@ -1 +0,0 @@ -Option 'type' set to 'redfish-dell' for management configuration 'default'. diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-unknown-type.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-unknown-type.golden deleted file mode 100644 index 4cd480161..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationTypeGoldenOutput/config-cmd-set-management-config-unknown-type.golden +++ /dev/null @@ -1,10 +0,0 @@ -Error: Unknown management type 'foo'. Known types include 'redfish' and 'redfish-dell'. -Usage: - set-management-config NAME [flags] - -Flags: - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) - diff --git a/cmd/config/testdata/TestConfigSetManagementConfigurationUseProxyGoldenOutput/config-cmd-set-management-config-change-use-proxy.golden b/cmd/config/testdata/TestConfigSetManagementConfigurationUseProxyGoldenOutput/config-cmd-set-management-config-change-use-proxy.golden deleted file mode 100644 index 3f04824bf..000000000 --- a/cmd/config/testdata/TestConfigSetManagementConfigurationUseProxyGoldenOutput/config-cmd-set-management-config-change-use-proxy.golden +++ /dev/null @@ -1 +0,0 @@ -Option 'useproxy' set to 'true' for management configuration 'default' diff --git a/docs/source/cli/airshipctl_config_set-management-config.md b/docs/source/cli/airshipctl_config_set-management-config.md index 87c8b413a..a48b627a3 100644 --- a/docs/source/cli/airshipctl_config_set-management-config.md +++ b/docs/source/cli/airshipctl_config_set-management-config.md @@ -13,10 +13,12 @@ airshipctl config set-management-config NAME [flags] ### Options ``` - -h, --help help for set-management-config - --insecure Ignore SSL certificate verification on out-of-band management requests - --management-type string Set the out-of-band management type (default "redfish") - --use-proxy Use the proxy configuration specified in the local environment (default true) + -h, --help help for set-management-config + --insecure Ignore SSL certificate verification on out-of-band management requests + --management-type string Set the out-of-band management type (default "redfish") + --system-action-retries int Set the number of attempts to poll a host for a status (default 30) + --system-reboot-delay int Set the number of seconds to wait between power actions (e.g. shutdown, startup) (default 30) + --use-proxy Use the proxy configuration specified in the local environment (default true) ``` ### Options inherited from parent commands diff --git a/pkg/config/config.go b/pkg/config/config.go index d0c663c8b..bd72958df 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -537,3 +537,21 @@ func (c *Config) WorkDir() (dir string, err error) { } return dir, err } + +// AddManagementConfig creates a new instance of ManagementConfig object +func (c *Config) AddManagementConfig(mgmtCfgName string, opts ...ManagementConfigOption) *ManagementConfiguration { + // Create the new Airshipctl config ManagementConfig + nMgmtCfg := NewManagementConfiguration() + c.ManagementConfiguration[mgmtCfgName] = nMgmtCfg + + // We can use Modify to populate the correct information + c.ModifyManagementConfig(nMgmtCfg, opts...) + return nMgmtCfg +} + +// ModifyManagementConfig updates ManagementConfig object with given options +func (c *Config) ModifyManagementConfig(mgmtConfig *ManagementConfiguration, opts ...ManagementConfigOption) { + for _, o := range opts { + o(mgmtConfig) + } +} diff --git a/pkg/config/config_helper.go b/pkg/config/config_helper.go index 0a302062c..77797acc4 100644 --- a/pkg/config/config_helper.go +++ b/pkg/config/config_helper.go @@ -83,6 +83,86 @@ func (o *RunSetContextOptions) RunSetContext(opts ...ContextOption) error { return cfg.PersistConfig(true) } +// ManagementConfigOption is a function that allows to modify ManagementConfig object +type ManagementConfigOption func(mgmtConf *ManagementConfiguration) + +// SetManagementConfigInsecure sets Insecure option in ManagementConfig object +func SetManagementConfigInsecure(insecure bool) ManagementConfigOption { + return func(mgmtConf *ManagementConfiguration) { + mgmtConf.Insecure = insecure + } +} + +// SetManagementConfigMgmtType sets Type in ManagementConfig object +func SetManagementConfigMgmtType(mgmtType string) ManagementConfigOption { + return func(mgmtCfg *ManagementConfiguration) { + mgmtCfg.Type = mgmtType + } +} + +// SetManagementConfigUseProxy sets UseProxy in ManagementConfig object +func SetManagementConfigUseProxy(useProxy bool) ManagementConfigOption { + return func(mgmtCfg *ManagementConfiguration) { + mgmtCfg.UseProxy = useProxy + } +} + +// SetManagementConfigSystemActionRetries sets SystemActionRetries in ManagementConfig object +func SetManagementConfigSystemActionRetries(sysActionRetries int) ManagementConfigOption { + return func(mgmtCfg *ManagementConfiguration) { + mgmtCfg.SystemActionRetries = sysActionRetries + } +} + +// SetManagementConfigSystemRebootDelay sets SystemRebootDelay in ManagementConfig object +func SetManagementConfigSystemRebootDelay(sysRebootDelay int) ManagementConfigOption { + return func(mgmtCfg *ManagementConfiguration) { + mgmtCfg.SystemRebootDelay = sysRebootDelay + } +} + +// RunSetManagementConfigOptions are options required to create/modify airshipctl management config +type RunSetManagementConfigOptions struct { + CfgFactory Factory + MgmtCfgName string + Writer io.Writer +} + +// RunSetManagementConfig validates the given command line options and invokes add/modify ManagementConfig +func (o *RunSetManagementConfigOptions) RunSetManagementConfig(opts ...ManagementConfigOption) error { + cfg, err := o.CfgFactory() + if err != nil { + return err + } + + if o.MgmtCfgName == "" { + return ErrEmptyManagementConfigurationName{} + } + + infoMsg := fmt.Sprintf("management configuration with name %s", o.MgmtCfgName) + mgmtCfg, err := cfg.GetManagementConfiguration(o.MgmtCfgName) + if err != nil { + // context didn't exist, create it + cfg.AddManagementConfig(o.MgmtCfgName, opts...) + infoMsg = fmt.Sprintf("%s created\n", infoMsg) + } else { + // Context exists, lets update + cfg.ModifyManagementConfig(mgmtCfg, opts...) + infoMsg = fmt.Sprintf("%s modified\n", infoMsg) + } + + // Verify we didn't break anything + if err = cfg.EnsureComplete(); err != nil { + return err + } + + if _, err := o.Writer.Write([]byte(infoMsg)); err != nil { + return err + } + // Update configuration file just in time persistence approach + return cfg.PersistConfig(true) +} + // RunUseContext validates the given context name and updates it as current context func RunUseContext(desiredContext string, airconfig *Config) error { if _, err := airconfig.GetContext(desiredContext); err != nil { diff --git a/pkg/config/config_helper_test.go b/pkg/config/config_helper_test.go index c9b920acc..b871f8157 100644 --- a/pkg/config/config_helper_test.go +++ b/pkg/config/config_helper_test.go @@ -128,6 +128,88 @@ func TestRunSetContext(t *testing.T) { } } +func TestRunSetManagementConfig(t *testing.T) { + ioBuffer := bytes.NewBuffer(nil) + tests := []struct { + name string + options config.RunSetManagementConfigOptions + mgmtCfgOpts []config.ManagementConfigOption + expectedOut string + err error + }{ + { + name: "create new mgmt cfg", + options: config.RunSetManagementConfigOptions{ + CfgFactory: prepareConfig(), + MgmtCfgName: "new_mgmt_cfg", + Writer: ioBuffer, + }, + mgmtCfgOpts: []config.ManagementConfigOption{config.SetManagementConfigInsecure(true), + config.SetManagementConfigUseProxy(true), config.SetManagementConfigMgmtType("redfish")}, + err: nil, + expectedOut: "management configuration with name new_mgmt_cfg created\n", + }, + { + name: "modify mgmt cfg", + options: config.RunSetManagementConfigOptions{ + CfgFactory: prepareConfig(), + MgmtCfgName: "dummy_management_config", + Writer: ioBuffer, + }, + mgmtCfgOpts: []config.ManagementConfigOption{config.SetManagementConfigSystemRebootDelay(25), + config.SetManagementConfigSystemActionRetries(20)}, + err: nil, + expectedOut: "management configuration with name dummy_management_config modified\n", + }, + { + name: "bad config", + options: config.RunSetManagementConfigOptions{ + CfgFactory: func() (*config.Config, error) { + return nil, config.ErrMissingConfig{What: "bad config"} + }, + }, + err: config.ErrMissingConfig{What: "bad config"}, + }, + { + name: "no mgmt cfg name provided", + options: config.RunSetManagementConfigOptions{ + CfgFactory: prepareConfig(), + MgmtCfgName: "", + }, + err: config.ErrEmptyManagementConfigurationName{}, + }, + { + name: "incomplete config", + options: config.RunSetManagementConfigOptions{ + CfgFactory: func() (*config.Config, error) { + cfg := testutil.DummyConfig() + cfg.Contexts = map[string]*config.Context{} + return cfg, nil + }, + MgmtCfgName: "dummy_management_config", + }, + err: config.ErrMissingConfig{What: "At least one Context needs to be defined"}, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + ioBuffer.Reset() + err := tt.options.RunSetManagementConfig(tt.mgmtCfgOpts...) + if tt.err != nil { + require.Error(t, err) + require.Equal(t, tt.err, err) + } else { + require.NoError(t, err) + } + if tt.expectedOut != "" { + require.Equal(t, tt.expectedOut, ioBuffer.String()) + } + }) + } +} + func TestRunUseContext(t *testing.T) { t.Run("testUseContext", func(t *testing.T) { conf := testutil.DummyConfig() diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 4f62c2a1d..31382dc74 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -521,3 +521,23 @@ func TestWorkDir(t *testing.T) { assert.NoError(t, err) assert.NotEmpty(t, wd) } + +func TestAddManagementConfig(t *testing.T) { + conf, cleanup := testutil.InitConfig(t) + defer cleanup(t) + + managementConfig := conf.AddManagementConfig("new_mgmt_context", config.SetManagementConfigUseProxy(false)) + assert.EqualValues(t, conf.ManagementConfiguration["new_mgmt_context"], managementConfig) +} + +func TestModifyManagementConfig(t *testing.T) { + conf, cleanup := testutil.InitConfig(t) + defer cleanup(t) + + managementConfig := conf.AddManagementConfig("modified_mgmt_config") + + conf.ModifyManagementConfig(managementConfig, config.SetManagementConfigSystemActionRetries(60)) + assert.EqualValues(t, conf.ManagementConfiguration["modified_mgmt_config"].SystemActionRetries, + managementConfig.SystemActionRetries) + assert.EqualValues(t, conf.ManagementConfiguration["modified_mgmt_config"], managementConfig) +} diff --git a/pkg/config/errors.go b/pkg/config/errors.go index 294ba2ec8..42871af66 100644 --- a/pkg/config/errors.go +++ b/pkg/config/errors.go @@ -144,6 +144,14 @@ func (e ErrManagementConfigurationNotFound) Error() string { return fmt.Sprintf("Unknown management configuration '%s'.", e.Name) } +// ErrEmptyManagementConfigurationName returned when attempted to create/modify management config with empty name +type ErrEmptyManagementConfigurationName struct { +} + +func (e ErrEmptyManagementConfigurationName) Error() string { + return fmt.Sprintf("management config name must not be empty") +} + // ErrMissingCurrentContext returned in case --current used without setting current-context type ErrMissingCurrentContext struct { }