Deprecated commands

This commit is contained in:
Alex Dadgar 2018-03-21 10:16:13 -07:00
parent de08c1891a
commit aa85b61fc8
3 changed files with 230 additions and 115 deletions

View File

@ -1,19 +1,51 @@
package main
package command
import (
"fmt"
"os"
"github.com/hashicorp/nomad/command"
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/version"
"github.com/mitchellh/cli"
)
// DeprecatedCommand is a command that wraps an existing command and prints a
// deprecation notice and points the user to the new command. Deprecated
// commands are always hidden from help output.
type DeprecatedCommand struct {
cli.Command
Meta
// Old is the old command name, New is the new command name.
Old, New string
}
// Help wraps the embedded Help command and prints a warning about deprecations.
func (c *DeprecatedCommand) Help() string {
c.warn()
return c.Command.Help()
}
// Run wraps the embedded Run command and prints a warning about deprecation.
func (c *DeprecatedCommand) Run(args []string) int {
c.warn()
return c.Command.Run(args)
}
func (c *DeprecatedCommand) warn() {
c.Ui.Warn(wrapAtLength(fmt.Sprintf(
"WARNING! The \"nomad %s\" command is deprecated. Please use \"nomad %s\" "+
"instead. This command will be removed in Nomad 0.10 (or later).",
c.Old,
c.New)))
c.Ui.Warn("")
}
// Commands returns the mapping of CLI commands for Nomad. The meta
// parameter lets you set meta options for all commands.
func Commands(metaPtr *command.Meta) map[string]cli.CommandFactory {
func Commands(metaPtr *Meta) map[string]cli.CommandFactory {
if metaPtr == nil {
metaPtr = new(command.Meta)
metaPtr = new(Meta)
}
meta := *metaPtr
@ -25,94 +57,94 @@ func Commands(metaPtr *command.Meta) map[string]cli.CommandFactory {
}
}
return map[string]cli.CommandFactory{
all := map[string]cli.CommandFactory{
"acl": func() (cli.Command, error) {
return &command.ACLCommand{
return &ACLCommand{
Meta: meta,
}, nil
},
"acl bootstrap": func() (cli.Command, error) {
return &command.ACLBootstrapCommand{
return &ACLBootstrapCommand{
Meta: meta,
}, nil
},
"acl policy": func() (cli.Command, error) {
return &command.ACLPolicyCommand{
return &ACLPolicyCommand{
Meta: meta,
}, nil
},
"acl policy apply": func() (cli.Command, error) {
return &command.ACLPolicyApplyCommand{
return &ACLPolicyApplyCommand{
Meta: meta,
}, nil
},
"acl policy delete": func() (cli.Command, error) {
return &command.ACLPolicyDeleteCommand{
return &ACLPolicyDeleteCommand{
Meta: meta,
}, nil
},
"acl policy info": func() (cli.Command, error) {
return &command.ACLPolicyInfoCommand{
return &ACLPolicyInfoCommand{
Meta: meta,
}, nil
},
"acl policy list": func() (cli.Command, error) {
return &command.ACLPolicyListCommand{
return &ACLPolicyListCommand{
Meta: meta,
}, nil
},
"acl token": func() (cli.Command, error) {
return &command.ACLTokenCommand{
return &ACLTokenCommand{
Meta: meta,
}, nil
},
"acl token create": func() (cli.Command, error) {
return &command.ACLTokenCreateCommand{
return &ACLTokenCreateCommand{
Meta: meta,
}, nil
},
"acl token update": func() (cli.Command, error) {
return &command.ACLTokenUpdateCommand{
return &ACLTokenUpdateCommand{
Meta: meta,
}, nil
},
"acl token delete": func() (cli.Command, error) {
return &command.ACLTokenDeleteCommand{
return &ACLTokenDeleteCommand{
Meta: meta,
}, nil
},
"acl token info": func() (cli.Command, error) {
return &command.ACLTokenInfoCommand{
return &ACLTokenInfoCommand{
Meta: meta,
}, nil
},
"acl token self": func() (cli.Command, error) {
return &command.ACLTokenSelfCommand{
return &ACLTokenSelfCommand{
Meta: meta,
}, nil
},
"alloc": func() (cli.Command, error) {
return &command.AllocCommand{
return &AllocCommand{
Meta: meta,
}, nil
},
"alloc fs": func() (cli.Command, error) {
return &command.AllocFSCommand{
return &AllocFSCommand{
Meta: meta,
}, nil
},
"alloc logs": func() (cli.Command, error) {
return &command.AllocLogsCommand{
return &AllocLogsCommand{
Meta: meta,
}, nil
},
"alloc status": func() (cli.Command, error) {
return &command.AllocStatusCommand{
return &AllocStatusCommand{
Meta: meta,
}, nil
},
"alloc-status": func() (cli.Command, error) {
return &command.AllocStatusCommand{
return &AllocStatusCommand{
Meta: meta,
}, nil
},
@ -124,424 +156,492 @@ func Commands(metaPtr *command.Meta) map[string]cli.CommandFactory {
}, nil
},
"agent-info": func() (cli.Command, error) {
return &command.AgentInfoCommand{
return &AgentInfoCommand{
Meta: meta,
}, nil
},
"check": func() (cli.Command, error) {
return &command.AgentCheckCommand{
Meta: meta,
}, nil
},
"client-config": func() (cli.Command, error) {
return &command.NodeConfigCommand{
return &AgentCheckCommand{
Meta: meta,
}, nil
},
"deployment": func() (cli.Command, error) {
return &command.DeploymentCommand{
return &DeploymentCommand{
Meta: meta,
}, nil
},
"deployment fail": func() (cli.Command, error) {
return &command.DeploymentFailCommand{
return &DeploymentFailCommand{
Meta: meta,
}, nil
},
"deployment list": func() (cli.Command, error) {
return &command.DeploymentListCommand{
return &DeploymentListCommand{
Meta: meta,
}, nil
},
"deployment pause": func() (cli.Command, error) {
return &command.DeploymentPauseCommand{
return &DeploymentPauseCommand{
Meta: meta,
}, nil
},
"deployment promote": func() (cli.Command, error) {
return &command.DeploymentPromoteCommand{
return &DeploymentPromoteCommand{
Meta: meta,
}, nil
},
"deployment resume": func() (cli.Command, error) {
return &command.DeploymentResumeCommand{
return &DeploymentResumeCommand{
Meta: meta,
}, nil
},
"deployment status": func() (cli.Command, error) {
return &command.DeploymentStatusCommand{
return &DeploymentStatusCommand{
Meta: meta,
}, nil
},
"eval": func() (cli.Command, error) {
return &command.EvalCommand{
return &EvalCommand{
Meta: meta,
}, nil
},
"eval status": func() (cli.Command, error) {
return &command.EvalStatusCommand{
return &EvalStatusCommand{
Meta: meta,
}, nil
},
"eval-status": func() (cli.Command, error) {
return &command.EvalStatusCommand{
return &EvalStatusCommand{
Meta: meta,
}, nil
},
"executor": func() (cli.Command, error) {
return &command.ExecutorPluginCommand{
return &ExecutorPluginCommand{
Meta: meta,
}, nil
},
"fs": func() (cli.Command, error) {
return &command.AllocFSCommand{
return &AllocFSCommand{
Meta: meta,
}, nil
},
"init": func() (cli.Command, error) {
return &command.JobInitCommand{
return &JobInitCommand{
Meta: meta,
}, nil
},
"inspect": func() (cli.Command, error) {
return &command.JobInspectCommand{
return &JobInspectCommand{
Meta: meta,
}, nil
},
"keygen": func() (cli.Command, error) {
return &command.OperatorKeygenCommand{
return &OperatorKeygenCommand{
Meta: meta,
}, nil
},
"keyring": func() (cli.Command, error) {
return &command.OperatorKeyringCommand{
return &OperatorKeyringCommand{
Meta: meta,
}, nil
},
"job": func() (cli.Command, error) {
return &command.JobCommand{
return &JobCommand{
Meta: meta,
}, nil
},
"job deployments": func() (cli.Command, error) {
return &command.JobDeploymentsCommand{
return &JobDeploymentsCommand{
Meta: meta,
}, nil
},
"job dispatch": func() (cli.Command, error) {
return &command.JobDispatchCommand{
return &JobDispatchCommand{
Meta: meta,
}, nil
},
"job history": func() (cli.Command, error) {
return &command.JobHistoryCommand{
return &JobHistoryCommand{
Meta: meta,
}, nil
},
"job init": func() (cli.Command, error) {
return &command.JobInitCommand{
return &JobInitCommand{
Meta: meta,
}, nil
},
"job inspect": func() (cli.Command, error) {
return &command.JobInspectCommand{
return &JobInspectCommand{
Meta: meta,
}, nil
},
"job plan": func() (cli.Command, error) {
return &command.JobPlanCommand{
return &JobPlanCommand{
Meta: meta,
}, nil
},
"job promote": func() (cli.Command, error) {
return &command.JobPromoteCommand{
return &JobPromoteCommand{
Meta: meta,
}, nil
},
"job revert": func() (cli.Command, error) {
return &command.JobRevertCommand{
return &JobRevertCommand{
Meta: meta,
}, nil
},
"job run": func() (cli.Command, error) {
return &command.JobRunCommand{
return &JobRunCommand{
Meta: meta,
}, nil
},
"job status": func() (cli.Command, error) {
return &command.JobStatusCommand{
return &JobStatusCommand{
Meta: meta,
}, nil
},
"job stop": func() (cli.Command, error) {
return &command.JobStopCommand{
return &JobStopCommand{
Meta: meta,
}, nil
},
"job validate": func() (cli.Command, error) {
return &command.JobValidateCommand{
return &JobValidateCommand{
Meta: meta,
}, nil
},
"logs": func() (cli.Command, error) {
return &command.AllocLogsCommand{
return &AllocLogsCommand{
Meta: meta,
}, nil
},
"namespace": func() (cli.Command, error) {
return &command.NamespaceCommand{
return &NamespaceCommand{
Meta: meta,
}, nil
},
"namespace apply": func() (cli.Command, error) {
return &command.NamespaceApplyCommand{
return &NamespaceApplyCommand{
Meta: meta,
}, nil
},
"namespace delete": func() (cli.Command, error) {
return &command.NamespaceDeleteCommand{
return &NamespaceDeleteCommand{
Meta: meta,
}, nil
},
"namespace inspect": func() (cli.Command, error) {
return &command.NamespaceInspectCommand{
return &NamespaceInspectCommand{
Meta: meta,
}, nil
},
"namespace list": func() (cli.Command, error) {
return &command.NamespaceListCommand{
return &NamespaceListCommand{
Meta: meta,
}, nil
},
"namespace status": func() (cli.Command, error) {
return &command.NamespaceStatusCommand{
return &NamespaceStatusCommand{
Meta: meta,
}, nil
},
"node": func() (cli.Command, error) {
return &command.NodeCommand{
return &NodeCommand{
Meta: meta,
}, nil
},
"node config": func() (cli.Command, error) {
return &command.NodeConfigCommand{
return &NodeConfigCommand{
Meta: meta,
}, nil
},
"node-drain": func() (cli.Command, error) {
return &command.NodeDrainCommand{
return &NodeDrainCommand{
Meta: meta,
}, nil
},
"node drain": func() (cli.Command, error) {
return &command.NodeDrainCommand{
return &NodeDrainCommand{
Meta: meta,
}, nil
},
"node eligibility": func() (cli.Command, error) {
return &command.NodeEligibilityCommand{
return &NodeEligibilityCommand{
Meta: meta,
}, nil
},
"node-status": func() (cli.Command, error) {
return &command.NodeStatusCommand{
return &NodeStatusCommand{
Meta: meta,
}, nil
},
"node status": func() (cli.Command, error) {
return &command.NodeStatusCommand{
return &NodeStatusCommand{
Meta: meta,
}, nil
},
"operator": func() (cli.Command, error) {
return &command.OperatorCommand{
return &OperatorCommand{
Meta: meta,
}, nil
},
"operator autopilot": func() (cli.Command, error) {
return &command.OperatorAutopilotCommand{
return &OperatorAutopilotCommand{
Meta: meta,
}, nil
},
"operator autopilot get-config": func() (cli.Command, error) {
return &command.OperatorAutopilotGetCommand{
return &OperatorAutopilotGetCommand{
Meta: meta,
}, nil
},
"operator autopilot set-config": func() (cli.Command, error) {
return &command.OperatorAutopilotSetCommand{
return &OperatorAutopilotSetCommand{
Meta: meta,
}, nil
},
"operator keygen": func() (cli.Command, error) {
return &command.OperatorKeygenCommand{
return &OperatorKeygenCommand{
Meta: meta,
}, nil
},
"operator keyring": func() (cli.Command, error) {
return &command.OperatorKeyringCommand{
return &OperatorKeyringCommand{
Meta: meta,
}, nil
},
"operator raft": func() (cli.Command, error) {
return &command.OperatorRaftCommand{
return &OperatorRaftCommand{
Meta: meta,
}, nil
},
"operator raft list-peers": func() (cli.Command, error) {
return &command.OperatorRaftListCommand{
return &OperatorRaftListCommand{
Meta: meta,
}, nil
},
"operator raft remove-peer": func() (cli.Command, error) {
return &command.OperatorRaftRemoveCommand{
return &OperatorRaftRemoveCommand{
Meta: meta,
}, nil
},
"plan": func() (cli.Command, error) {
return &command.JobPlanCommand{
return &JobPlanCommand{
Meta: meta,
}, nil
},
"quota": func() (cli.Command, error) {
return &command.QuotaCommand{
return &QuotaCommand{
Meta: meta,
}, nil
},
"quota apply": func() (cli.Command, error) {
return &command.QuotaApplyCommand{
return &QuotaApplyCommand{
Meta: meta,
}, nil
},
"quota delete": func() (cli.Command, error) {
return &command.QuotaDeleteCommand{
return &QuotaDeleteCommand{
Meta: meta,
}, nil
},
"quota init": func() (cli.Command, error) {
return &command.QuotaInitCommand{
return &QuotaInitCommand{
Meta: meta,
}, nil
},
"quota inspect": func() (cli.Command, error) {
return &command.QuotaInspectCommand{
return &QuotaInspectCommand{
Meta: meta,
}, nil
},
"quota list": func() (cli.Command, error) {
return &command.QuotaListCommand{
return &QuotaListCommand{
Meta: meta,
}, nil
},
"quota status": func() (cli.Command, error) {
return &command.QuotaStatusCommand{
return &QuotaStatusCommand{
Meta: meta,
}, nil
},
"run": func() (cli.Command, error) {
return &command.JobRunCommand{
return &JobRunCommand{
Meta: meta,
}, nil
},
"sentinel": func() (cli.Command, error) {
return &command.SentinelCommand{
return &SentinelCommand{
Meta: meta,
}, nil
},
"sentinel list": func() (cli.Command, error) {
return &command.SentinelListCommand{
return &SentinelListCommand{
Meta: meta,
}, nil
},
"sentinel apply": func() (cli.Command, error) {
return &command.SentinelApplyCommand{
return &SentinelApplyCommand{
Meta: meta,
}, nil
},
"sentinel delete": func() (cli.Command, error) {
return &command.SentinelDeleteCommand{
return &SentinelDeleteCommand{
Meta: meta,
}, nil
},
"sentinel read": func() (cli.Command, error) {
return &command.SentinelReadCommand{
return &SentinelReadCommand{
Meta: meta,
}, nil
},
"server": func() (cli.Command, error) {
return &command.ServerCommand{
return &ServerCommand{
Meta: meta,
}, nil
},
"server force-leave": func() (cli.Command, error) {
return &command.ServerForceLeaveCommand{
return &ServerForceLeaveCommand{
Meta: meta,
}, nil
},
"server join": func() (cli.Command, error) {
return &command.ServerJoinCommand{
return &ServerJoinCommand{
Meta: meta,
}, nil
},
"server members": func() (cli.Command, error) {
return &command.ServerMembersCommand{
return &ServerMembersCommand{
Meta: meta,
}, nil
},
"server-force-leave": func() (cli.Command, error) {
return &command.ServerForceLeaveCommand{
return &ServerForceLeaveCommand{
Meta: meta,
}, nil
},
"server-join": func() (cli.Command, error) {
return &command.ServerJoinCommand{
return &ServerJoinCommand{
Meta: meta,
}, nil
},
"server-members": func() (cli.Command, error) {
return &command.ServerMembersCommand{
return &ServerMembersCommand{
Meta: meta,
}, nil
},
"status": func() (cli.Command, error) {
return &command.StatusCommand{
return &StatusCommand{
Meta: meta,
}, nil
},
"stop": func() (cli.Command, error) {
return &command.JobStopCommand{
return &JobStopCommand{
Meta: meta,
}, nil
},
"ui": func() (cli.Command, error) {
return &command.UiCommand{
return &UiCommand{
Meta: meta,
}, nil
},
"validate": func() (cli.Command, error) {
return &command.JobValidateCommand{
return &JobValidateCommand{
Meta: meta,
}, nil
},
"version": func() (cli.Command, error) {
return &command.VersionCommand{
return &VersionCommand{
Version: version.GetVersion(),
Ui: meta.Ui,
}, nil
},
}
deprecated := map[string]cli.CommandFactory{
"client-config": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "client-config",
New: "node config",
Meta: meta,
Command: &NodeConfigCommand{
Meta: meta,
},
}, nil
},
"keygen": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "keygen",
New: "operator keygen",
Meta: meta,
Command: &OperatorKeygenCommand{
Meta: meta,
},
}, nil
},
"keyring": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "keyring",
New: "operator keyring",
Meta: meta,
Command: &OperatorKeyringCommand{
Meta: meta,
},
}, nil
},
"server-force-leave": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "server-force-leave",
New: "server force-leave",
Meta: meta,
Command: &ServerForceLeaveCommand{
Meta: meta,
},
}, nil
},
"server-join": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "server-join",
New: "server join",
Meta: meta,
Command: &ServerJoinCommand{
Meta: meta,
},
}, nil
},
"server-members": func() (cli.Command, error) {
return &DeprecatedCommand{
Old: "server-members",
New: "server members",
Meta: meta,
Command: &ServerMembersCommand{
Meta: meta,
},
}, nil
},
}
for k, v := range deprecated {
all[k] = v
}
return all
}

View File

@ -13,11 +13,15 @@ import (
gg "github.com/hashicorp/go-getter"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/jobspec"
"github.com/kr/text"
"github.com/posener/complete"
"github.com/ryanuber/columnize"
)
// maxLineLength is the maximum width of any line.
const maxLineLength int = 78
// formatKV takes a set of strings and formats them into properly
// aligned k = v pairs using the columnize library.
func formatKV(in []string) string {
@ -53,6 +57,22 @@ func limit(s string, length int) string {
return s[:length]
}
// wrapAtLengthWithPadding wraps the given text at the maxLineLength, taking
// into account any provided left padding.
func wrapAtLengthWithPadding(s string, pad int) string {
wrapped := text.Wrap(s, maxLineLength-pad)
lines := strings.Split(wrapped, "\n")
for i, line := range lines {
lines[i] = strings.Repeat(" ", pad) + line
}
return strings.Join(lines, "\n")
}
// wrapAtLength wraps the given text to maxLineLength.
func wrapAtLength(s string) string {
return wrapAtLengthWithPadding(s, 0)
}
// formatTime formats the time to string based on RFC822
func formatTime(t time.Time) string {
if t.Unix() < 1 {

View File

@ -9,6 +9,7 @@ import (
"strings"
"text/tabwriter"
"github.com/hashicorp/nomad/command"
"github.com/hashicorp/nomad/version"
"github.com/mitchellh/cli"
"github.com/sean-/seed"
@ -62,16 +63,10 @@ func main() {
}
func Run(args []string) int {
return RunCustom(args, Commands(nil))
return RunCustom(args, command.Commands(nil))
}
func RunCustom(args []string, commands map[string]cli.CommandFactory) int {
// Build the commands to include in the help now.
commandsInclude := make([]string, 0, len(commands))
for k := range commands {
commandsInclude = append(commandsInclude, k)
}
cli := &cli.CLI{
Name: "nomad",
Version: version.GetVersion().FullVersionNumber(true),