mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-07 22:53:08 -06:00
b79adeae02
Use the ResourceState.Provider field to store the full name of the provider used during apply. This field is only used when a resource is removed from the config, and will allow that resource to be removed by the exact same provider with which it was created. Modify the locations which might accept the alue of the ResourceState.Provider field to detect that the name is resolved.
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package terraform
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/terraform/config"
|
|
"github.com/hashicorp/terraform/dag"
|
|
)
|
|
|
|
// ConcreteProviderNodeFunc is a callback type used to convert an
|
|
// abstract provider to a concrete one of some type.
|
|
type ConcreteProviderNodeFunc func(*NodeAbstractProvider) dag.Vertex
|
|
|
|
// NodeAbstractProvider represents a provider that has no associated operations.
|
|
// It registers all the common interfaces across operations for providers.
|
|
type NodeAbstractProvider struct {
|
|
NameValue string
|
|
PathValue []string
|
|
|
|
// The fields below will be automatically set using the Attach
|
|
// interfaces if you're running those transforms, but also be explicitly
|
|
// set if you already have that information.
|
|
|
|
Config *config.ProviderConfig
|
|
}
|
|
|
|
func ResolveProviderName(name string, path []string) string {
|
|
if strings.Contains(name, "provider.") {
|
|
// already resolved
|
|
return name
|
|
}
|
|
|
|
name = fmt.Sprintf("provider.%s", name)
|
|
if len(path) >= 1 {
|
|
name = fmt.Sprintf("%s.%s", modulePrefixStr(path), name)
|
|
}
|
|
|
|
return name
|
|
}
|
|
|
|
func (n *NodeAbstractProvider) Name() string {
|
|
return ResolveProviderName(n.NameValue, n.PathValue)
|
|
}
|
|
|
|
// GraphNodeSubPath
|
|
func (n *NodeAbstractProvider) Path() []string {
|
|
return n.PathValue
|
|
}
|
|
|
|
// RemovableIfNotTargeted
|
|
func (n *NodeAbstractProvider) RemoveIfNotTargeted() bool {
|
|
// We need to add this so that this node will be removed if
|
|
// it isn't targeted or a dependency of a target.
|
|
return true
|
|
}
|
|
|
|
// GraphNodeReferencer
|
|
func (n *NodeAbstractProvider) References() []string {
|
|
if n.Config == nil {
|
|
return nil
|
|
}
|
|
|
|
return ReferencesFromConfig(n.Config.RawConfig)
|
|
}
|
|
|
|
// GraphNodeProvider
|
|
func (n *NodeAbstractProvider) ProviderName() string {
|
|
return n.NameValue
|
|
}
|
|
|
|
// GraphNodeProvider
|
|
func (n *NodeAbstractProvider) ProviderConfig() *config.ProviderConfig {
|
|
if n.Config == nil {
|
|
return nil
|
|
}
|
|
|
|
return n.Config
|
|
}
|
|
|
|
// GraphNodeAttachProvider
|
|
func (n *NodeAbstractProvider) AttachProvider(c *config.ProviderConfig) {
|
|
n.Config = c
|
|
}
|
|
|
|
// GraphNodeDotter impl.
|
|
func (n *NodeAbstractProvider) DotNode(name string, opts *dag.DotOpts) *dag.DotNode {
|
|
return &dag.DotNode{
|
|
Name: name,
|
|
Attrs: map[string]string{
|
|
"label": n.Name(),
|
|
"shape": "diamond",
|
|
},
|
|
}
|
|
}
|