Merge pull request #21274 from hashicorp/jbardin/validate-integers

validate integers when using protoV5
This commit is contained in:
James Bardin 2019-05-11 09:50:36 -04:00 committed by GitHub
commit d495fb5b35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 5 deletions

View File

@ -153,6 +153,10 @@ func testResource() *schema.Resource {
Optional: true,
Description: "do not set in config",
},
"int": {
Type: schema.TypeInt,
Optional: true,
},
},
}
}

View File

@ -1029,3 +1029,24 @@ resource "test_resource" "foo" {
},
})
}
func TestResource_floatInIntAttr(t *testing.T) {
resource.UnitTest(t, resource.TestCase{
Providers: testAccProviders,
CheckDestroy: testAccCheckResourceDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: strings.TrimSpace(`
resource "test_resource" "foo" {
required = "yep"
required_map = {
key = "value"
}
int = 40.2
}
`),
ExpectError: regexp.MustCompile(`must be a whole number, got 40.2`),
},
},
})
}

View File

@ -1731,12 +1731,25 @@ func (m schemaMap) validatePrimitive(
}
decoded = n
case TypeInt:
// Verify that we can parse this as an int
var n int
if err := mapstructure.WeakDecode(raw, &n); err != nil {
return nil, []error{fmt.Errorf("%s: %s", k, err)}
switch {
case isProto5():
// We need to verify the type precisely, because WeakDecode will
// decode a float as an integer.
// the config shims only use int for integral number values
if v, ok := raw.(int); ok {
decoded = v
} else {
return nil, []error{fmt.Errorf("%s: must be a whole number, got %v", k, raw)}
}
default:
// Verify that we can parse this as an int
var n int
if err := mapstructure.WeakDecode(raw, &n); err != nil {
return nil, []error{fmt.Errorf("%s: %s", k, err)}
}
decoded = n
}
decoded = n
case TypeFloat:
// Verify that we can parse this as an int
var n float64