config: if count > 1, variable references must have index
/cc @pearkes - Here is that validation
This commit is contained in:
parent
dd8db83543
commit
aa6a758f6b
|
@ -66,7 +66,9 @@ type ResourceVariable struct {
|
||||||
Type string // Resource type, i.e. "aws_instance"
|
Type string // Resource type, i.e. "aws_instance"
|
||||||
Name string // Resource name
|
Name string // Resource name
|
||||||
Field string // Resource field
|
Field string // Resource field
|
||||||
Multi bool // True if multi-variable: aws_instance.foo.*.id
|
|
||||||
|
Multi bool // True if multi-variable: aws_instance.foo.*.id
|
||||||
|
Index int // Index for multi-variable: aws_instance.foo.1.id == 1
|
||||||
|
|
||||||
key string
|
key string
|
||||||
}
|
}
|
||||||
|
@ -124,9 +126,9 @@ func (c *Config) Validate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that all references to resources are valid
|
// Check that all references to resources are valid
|
||||||
resources := make(map[string]struct{})
|
resources := make(map[string]*Resource)
|
||||||
for _, r := range c.Resources {
|
for _, r := range c.Resources {
|
||||||
resources[r.Id()] = struct{}{}
|
resources[r.Id()] = r
|
||||||
}
|
}
|
||||||
for source, vs := range vars {
|
for source, vs := range vars {
|
||||||
for _, v := range vs {
|
for _, v := range vs {
|
||||||
|
@ -136,12 +138,26 @@ func (c *Config) Validate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := fmt.Sprintf("%s.%s", rv.Type, rv.Name)
|
id := fmt.Sprintf("%s.%s", rv.Type, rv.Name)
|
||||||
if _, ok := resources[id]; !ok {
|
r, ok := resources[id]
|
||||||
|
if !ok {
|
||||||
errs = append(errs, fmt.Errorf(
|
errs = append(errs, fmt.Errorf(
|
||||||
"%s: unknown resource '%s' referenced in variable %s",
|
"%s: unknown resource '%s' referenced in variable %s",
|
||||||
source,
|
source,
|
||||||
id,
|
id,
|
||||||
rv.FullKey()))
|
rv.FullKey()))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it is a multi reference and resource has a single
|
||||||
|
// count, it is an error.
|
||||||
|
if r.Count > 1 && !rv.Multi {
|
||||||
|
errs = append(errs, fmt.Errorf(
|
||||||
|
"%s: variable '%s' must specify index for multi-count "+
|
||||||
|
"resource %s",
|
||||||
|
source,
|
||||||
|
rv.FullKey(),
|
||||||
|
id))
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,13 @@ func TestConfigValidate(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConfigValidate_badMultiResource(t *testing.T) {
|
||||||
|
c := testConfig(t, "validate-bad-multi-resource")
|
||||||
|
if err := c.Validate(); err == nil {
|
||||||
|
t.Fatal("should not be valid")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestConfigValidate_outputBadField(t *testing.T) {
|
func TestConfigValidate_outputBadField(t *testing.T) {
|
||||||
c := testConfig(t, "validate-output-bad-field")
|
c := testConfig(t, "validate-output-bad-field")
|
||||||
if err := c.Validate(); err == nil {
|
if err := c.Validate(); err == nil {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
resource "aws_instance" "web" {
|
||||||
|
count = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ip" {
|
||||||
|
value = "${aws_instance.web.id}"
|
||||||
|
}
|
Loading…
Reference in New Issue