2014-05-24 14:04:43 -05:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
2014-07-02 19:01:02 -05:00
|
|
|
"os/signal"
|
2014-05-24 14:04:43 -05:00
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/command"
|
|
|
|
"github.com/mitchellh/cli"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Commands is the mapping of all the available Terraform commands.
|
|
|
|
var Commands map[string]cli.CommandFactory
|
2016-03-22 12:41:02 -05:00
|
|
|
var PlumbingCommands map[string]struct{}
|
2014-05-24 14:04:43 -05:00
|
|
|
|
2014-06-26 19:05:21 -05:00
|
|
|
// Ui is the cli.Ui used for communicating to the outside world.
|
|
|
|
var Ui cli.Ui
|
|
|
|
|
2015-02-21 18:04:32 -06:00
|
|
|
const (
|
|
|
|
ErrorPrefix = "e:"
|
|
|
|
OutputPrefix = "o:"
|
|
|
|
)
|
2014-06-10 12:28:47 -05:00
|
|
|
|
2014-05-24 14:04:43 -05:00
|
|
|
func init() {
|
2014-06-26 19:05:21 -05:00
|
|
|
Ui = &cli.PrefixedUi{
|
2014-06-10 12:28:47 -05:00
|
|
|
AskPrefix: OutputPrefix,
|
|
|
|
OutputPrefix: OutputPrefix,
|
|
|
|
InfoPrefix: OutputPrefix,
|
|
|
|
ErrorPrefix: ErrorPrefix,
|
2016-05-24 15:59:44 -05:00
|
|
|
Ui: &cli.BasicUi{Writer: os.Stdout},
|
2014-06-10 12:28:47 -05:00
|
|
|
}
|
2014-05-24 14:04:43 -05:00
|
|
|
|
2014-07-12 22:38:56 -05:00
|
|
|
meta := command.Meta{
|
2017-04-13 20:05:58 -05:00
|
|
|
Color: true,
|
|
|
|
GlobalPluginDirs: globalPluginDirs(),
|
|
|
|
PluginOverrides: &PluginOverrides,
|
|
|
|
Ui: Ui,
|
2014-07-12 22:38:56 -05:00
|
|
|
}
|
|
|
|
|
2016-11-24 11:22:18 -06:00
|
|
|
// The command list is included in the terraform -help
|
|
|
|
// output, which is in turn included in the docs at
|
|
|
|
// website/source/docs/commands/index.html.markdown; if you
|
|
|
|
// add, remove or reclassify commands then consider updating
|
|
|
|
// that to match.
|
|
|
|
|
2016-03-22 12:41:02 -05:00
|
|
|
PlumbingCommands = map[string]struct{}{
|
2017-04-01 15:06:28 -05:00
|
|
|
"state": struct{}{}, // includes all subcommands
|
|
|
|
"debug": struct{}{}, // includes all subcommands
|
|
|
|
"force-unlock": struct{}{},
|
2016-03-22 12:41:02 -05:00
|
|
|
}
|
|
|
|
|
2014-05-24 14:04:43 -05:00
|
|
|
Commands = map[string]cli.CommandFactory{
|
2014-05-24 14:27:58 -05:00
|
|
|
"apply": func() (cli.Command, error) {
|
|
|
|
return &command.ApplyCommand{
|
2014-07-12 22:38:56 -05:00
|
|
|
Meta: meta,
|
|
|
|
ShutdownCh: makeShutdownCh(),
|
2014-05-24 14:27:58 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-11-14 00:18:18 -06:00
|
|
|
"console": func() (cli.Command, error) {
|
|
|
|
return &command.ConsoleCommand{
|
|
|
|
Meta: meta,
|
|
|
|
ShutdownCh: makeShutdownCh(),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-09-30 23:51:45 -05:00
|
|
|
"destroy": func() (cli.Command, error) {
|
|
|
|
return &command.ApplyCommand{
|
|
|
|
Meta: meta,
|
|
|
|
Destroy: true,
|
|
|
|
ShutdownCh: makeShutdownCh(),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2017-02-16 17:29:19 -06:00
|
|
|
"env": func() (cli.Command, error) {
|
2017-05-30 17:06:13 -05:00
|
|
|
return &command.WorkspaceCommand{
|
|
|
|
Meta: meta,
|
|
|
|
LegacyName: true,
|
2017-02-16 17:29:19 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2017-02-23 12:13:28 -06:00
|
|
|
"env list": func() (cli.Command, error) {
|
2017-05-30 17:06:13 -05:00
|
|
|
return &command.WorkspaceListCommand{
|
|
|
|
Meta: meta,
|
|
|
|
LegacyName: true,
|
2017-02-23 12:13:28 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"env select": func() (cli.Command, error) {
|
2017-05-30 17:06:13 -05:00
|
|
|
return &command.WorkspaceSelectCommand{
|
|
|
|
Meta: meta,
|
|
|
|
LegacyName: true,
|
2017-02-23 12:13:28 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"env new": func() (cli.Command, error) {
|
2017-05-30 17:06:13 -05:00
|
|
|
return &command.WorkspaceNewCommand{
|
|
|
|
Meta: meta,
|
|
|
|
LegacyName: true,
|
2017-02-23 12:13:28 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"env delete": func() (cli.Command, error) {
|
2017-05-30 17:06:13 -05:00
|
|
|
return &command.WorkspaceDeleteCommand{
|
|
|
|
Meta: meta,
|
|
|
|
LegacyName: true,
|
2017-02-23 12:13:28 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-02-02 16:10:22 -06:00
|
|
|
"fmt": func() (cli.Command, error) {
|
|
|
|
return &command.FmtCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-09-22 12:56:50 -05:00
|
|
|
"get": func() (cli.Command, error) {
|
|
|
|
return &command.GetCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-07-01 12:02:13 -05:00
|
|
|
"graph": func() (cli.Command, error) {
|
|
|
|
return &command.GraphCommand{
|
2014-07-12 22:38:56 -05:00
|
|
|
Meta: meta,
|
2014-07-01 12:02:13 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-05-04 12:06:16 -05:00
|
|
|
"import": func() (cli.Command, error) {
|
|
|
|
return &command.ImportCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-09-27 14:31:38 -05:00
|
|
|
"init": func() (cli.Command, error) {
|
|
|
|
return &command.InitCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-04-04 21:11:11 -05:00
|
|
|
"internal-plugin": func() (cli.Command, error) {
|
|
|
|
return &command.InternalPluginCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-07-13 12:25:42 -05:00
|
|
|
"output": func() (cli.Command, error) {
|
|
|
|
return &command.OutputCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-06-20 13:47:02 -05:00
|
|
|
"plan": func() (cli.Command, error) {
|
|
|
|
return &command.PlanCommand{
|
2014-07-12 22:38:56 -05:00
|
|
|
Meta: meta,
|
2014-06-09 13:53:41 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2017-04-25 20:10:10 -05:00
|
|
|
"providers": func() (cli.Command, error) {
|
|
|
|
return &command.ProvidersCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2015-03-04 22:42:26 -06:00
|
|
|
"push": func() (cli.Command, error) {
|
|
|
|
return &command.PushCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-06-27 13:09:01 -05:00
|
|
|
"refresh": func() (cli.Command, error) {
|
|
|
|
return &command.RefreshCommand{
|
2014-07-12 22:38:56 -05:00
|
|
|
Meta: meta,
|
2014-06-27 13:09:01 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-07-12 21:47:31 -05:00
|
|
|
"show": func() (cli.Command, error) {
|
|
|
|
return &command.ShowCommand{
|
2014-07-12 22:38:56 -05:00
|
|
|
Meta: meta,
|
2014-07-12 21:47:31 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2015-02-26 12:29:51 -06:00
|
|
|
"taint": func() (cli.Command, error) {
|
|
|
|
return &command.TaintCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2015-11-05 08:47:08 -06:00
|
|
|
"validate": func() (cli.Command, error) {
|
|
|
|
return &command.ValidateCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2014-05-24 14:04:43 -05:00
|
|
|
"version": func() (cli.Command, error) {
|
|
|
|
return &command.VersionCommand{
|
2014-07-13 12:42:18 -05:00
|
|
|
Meta: meta,
|
2014-05-24 14:04:43 -05:00
|
|
|
Revision: GitCommit,
|
|
|
|
Version: Version,
|
|
|
|
VersionPrerelease: VersionPrerelease,
|
2014-10-13 16:05:29 -05:00
|
|
|
CheckFunc: commandVersionCheck,
|
2014-05-24 14:04:43 -05:00
|
|
|
}, nil
|
|
|
|
},
|
2016-03-08 14:37:34 -06:00
|
|
|
|
|
|
|
"untaint": func() (cli.Command, error) {
|
|
|
|
return &command.UntaintCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
2016-03-22 12:41:02 -05:00
|
|
|
|
2017-05-30 17:06:13 -05:00
|
|
|
"workspace": func() (cli.Command, error) {
|
|
|
|
return &command.WorkspaceCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"workspace list": func() (cli.Command, error) {
|
|
|
|
return &command.WorkspaceListCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"workspace select": func() (cli.Command, error) {
|
|
|
|
return &command.WorkspaceSelectCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"workspace new": func() (cli.Command, error) {
|
|
|
|
return &command.WorkspaceNewCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"workspace delete": func() (cli.Command, error) {
|
|
|
|
return &command.WorkspaceDeleteCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-03-22 12:41:02 -05:00
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Plumbing
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
|
2016-11-15 14:33:40 -06:00
|
|
|
"debug": func() (cli.Command, error) {
|
|
|
|
return &command.DebugCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"debug json2dot": func() (cli.Command, error) {
|
|
|
|
return &command.DebugJSON2DotCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2017-04-01 15:06:28 -05:00
|
|
|
"force-unlock": func() (cli.Command, error) {
|
|
|
|
return &command.UnlockCommand{
|
|
|
|
Meta: meta,
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-03-22 12:41:02 -05:00
|
|
|
"state": func() (cli.Command, error) {
|
2017-03-01 09:10:47 -06:00
|
|
|
return &command.StateCommand{}, nil
|
2016-03-22 12:41:02 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
"state list": func() (cli.Command, error) {
|
|
|
|
return &command.StateListCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2016-03-22 12:41:02 -05:00
|
|
|
}, nil
|
|
|
|
},
|
2016-03-25 12:17:25 -05:00
|
|
|
|
2016-03-31 11:29:39 -05:00
|
|
|
"state rm": func() (cli.Command, error) {
|
|
|
|
return &command.StateRmCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2016-03-31 11:29:39 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-06-22 03:46:38 -05:00
|
|
|
"state mv": func() (cli.Command, error) {
|
|
|
|
return &command.StateMvCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2016-06-22 03:46:38 -05:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2017-01-18 22:51:06 -06:00
|
|
|
"state pull": func() (cli.Command, error) {
|
|
|
|
return &command.StatePullCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2017-01-18 22:51:06 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
|
|
|
"state push": func() (cli.Command, error) {
|
|
|
|
return &command.StatePushCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2017-01-18 22:51:06 -06:00
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
|
2016-03-25 12:17:25 -05:00
|
|
|
"state show": func() (cli.Command, error) {
|
|
|
|
return &command.StateShowCommand{
|
2017-03-01 09:10:47 -06:00
|
|
|
Meta: meta,
|
2016-03-25 12:17:25 -05:00
|
|
|
}, nil
|
|
|
|
},
|
2014-05-24 14:04:43 -05:00
|
|
|
}
|
|
|
|
}
|
2014-07-02 19:01:02 -05:00
|
|
|
|
|
|
|
// makeShutdownCh creates an interrupt listener and returns a channel.
|
|
|
|
// A message will be sent on the channel for every interrupt received.
|
|
|
|
func makeShutdownCh() <-chan struct{} {
|
|
|
|
resultCh := make(chan struct{})
|
|
|
|
|
|
|
|
signalCh := make(chan os.Signal, 4)
|
2016-12-08 11:10:52 -06:00
|
|
|
signal.Notify(signalCh, ignoreSignals...)
|
|
|
|
signal.Notify(signalCh, forwardSignals...)
|
2014-07-02 19:01:02 -05:00
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
<-signalCh
|
|
|
|
resultCh <- struct{}{}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return resultCh
|
|
|
|
}
|