github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/command/commands.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/hashicorp/nomad/command/agent"
     8  	"github.com/hashicorp/nomad/drivers/docker/docklog"
     9  	"github.com/hashicorp/nomad/version"
    10  	colorable "github.com/mattn/go-colorable"
    11  	"github.com/mitchellh/cli"
    12  )
    13  
    14  const (
    15  	// EnvNomadCLINoColor is an env var that toggles colored UI output.
    16  	EnvNomadCLINoColor = `NOMAD_CLI_NO_COLOR`
    17  )
    18  
    19  // DeprecatedCommand is a command that wraps an existing command and prints a
    20  // deprecation notice and points the user to the new command. Deprecated
    21  // commands are always hidden from help output.
    22  type DeprecatedCommand struct {
    23  	cli.Command
    24  	Meta
    25  
    26  	// Old is the old command name, New is the new command name.
    27  	Old, New string
    28  }
    29  
    30  // Help wraps the embedded Help command and prints a warning about deprecations.
    31  func (c *DeprecatedCommand) Help() string {
    32  	c.warn()
    33  	return c.Command.Help()
    34  }
    35  
    36  // Run wraps the embedded Run command and prints a warning about deprecation.
    37  func (c *DeprecatedCommand) Run(args []string) int {
    38  	c.warn()
    39  	return c.Command.Run(args)
    40  }
    41  
    42  func (c *DeprecatedCommand) warn() {
    43  	c.Ui.Warn(wrapAtLength(fmt.Sprintf(
    44  		"WARNING! The \"nomad %s\" command is deprecated. Please use \"nomad %s\" "+
    45  			"instead. This command will be removed in Nomad 0.10 (or later).",
    46  		c.Old,
    47  		c.New)))
    48  	c.Ui.Warn("")
    49  }
    50  
    51  // NamedCommand is a interface to denote a commmand's name.
    52  type NamedCommand interface {
    53  	Name() string
    54  }
    55  
    56  // Commands returns the mapping of CLI commands for Nomad. The meta
    57  // parameter lets you set meta options for all commands.
    58  func Commands(metaPtr *Meta, agentUi cli.Ui) map[string]cli.CommandFactory {
    59  	if metaPtr == nil {
    60  		metaPtr = new(Meta)
    61  	}
    62  
    63  	meta := *metaPtr
    64  	if meta.Ui == nil {
    65  		meta.Ui = &cli.BasicUi{
    66  			Reader:      os.Stdin,
    67  			Writer:      colorable.NewColorableStdout(),
    68  			ErrorWriter: colorable.NewColorableStderr(),
    69  		}
    70  	}
    71  
    72  	all := map[string]cli.CommandFactory{
    73  		"acl": func() (cli.Command, error) {
    74  			return &ACLCommand{
    75  				Meta: meta,
    76  			}, nil
    77  		},
    78  		"acl bootstrap": func() (cli.Command, error) {
    79  			return &ACLBootstrapCommand{
    80  				Meta: meta,
    81  			}, nil
    82  		},
    83  		"acl policy": func() (cli.Command, error) {
    84  			return &ACLPolicyCommand{
    85  				Meta: meta,
    86  			}, nil
    87  		},
    88  		"acl policy apply": func() (cli.Command, error) {
    89  			return &ACLPolicyApplyCommand{
    90  				Meta: meta,
    91  			}, nil
    92  		},
    93  		"acl policy delete": func() (cli.Command, error) {
    94  			return &ACLPolicyDeleteCommand{
    95  				Meta: meta,
    96  			}, nil
    97  		},
    98  		"acl policy info": func() (cli.Command, error) {
    99  			return &ACLPolicyInfoCommand{
   100  				Meta: meta,
   101  			}, nil
   102  		},
   103  		"acl policy list": func() (cli.Command, error) {
   104  			return &ACLPolicyListCommand{
   105  				Meta: meta,
   106  			}, nil
   107  		},
   108  		"acl token": func() (cli.Command, error) {
   109  			return &ACLTokenCommand{
   110  				Meta: meta,
   111  			}, nil
   112  		},
   113  		"acl token create": func() (cli.Command, error) {
   114  			return &ACLTokenCreateCommand{
   115  				Meta: meta,
   116  			}, nil
   117  		},
   118  		"acl token update": func() (cli.Command, error) {
   119  			return &ACLTokenUpdateCommand{
   120  				Meta: meta,
   121  			}, nil
   122  		},
   123  		"acl token delete": func() (cli.Command, error) {
   124  			return &ACLTokenDeleteCommand{
   125  				Meta: meta,
   126  			}, nil
   127  		},
   128  		"acl token info": func() (cli.Command, error) {
   129  			return &ACLTokenInfoCommand{
   130  				Meta: meta,
   131  			}, nil
   132  		},
   133  		"acl token list": func() (cli.Command, error) {
   134  			return &ACLTokenListCommand{
   135  				Meta: meta,
   136  			}, nil
   137  		},
   138  		"acl token self": func() (cli.Command, error) {
   139  			return &ACLTokenSelfCommand{
   140  				Meta: meta,
   141  			}, nil
   142  		},
   143  		"alloc": func() (cli.Command, error) {
   144  			return &AllocCommand{
   145  				Meta: meta,
   146  			}, nil
   147  		},
   148  		"alloc exec": func() (cli.Command, error) {
   149  			return &AllocExecCommand{
   150  				Meta: meta,
   151  			}, nil
   152  		},
   153  		"alloc signal": func() (cli.Command, error) {
   154  			return &AllocSignalCommand{
   155  				Meta: meta,
   156  			}, nil
   157  		},
   158  		"alloc stop": func() (cli.Command, error) {
   159  			return &AllocStopCommand{
   160  				Meta: meta,
   161  			}, nil
   162  		},
   163  		"alloc fs": func() (cli.Command, error) {
   164  			return &AllocFSCommand{
   165  				Meta: meta,
   166  			}, nil
   167  		},
   168  		"alloc logs": func() (cli.Command, error) {
   169  			return &AllocLogsCommand{
   170  				Meta: meta,
   171  			}, nil
   172  		},
   173  		"alloc restart": func() (cli.Command, error) {
   174  			return &AllocRestartCommand{
   175  				Meta: meta,
   176  			}, nil
   177  		},
   178  		"alloc status": func() (cli.Command, error) {
   179  			return &AllocStatusCommand{
   180  				Meta: meta,
   181  			}, nil
   182  		},
   183  		"alloc-status": func() (cli.Command, error) {
   184  			return &AllocStatusCommand{
   185  				Meta: meta,
   186  			}, nil
   187  		},
   188  		"agent": func() (cli.Command, error) {
   189  			return &agent.Command{
   190  				Version:    version.GetVersion(),
   191  				Ui:         agentUi,
   192  				ShutdownCh: make(chan struct{}),
   193  			}, nil
   194  		},
   195  		"agent-info": func() (cli.Command, error) {
   196  			return &AgentInfoCommand{
   197  				Meta: meta,
   198  			}, nil
   199  		},
   200  		"check": func() (cli.Command, error) {
   201  			return &AgentCheckCommand{
   202  				Meta: meta,
   203  			}, nil
   204  		},
   205  		"deployment": func() (cli.Command, error) {
   206  			return &DeploymentCommand{
   207  				Meta: meta,
   208  			}, nil
   209  		},
   210  		"deployment fail": func() (cli.Command, error) {
   211  			return &DeploymentFailCommand{
   212  				Meta: meta,
   213  			}, nil
   214  		},
   215  		"deployment list": func() (cli.Command, error) {
   216  			return &DeploymentListCommand{
   217  				Meta: meta,
   218  			}, nil
   219  		},
   220  		"deployment pause": func() (cli.Command, error) {
   221  			return &DeploymentPauseCommand{
   222  				Meta: meta,
   223  			}, nil
   224  		},
   225  		"deployment promote": func() (cli.Command, error) {
   226  			return &DeploymentPromoteCommand{
   227  				Meta: meta,
   228  			}, nil
   229  		},
   230  		"deployment resume": func() (cli.Command, error) {
   231  			return &DeploymentResumeCommand{
   232  				Meta: meta,
   233  			}, nil
   234  		},
   235  		"deployment status": func() (cli.Command, error) {
   236  			return &DeploymentStatusCommand{
   237  				Meta: meta,
   238  			}, nil
   239  		},
   240  		docklog.PluginName: func() (cli.Command, error) {
   241  			return &DockerLoggerPluginCommand{
   242  				Meta: meta,
   243  			}, nil
   244  		},
   245  		"eval": func() (cli.Command, error) {
   246  			return &EvalCommand{
   247  				Meta: meta,
   248  			}, nil
   249  		},
   250  		"eval status": func() (cli.Command, error) {
   251  			return &EvalStatusCommand{
   252  				Meta: meta,
   253  			}, nil
   254  		},
   255  		"eval-status": func() (cli.Command, error) {
   256  			return &EvalStatusCommand{
   257  				Meta: meta,
   258  			}, nil
   259  		},
   260  		"exec": func() (cli.Command, error) {
   261  			return &AllocExecCommand{
   262  				Meta: meta,
   263  			}, nil
   264  		},
   265  		"executor": func() (cli.Command, error) {
   266  			return &ExecutorPluginCommand{
   267  				Meta: meta,
   268  			}, nil
   269  		},
   270  		"fs": func() (cli.Command, error) {
   271  			return &AllocFSCommand{
   272  				Meta: meta,
   273  			}, nil
   274  		},
   275  		"init": func() (cli.Command, error) {
   276  			return &JobInitCommand{
   277  				Meta: meta,
   278  			}, nil
   279  		},
   280  		"inspect": func() (cli.Command, error) {
   281  			return &JobInspectCommand{
   282  				Meta: meta,
   283  			}, nil
   284  		},
   285  		"keygen": func() (cli.Command, error) {
   286  			return &OperatorKeygenCommand{
   287  				Meta: meta,
   288  			}, nil
   289  		},
   290  		"keyring": func() (cli.Command, error) {
   291  			return &OperatorKeyringCommand{
   292  				Meta: meta,
   293  			}, nil
   294  		},
   295  		"job": func() (cli.Command, error) {
   296  			return &JobCommand{
   297  				Meta: meta,
   298  			}, nil
   299  		},
   300  		"job deployments": func() (cli.Command, error) {
   301  			return &JobDeploymentsCommand{
   302  				Meta: meta,
   303  			}, nil
   304  		},
   305  		"job dispatch": func() (cli.Command, error) {
   306  			return &JobDispatchCommand{
   307  				Meta: meta,
   308  			}, nil
   309  		},
   310  		"job eval": func() (cli.Command, error) {
   311  			return &JobEvalCommand{
   312  				Meta: meta,
   313  			}, nil
   314  		},
   315  		"job history": func() (cli.Command, error) {
   316  			return &JobHistoryCommand{
   317  				Meta: meta,
   318  			}, nil
   319  		},
   320  		"job init": func() (cli.Command, error) {
   321  			return &JobInitCommand{
   322  				Meta: meta,
   323  			}, nil
   324  		},
   325  		"job inspect": func() (cli.Command, error) {
   326  			return &JobInspectCommand{
   327  				Meta: meta,
   328  			}, nil
   329  		},
   330  		"job periodic": func() (cli.Command, error) {
   331  			return &JobPeriodicCommand{
   332  				Meta: meta,
   333  			}, nil
   334  		},
   335  		"job periodic force": func() (cli.Command, error) {
   336  			return &JobPeriodicForceCommand{
   337  				Meta: meta,
   338  			}, nil
   339  		},
   340  		"job plan": func() (cli.Command, error) {
   341  			return &JobPlanCommand{
   342  				Meta: meta,
   343  			}, nil
   344  		},
   345  		"job promote": func() (cli.Command, error) {
   346  			return &JobPromoteCommand{
   347  				Meta: meta,
   348  			}, nil
   349  		},
   350  		"job revert": func() (cli.Command, error) {
   351  			return &JobRevertCommand{
   352  				Meta: meta,
   353  			}, nil
   354  		},
   355  		"job run": func() (cli.Command, error) {
   356  			return &JobRunCommand{
   357  				Meta: meta,
   358  			}, nil
   359  		},
   360  		"job status": func() (cli.Command, error) {
   361  			return &JobStatusCommand{
   362  				Meta: meta,
   363  			}, nil
   364  		},
   365  		"job stop": func() (cli.Command, error) {
   366  			return &JobStopCommand{
   367  				Meta: meta,
   368  			}, nil
   369  		},
   370  		"job validate": func() (cli.Command, error) {
   371  			return &JobValidateCommand{
   372  				Meta: meta,
   373  			}, nil
   374  		},
   375  		"logmon": func() (cli.Command, error) {
   376  			return &LogMonPluginCommand{
   377  				Meta: meta,
   378  			}, nil
   379  		},
   380  		"logs": func() (cli.Command, error) {
   381  			return &AllocLogsCommand{
   382  				Meta: meta,
   383  			}, nil
   384  		},
   385  		"namespace": func() (cli.Command, error) {
   386  			return &NamespaceCommand{
   387  				Meta: meta,
   388  			}, nil
   389  		},
   390  		"namespace apply": func() (cli.Command, error) {
   391  			return &NamespaceApplyCommand{
   392  				Meta: meta,
   393  			}, nil
   394  		},
   395  		"namespace delete": func() (cli.Command, error) {
   396  			return &NamespaceDeleteCommand{
   397  				Meta: meta,
   398  			}, nil
   399  		},
   400  		"namespace inspect": func() (cli.Command, error) {
   401  			return &NamespaceInspectCommand{
   402  				Meta: meta,
   403  			}, nil
   404  		},
   405  		"namespace list": func() (cli.Command, error) {
   406  			return &NamespaceListCommand{
   407  				Meta: meta,
   408  			}, nil
   409  		},
   410  		"namespace status": func() (cli.Command, error) {
   411  			return &NamespaceStatusCommand{
   412  				Meta: meta,
   413  			}, nil
   414  		},
   415  		"node": func() (cli.Command, error) {
   416  			return &NodeCommand{
   417  				Meta: meta,
   418  			}, nil
   419  		},
   420  		"node config": func() (cli.Command, error) {
   421  			return &NodeConfigCommand{
   422  				Meta: meta,
   423  			}, nil
   424  		},
   425  		"node-drain": func() (cli.Command, error) {
   426  			return &NodeDrainCommand{
   427  				Meta: meta,
   428  			}, nil
   429  		},
   430  		"node drain": func() (cli.Command, error) {
   431  			return &NodeDrainCommand{
   432  				Meta: meta,
   433  			}, nil
   434  		},
   435  		"node eligibility": func() (cli.Command, error) {
   436  			return &NodeEligibilityCommand{
   437  				Meta: meta,
   438  			}, nil
   439  		},
   440  		"node-status": func() (cli.Command, error) {
   441  			return &NodeStatusCommand{
   442  				Meta: meta,
   443  			}, nil
   444  		},
   445  		"node status": func() (cli.Command, error) {
   446  			return &NodeStatusCommand{
   447  				Meta: meta,
   448  			}, nil
   449  		},
   450  		"operator": func() (cli.Command, error) {
   451  			return &OperatorCommand{
   452  				Meta: meta,
   453  			}, nil
   454  		},
   455  
   456  		"operator autopilot": func() (cli.Command, error) {
   457  			return &OperatorAutopilotCommand{
   458  				Meta: meta,
   459  			}, nil
   460  		},
   461  
   462  		"operator autopilot get-config": func() (cli.Command, error) {
   463  			return &OperatorAutopilotGetCommand{
   464  				Meta: meta,
   465  			}, nil
   466  		},
   467  
   468  		"operator autopilot set-config": func() (cli.Command, error) {
   469  			return &OperatorAutopilotSetCommand{
   470  				Meta: meta,
   471  			}, nil
   472  		},
   473  		"operator keygen": func() (cli.Command, error) {
   474  			return &OperatorKeygenCommand{
   475  				Meta: meta,
   476  			}, nil
   477  		},
   478  		"operator keyring": func() (cli.Command, error) {
   479  			return &OperatorKeyringCommand{
   480  				Meta: meta,
   481  			}, nil
   482  		},
   483  		"operator raft": func() (cli.Command, error) {
   484  			return &OperatorRaftCommand{
   485  				Meta: meta,
   486  			}, nil
   487  		},
   488  
   489  		"operator raft list-peers": func() (cli.Command, error) {
   490  			return &OperatorRaftListCommand{
   491  				Meta: meta,
   492  			}, nil
   493  		},
   494  
   495  		"operator raft remove-peer": func() (cli.Command, error) {
   496  			return &OperatorRaftRemoveCommand{
   497  				Meta: meta,
   498  			}, nil
   499  		},
   500  
   501  		"plan": func() (cli.Command, error) {
   502  			return &JobPlanCommand{
   503  				Meta: meta,
   504  			}, nil
   505  		},
   506  
   507  		"quota": func() (cli.Command, error) {
   508  			return &QuotaCommand{
   509  				Meta: meta,
   510  			}, nil
   511  		},
   512  
   513  		"quota apply": func() (cli.Command, error) {
   514  			return &QuotaApplyCommand{
   515  				Meta: meta,
   516  			}, nil
   517  		},
   518  
   519  		"quota delete": func() (cli.Command, error) {
   520  			return &QuotaDeleteCommand{
   521  				Meta: meta,
   522  			}, nil
   523  		},
   524  
   525  		"quota init": func() (cli.Command, error) {
   526  			return &QuotaInitCommand{
   527  				Meta: meta,
   528  			}, nil
   529  		},
   530  
   531  		"quota inspect": func() (cli.Command, error) {
   532  			return &QuotaInspectCommand{
   533  				Meta: meta,
   534  			}, nil
   535  		},
   536  
   537  		"quota list": func() (cli.Command, error) {
   538  			return &QuotaListCommand{
   539  				Meta: meta,
   540  			}, nil
   541  		},
   542  
   543  		"quota status": func() (cli.Command, error) {
   544  			return &QuotaStatusCommand{
   545  				Meta: meta,
   546  			}, nil
   547  		},
   548  
   549  		"run": func() (cli.Command, error) {
   550  			return &JobRunCommand{
   551  				Meta: meta,
   552  			}, nil
   553  		},
   554  		"sentinel": func() (cli.Command, error) {
   555  			return &SentinelCommand{
   556  				Meta: meta,
   557  			}, nil
   558  		},
   559  		"sentinel list": func() (cli.Command, error) {
   560  			return &SentinelListCommand{
   561  				Meta: meta,
   562  			}, nil
   563  		},
   564  		"sentinel apply": func() (cli.Command, error) {
   565  			return &SentinelApplyCommand{
   566  				Meta: meta,
   567  			}, nil
   568  		},
   569  		"sentinel delete": func() (cli.Command, error) {
   570  			return &SentinelDeleteCommand{
   571  				Meta: meta,
   572  			}, nil
   573  		},
   574  		"sentinel read": func() (cli.Command, error) {
   575  			return &SentinelReadCommand{
   576  				Meta: meta,
   577  			}, nil
   578  		},
   579  		"server": func() (cli.Command, error) {
   580  			return &ServerCommand{
   581  				Meta: meta,
   582  			}, nil
   583  		},
   584  		"server force-leave": func() (cli.Command, error) {
   585  			return &ServerForceLeaveCommand{
   586  				Meta: meta,
   587  			}, nil
   588  		},
   589  		"server join": func() (cli.Command, error) {
   590  			return &ServerJoinCommand{
   591  				Meta: meta,
   592  			}, nil
   593  		},
   594  		"server members": func() (cli.Command, error) {
   595  			return &ServerMembersCommand{
   596  				Meta: meta,
   597  			}, nil
   598  		},
   599  		"server-force-leave": func() (cli.Command, error) {
   600  			return &ServerForceLeaveCommand{
   601  				Meta: meta,
   602  			}, nil
   603  		},
   604  		"server-join": func() (cli.Command, error) {
   605  			return &ServerJoinCommand{
   606  				Meta: meta,
   607  			}, nil
   608  		},
   609  		"server-members": func() (cli.Command, error) {
   610  			return &ServerMembersCommand{
   611  				Meta: meta,
   612  			}, nil
   613  		},
   614  		"status": func() (cli.Command, error) {
   615  			return &StatusCommand{
   616  				Meta: meta,
   617  			}, nil
   618  		},
   619  		"stop": func() (cli.Command, error) {
   620  			return &JobStopCommand{
   621  				Meta: meta,
   622  			}, nil
   623  		},
   624  		"ui": func() (cli.Command, error) {
   625  			return &UiCommand{
   626  				Meta: meta,
   627  			}, nil
   628  		},
   629  		"validate": func() (cli.Command, error) {
   630  			return &JobValidateCommand{
   631  				Meta: meta,
   632  			}, nil
   633  		},
   634  		"version": func() (cli.Command, error) {
   635  			return &VersionCommand{
   636  				Version: version.GetVersion(),
   637  				Ui:      meta.Ui,
   638  			}, nil
   639  		},
   640  	}
   641  
   642  	deprecated := map[string]cli.CommandFactory{
   643  		"client-config": func() (cli.Command, error) {
   644  			return &DeprecatedCommand{
   645  				Old:  "client-config",
   646  				New:  "node config",
   647  				Meta: meta,
   648  				Command: &NodeConfigCommand{
   649  					Meta: meta,
   650  				},
   651  			}, nil
   652  		},
   653  
   654  		"keygen": func() (cli.Command, error) {
   655  			return &DeprecatedCommand{
   656  				Old:  "keygen",
   657  				New:  "operator keygen",
   658  				Meta: meta,
   659  				Command: &OperatorKeygenCommand{
   660  					Meta: meta,
   661  				},
   662  			}, nil
   663  		},
   664  
   665  		"keyring": func() (cli.Command, error) {
   666  			return &DeprecatedCommand{
   667  				Old:  "keyring",
   668  				New:  "operator keyring",
   669  				Meta: meta,
   670  				Command: &OperatorKeyringCommand{
   671  					Meta: meta,
   672  				},
   673  			}, nil
   674  		},
   675  
   676  		"server-force-leave": func() (cli.Command, error) {
   677  			return &DeprecatedCommand{
   678  				Old:  "server-force-leave",
   679  				New:  "server force-leave",
   680  				Meta: meta,
   681  				Command: &ServerForceLeaveCommand{
   682  					Meta: meta,
   683  				},
   684  			}, nil
   685  		},
   686  
   687  		"server-join": func() (cli.Command, error) {
   688  			return &DeprecatedCommand{
   689  				Old:  "server-join",
   690  				New:  "server join",
   691  				Meta: meta,
   692  				Command: &ServerJoinCommand{
   693  					Meta: meta,
   694  				},
   695  			}, nil
   696  		},
   697  
   698  		"server-members": func() (cli.Command, error) {
   699  			return &DeprecatedCommand{
   700  				Old:  "server-members",
   701  				New:  "server members",
   702  				Meta: meta,
   703  				Command: &ServerMembersCommand{
   704  					Meta: meta,
   705  				},
   706  			}, nil
   707  		},
   708  	}
   709  
   710  	for k, v := range deprecated {
   711  		all[k] = v
   712  	}
   713  	return all
   714  }