Skip to content

Commit

Permalink
Merge pull request #679 from hashicorp/b-fix-module=type
Browse files Browse the repository at this point in the history
config: validate that module variables can go to ints, convert [GH-624]
  • Loading branch information
mitchellh committed Dec 16, 2014
2 parents 41dabd7 + d24082d commit 675eab1
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 21 deletions.
62 changes: 41 additions & 21 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,34 +239,54 @@ func (c *Config) Validate() error {
"%s: module repeated multiple times",
m.Id()))
}

// Already seen this module, just skip it
continue
}

if _, ok := modules[m.Id()]; !ok {
// If we haven't seen this module before, check that the
// source has no interpolations.
rc, err := NewRawConfig(map[string]interface{}{
"root": m.Source,
})
if err != nil {
errs = append(errs, fmt.Errorf(
"%s: module source error: %s",
m.Id(), err))
} else if len(rc.Interpolations) > 0 {
errs = append(errs, fmt.Errorf(
"%s: module source cannot contain interpolations",
m.Id()))
}
modules[m.Id()] = m

// Check that the name matches our regexp
if !NameRegexp.Match([]byte(m.Name)) {
// Check that the source has no interpolations
rc, err := NewRawConfig(map[string]interface{}{
"root": m.Source,
})
if err != nil {
errs = append(errs, fmt.Errorf(
"%s: module source error: %s",
m.Id(), err))
} else if len(rc.Interpolations) > 0 {
errs = append(errs, fmt.Errorf(
"%s: module source cannot contain interpolations",
m.Id()))
}

// Check that the name matches our regexp
if !NameRegexp.Match([]byte(m.Name)) {
errs = append(errs, fmt.Errorf(
"%s: module name can only contain letters, numbers, "+
"dashes, and underscores",
m.Id()))
}

// Check that the configuration can all be strings
raw := make(map[string]interface{})
for k, v := range m.RawConfig.Raw {
var strVal string
if err := mapstructure.WeakDecode(v, &strVal); err != nil {
errs = append(errs, fmt.Errorf(
"%s: module name can only contain letters, numbers, "+
"dashes, and underscores",
m.Id()))
"%s: variable %s must be a string value",
m.Id(), k))
}
raw[k] = strVal
}

modules[m.Id()] = m
// Update the raw configuration to only contain the string values
m.RawConfig, err = NewRawConfig(raw)
if err != nil {
errs = append(errs, fmt.Errorf(
"%s: can't initialize configuration: %s",
m.Id(), err))
}
}
dupped = nil

Expand Down
14 changes: 14 additions & 0 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,20 @@ func TestConfigValidate_moduleSourceVar(t *testing.T) {
}
}

func TestConfigValidate_moduleVarInt(t *testing.T) {
c := testConfig(t, "validate-module-var-int")
if err := c.Validate(); err != nil {
t.Fatalf("should be valid: %s", err)
}
}

func TestConfigValidate_moduleVarMap(t *testing.T) {
c := testConfig(t, "validate-module-var-map")
if err := c.Validate(); err == nil {
t.Fatal("should be invalid")
}
}

func TestConfigValidate_nil(t *testing.T) {
var c Config
if err := c.Validate(); err != nil {
Expand Down
4 changes: 4 additions & 0 deletions config/test-fixtures/validate-module-var-int/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module "foo" {
source = "./foo"
nodes = 3
}
4 changes: 4 additions & 0 deletions config/test-fixtures/validate-module-var-map/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module "foo" {
source = "./foo"
nodes = [1,2,3]
}
13 changes: 13 additions & 0 deletions terraform/terraform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,19 @@ STATE:
<no state>
`

const testTerraformPlanModuleVarIntStr = `
DIFF:
module.child:
CREATE: aws_instance.foo
num: "" => "2"
type: "" => "aws_instance"
STATE:
<no state>
`

const testTerraformPlanOrphanStr = `
DIFF:
Expand Down

0 comments on commit 675eab1

Please sign in to comment.