From d2088463d38b8a10fe7caaddabc3d8f223af3ea3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2014 15:56:43 -0700 Subject: [PATCH] terraform: validate required variables are all set --- terraform/terraform.go | 21 +++++++++ terraform/terraform_test.go | 44 +++++++++++++++++++ terraform/test-fixtures/new-variables/main.tf | 4 ++ 3 files changed, 69 insertions(+) create mode 100644 terraform/test-fixtures/new-variables/main.tf diff --git a/terraform/terraform.go b/terraform/terraform.go index 8de2d2557c..7128872f39 100644 --- a/terraform/terraform.go +++ b/terraform/terraform.go @@ -30,6 +30,27 @@ type Config struct { // time, as well as richer checks such as verifying that the resource providers // can be properly initialized, can be configured, etc. func New(c *Config) (*Terraform, error) { + // Validate that all required variables have values + required := make(map[string]struct{}) + for k, v := range c.Config.Variables { + if v.Required() { + required[k] = struct{}{} + } + } + for k, _ := range c.Variables { + delete(required, k) + } + if len(required) > 0 { + errs := make([]error, 0, len(required)) + for k, _ := range required { + errs = append(errs, fmt.Errorf( + "Required variable not set: %s", k)) + } + + // TODO(mitchellh): Return multi-error + return nil, errs[0] + } + // Go through each resource and match it up to a provider mapping := make(map[*config.Resource]ResourceProvider) providers := make(map[string]ResourceProvider) diff --git a/terraform/terraform_test.go b/terraform/terraform_test.go index 585d36866b..4053a900f3 100644 --- a/terraform/terraform_test.go +++ b/terraform/terraform_test.go @@ -79,3 +79,47 @@ func TestNew(t *testing.T) { t.Fatalf("bad: %#v", mapping) } } + +func TestNew_variables(t *testing.T) { + config := testConfig(t, "new-variables") + tfConfig := &Config{ + Config: config, + } + + // Missing + tfConfig.Variables = map[string]string{ + "bar": "baz", + } + tf, err := New(tfConfig) + if err == nil { + t.Fatal("should error") + } + if tf != nil { + t.Fatalf("should not return tf") + } + + // Good + tfConfig.Variables = map[string]string{ + "foo": "bar", + } + tf, err = New(tfConfig) + if err != nil { + t.Fatalf("err: %s", err) + } + if tf == nil { + t.Fatal("tf should not be nil") + } + + // Good + tfConfig.Variables = map[string]string{ + "foo": "bar", + "bar": "baz", + } + tf, err = New(tfConfig) + if err != nil { + t.Fatalf("err: %s", err) + } + if tf == nil { + t.Fatal("tf should not be nil") + } +} diff --git a/terraform/test-fixtures/new-variables/main.tf b/terraform/test-fixtures/new-variables/main.tf new file mode 100644 index 0000000000..8f6471e367 --- /dev/null +++ b/terraform/test-fixtures/new-variables/main.tf @@ -0,0 +1,4 @@ +variable "foo" {} +variable "bar" { + default = "baz" +}