opentofu/terraform/eval_provider.go

109 lines
2.7 KiB
Go
Raw Normal View History

2015-02-03 03:43:18 -06:00
package terraform
import (
"fmt"
2015-02-13 19:59:54 -06:00
"github.com/hashicorp/terraform/config"
2015-02-03 03:43:18 -06:00
)
// EvalConfigProvider is an EvalNode implementation that configures
// a provider that is already initialized and retrieved.
type EvalConfigProvider struct {
Provider string
2015-02-14 00:58:41 -06:00
Config **ResourceConfig
2015-02-03 03:43:18 -06:00
}
2015-02-14 00:58:41 -06:00
func (n *EvalConfigProvider) Eval(ctx EvalContext) (interface{}, error) {
cfg := *n.Config
2015-02-13 19:59:54 -06:00
// If we have a configuration set, then use that
if input := ctx.ProviderInput(n.Provider); input != nil {
rc, err := config.NewRawConfig(input)
if err != nil {
return nil, err
}
merged := cfg.raw.Merge(rc)
cfg = NewResourceConfig(merged)
}
// Get the parent configuration if there is one
if parent := ctx.ParentProviderConfig(n.Provider); parent != nil {
2015-02-13 19:59:54 -06:00
merged := cfg.raw.Merge(parent.raw)
cfg = NewResourceConfig(merged)
}
2015-02-13 19:59:54 -06:00
return nil, ctx.ConfigureProvider(n.Provider, cfg)
2015-02-03 03:43:18 -06:00
}
// EvalInitProvider is an EvalNode implementation that initializes a provider
// and returns nothing. The provider can be retrieved again with the
// EvalGetProvider node.
type EvalInitProvider struct {
Name string
}
2015-02-14 00:58:41 -06:00
func (n *EvalInitProvider) Eval(ctx EvalContext) (interface{}, error) {
2015-02-03 03:43:18 -06:00
return ctx.InitProvider(n.Name)
}
// EvalGetProvider is an EvalNode implementation that retrieves an already
// initialized provider instance for the given name.
type EvalGetProvider struct {
2015-02-12 16:46:22 -06:00
Name string
Output *ResourceProvider
2015-02-03 03:43:18 -06:00
}
2015-02-14 00:58:41 -06:00
func (n *EvalGetProvider) Eval(ctx EvalContext) (interface{}, error) {
2015-02-03 03:43:18 -06:00
result := ctx.Provider(n.Name)
if result == nil {
return nil, fmt.Errorf("provider %s not initialized", n.Name)
}
2015-02-12 16:46:22 -06:00
if n.Output != nil {
*n.Output = result
}
2015-02-14 00:58:41 -06:00
return nil, nil
2015-02-03 03:43:18 -06:00
}
2015-02-13 19:59:54 -06:00
// EvalInputProvider is an EvalNode implementation that asks for input
// for the given provider configurations.
type EvalInputProvider struct {
Name string
Provider *ResourceProvider
Config *config.RawConfig
}
2015-02-14 00:58:41 -06:00
func (n *EvalInputProvider) Eval(ctx EvalContext) (interface{}, error) {
2015-02-13 19:59:54 -06:00
// If we already configured this provider, then don't do this again
if v := ctx.ProviderInput(n.Name); v != nil {
return nil, nil
}
rc := NewResourceConfig(n.Config)
rc.Config = make(map[string]interface{})
// Wrap the input into a namespace
input := &PrefixUIInput{
IdPrefix: fmt.Sprintf("provider.%s", n.Name),
QueryPrefix: fmt.Sprintf("provider.%s.", n.Name),
UIInput: ctx.Input(),
}
// Go through each provider and capture the input necessary
// to satisfy it.
config, err := (*n.Provider).Input(input, rc)
if err != nil {
return nil, fmt.Errorf(
"Error configuring %s: %s", n.Name, err)
}
if config != nil && len(config.Config) > 0 {
// Set the configuration
ctx.SetProviderInput(n.Name, config.Config)
}
return nil, nil
}