terraform: record dependency to self (other index)
Fixes #10313 The new graph wasn't properly recording resource dependencies to a specific index of itself. For example: `foo.bar.2` depending on `foo.bar.0` wasn't shown in the state when it should've been. This adds a test to verify this and fixes it.
This commit is contained in:
parent
546caf9909
commit
f50c7acf95
|
@ -3611,6 +3611,66 @@ func TestContext2Apply_provisionerMultiSelfRef(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestContext2Apply_provisionerMultiSelfRefSingle(t *testing.T) {
|
||||
var lock sync.Mutex
|
||||
order := make([]string, 0, 5)
|
||||
|
||||
m := testModule(t, "apply-provisioner-multi-self-ref-single")
|
||||
p := testProvider("aws")
|
||||
pr := testProvisioner()
|
||||
p.ApplyFn = testApplyFn
|
||||
p.DiffFn = testDiffFn
|
||||
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
|
||||
val, ok := c.Config["order"]
|
||||
if !ok {
|
||||
t.Fatalf("bad value for order: %v %#v", val, c)
|
||||
}
|
||||
|
||||
order = append(order, val.(string))
|
||||
return nil
|
||||
}
|
||||
|
||||
ctx := testContext2(t, &ContextOpts{
|
||||
Module: m,
|
||||
Providers: map[string]ResourceProviderFactory{
|
||||
"aws": testProviderFuncFixed(p),
|
||||
},
|
||||
Provisioners: map[string]ResourceProvisionerFactory{
|
||||
"shell": testProvisionerFuncFixed(pr),
|
||||
},
|
||||
})
|
||||
|
||||
if _, err := ctx.Plan(); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
state, err := ctx.Apply()
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
actual := strings.TrimSpace(state.String())
|
||||
expected := strings.TrimSpace(testTerraformApplyProvisionerMultiSelfRefSingleStr)
|
||||
if actual != expected {
|
||||
t.Fatalf("bad: \n%s", actual)
|
||||
}
|
||||
|
||||
// Verify apply was invoked
|
||||
if !pr.ApplyCalled {
|
||||
t.Fatalf("provisioner not invoked")
|
||||
}
|
||||
|
||||
// Verify our result
|
||||
sort.Strings(order)
|
||||
expectedOrder := []string{"0", "1", "2"}
|
||||
if !reflect.DeepEqual(order, expectedOrder) {
|
||||
t.Fatalf("bad: %#v", order)
|
||||
}
|
||||
}
|
||||
|
||||
func TestContext2Apply_provisionerMultiSelfRefCount(t *testing.T) {
|
||||
var lock sync.Mutex
|
||||
commands := make([]string, 0, 5)
|
||||
|
|
|
@ -47,7 +47,10 @@ func (n *NodeApplyableResource) EvalTree() EvalNode {
|
|||
// code for this that we've used for a long time.
|
||||
var stateDeps []string
|
||||
{
|
||||
oldN := &graphNodeExpandedResource{Resource: n.Config}
|
||||
oldN := &graphNodeExpandedResource{
|
||||
Resource: n.Config,
|
||||
Index: addr.Index,
|
||||
}
|
||||
stateDeps = oldN.StateDependencies()
|
||||
}
|
||||
|
||||
|
|
|
@ -603,6 +603,27 @@ aws_instance.foo.2:
|
|||
type = aws_instance
|
||||
`
|
||||
|
||||
const testTerraformApplyProvisionerMultiSelfRefSingleStr = `
|
||||
aws_instance.foo.0:
|
||||
ID = foo
|
||||
foo = number 0
|
||||
type = aws_instance
|
||||
aws_instance.foo.1:
|
||||
ID = foo
|
||||
foo = number 1
|
||||
type = aws_instance
|
||||
|
||||
Dependencies:
|
||||
aws_instance.foo.0
|
||||
aws_instance.foo.2:
|
||||
ID = foo
|
||||
foo = number 2
|
||||
type = aws_instance
|
||||
|
||||
Dependencies:
|
||||
aws_instance.foo.0
|
||||
`
|
||||
|
||||
const testTerraformApplyProvisionerDiffStr = `
|
||||
aws_instance.bar:
|
||||
ID = foo
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
resource "aws_instance" "foo" {
|
||||
count = 3
|
||||
foo = "number ${count.index}"
|
||||
|
||||
provisioner "shell" {
|
||||
command = "${aws_instance.foo.0.foo}"
|
||||
order = "${count.index}"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue