terraform: goodbye context.go (old)
This commit is contained in:
parent
14b5942453
commit
e37c187228
|
@ -387,3 +387,16 @@ func (c *Context2) walk(operation walkOperation) (*ContextGraphWalker, error) {
|
||||||
walker := &ContextGraphWalker{Context: c, Operation: operation}
|
walker := &ContextGraphWalker{Context: c, Operation: operation}
|
||||||
return walker, graph.Walk(walker)
|
return walker, graph.Walk(walker)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// walkOperation is an enum which tells the walkContext what to do.
|
||||||
|
type walkOperation byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
walkInvalid walkOperation = iota
|
||||||
|
walkInput
|
||||||
|
walkApply
|
||||||
|
walkPlan
|
||||||
|
walkPlanDestroy
|
||||||
|
walkRefresh
|
||||||
|
walkValidate
|
||||||
|
)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -4630,3 +4630,171 @@ func TestContext2Apply_singleDestroy(t *testing.T) {
|
||||||
func testContext2(t *testing.T, opts *ContextOpts) *Context2 {
|
func testContext2(t *testing.T, opts *ContextOpts) *Context2 {
|
||||||
return NewContext2(opts)
|
return NewContext2(opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testApplyFn(
|
||||||
|
info *InstanceInfo,
|
||||||
|
s *InstanceState,
|
||||||
|
d *InstanceDiff) (*InstanceState, error) {
|
||||||
|
if d.Destroy {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
id := "foo"
|
||||||
|
if idAttr, ok := d.Attributes["id"]; ok && !idAttr.NewComputed {
|
||||||
|
id = idAttr.New
|
||||||
|
}
|
||||||
|
|
||||||
|
result := &InstanceState{
|
||||||
|
ID: id,
|
||||||
|
}
|
||||||
|
|
||||||
|
if d != nil {
|
||||||
|
result = result.MergeDiff(d)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func testDiffFn(
|
||||||
|
info *InstanceInfo,
|
||||||
|
s *InstanceState,
|
||||||
|
c *ResourceConfig) (*InstanceDiff, error) {
|
||||||
|
var diff InstanceDiff
|
||||||
|
diff.Attributes = make(map[string]*ResourceAttrDiff)
|
||||||
|
|
||||||
|
for k, v := range c.Raw {
|
||||||
|
if _, ok := v.(string); !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if k == "nil" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// This key is used for other purposes
|
||||||
|
if k == "compute_value" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if k == "compute" {
|
||||||
|
attrDiff := &ResourceAttrDiff{
|
||||||
|
Old: "",
|
||||||
|
New: "",
|
||||||
|
NewComputed: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
if cv, ok := c.Config["compute_value"]; ok {
|
||||||
|
if cv.(string) == "1" {
|
||||||
|
attrDiff.NewComputed = false
|
||||||
|
attrDiff.New = fmt.Sprintf("computed_%s", v.(string))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff.Attributes[v.(string)] = attrDiff
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this key is not computed, then look it up in the
|
||||||
|
// cleaned config.
|
||||||
|
found := false
|
||||||
|
for _, ck := range c.ComputedKeys {
|
||||||
|
if ck == k {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
v = c.Config[k]
|
||||||
|
}
|
||||||
|
|
||||||
|
attrDiff := &ResourceAttrDiff{
|
||||||
|
Old: "",
|
||||||
|
New: v.(string),
|
||||||
|
}
|
||||||
|
|
||||||
|
if k == "require_new" {
|
||||||
|
attrDiff.RequiresNew = true
|
||||||
|
}
|
||||||
|
diff.Attributes[k] = attrDiff
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, k := range c.ComputedKeys {
|
||||||
|
diff.Attributes[k] = &ResourceAttrDiff{
|
||||||
|
Old: "",
|
||||||
|
NewComputed: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range diff.Attributes {
|
||||||
|
if v.NewComputed {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
old, ok := s.Attributes[k]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if old == v.New {
|
||||||
|
delete(diff.Attributes, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !diff.Empty() {
|
||||||
|
diff.Attributes["type"] = &ResourceAttrDiff{
|
||||||
|
Old: "",
|
||||||
|
New: info.Type,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &diff, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func testProvider(prefix string) *MockResourceProvider {
|
||||||
|
p := new(MockResourceProvider)
|
||||||
|
p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
p.ResourcesReturn = []ResourceType{
|
||||||
|
ResourceType{
|
||||||
|
Name: fmt.Sprintf("%s_instance", prefix),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func testProvisioner() *MockResourceProvisioner {
|
||||||
|
p := new(MockResourceProvisioner)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
const testContextGraph = `
|
||||||
|
root: root
|
||||||
|
aws_instance.bar
|
||||||
|
aws_instance.bar -> provider.aws
|
||||||
|
aws_instance.foo
|
||||||
|
aws_instance.foo -> provider.aws
|
||||||
|
provider.aws
|
||||||
|
root
|
||||||
|
root -> aws_instance.bar
|
||||||
|
root -> aws_instance.foo
|
||||||
|
`
|
||||||
|
|
||||||
|
const testContextRefreshModuleStr = `
|
||||||
|
aws_instance.web: (1 tainted)
|
||||||
|
ID = <not created>
|
||||||
|
Tainted ID 1 = bar
|
||||||
|
|
||||||
|
module.child:
|
||||||
|
aws_instance.web:
|
||||||
|
ID = new
|
||||||
|
`
|
||||||
|
|
||||||
|
const testContextRefreshOutputPartialStr = `
|
||||||
|
<no state>
|
||||||
|
`
|
||||||
|
|
||||||
|
const testContextRefreshTaintedStr = `
|
||||||
|
aws_instance.web: (1 tainted)
|
||||||
|
ID = <not created>
|
||||||
|
Tainted ID 1 = foo
|
||||||
|
`
|
||||||
|
|
|
@ -42,12 +42,12 @@ type Plan struct {
|
||||||
//
|
//
|
||||||
// The following fields in opts are overridden by the plan: Config,
|
// The following fields in opts are overridden by the plan: Config,
|
||||||
// Diff, State, Variables.
|
// Diff, State, Variables.
|
||||||
func (p *Plan) Context(opts *ContextOpts) *Context {
|
func (p *Plan) Context(opts *ContextOpts) *Context2 {
|
||||||
opts.Diff = p.Diff
|
opts.Diff = p.Diff
|
||||||
opts.Module = p.Module
|
opts.Module = p.Module
|
||||||
opts.State = p.State
|
opts.State = p.State
|
||||||
opts.Variables = p.Vars
|
opts.Variables = p.Vars
|
||||||
return NewContext(opts)
|
return NewContext2(opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Plan) String() string {
|
func (p *Plan) String() string {
|
||||||
|
|
|
@ -93,7 +93,7 @@ type ResourceConfig struct {
|
||||||
// NewResourceConfig creates a new ResourceConfig from a config.RawConfig.
|
// NewResourceConfig creates a new ResourceConfig from a config.RawConfig.
|
||||||
func NewResourceConfig(c *config.RawConfig) *ResourceConfig {
|
func NewResourceConfig(c *config.RawConfig) *ResourceConfig {
|
||||||
result := &ResourceConfig{raw: c}
|
result := &ResourceConfig{raw: c}
|
||||||
result.interpolate(nil, nil)
|
result.interpolateForce()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,36 +201,18 @@ func (c *ResourceConfig) get(
|
||||||
return current, true
|
return current, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ResourceConfig) interpolate(
|
|
||||||
ctx *walkContext, r *Resource) error {
|
|
||||||
if c == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if ctx != nil {
|
|
||||||
if err := ctx.computeVars(c.raw, r); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.raw == nil {
|
|
||||||
var err error
|
|
||||||
c.raw, err = config.NewRawConfig(make(map[string]interface{}))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c.ComputedKeys = c.raw.UnknownKeys()
|
|
||||||
c.Raw = c.raw.Raw
|
|
||||||
c.Config = c.raw.Config()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// interpolateForce is a temporary thing. We want to get rid of interpolate
|
// interpolateForce is a temporary thing. We want to get rid of interpolate
|
||||||
// above and likewise this, but it can only be done after the f-ast-graph
|
// above and likewise this, but it can only be done after the f-ast-graph
|
||||||
// refactor is complete.
|
// refactor is complete.
|
||||||
func (c *ResourceConfig) interpolateForce() {
|
func (c *ResourceConfig) interpolateForce() {
|
||||||
|
if c.raw == nil {
|
||||||
|
var err error
|
||||||
|
c.raw, err = config.NewRawConfig(make(map[string]interface{}))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.ComputedKeys = c.raw.UnknownKeys()
|
c.ComputedKeys = c.raw.UnknownKeys()
|
||||||
c.Raw = c.raw.Raw
|
c.Raw = c.raw.Raw
|
||||||
c.Config = c.raw.Config()
|
c.Config = c.raw.Config()
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/config"
|
"github.com/hashicorp/terraform/config"
|
||||||
|
"github.com/hashicorp/terraform/config/lang/ast"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestInstanceInfo(t *testing.T) {
|
func TestInstanceInfo(t *testing.T) {
|
||||||
|
@ -99,17 +100,20 @@ func TestResourceConfigGet(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rc := NewResourceConfig(rawC)
|
|
||||||
if tc.Vars != nil {
|
if tc.Vars != nil {
|
||||||
ctx := NewContext(&ContextOpts{Variables: tc.Vars})
|
vs := make(map[string]ast.Variable)
|
||||||
err := rc.interpolate(
|
for k, v := range tc.Vars {
|
||||||
ctx.walkContext(walkInvalid, rootModulePath),
|
vs["var."+k] = ast.Variable{Value: v, Type: ast.TypeString}
|
||||||
nil)
|
}
|
||||||
if err != nil {
|
|
||||||
|
if err := rawC.Interpolate(vs); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc := NewResourceConfig(rawC)
|
||||||
|
rc.interpolateForce()
|
||||||
|
|
||||||
v, _ := rc.Get(tc.Key)
|
v, _ := rc.Get(tc.Key)
|
||||||
if !reflect.DeepEqual(v, tc.Value) {
|
if !reflect.DeepEqual(v, tc.Value) {
|
||||||
t.Fatalf("%d bad: %#v", i, v)
|
t.Fatalf("%d bad: %#v", i, v)
|
||||||
|
|
Loading…
Reference in New Issue