terraform: delete some flatten stuff
This commit is contained in:
parent
114315d502
commit
301cf60821
|
@ -1,8 +1,6 @@
|
||||||
package terraform
|
package terraform
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/dag"
|
"github.com/hashicorp/terraform/dag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -21,87 +19,3 @@ type GraphNodeFlatGraph interface {
|
||||||
type GraphNodeFlattenable interface {
|
type GraphNodeFlattenable interface {
|
||||||
Flatten(path []string) (dag.Vertex, error)
|
Flatten(path []string) (dag.Vertex, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlattenTransformer is a transformer that goes through the graph, finds
|
|
||||||
// subgraphs that can be flattened, and flattens them into this graph,
|
|
||||||
// removing the prior subgraph node.
|
|
||||||
type FlattenTransformer struct{}
|
|
||||||
|
|
||||||
func (t *FlattenTransformer) Transform(g *Graph) error {
|
|
||||||
for _, v := range g.Vertices() {
|
|
||||||
fn, ok := v.(GraphNodeFlatGraph)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't want to be flattened, don't do it
|
|
||||||
subgraph := fn.FlattenGraph()
|
|
||||||
if subgraph == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all the things that depend on this node. We'll re-connect
|
|
||||||
// dependents later. We have to copy these here since the UpEdges
|
|
||||||
// value will be deleted after the Remove below.
|
|
||||||
dependents := make([]dag.Vertex, 0, 5)
|
|
||||||
for _, v := range g.UpEdges(v).List() {
|
|
||||||
dependents = append(dependents, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the old node
|
|
||||||
g.Remove(v)
|
|
||||||
|
|
||||||
// Go through the subgraph and flatten all the nodes
|
|
||||||
for _, sv := range subgraph.Vertices() {
|
|
||||||
// If the vertex already has a subpath then we assume it has
|
|
||||||
// already been flattened. Ignore it.
|
|
||||||
if _, ok := sv.(GraphNodeSubPath); ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
fn, ok := sv.(GraphNodeFlattenable)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf(
|
|
||||||
"unflattenable node: %s %T",
|
|
||||||
dag.VertexName(sv), sv)
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := fn.Flatten(subgraph.Path)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf(
|
|
||||||
"error flattening %s (%T): %s",
|
|
||||||
dag.VertexName(sv), sv, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if v == nil {
|
|
||||||
subgraph.Remove(v)
|
|
||||||
} else {
|
|
||||||
subgraph.Replace(sv, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we've handled any changes to the graph that are
|
|
||||||
// needed, we can add them all to our graph along with their edges.
|
|
||||||
for _, sv := range subgraph.Vertices() {
|
|
||||||
g.Add(sv)
|
|
||||||
}
|
|
||||||
for _, se := range subgraph.Edges() {
|
|
||||||
g.Connect(se)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connect the dependencies for all the new nodes that we added.
|
|
||||||
// This will properly connect variables to their sources, for example.
|
|
||||||
for _, sv := range subgraph.Vertices() {
|
|
||||||
g.ConnectDependent(sv)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Re-connect all the things that dependent on the graph
|
|
||||||
// we just flattened. This should connect them back into the
|
|
||||||
// correct nodes if their DependentOn() is setup correctly.
|
|
||||||
for _, v := range dependents {
|
|
||||||
g.ConnectDependent(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
package terraform
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestFlattenTransformer(t *testing.T) {
|
|
||||||
mod := testModule(t, "transform-flatten")
|
|
||||||
|
|
||||||
var b BasicGraphBuilder
|
|
||||||
b = BasicGraphBuilder{
|
|
||||||
Steps: []GraphTransformer{
|
|
||||||
&ConfigTransformerOld{Module: mod},
|
|
||||||
&VertexTransformer{
|
|
||||||
Transforms: []GraphVertexTransformer{
|
|
||||||
&ExpandTransform{
|
|
||||||
Builder: &b,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
&FlattenTransformer{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
g, err := b.Build(rootModulePath)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
actual := strings.TrimSpace(g.String())
|
|
||||||
expected := strings.TrimSpace(testTransformFlattenStr)
|
|
||||||
if actual != expected {
|
|
||||||
t.Fatalf("bad:\n\n%s", actual)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFlattenTransformer_withProxy(t *testing.T) {
|
|
||||||
mod := testModule(t, "transform-flatten")
|
|
||||||
|
|
||||||
var b BasicGraphBuilder
|
|
||||||
b = BasicGraphBuilder{
|
|
||||||
Steps: []GraphTransformer{
|
|
||||||
&ConfigTransformerOld{Module: mod},
|
|
||||||
&VertexTransformer{
|
|
||||||
Transforms: []GraphVertexTransformer{
|
|
||||||
&ExpandTransform{
|
|
||||||
Builder: &b,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
&FlattenTransformer{},
|
|
||||||
&ProxyTransformer{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
g, err := b.Build(rootModulePath)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
actual := strings.TrimSpace(g.String())
|
|
||||||
expected := strings.TrimSpace(testTransformFlattenProxyStr)
|
|
||||||
if actual != expected {
|
|
||||||
t.Fatalf("bad:\n\n%s", actual)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const testTransformFlattenStr = `
|
|
||||||
aws_instance.parent
|
|
||||||
aws_instance.parent-output
|
|
||||||
module.child.aws_instance.child
|
|
||||||
module.child.var.var
|
|
||||||
module.child.plan-destroy
|
|
||||||
module.child.var.var
|
|
||||||
aws_instance.parent
|
|
||||||
`
|
|
||||||
|
|
||||||
const testTransformFlattenProxyStr = `
|
|
||||||
aws_instance.parent
|
|
||||||
aws_instance.parent-output
|
|
||||||
module.child.aws_instance.child
|
|
||||||
aws_instance.parent
|
|
||||||
module.child.var.var
|
|
||||||
module.child.plan-destroy
|
|
||||||
module.child.var.var
|
|
||||||
aws_instance.parent
|
|
||||||
`
|
|
Loading…
Reference in New Issue