2016-10-19 16:54:00 -05:00
|
|
|
package terraform
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2017-11-07 12:09:36 -06:00
|
|
|
"strings"
|
2016-10-19 16:54:00 -05:00
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/config"
|
2016-12-02 21:26:40 -06:00
|
|
|
"github.com/hashicorp/terraform/dag"
|
2016-10-19 16:54:00 -05:00
|
|
|
)
|
|
|
|
|
2016-12-03 17:27:38 -06:00
|
|
|
// ConcreteProviderNodeFunc is a callback type used to convert an
|
|
|
|
// abstract provider to a concrete one of some type.
|
|
|
|
type ConcreteProviderNodeFunc func(*NodeAbstractProvider) dag.Vertex
|
|
|
|
|
2016-10-19 16:54:00 -05:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2017-11-01 17:34:18 -05:00
|
|
|
func ResolveProviderName(name string, path []string) string {
|
2017-11-07 12:09:36 -06:00
|
|
|
if strings.Contains(name, "provider.") {
|
|
|
|
// already resolved
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2017-11-01 17:34:18 -05:00
|
|
|
name = fmt.Sprintf("provider.%s", name)
|
2017-11-06 20:57:06 -06:00
|
|
|
if len(path) >= 1 {
|
2017-11-01 17:34:18 -05:00
|
|
|
name = fmt.Sprintf("%s.%s", modulePrefixStr(path), name)
|
2016-10-19 16:54:00 -05:00
|
|
|
}
|
|
|
|
|
2017-11-01 17:34:18 -05:00
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
|
|
|
func (n *NodeAbstractProvider) Name() string {
|
|
|
|
return ResolveProviderName(n.NameValue, n.PathValue)
|
2016-10-19 16:54:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// GraphNodeSubPath
|
|
|
|
func (n *NodeAbstractProvider) Path() []string {
|
|
|
|
return n.PathValue
|
|
|
|
}
|
|
|
|
|
2017-02-17 11:21:29 -06:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2016-10-19 16:54:00 -05:00
|
|
|
// 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
|
2017-10-13 09:11:10 -05:00
|
|
|
func (n *NodeAbstractProvider) ProviderConfig() *config.ProviderConfig {
|
2016-10-19 16:54:00 -05:00
|
|
|
if n.Config == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-10-13 09:11:10 -05:00
|
|
|
return n.Config
|
2016-10-19 16:54:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// GraphNodeAttachProvider
|
|
|
|
func (n *NodeAbstractProvider) AttachProvider(c *config.ProviderConfig) {
|
|
|
|
n.Config = c
|
|
|
|
}
|
2016-12-02 21:26:40 -06:00
|
|
|
|
|
|
|
// 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",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|