terraform/command/command.go

113 lines
3.1 KiB
Go
Raw Normal View History

2014-07-01 19:02:13 +02:00
package command
import (
"fmt"
"log"
2017-01-19 05:50:45 +01:00
"os"
2014-07-01 19:02:13 +02:00
"github.com/hashicorp/terraform/terraform"
2014-07-03 22:12:45 +02:00
"github.com/mitchellh/cli"
2014-07-01 19:02:13 +02:00
)
2014-09-29 20:24:16 +02:00
// Set to true when we're testing
var test bool = false
// DefaultDataDir is the default directory for storing local data.
const DefaultDataDir = ".terraform"
// DefaultPluginVendorDir is the location in the config directory to look for
// user-added plugin binaries. Terraform only reads from this path if it
// exists, it is never created by terraform.
const DefaultPluginVendorDir = "terraform.d/plugins"
2014-07-12 06:03:56 +02:00
// DefaultStateFilename is the default filename used for the state file.
const DefaultStateFilename = "terraform.tfstate"
// DefaultVarsFilename is the default filename used for vars
const DefaultVarsFilename = "terraform.tfvars"
2015-09-11 20:56:20 +02:00
// DefaultBackupExtension is added to the state file to form the path
const DefaultBackupExtension = ".backup"
2014-07-28 00:09:04 +02:00
// DefaultParallelism is the limit Terraform places on total parallel
// operations as it walks the dependency graph.
const DefaultParallelism = 10
2017-01-19 05:50:45 +01:00
// ErrUnsupportedLocalOp is the common error message shown for operations
// that require a backend.Local.
const ErrUnsupportedLocalOp = `The configured backend doesn't support this operation.
The "backend" in Terraform defines how Terraform operates. The default
backend performs all operations locally on your machine. Your configuration
is configured to use a non-local backend. This backend doesn't support this
operation.
If you want to use the state from the backend but force all other data
(configuration, variables, etc.) to come locally, you can force local
behavior with the "-local" flag.
`
// ModulePath returns the path to the root module from the CLI args.
//
// This centralizes the logic for any commands that expect a module path
// on their CLI args. This will verify that only one argument is given
// and that it is a path to configuration.
//
// If your command accepts more than one arg, then change the slice bounds
// to pass validation.
func ModulePath(args []string) (string, error) {
// TODO: test
if len(args) > 1 {
return "", fmt.Errorf("Too many command line arguments. Configuration path expected.")
}
if len(args) == 0 {
path, err := os.Getwd()
if err != nil {
return "", fmt.Errorf("Error getting pwd: %s", err)
}
return path, nil
}
return args[0], nil
}
2014-07-03 22:12:45 +02:00
func validateContext(ctx *terraform.Context, ui cli.Ui) bool {
log.Println("[INFO] Validating the context...")
ws, es := ctx.Validate()
log.Printf("[INFO] Validation result: %d warnings, %d errors", len(ws), len(es))
if len(ws) > 0 || len(es) > 0 {
2014-07-03 22:12:45 +02:00
ui.Output(
"There are warnings and/or errors related to your configuration. Please\n" +
"fix these before continuing.\n")
if len(ws) > 0 {
ui.Warn("Warnings:\n")
2014-07-03 22:12:45 +02:00
for _, w := range ws {
ui.Warn(fmt.Sprintf(" * %s", w))
2014-07-03 22:12:45 +02:00
}
if len(es) > 0 {
ui.Output("")
}
}
if len(es) > 0 {
ui.Error("Errors:\n")
2014-07-03 22:12:45 +02:00
for _, e := range es {
ui.Error(fmt.Sprintf(" * %s", e))
2014-07-03 22:12:45 +02:00
}
return false
} else {
ui.Warn(fmt.Sprintf("\n"+
"No errors found. Continuing with %d warning(s).\n", len(ws)))
return true
2014-07-03 22:12:45 +02:00
}
}
return true
}