From 11b4794612643b0f82a521471e71fce15acf9192 Mon Sep 17 00:00:00 2001 From: Chris Marchesi Date: Tue, 2 May 2017 20:36:38 -0700 Subject: [PATCH] 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. --- terraform/graph_builder_refresh_test.go | 96 +++++++++++ terraform/node_data_refresh_test.go | 154 ++++++++++++++++++ terraform/node_resource_refresh_test.go | 154 ++++++++++++++++++ .../refresh-config-orphan/main.tf | 3 + .../refresh-data-scale-inout/main.tf | 3 + .../refresh-resource-scale-inout/main.tf | 3 + 6 files changed, 413 insertions(+) create mode 100644 terraform/graph_builder_refresh_test.go create mode 100644 terraform/node_data_refresh_test.go create mode 100644 terraform/node_resource_refresh_test.go create mode 100644 terraform/test-fixtures/refresh-config-orphan/main.tf create mode 100644 terraform/test-fixtures/refresh-data-scale-inout/main.tf create mode 100644 terraform/test-fixtures/refresh-resource-scale-inout/main.tf diff --git a/terraform/graph_builder_refresh_test.go b/terraform/graph_builder_refresh_test.go new file mode 100644 index 000000000..e4383ab4e --- /dev/null +++ b/terraform/graph_builder_refresh_test.go @@ -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) + } +} diff --git a/terraform/node_data_refresh_test.go b/terraform/node_data_refresh_test.go new file mode 100644 index 000000000..6aa3af37a --- /dev/null +++ b/terraform/node_data_refresh_test.go @@ -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) + } +} diff --git a/terraform/node_resource_refresh_test.go b/terraform/node_resource_refresh_test.go new file mode 100644 index 000000000..b2ac4d346 --- /dev/null +++ b/terraform/node_resource_refresh_test.go @@ -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) + } +} diff --git a/terraform/test-fixtures/refresh-config-orphan/main.tf b/terraform/test-fixtures/refresh-config-orphan/main.tf new file mode 100644 index 000000000..acef373b3 --- /dev/null +++ b/terraform/test-fixtures/refresh-config-orphan/main.tf @@ -0,0 +1,3 @@ +resource "aws_instance" "foo" { + count = 3 +} diff --git a/terraform/test-fixtures/refresh-data-scale-inout/main.tf b/terraform/test-fixtures/refresh-data-scale-inout/main.tf new file mode 100644 index 000000000..480ba9483 --- /dev/null +++ b/terraform/test-fixtures/refresh-data-scale-inout/main.tf @@ -0,0 +1,3 @@ +data "aws_instance" "foo" { + count = 3 +} diff --git a/terraform/test-fixtures/refresh-resource-scale-inout/main.tf b/terraform/test-fixtures/refresh-resource-scale-inout/main.tf new file mode 100644 index 000000000..acef373b3 --- /dev/null +++ b/terraform/test-fixtures/refresh-resource-scale-inout/main.tf @@ -0,0 +1,3 @@ +resource "aws_instance" "foo" { + count = 3 +}