core: Test for new refresh graph behaviour
Tests on DynamicExpand for both resources and data sources, cover scale in/out scenarios, and also a verification for the behaviour of config orphans.
This commit is contained in:
parent
f63ad1dbd1
commit
11b4794612
|
@ -0,0 +1,96 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestRefreshGraphBuilder_configOrphans(t *testing.T) {
|
||||||
|
|
||||||
|
m := testModule(t, "refresh-config-orphan")
|
||||||
|
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.2": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.2": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
b := &RefreshGraphBuilder{
|
||||||
|
Module: m,
|
||||||
|
State: state,
|
||||||
|
Providers: []string{"aws"},
|
||||||
|
}
|
||||||
|
g, err := b.Build(rootModulePath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error building graph: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := g.StringWithNodeTypes()
|
||||||
|
expected := `aws_instance.foo - *terraform.NodeRefreshableManagedResource
|
||||||
|
provider.aws - *terraform.NodeApplyableProvider
|
||||||
|
data.aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
provider.aws - *terraform.NodeApplyableProvider
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
provider.aws - *terraform.NodeApplyableProvider
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
provider.aws - *terraform.NodeApplyableProvider
|
||||||
|
provider.aws - *terraform.NodeApplyableProvider
|
||||||
|
provider.aws (close) - *terraform.graphNodeCloseProvider
|
||||||
|
aws_instance.foo - *terraform.NodeRefreshableManagedResource
|
||||||
|
data.aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
`
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected:\n%s\nGot:\n%s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNodeRefreshableDataResourceDynamicExpand_scaleOut(t *testing.T) {
|
||||||
|
var stateLock sync.RWMutex
|
||||||
|
|
||||||
|
addr, err := ParseResourceAddress("data.aws_instance.foo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("bad: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := testModule(t, "refresh-data-scale-inout")
|
||||||
|
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"data.aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
n := &NodeRefreshableDataResource{
|
||||||
|
NodeAbstractCountResource: &NodeAbstractCountResource{
|
||||||
|
NodeAbstractResource: &NodeAbstractResource{
|
||||||
|
Addr: addr,
|
||||||
|
Config: m.Config().Resources[0],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
g, err := n.DynamicExpand(&MockEvalContext{
|
||||||
|
PathPath: []string{"root"},
|
||||||
|
StateState: state,
|
||||||
|
StateLock: &stateLock,
|
||||||
|
})
|
||||||
|
|
||||||
|
actual := g.StringWithNodeTypes()
|
||||||
|
expected := `data.aws_instance.foo[0] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
root - terraform.graphNodeRoot
|
||||||
|
data.aws_instance.foo[0] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
`
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected:\n%s\nGot:\n%s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNodeRefreshableDataResourceDynamicExpand_scaleIn(t *testing.T) {
|
||||||
|
var stateLock sync.RWMutex
|
||||||
|
|
||||||
|
addr, err := ParseResourceAddress("data.aws_instance.foo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("bad: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := testModule(t, "refresh-data-scale-inout")
|
||||||
|
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"data.aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.2": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"data.aws_instance.foo.3": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "qux",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
n := &NodeRefreshableDataResource{
|
||||||
|
NodeAbstractCountResource: &NodeAbstractCountResource{
|
||||||
|
NodeAbstractResource: &NodeAbstractResource{
|
||||||
|
Addr: addr,
|
||||||
|
Config: m.Config().Resources[0],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
g, err := n.DynamicExpand(&MockEvalContext{
|
||||||
|
PathPath: []string{"root"},
|
||||||
|
StateState: state,
|
||||||
|
StateLock: &stateLock,
|
||||||
|
})
|
||||||
|
|
||||||
|
actual := g.StringWithNodeTypes()
|
||||||
|
expected := `data.aws_instance.foo[0] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[3] - *terraform.NodeDestroyableDataResource
|
||||||
|
root - terraform.graphNodeRoot
|
||||||
|
data.aws_instance.foo[0] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[1] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[2] - *terraform.NodeRefreshableDataResourceInstance
|
||||||
|
data.aws_instance.foo[3] - *terraform.NodeDestroyableDataResource
|
||||||
|
`
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected:\n%s\nGot:\n%s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNodeRefreshableManagedResourceDynamicExpand_scaleOut(t *testing.T) {
|
||||||
|
var stateLock sync.RWMutex
|
||||||
|
|
||||||
|
addr, err := ParseResourceAddress("aws_instance.foo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("bad: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := testModule(t, "refresh-resource-scale-inout")
|
||||||
|
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
n := &NodeRefreshableManagedResource{
|
||||||
|
NodeAbstractCountResource: &NodeAbstractCountResource{
|
||||||
|
NodeAbstractResource: &NodeAbstractResource{
|
||||||
|
Addr: addr,
|
||||||
|
Config: m.Config().Resources[0],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
g, err := n.DynamicExpand(&MockEvalContext{
|
||||||
|
PathPath: []string{"root"},
|
||||||
|
StateState: state,
|
||||||
|
StateLock: &stateLock,
|
||||||
|
})
|
||||||
|
|
||||||
|
actual := g.StringWithNodeTypes()
|
||||||
|
expected := `aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[2] - *terraform.NodePlannableResourceInstance
|
||||||
|
root - terraform.graphNodeRoot
|
||||||
|
aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[2] - *terraform.NodePlannableResourceInstance
|
||||||
|
`
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected:\n%s\nGot:\n%s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNodeRefreshableManagedResourceDynamicExpand_scaleIn(t *testing.T) {
|
||||||
|
var stateLock sync.RWMutex
|
||||||
|
|
||||||
|
addr, err := ParseResourceAddress("aws_instance.foo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("bad: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := testModule(t, "refresh-resource-scale-inout")
|
||||||
|
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"aws_instance.foo.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.2": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.foo.3": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Deposed: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "qux",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
n := &NodeRefreshableManagedResource{
|
||||||
|
NodeAbstractCountResource: &NodeAbstractCountResource{
|
||||||
|
NodeAbstractResource: &NodeAbstractResource{
|
||||||
|
Addr: addr,
|
||||||
|
Config: m.Config().Resources[0],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
g, err := n.DynamicExpand(&MockEvalContext{
|
||||||
|
PathPath: []string{"root"},
|
||||||
|
StateState: state,
|
||||||
|
StateLock: &stateLock,
|
||||||
|
})
|
||||||
|
|
||||||
|
actual := g.StringWithNodeTypes()
|
||||||
|
expected := `aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[2] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[3] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
root - terraform.graphNodeRoot
|
||||||
|
aws_instance.foo[0] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[1] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[2] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
aws_instance.foo[3] - *terraform.NodeRefreshableManagedResourceInstance
|
||||||
|
`
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected:\n%s\nGot:\n%s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
resource "aws_instance" "foo" {
|
||||||
|
count = 3
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
data "aws_instance" "foo" {
|
||||||
|
count = 3
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
resource "aws_instance" "foo" {
|
||||||
|
count = 3
|
||||||
|
}
|
Loading…
Reference in New Issue