mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-24 16:10:46 -06:00
48757bcbe0
We don't need another node type for orphaned outptus, they are just outputs being removed for a different reason than destroy. Use the NodeDestroyableOutput implementation. Destroy outputs also don't need to be referencers, since they are being removed. Rename DestroyOutputTransformer to destroyRootOutputTransformer, and add an explanation as to why it is the only transformer that requires an exception to know when it's involved from the destroy command.
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package terraform
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/configs"
|
|
"github.com/hashicorp/terraform/states"
|
|
)
|
|
|
|
// OrphanOutputTransformer finds the outputs that aren't present
|
|
// in the given config that are in the state and adds them to the graph
|
|
// for deletion.
|
|
type OrphanOutputTransformer struct {
|
|
Config *configs.Config // Root of config tree
|
|
State *states.State // State is the root state
|
|
}
|
|
|
|
func (t *OrphanOutputTransformer) Transform(g *Graph) error {
|
|
if t.State == nil {
|
|
log.Printf("[DEBUG] No state, no orphan outputs")
|
|
return nil
|
|
}
|
|
|
|
for _, ms := range t.State.Modules {
|
|
if err := t.transform(g, ms); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (t *OrphanOutputTransformer) transform(g *Graph, ms *states.Module) error {
|
|
if ms == nil {
|
|
return nil
|
|
}
|
|
|
|
moduleAddr := ms.Addr
|
|
|
|
// Get the config for this path, which is nil if the entire module has been
|
|
// removed.
|
|
var outputs map[string]*configs.Output
|
|
if c := t.Config.DescendentForInstance(moduleAddr); c != nil {
|
|
outputs = c.Module.Outputs
|
|
}
|
|
|
|
// An output is "orphaned" if it's present in the state but not declared
|
|
// in the configuration.
|
|
for name := range ms.OutputValues {
|
|
if _, exists := outputs[name]; exists {
|
|
continue
|
|
}
|
|
|
|
g.Add(&NodeDestroyableOutput{
|
|
Addr: addrs.OutputValue{Name: name}.Absolute(moduleAddr),
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|