mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
0dcca1bc37
Replace the graphNodeRoot for the main graph with a nodeCloseModule for the root module. USe a new transformer as well, so as to not change any behavior of DynamicExpand graphs. Closing out the root module like we do with sub modules means we no longer need the OrphanResourceTransformer, or the NodeDestroyResource. The old resource destroy logic has mostly moved into the instance nodes, and the remaining resource node was just for cleanup, which need to be done again by the module since there isn't always a NodeDestroyResource to be evaluated. The more-correct state caused a few tests to fail, which need to be cleaned up to match the state without empty resource husks.
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package terraform
|
|
|
|
import (
|
|
"github.com/hashicorp/terraform/dag"
|
|
)
|
|
|
|
const rootNodeName = "root"
|
|
|
|
// RootTransformer is a GraphTransformer that adds a root to the graph.
|
|
type RootTransformer struct{}
|
|
|
|
func (t *RootTransformer) Transform(g *Graph) error {
|
|
// If we already have a good root, we're done
|
|
if _, err := g.Root(); err == nil {
|
|
return nil
|
|
}
|
|
|
|
// Add a root
|
|
var root graphNodeRoot
|
|
g.Add(root)
|
|
|
|
// Connect the root to all the edges that need it
|
|
for _, v := range g.Vertices() {
|
|
if v == root {
|
|
continue
|
|
}
|
|
|
|
if g.UpEdges(v).Len() == 0 {
|
|
g.Connect(dag.BasicEdge(root, v))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type graphNodeRoot struct{}
|
|
|
|
func (n graphNodeRoot) Name() string {
|
|
return rootNodeName
|
|
}
|
|
|
|
// CloseRootModuleTransformer is a GraphTransformer that adds a root to the graph.
|
|
type CloseRootModuleTransformer struct{}
|
|
|
|
func (t *CloseRootModuleTransformer) Transform(g *Graph) error {
|
|
// close the root module
|
|
closeRoot := &nodeCloseModule{}
|
|
g.Add(closeRoot)
|
|
|
|
// since this is closing the root module, make it depend on everything in
|
|
// the root module.
|
|
for _, v := range g.Vertices() {
|
|
if v == closeRoot {
|
|
continue
|
|
}
|
|
|
|
// since this is closing the root module, and must be last, we can
|
|
// connect to anything that doesn't have any up edges.
|
|
if g.UpEdges(v).Len() == 0 {
|
|
g.Connect(dag.BasicEdge(closeRoot, v))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|