terraform: start eval stuff, untested
This commit is contained in:
parent
a73f939ee9
commit
128c07e504
|
@ -0,0 +1,33 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
// EvalContext is the interface that is given to eval nodes to execute.
|
||||||
|
type EvalContext interface {
|
||||||
|
// InitProvider initializes the provider with the given name and
|
||||||
|
// returns the implementation of the resource provider or an error.
|
||||||
|
InitProvider(string) (ResourceProvider, error)
|
||||||
|
|
||||||
|
// Provider gets the provider instance with the given name (already
|
||||||
|
// initialized) or returns nil if the provider isn't initialized.
|
||||||
|
Provider(string) ResourceProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// EvalNode is the interface that must be implemented by graph nodes to
|
||||||
|
// evaluate/execute.
|
||||||
|
type EvalNode interface {
|
||||||
|
// Args returns the arguments for this node as well as the list of
|
||||||
|
// expected types. The expected types are only used for type checking
|
||||||
|
// and not used at runtime.
|
||||||
|
Args() ([]EvalNode, []EvalType)
|
||||||
|
|
||||||
|
// Eval evaluates this node with the given context.
|
||||||
|
Eval(EvalContext) (interface{}, error)
|
||||||
|
|
||||||
|
// Type returns the type that will be returned by this node.
|
||||||
|
Type() EvalType
|
||||||
|
}
|
||||||
|
|
||||||
|
// GraphNodeEvalable is the interface that graph nodes must implement
|
||||||
|
// to enable valuation.
|
||||||
|
type GraphNodeEvalable interface {
|
||||||
|
EvalTree() EvalNode
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/hashicorp/terraform/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EvalInterpolate is an EvalNode implementation that takes a raw
|
||||||
|
// configuration and interpolates it.
|
||||||
|
type EvalInterpolate struct {
|
||||||
|
Config *config.RawConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInterpolate) Args() ([]EvalNode, []EvalType) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInterpolate) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInterpolate) Type() EvalType {
|
||||||
|
return EvalTypeConfig
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EvalConfigProvider is an EvalNode implementation that configures
|
||||||
|
// a provider that is already initialized and retrieved.
|
||||||
|
type EvalConfigProvider struct {
|
||||||
|
Provider EvalNode
|
||||||
|
Config EvalNode
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalConfigProvider) Args() ([]EvalNode, []EvalType) {
|
||||||
|
return []EvalNode{n.Provider, n.Config},
|
||||||
|
[]EvalType{EvalTypeResourceProvider, EvalTypeConfig}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalConfigProvider) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalConfigProvider) Type() EvalType {
|
||||||
|
return EvalTypeNull
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInitProvider) Args() ([]EvalNode, []EvalType) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInitProvider) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
|
return ctx.InitProvider(n.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalInitProvider) Type() EvalType {
|
||||||
|
return EvalTypeNull
|
||||||
|
}
|
||||||
|
|
||||||
|
// EvalGetProvider is an EvalNode implementation that retrieves an already
|
||||||
|
// initialized provider instance for the given name.
|
||||||
|
type EvalGetProvider struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalGetProvider) Args() ([]EvalNode, []EvalType) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalGetProvider) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
|
result := ctx.Provider(n.Name)
|
||||||
|
if result == nil {
|
||||||
|
return nil, fmt.Errorf("provider %s not initialized", n.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalGetProvider) Type() EvalType {
|
||||||
|
return EvalTypeResourceProvider
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
// This separate file for EvalType exists so that stringer below
|
||||||
|
// can work without error. See this thread for more details:
|
||||||
|
//
|
||||||
|
// http://comments.gmane.org/gmane.comp.lang.go.general/148740
|
||||||
|
|
||||||
|
//go:generate stringer -type=EvalType eval_type.go
|
||||||
|
|
||||||
|
// EvalType is the type of any value returned by an EvalNode. This is
|
||||||
|
// used for type checking.
|
||||||
|
type EvalType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
EvalTypeInvalid EvalType = 0
|
||||||
|
EvalTypeNull EvalType = 1 << iota
|
||||||
|
EvalTypeConfig
|
||||||
|
EvalTypeResourceProvider
|
||||||
|
)
|
|
@ -0,0 +1,34 @@
|
||||||
|
// generated by stringer -type=EvalType eval_type.go; DO NOT EDIT
|
||||||
|
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const (
|
||||||
|
_EvalType_name_0 = "EvalTypeInvalid"
|
||||||
|
_EvalType_name_1 = "EvalTypeNull"
|
||||||
|
_EvalType_name_2 = "EvalTypeConfig"
|
||||||
|
_EvalType_name_3 = "EvalTypeResourceProvider"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_EvalType_index_0 = [...]uint8{0, 15}
|
||||||
|
_EvalType_index_1 = [...]uint8{0, 12}
|
||||||
|
_EvalType_index_2 = [...]uint8{0, 14}
|
||||||
|
_EvalType_index_3 = [...]uint8{0, 24}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (i EvalType) String() string {
|
||||||
|
switch {
|
||||||
|
case i == 0:
|
||||||
|
return _EvalType_name_0
|
||||||
|
case i == 2:
|
||||||
|
return _EvalType_name_1
|
||||||
|
case i == 4:
|
||||||
|
return _EvalType_name_2
|
||||||
|
case i == 8:
|
||||||
|
return _EvalType_name_3
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("EvalType(%d)", i)
|
||||||
|
}
|
||||||
|
}
|
|
@ -73,6 +73,14 @@ func (n *GraphNodeConfigProvider) DependentOn() []string {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GraphNodeEvalable impl.
|
||||||
|
func (n *GraphNodeConfigProvider) EvalTree() EvalNode {
|
||||||
|
return &EvalConfigProvider{
|
||||||
|
Provider: &EvalGetProvider{Name: n.Provider.Name},
|
||||||
|
Config: &EvalInterpolate{Config: n.Provider.RawConfig},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GraphNodeProvider implementation
|
// GraphNodeProvider implementation
|
||||||
func (n *GraphNodeConfigProvider) ProviderName() string {
|
func (n *GraphNodeConfigProvider) ProviderName() string {
|
||||||
return n.Provider.Name
|
return n.Provider.Name
|
||||||
|
|
|
@ -100,6 +100,11 @@ func (n *graphNodeMissingProvider) Name() string {
|
||||||
return fmt.Sprintf("provider.%s", n.ProviderNameValue)
|
return fmt.Sprintf("provider.%s", n.ProviderNameValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GraphNodeEvalable impl.
|
||||||
|
func (n *graphNodeMissingProvider) EvalTree() EvalNode {
|
||||||
|
return &EvalInitProvider{Name: n.ProviderNameValue}
|
||||||
|
}
|
||||||
|
|
||||||
func (n *graphNodeMissingProvider) ProviderName() string {
|
func (n *graphNodeMissingProvider) ProviderName() string {
|
||||||
return n.ProviderNameValue
|
return n.ProviderNameValue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue