From 903e49162daffe573909fb8e230860aa86eac44c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 27 Feb 2015 19:18:04 -0800 Subject: [PATCH] terraform: add TransitiveReductionTransformer --- .../transform-trans-reduce-basic/main.tf | 10 +++++ terraform/transform_transitive_reduction.go | 20 ++++++++++ .../transform_transitive_reduction_test.go | 39 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 terraform/test-fixtures/transform-trans-reduce-basic/main.tf create mode 100644 terraform/transform_transitive_reduction.go create mode 100644 terraform/transform_transitive_reduction_test.go diff --git a/terraform/test-fixtures/transform-trans-reduce-basic/main.tf b/terraform/test-fixtures/transform-trans-reduce-basic/main.tf new file mode 100644 index 000000000..4fb97c7a7 --- /dev/null +++ b/terraform/test-fixtures/transform-trans-reduce-basic/main.tf @@ -0,0 +1,10 @@ +resource "aws_instance" "A" {} + +resource "aws_instance" "B" { + A = "${aws_instance.A.id}" +} + +resource "aws_instance" "C" { + A = "${aws_instance.A.id}" + B = "${aws_instance.B.id}" +} diff --git a/terraform/transform_transitive_reduction.go b/terraform/transform_transitive_reduction.go new file mode 100644 index 000000000..21842789c --- /dev/null +++ b/terraform/transform_transitive_reduction.go @@ -0,0 +1,20 @@ +package terraform + +// TransitiveReductionTransformer is a GraphTransformer that performs +// finds the transitive reduction of the graph. For a definition of +// transitive reduction, see Wikipedia. +type TransitiveReductionTransformer struct{} + +func (t *TransitiveReductionTransformer) Transform(g *Graph) error { + // If the graph isn't valid, skip the transitive reduction. + // We don't error here because Terraform itself handles graph + // validation in a better way, or we assume it does. + if err := g.Validate(); err != nil { + return nil + } + + // Do it + g.TransitiveReduction() + + return nil +} diff --git a/terraform/transform_transitive_reduction_test.go b/terraform/transform_transitive_reduction_test.go new file mode 100644 index 000000000..bcd3b7d23 --- /dev/null +++ b/terraform/transform_transitive_reduction_test.go @@ -0,0 +1,39 @@ +package terraform + +import ( + "strings" + "testing" +) + +func TestTransitiveReductionTransformer(t *testing.T) { + mod := testModule(t, "transform-trans-reduce-basic") + + g := Graph{Path: RootModulePath} + { + tf := &ConfigTransformer{Module: mod} + if err := tf.Transform(&g); err != nil { + t.Fatalf("err: %s", err) + } + } + + { + transform := &TransitiveReductionTransformer{} + if err := transform.Transform(&g); err != nil { + t.Fatalf("err: %s", err) + } + } + + actual := strings.TrimSpace(g.String()) + expected := strings.TrimSpace(testTransformTransReduceBasicStr) + if actual != expected { + t.Fatalf("bad:\n\n%s", actual) + } +} + +const testTransformTransReduceBasicStr = ` +aws_instance.A +aws_instance.B + aws_instance.A +aws_instance.C + aws_instance.B +`