kubeform.dev/terraform-backend-sdk@v0.0.0-20220310143633-45f07fe731c5/command/workspace_select.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"kubeform.dev/terraform-backend-sdk/tfdiags"
     8  	"github.com/mitchellh/cli"
     9  	"github.com/posener/complete"
    10  )
    11  
    12  type WorkspaceSelectCommand struct {
    13  	Meta
    14  	LegacyName bool
    15  }
    16  
    17  func (c *WorkspaceSelectCommand) Run(args []string) int {
    18  	args = c.Meta.process(args)
    19  	envCommandShowWarning(c.Ui, c.LegacyName)
    20  
    21  	cmdFlags := c.Meta.defaultFlagSet("workspace select")
    22  	cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
    23  	if err := cmdFlags.Parse(args); err != nil {
    24  		c.Ui.Error(fmt.Sprintf("Error parsing command-line flags: %s\n", err.Error()))
    25  		return 1
    26  	}
    27  
    28  	args = cmdFlags.Args()
    29  	if len(args) != 1 {
    30  		c.Ui.Error("Expected a single argument: NAME.\n")
    31  		return cli.RunResultHelp
    32  	}
    33  
    34  	configPath, err := ModulePath(args[1:])
    35  	if err != nil {
    36  		c.Ui.Error(err.Error())
    37  		return 1
    38  	}
    39  
    40  	var diags tfdiags.Diagnostics
    41  
    42  	backendConfig, backendDiags := c.loadBackendConfig(configPath)
    43  	diags = diags.Append(backendDiags)
    44  	if diags.HasErrors() {
    45  		c.showDiagnostics(diags)
    46  		return 1
    47  	}
    48  
    49  	current, isOverridden := c.WorkspaceOverridden()
    50  	if isOverridden {
    51  		c.Ui.Error(envIsOverriddenSelectError)
    52  		return 1
    53  	}
    54  
    55  	// Load the backend
    56  	b, backendDiags := c.Backend(&BackendOpts{
    57  		Config: backendConfig,
    58  	})
    59  	diags = diags.Append(backendDiags)
    60  	if backendDiags.HasErrors() {
    61  		c.showDiagnostics(diags)
    62  		return 1
    63  	}
    64  
    65  	if err != nil {
    66  		c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
    67  		return 1
    68  	}
    69  
    70  	// This command will not write state
    71  	c.ignoreRemoteBackendVersionConflict(b)
    72  
    73  	name := args[0]
    74  	if !validWorkspaceName(name) {
    75  		c.Ui.Error(fmt.Sprintf(envInvalidName, name))
    76  		return 1
    77  	}
    78  
    79  	states, err := b.Workspaces()
    80  	if err != nil {
    81  		c.Ui.Error(err.Error())
    82  		return 1
    83  	}
    84  
    85  	if name == current {
    86  		// already using this workspace
    87  		return 0
    88  	}
    89  
    90  	found := false
    91  	for _, s := range states {
    92  		if name == s {
    93  			found = true
    94  			break
    95  		}
    96  	}
    97  
    98  	if !found {
    99  		c.Ui.Error(fmt.Sprintf(envDoesNotExist, name))
   100  		return 1
   101  	}
   102  
   103  	err = c.SetWorkspace(name)
   104  	if err != nil {
   105  		c.Ui.Error(err.Error())
   106  		return 1
   107  	}
   108  
   109  	c.Ui.Output(
   110  		c.Colorize().Color(
   111  			fmt.Sprintf(envChanged, name),
   112  		),
   113  	)
   114  
   115  	return 0
   116  }
   117  
   118  func (c *WorkspaceSelectCommand) AutocompleteArgs() complete.Predictor {
   119  	return completePredictSequence{
   120  		complete.PredictNothing, // the "select" subcommand itself (already matched)
   121  		c.completePredictWorkspaceName(),
   122  		complete.PredictDirs(""),
   123  	}
   124  }
   125  
   126  func (c *WorkspaceSelectCommand) AutocompleteFlags() complete.Flags {
   127  	return nil
   128  }
   129  
   130  func (c *WorkspaceSelectCommand) Help() string {
   131  	helpText := `
   132  Usage: terraform [global options] workspace select NAME
   133  
   134    Select a different Terraform workspace.
   135  
   136  `
   137  	return strings.TrimSpace(helpText)
   138  }
   139  
   140  func (c *WorkspaceSelectCommand) Synopsis() string {
   141  	return "Select a workspace"
   142  }