opentofu/terraform/evaltree_provider.go
James Bardin a14fd0344c WIP reference providers by full name
This turned out to be a big messy commit, since the way providers are
referenced is tightly coupled throughout the code. That starts to unify
how providers are referenced, using the format output node Name method.

Add a new field to the internal resource data types called
ResolvedProvider. This is set by a new setter method SetProvider when a
resource is connected to a provider during graph creation. This allows
us to later lookup the provider instance a resource is connected to,
without requiring it to have the same module path.

The InitProvider context method now takes 2 arguments, one if the
provider type and the second is the full name of the provider. While the
provider type could still be parsed from the full name, this makes it
more explicit and, and changes to the name format won't effect this
code.
2017-11-02 15:00:06 -04:00

119 lines
2.6 KiB
Go

package terraform
import (
"strings"
"github.com/hashicorp/terraform/config"
)
// ProviderEvalTree returns the evaluation tree for initializing and
// configuring providers.
func ProviderEvalTree(n *NodeApplyableProvider, config *config.ProviderConfig) EvalNode {
var provider ResourceProvider
var resourceConfig *ResourceConfig
typeName := strings.SplitN(n.NameValue, ".", 2)[0]
seq := make([]EvalNode, 0, 5)
seq = append(seq, &EvalInitProvider{
TypeName: typeName,
Name: n.Name(),
})
// Input stuff
seq = append(seq, &EvalOpFilter{
Ops: []walkOperation{walkInput, walkImport},
Node: &EvalSequence{
Nodes: []EvalNode{
&EvalGetProvider{
Name: n.Name(),
Output: &provider,
},
&EvalInterpolateProvider{
Config: config,
Output: &resourceConfig,
},
&EvalBuildProviderConfig{
Provider: n.NameValue,
Config: &resourceConfig,
Output: &resourceConfig,
},
&EvalInputProvider{
Name: n.NameValue,
Provider: &provider,
Config: &resourceConfig,
},
},
},
})
seq = append(seq, &EvalOpFilter{
Ops: []walkOperation{walkValidate},
Node: &EvalSequence{
Nodes: []EvalNode{
&EvalGetProvider{
Name: n.Name(),
Output: &provider,
},
&EvalInterpolateProvider{
Config: config,
Output: &resourceConfig,
},
&EvalBuildProviderConfig{
Provider: n.NameValue,
Config: &resourceConfig,
Output: &resourceConfig,
},
&EvalValidateProvider{
Provider: &provider,
Config: &resourceConfig,
},
},
},
})
// Apply stuff
seq = append(seq, &EvalOpFilter{
Ops: []walkOperation{walkRefresh, walkPlan, walkApply, walkDestroy, walkImport},
Node: &EvalSequence{
Nodes: []EvalNode{
&EvalGetProvider{
Name: n.Name(),
Output: &provider,
},
&EvalInterpolateProvider{
Config: config,
Output: &resourceConfig,
},
&EvalBuildProviderConfig{
Provider: n.NameValue,
Config: &resourceConfig,
Output: &resourceConfig,
},
},
},
})
// We configure on everything but validate, since validate may
// not have access to all the variables.
seq = append(seq, &EvalOpFilter{
Ops: []walkOperation{walkRefresh, walkPlan, walkApply, walkDestroy, walkImport},
Node: &EvalSequence{
Nodes: []EvalNode{
&EvalConfigProvider{
Provider: n.Name(),
Config: &resourceConfig,
},
},
},
})
return &EvalSequence{Nodes: seq}
}
// CloseProviderEvalTree returns the evaluation tree for closing
// provider connections that aren't needed anymore.
func CloseProviderEvalTree(n string) EvalNode {
return &EvalCloseProvider{Name: n}
}