Merge pull request #10297 from hashicorp/b-template-path
providers/template: disallow file paths in `template`
This commit is contained in:
commit
68c96e0ce5
|
@ -25,7 +25,6 @@ func dataSourceFile() *schema.Resource {
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Description: "Contents of the template",
|
Description: "Contents of the template",
|
||||||
ConflictsWith: []string{"filename"},
|
ConflictsWith: []string{"filename"},
|
||||||
ValidateFunc: validateTemplateAttribute,
|
|
||||||
},
|
},
|
||||||
"filename": &schema.Schema{
|
"filename": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
|
@ -82,13 +81,14 @@ func renderFile(d *schema.ResourceData) (string, error) {
|
||||||
filename := d.Get("filename").(string)
|
filename := d.Get("filename").(string)
|
||||||
vars := d.Get("vars").(map[string]interface{})
|
vars := d.Get("vars").(map[string]interface{})
|
||||||
|
|
||||||
|
contents := template
|
||||||
if template == "" && filename != "" {
|
if template == "" && filename != "" {
|
||||||
template = filename
|
data, _, err := pathorcontents.Read(filename)
|
||||||
}
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
contents, _, err := pathorcontents.Read(template)
|
contents = data
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rendered, err := execute(contents, vars)
|
rendered, err := execute(contents, vars)
|
||||||
|
@ -145,20 +145,6 @@ func hash(s string) string {
|
||||||
return hex.EncodeToString(sha[:])
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateVarsAttribute(v interface{}, key string) (ws []string, es []error) {
|
func validateVarsAttribute(v interface{}, key string) (ws []string, es []error) {
|
||||||
// vars can only be primitives right now
|
// vars can only be primitives right now
|
||||||
var badVars []string
|
var badVars []string
|
||||||
|
|
|
@ -2,8 +2,6 @@ package template
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -26,6 +24,7 @@ func TestTemplateRendering(t *testing.T) {
|
||||||
{`{a="foo"}`, `$${a}`, `foo`},
|
{`{a="foo"}`, `$${a}`, `foo`},
|
||||||
{`{a="hello"}`, `$${replace(a, "ello", "i")}`, `hi`},
|
{`{a="hello"}`, `$${replace(a, "ello", "i")}`, `hi`},
|
||||||
{`{}`, `${1+2+3}`, `6`},
|
{`{}`, `${1+2+3}`, `6`},
|
||||||
|
{`{}`, `/`, `/`},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range cases {
|
for _, tt := range cases {
|
||||||
|
@ -47,30 +46,6 @@ func TestTemplateRendering(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])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateVarsAttribute(t *testing.T) {
|
func TestValidateVarsAttribute(t *testing.T) {
|
||||||
cases := map[string]struct {
|
cases := map[string]struct {
|
||||||
Vars map[string]interface{}
|
Vars map[string]interface{}
|
||||||
|
|
Loading…
Reference in New Issue