command/apply: basic implementation

This commit is contained in:
Mitchell Hashimoto 2014-06-18 16:42:13 -07:00
parent 830ddf0c8e
commit 8aa99687c3
2 changed files with 53 additions and 3 deletions

View File

@ -1,18 +1,67 @@
package command package command
import ( import (
"flag"
"fmt"
"strings" "strings"
"github.com/hashicorp/terraform/config"
"github.com/hashicorp/terraform/terraform"
"github.com/mitchellh/cli" "github.com/mitchellh/cli"
) )
// ApplyCommand is a Command implementation that applies a Terraform // ApplyCommand is a Command implementation that applies a Terraform
// configuration and actually builds or changes infrastructure. // configuration and actually builds or changes infrastructure.
type ApplyCommand struct { type ApplyCommand struct {
Ui cli.Ui TFConfig *terraform.Config
Ui cli.Ui
} }
func (c *ApplyCommand) Run(_ []string) int { func (c *ApplyCommand) Run(args []string) int {
cmdFlags := flag.NewFlagSet("apply", flag.ContinueOnError)
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
if err := cmdFlags.Parse(args); err != nil {
return 1
}
args = cmdFlags.Args()
if len(args) != 1 {
c.Ui.Error(
"The apply command expects only one argument with the path\n" +
"to a Terraform configuration.\n")
cmdFlags.Usage()
return 1
}
b, err := config.Load(args[0])
if err != nil {
c.Ui.Error(fmt.Sprintf("Error loading blueprint: %s", err))
return 1
}
tfconfig := c.TFConfig
tfconfig.Config = b
tf, err := terraform.New(tfconfig)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error initializing Terraform: %s", err))
return 1
}
diff, err := tf.Diff(nil)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error running diff: %s", err))
return 1
}
state, err := tf.Apply(nil, diff)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error applying diff: %s", err))
return 1
}
c.Ui.Output(strings.TrimSpace(state.String()))
return 0 return 0
} }

View File

@ -25,7 +25,8 @@ func init() {
Commands = map[string]cli.CommandFactory{ Commands = map[string]cli.CommandFactory{
"apply": func() (cli.Command, error) { "apply": func() (cli.Command, error) {
return &command.ApplyCommand{ return &command.ApplyCommand{
Ui: ui, TFConfig: &TFConfig,
Ui: ui,
}, nil }, nil
}, },