diff --git a/helper/validation/validation.go b/helper/validation/validation.go index b92916315..1fc3a6c09 100644 --- a/helper/validation/validation.go +++ b/helper/validation/validation.go @@ -6,6 +6,7 @@ import ( "reflect" "regexp" "strings" + "time" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/structure" @@ -210,3 +211,12 @@ func ValidateRegexp(v interface{}, k string) (ws []string, errors []error) { } return } + +// ValidateRFC3339TimeString is a ValidateFunc that ensures a string parses +// as time.RFC3339 format +func ValidateRFC3339TimeString(v interface{}, k string) (ws []string, errors []error) { + if _, err := time.Parse(time.RFC3339, v.(string)); err != nil { + errors = append(errors, fmt.Errorf("%q: invalid RFC3339 timestamp", k)) + } + return +} diff --git a/helper/validation/validation_test.go b/helper/validation/validation_test.go index cd68fa18d..0e77006d4 100644 --- a/helper/validation/validation_test.go +++ b/helper/validation/validation_test.go @@ -144,6 +144,58 @@ func TestValidationRegexp(t *testing.T) { }) } +func TestValidateRFC3339TimeString(t *testing.T) { + runTestCases(t, []testCase{ + { + val: "2018-03-01T00:00:00Z", + f: ValidateRFC3339TimeString, + }, + { + val: "2018-03-01T00:00:00-05:00", + f: ValidateRFC3339TimeString, + }, + { + val: "2018-03-01T00:00:00+05:00", + f: ValidateRFC3339TimeString, + }, + { + val: "03/01/2018", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "03-01-2018", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "2018-03-01", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "2018-03-01T", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "2018-03-01T00:00:00", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "2018-03-01T00:00:00Z05:00", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + { + val: "2018-03-01T00:00:00Z-05:00", + f: ValidateRFC3339TimeString, + expectedErr: regexp.MustCompile(regexp.QuoteMeta(`invalid RFC3339 timestamp`)), + }, + }) +} + func TestValidateJsonString(t *testing.T) { type testCases struct { Value string