diff --git a/cmd/backend_flag_test.go b/cmd/backend_flag_test.go new file mode 100644 index 0000000..2147f8f --- /dev/null +++ b/cmd/backend_flag_test.go @@ -0,0 +1,102 @@ +package cmd + +import ( + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/suite" +) + +type BackendFlagTestSuite struct { + suite.Suite + originalBackend string +} + +func (suite *BackendFlagTestSuite) SetupTest() { + suite.originalBackend = viper.GetString(BACKEND_NAME_FLAG) +} + +func (suite *BackendFlagTestSuite) TearDownTest() { + viper.Set(BACKEND_NAME_FLAG, suite.originalBackend) +} + +func TestBackendFlagTestSuite(t *testing.T) { + suite.Run(t, &BackendFlagTestSuite{}) +} + +func (suite *BackendFlagTestSuite) TestBackendFlagExists() { + flag := RootCmd.PersistentFlags().Lookup(BACKEND_NAME_FLAG) + suite.NotNil(flag, "backend flag should be registered") + suite.Equal("", flag.DefValue, "backend flag should have empty default value") + suite.Equal("backend name to use", flag.Usage, "backend flag should have correct usage description") +} + +func (suite *BackendFlagTestSuite) TestBackendFlagConstant() { + suite.Equal("backend-name", BACKEND_NAME_FLAG) +} + +func (suite *BackendFlagTestSuite) TestViperBindingForBackend() { + testBackend := "gcp-us-east1" + viper.Set(BACKEND_NAME_FLAG, testBackend) + + result := viper.GetString(BACKEND_NAME_FLAG) + suite.Equal(testBackend, result) +} + +func (suite *BackendFlagTestSuite) TestEmptyBackendFlag() { + viper.Set(BACKEND_NAME_FLAG, "") + + result := viper.GetString(BACKEND_NAME_FLAG) + suite.Equal("", result) +} + +func (suite *BackendFlagTestSuite) TestBackendFlagWithValidName() { + validBackend := "gcp-us-east1" + viper.Set(BACKEND_NAME_FLAG, validBackend) + + result := viper.GetString(BACKEND_NAME_FLAG) + suite.Equal(validBackend, result) +} + +func (suite *BackendFlagTestSuite) TestCommandsHaveAccessToBackendFlag() { + commands := []struct { + name string + cmd interface{} + }{ + {"IngestionKeyCmd", IngestionKeyCmd}, + {"getDatasourcesAPIKeyCmd", getDatasourcesAPIKeyCmd}, + {"DeployCmd", DeployCmd}, + } + + for _, tc := range commands { + suite.Run(tc.name, func() { + flag := RootCmd.PersistentFlags().Lookup(BACKEND_NAME_FLAG) + suite.NotNil(flag, "Flag should be accessible to "+tc.name) + }) + } +} + +func (suite *BackendFlagTestSuite) TestBackendFlagPattern() { + suite.Run("flag not set - should be empty", func() { + viper.Set(BACKEND_NAME_FLAG, "") + backendName := viper.GetString(BACKEND_NAME_FLAG) + + if backendName == "" { + suite.Empty(backendName) + } else { + suite.Fail("Expected empty backend name when flag not set") + } + }) + + suite.Run("flag set - should use flag value", func() { + expectedBackend := "gcp-us-east1" + viper.Set(BACKEND_NAME_FLAG, expectedBackend) + backendName := viper.GetString(BACKEND_NAME_FLAG) + + if backendName == "" { + suite.Fail("Should not be empty when flag is set") + } else { + suite.Equal(expectedBackend, backendName) + } + }) +} diff --git a/cmd/login.go b/cmd/login.go index a1b57df..1447fec 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -160,6 +160,11 @@ func fetchApiKey(tenantUUID string) (*auth.ApiKey, error) { } func selectBackendName(tenantUUID string, deployFlow bool) (string, bool, error) { + if flagValue := viper.GetString(BACKEND_NAME_FLAG); flagValue != "" { + // non-incloud architecture is deprecated, so explicitly provided backends are always incloud + return flagValue, true, nil + } + var err error var auth0Token *auth.Auth0Token if auth0Token, err = auth.LoadAuth0Token(); err != nil { @@ -187,14 +192,17 @@ func selectBackendName(tenantUUID string, deployFlow bool) (string, bool, error) return "", false, nil } - backendId := "" - switch len(backendsList) { - case 0: + if len(backendsList) == 0 { return "", false, ErrNoActiveBackends - case 1: - backendId = backendsList[0].Name - default: - backendId = ui.GlobalWriter.SelectPrompt("Select backend:", maps.Keys(backendNames)) + } + + if len(backendsList) == 1 { + return backendsList[0].Name, backendNames[backendsList[0].Name], nil + } + + backendId := ui.GlobalWriter.SelectPrompt("Select backend:", maps.Keys(backendNames)) + if backendId == "" { + return "", false, ErrExecutionAborted } return backendId, backendNames[backendId], nil diff --git a/cmd/root.go b/cmd/root.go index 36bd409..c9478be 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -33,6 +33,7 @@ const ( KUBECONTEXT_FLAG = "kube-context" HELM_RELEASE_FLAG = "release-name" CLUSTER_NAME_FLAG = "cluster-name" + BACKEND_NAME_FLAG = "backend-name" SKIP_CLI_UPDATE_FLAG = "skip-cli-update" INSTALLATION_ID_FLAG = "installation-id" INVALID_TOKEN_MESSAGE = "Issue with authentication - try again to copy command line and rerun" @@ -62,6 +63,9 @@ func init() { RootCmd.PersistentFlags().Bool(SKIP_CLI_UPDATE_FLAG, false, "disable automatic cli update check") viper.BindPFlag(SKIP_CLI_UPDATE_FLAG, RootCmd.PersistentFlags().Lookup(SKIP_CLI_UPDATE_FLAG)) + RootCmd.PersistentFlags().String(BACKEND_NAME_FLAG, "", "backend name to use") + viper.BindPFlag(BACKEND_NAME_FLAG, RootCmd.PersistentFlags().Lookup(BACKEND_NAME_FLAG)) + RootCmd.PersistentFlags().String(CLUSTER_NAME_FLAG, "", "cluster name") viper.BindPFlag(CLUSTER_NAME_FLAG, RootCmd.PersistentFlags().Lookup(CLUSTER_NAME_FLAG))