diff --git a/builtin/providers/template/resource_template_file.go b/builtin/providers/template/resource_template_file.go index 4b3e4bd89..78fdf8326 100644 --- a/builtin/providers/template/resource_template_file.go +++ b/builtin/providers/template/resource_template_file.go @@ -29,6 +29,7 @@ func resourceFile() *schema.Resource { Description: "Contents of the template", ForceNew: true, ConflictsWith: []string{"filename"}, + ValidateFunc: validateTemplateAttribute, }, "filename": &schema.Schema{ Type: schema.TypeString, @@ -174,3 +175,17 @@ func hash(s string) string { sha := sha256.Sum256([]byte(s)) return hex.EncodeToString(sha[:]) } + +func validateTemplateAttribute(v interface{}, key string) (ws []string, es []error) { + _, wasPath, err := pathorcontents.Read(v.(string)) + if err != nil { + es = append(es, err) + return + } + + if wasPath { + ws = append(ws, fmt.Sprintf("%s: looks like you specified a path instead of file contents. Use `file()` to load this path. Specifying a path directly is deprecated and will be removed in a future version.", key)) + } + + return +} diff --git a/builtin/providers/template/resource_template_file_test.go b/builtin/providers/template/resource_template_file_test.go index 9f54858dd..ed0d3a68c 100644 --- a/builtin/providers/template/resource_template_file_test.go +++ b/builtin/providers/template/resource_template_file_test.go @@ -2,6 +2,9 @@ package template import ( "fmt" + "io/ioutil" + "os" + "strings" "sync" "testing" @@ -77,6 +80,30 @@ func TestTemplateVariableChange(t *testing.T) { }) } +func TestValidateTemplateAttribute(t *testing.T) { + file, err := ioutil.TempFile("", "testtemplate") + if err != nil { + t.Fatal(err) + } + file.WriteString("Hello world.") + file.Close() + defer os.Remove(file.Name()) + + ws, es := validateTemplateAttribute(file.Name(), "test") + + if len(es) != 0 { + t.Fatalf("Unexpected errors: %#v", es) + } + + if len(ws) != 1 { + t.Fatalf("Expected 1 warning, got %d", len(ws)) + } + + if !strings.Contains(ws[0], "Specifying a path directly is deprecated") { + t.Fatalf("Expected warning about path, got: %s", ws[0]) + } +} + // This test covers a panic due to config.Func formerly being a // shared map, causing multiple template_file resources to try and // accessing it parallel during their lang.Eval() runs.