// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package graph import ( "github.com/hashicorp/terraform/internal/dag" "github.com/hashicorp/terraform/internal/terraform" ) // CloseTestGraphTransformer is a GraphTransformer that adds a closing node to the graph. type CloseTestGraphTransformer struct{} func (t *CloseTestGraphTransformer) Transform(g *terraform.Graph) error { closeRoot := &nodeCloseTest{} g.Add(closeRoot) for _, v := range g.Vertices() { if v == closeRoot { continue } // since this is closing the graph, make it depend on everything in // the graph that does not have a parent. Such nodes are the real roots // of the graph, and since they are now siblings of the closing root node, // they are allowed to run in parallel. if g.UpEdges(v).Len() == 0 { g.Connect(dag.BasicEdge(closeRoot, v)) } } return nil } // This node doesn't do anything, it's just to ensure that we have a single // root node that depends on everything in the graph. The nodes that it depends // on are the real roots of the graph. type nodeCloseTest struct { } func (n *nodeCloseTest) Name() string { return "testcloser" }