Merge pull request #8485 from hashicorp/b-json-keys
config: JSON resource keys with only one item load properly GH-5140
This commit is contained in:
commit
768791b117
|
@ -555,6 +555,37 @@ func loadManagedResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
|
||||||
item.Pos())
|
item.Pos())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HCL special case: if we're parsing JSON then directly nested
|
||||||
|
// items will show up as additional "keys". We need to unwrap them
|
||||||
|
// since we expect only two keys. Example:
|
||||||
|
//
|
||||||
|
// { "foo": { "bar": { "baz": {} } } }
|
||||||
|
//
|
||||||
|
// Will show up with Keys being: []string{"foo", "bar", "baz"}
|
||||||
|
// when we really just want the first two. To fix this we unwrap
|
||||||
|
// them into the right value.
|
||||||
|
if len(item.Keys) > 2 && item.Keys[0].Token.JSON {
|
||||||
|
for len(item.Keys) > 2 {
|
||||||
|
// Pop off the last key
|
||||||
|
n := len(item.Keys)
|
||||||
|
key := item.Keys[n-1]
|
||||||
|
item.Keys[n-1] = nil
|
||||||
|
item.Keys = item.Keys[:n-1]
|
||||||
|
|
||||||
|
// Wrap our value in a list
|
||||||
|
item.Val = &ast.ObjectType{
|
||||||
|
List: &ast.ObjectList{
|
||||||
|
Items: []*ast.ObjectItem{
|
||||||
|
&ast.ObjectItem{
|
||||||
|
Keys: []*ast.ObjectKey{key},
|
||||||
|
Val: item.Val,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(item.Keys) != 2 {
|
if len(item.Keys) != 2 {
|
||||||
return nil, fmt.Errorf(
|
return nil, fmt.Errorf(
|
||||||
"position %s: resource must be followed by exactly two strings, a type and a name",
|
"position %s: resource must be followed by exactly two strings, a type and a name",
|
||||||
|
|
|
@ -327,6 +327,22 @@ func TestLoadJSONBasic(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoadFileBasic_jsonNoName(t *testing.T) {
|
||||||
|
c, err := LoadFile(filepath.Join(fixtureDir, "resource-no-name.tf.json"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c == nil {
|
||||||
|
t.Fatal("config should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := resourcesStr(c.Resources)
|
||||||
|
if actual != strings.TrimSpace(basicJsonNoNameResourcesStr) {
|
||||||
|
t.Fatalf("bad:\n%s", actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestLoadFile_variables(t *testing.T) {
|
func TestLoadFile_variables(t *testing.T) {
|
||||||
c, err := LoadFile(filepath.Join(fixtureDir, "variables.tf"))
|
c, err := LoadFile(filepath.Join(fixtureDir, "variables.tf"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -837,6 +853,11 @@ foo
|
||||||
bar
|
bar
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const basicJsonNoNameResourcesStr = `
|
||||||
|
aws_security_group.allow_external_http_https (x1)
|
||||||
|
tags
|
||||||
|
`
|
||||||
|
|
||||||
const dirBasicOutputsStr = `
|
const dirBasicOutputsStr = `
|
||||||
web_ip
|
web_ip
|
||||||
vars
|
vars
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"resource" : {
|
||||||
|
"aws_security_group" : {
|
||||||
|
"allow_external_http_https" : {
|
||||||
|
"tags" : {
|
||||||
|
"Name" : "allow_external_http_https"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue