terraform/terraform/context_test.go

5101 lines
108 KiB
Go
Raw Normal View History

2015-02-05 00:44:23 +01:00
package terraform
import (
2015-02-12 03:33:45 +01:00
"bytes"
2015-02-05 02:02:18 +01:00
"fmt"
2015-02-12 21:52:48 +01:00
"os"
"reflect"
2015-02-12 02:51:56 +01:00
"sort"
2015-02-05 02:02:18 +01:00
"strings"
2015-02-12 02:51:56 +01:00
"sync"
2015-02-05 00:44:23 +01:00
"testing"
)
2015-02-12 00:22:03 +01:00
func TestContext2Plan(t *testing.T) {
m := testModule(t, "plan-good")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-11 17:51:17 +01:00
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if len(plan.Diff.RootModule().Resources) < 2 {
t.Fatalf("bad: %#v", plan.Diff.RootModule().Resources)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
func TestContext2Plan_emptyDiff(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-empty")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = func(
info *InstanceInfo,
s *InstanceState,
c *ResourceConfig) (*InstanceDiff, error) {
return nil, nil
}
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanEmptyStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
func TestContext2Plan_minimal(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-empty")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanEmptyStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
func TestContext2Plan_modules(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-modules")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
2015-02-11 17:51:17 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModulesStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
func TestContext2Plan_moduleInput(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-input")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleInputStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
2015-02-12 02:02:55 +01:00
func TestContext2Plan_moduleInputComputed(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-input-computed")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 02:02:55 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
2015-02-11 17:51:17 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleInputComputedStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
}
2015-02-11 17:51:17 +01:00
}
2015-02-12 02:02:55 +01:00
func TestContext2Plan_moduleInputFromVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-input-var")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 02:02:55 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "52",
},
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
2015-02-11 17:51:17 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleInputVarStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
}
}
2015-02-12 02:02:55 +01:00
func TestContext2Plan_moduleMultiVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-multi-var")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 02:02:55 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleMultiVarStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
2015-02-12 02:02:55 +01:00
func TestContext2Plan_moduleOrphans(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-modules-remove")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
s := &State{
2015-02-11 17:51:17 +01:00
Modules: []*ModuleState{
&ModuleState{
2015-02-12 00:22:03 +01:00
Path: []string{"root", "child"},
2015-02-11 17:51:17 +01:00
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.foo": &ResourceState{
2015-02-11 17:51:17 +01:00
Type: "aws_instance",
2015-02-12 00:22:03 +01:00
Primary: &InstanceState{
ID: "baz",
2015-02-11 17:51:17 +01:00
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleOrphansStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
2015-02-12 02:51:56 +01:00
func TestContext2Plan_moduleProviderInherit(t *testing.T) {
2015-02-12 00:22:03 +01:00
var l sync.Mutex
var calls []string
m := testModule(t, "plan-module-provider-inherit")
2015-02-12 02:51:56 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
2015-02-12 00:22:03 +01:00
"aws": func() (ResourceProvider, error) {
l.Lock()
defer l.Unlock()
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
p := testProvider("aws")
p.ConfigureFn = func(c *ResourceConfig) error {
if v, ok := c.Get("from"); !ok || v.(string) != "root" {
return fmt.Errorf("bad")
}
return nil
}
p.DiffFn = func(
info *InstanceInfo,
state *InstanceState,
c *ResourceConfig) (*InstanceDiff, error) {
v, _ := c.Get("from")
calls = append(calls, v.(string))
return testDiffFn(info, state, c)
}
return p, nil
2015-02-11 17:51:17 +01:00
},
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := calls
sort.Strings(actual)
expected := []string{"child", "root"}
if !reflect.DeepEqual(actual, expected) {
t.Fatalf("bad: %#v", actual)
2015-02-08 22:06:11 +01:00
}
}
func TestContext2Plan_moduleProviderDefaults(t *testing.T) {
2015-02-12 00:22:03 +01:00
var l sync.Mutex
var calls []string
toCount := 0
2015-02-08 22:06:11 +01:00
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-provider-defaults")
ctx := testContext2(t, &ContextOpts{
2015-02-10 01:06:19 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
2015-02-12 00:22:03 +01:00
"aws": func() (ResourceProvider, error) {
l.Lock()
defer l.Unlock()
p := testProvider("aws")
p.ConfigureFn = func(c *ResourceConfig) error {
if v, ok := c.Get("from"); !ok || v.(string) != "root" {
return fmt.Errorf("bad")
}
if v, ok := c.Get("to"); ok && v.(string) == "child" {
toCount++
}
return nil
}
p.DiffFn = func(
info *InstanceInfo,
state *InstanceState,
c *ResourceConfig) (*InstanceDiff, error) {
v, _ := c.Get("from")
calls = append(calls, v.(string))
return testDiffFn(info, state, c)
}
return p, nil
},
2015-02-10 01:06:19 +01:00
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-10 01:06:19 +01:00
2015-02-12 00:22:03 +01:00
if toCount != 1 {
t.Fatalf(
"provider in child didn't set proper config\n\n"+
"toCount: %d", toCount)
2015-02-10 01:06:19 +01:00
}
2015-02-12 00:22:03 +01:00
actual := calls
sort.Strings(actual)
expected := []string{"child", "root"}
if !reflect.DeepEqual(actual, expected) {
t.Fatalf("bad: %#v", actual)
2015-02-10 01:06:19 +01:00
}
}
2015-02-12 03:33:45 +01:00
func TestContext2Plan_moduleProviderDefaultsVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
var l sync.Mutex
var calls []string
m := testModule(t, "plan-module-provider-defaults-var")
2015-02-12 03:33:45 +01:00
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
2015-02-12 00:22:03 +01:00
"aws": func() (ResourceProvider, error) {
l.Lock()
defer l.Unlock()
p := testProvider("aws")
p.ConfigureFn = func(c *ResourceConfig) error {
var buf bytes.Buffer
if v, ok := c.Get("from"); ok {
buf.WriteString(v.(string) + "\n")
}
if v, ok := c.Get("to"); ok {
buf.WriteString(v.(string) + "\n")
}
calls = append(calls, buf.String())
return nil
}
p.DiffFn = testDiffFn
return p, nil
},
},
Variables: map[string]string{
"foo": "root",
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
expected := []string{
"root\n",
"root\nchild\n",
}
2015-02-12 00:22:03 +01:00
if !reflect.DeepEqual(calls, expected) {
t.Fatalf("BAD: %#v", calls)
}
}
2015-02-12 03:33:45 +01:00
func TestContext2Plan_moduleVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-var")
2015-02-05 02:02:18 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 03:33:45 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 02:02:18 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-05 02:02:18 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleVarStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-05 02:02:18 +01:00
}
}
2015-02-12 07:38:38 +01:00
func TestContext2Plan_moduleVarComputed(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-var-computed")
2015-02-05 02:02:18 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 07:38:38 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 02:02:18 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-05 02:02:18 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleVarComputedStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-05 02:02:18 +01:00
}
}
func TestContext2Plan_nil(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-nil")
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if len(plan.Diff.RootModule().Resources) != 0 {
t.Fatalf("bad: %#v", plan.Diff.RootModule().Resources)
}
}
2015-02-12 07:46:47 +01:00
func TestContext2Plan_computed(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-computed")
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 07:46:47 +01:00
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanComputedStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
}
}
2015-02-12 07:46:47 +01:00
func TestContext2Plan_computedList(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-computed-list")
2015-02-09 20:15:54 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 07:46:47 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-09 20:15:54 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-09 20:15:54 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanComputedListStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-09 20:21:16 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-12 07:46:47 +01:00
func TestContext2Plan_count(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count")
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 07:46:47 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-09 20:21:16 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-09 20:21:16 +01:00
}
2015-02-12 00:22:03 +01:00
if len(plan.Diff.RootModule().Resources) < 6 {
t.Fatalf("bad: %#v", plan.Diff.RootModule().Resources)
}
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-09 20:21:16 +01:00
}
}
2015-02-12 07:51:48 +01:00
func TestContext2Plan_countComputed(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-computed")
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 07:51:48 +01:00
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
if err == nil {
t.Fatal("should error")
}
}
func TestContext2Plan_countIndex(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-index")
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountIndexStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
}
}
func TestContext2Plan_countIndexZero(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-index-zero")
2015-02-09 03:02:29 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-09 03:02:29 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-09 03:02:29 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountIndexZeroStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-09 03:02:29 +01:00
}
}
func TestContext2Plan_countVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-var")
2015-02-09 18:50:20 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-09 18:50:20 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"count": "3",
},
2015-02-09 18:50:20 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-09 18:50:20 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountVarStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-09 18:50:20 +01:00
}
}
2015-02-12 08:04:40 +01:00
func TestContext2Plan_countZero(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-zero")
2015-02-07 18:53:46 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 08:04:40 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-07 18:53:46 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-07 18:53:46 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountZeroStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-07 18:53:46 +01:00
}
}
2015-02-12 08:04:40 +01:00
func TestContext2Plan_countOneIndex(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-one-index")
2015-02-07 18:53:46 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
2015-02-12 08:04:40 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-07 18:53:46 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-07 18:53:46 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountOneIndexStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-07 18:53:46 +01:00
}
}
2015-02-12 08:04:40 +01:00
func TestContext2Plan_countDecreaseToOne(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-dec")
2015-02-07 18:53:46 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
"aws_instance.foo.1": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
"aws_instance.foo.2": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-12 08:04:40 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-07 18:53:46 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-07 18:53:46 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-07 18:53:46 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountDecreaseStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-07 18:53:46 +01:00
}
}
func TestContext2Plan_countIncreaseFromNotSet(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-inc")
2015-02-10 01:08:00 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
s := &State{
2015-02-10 01:08:00 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
2015-02-12 00:22:03 +01:00
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
2015-02-10 01:08:00 +01:00
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-10 01:08:00 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-10 01:08:00 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-10 01:08:00 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountIncreaseStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-10 01:08:00 +01:00
}
}
func TestContext2Plan_countIncreaseFromOne(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-count-inc")
2015-02-09 18:54:56 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-09 18:54:56 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-09 18:54:56 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
t.Fatalf("err: %s", err)
2015-02-09 18:54:56 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanCountIncreaseFromOneStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-09 18:54:56 +01:00
}
}
2015-02-12 21:42:33 +01:00
func TestContext2Plan_destroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-destroy")
2015-02-09 18:54:56 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.DiffFn = testDiffFn
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.one": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
"aws_instance.two": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "baz",
},
},
},
},
},
}
2015-02-12 21:42:33 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(&PlanOpts{Destroy: true})
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if len(plan.Diff.RootModule().Resources) != 2 {
t.Fatalf("bad: %#v", plan.Diff.RootModule().Resources)
}
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanDestroyStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
}
}
2015-02-12 21:49:48 +01:00
func TestContext2Plan_moduleDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-destroy")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
&ModuleState{
Path: []string{"root", "child"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-12 21:49:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(&PlanOpts{Destroy: true})
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleDestroyStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_moduleDestroyMultivar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-module-destroy-multivar")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{},
},
&ModuleState{
Path: []string{"root", "child"},
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar0",
},
},
"aws_instance.foo.1": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar1",
},
},
},
},
},
}
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(&PlanOpts{Destroy: true})
if err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanModuleDestroyMultivarStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 21:52:48 +01:00
func TestContext2Plan_pathVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
cwd, err := os.Getwd()
if err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-path-var")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanPathVarStr)
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
// Warning: this ordering REALLY matters for this test. The
// order is: cwd, module, root.
expected = fmt.Sprintf(
expected,
cwd,
m.Config().Dir,
m.Config().Dir)
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
if actual != expected {
t.Fatalf("bad:\n%s\n\nexpected:\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_diffVar(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-diffvar")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"num": "2",
},
},
},
},
},
},
}
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.DiffFn = func(
info *InstanceInfo,
s *InstanceState,
c *ResourceConfig) (*InstanceDiff, error) {
if s.ID != "bar" {
return testDiffFn(info, s, c)
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
Old: "2",
New: "3",
},
},
}, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanDiffVarStr)
if actual != expected {
t.Fatalf("actual:\n%s\n\nexpected:\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_hook(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-good")
h := new(MockHook)
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
2015-02-12 00:22:03 +01:00
Hooks: []Hook{h},
2015-02-05 00:44:23 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
if err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !h.PreDiffCalled {
t.Fatal("should be called")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if !h.PostDiffCalled {
t.Fatal("should be called")
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_orphan(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-orphan")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.baz": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanOrphanStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_state(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-good")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if len(plan.Diff.RootModule().Resources) < 2 {
t.Fatalf("bad: %#v", plan.Diff.RootModule().Resources)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanStateStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s\n\nexpected:\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 21:52:48 +01:00
func TestContext2Plan_taint(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-taint")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{"num": "2"},
},
},
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
ID: "baz",
},
},
},
},
},
},
}
2015-02-12 21:52:48 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanTaintStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s", actual)
}
}
func TestContext2Plan_multiple_taint(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-taint")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
2015-02-05 00:44:23 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.foo": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
Primary: &InstanceState{
2015-02-12 00:22:03 +01:00
ID: "bar",
Attributes: map[string]string{"num": "2"},
},
},
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
ID: "baz",
},
&InstanceState{
ID: "zip",
2015-02-05 00:44:23 +01:00
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanMultipleTaintStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Plan_provider(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-provider")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
var value interface{}
p.ConfigureFn = func(c *ResourceConfig) error {
value, _ = c.Get("foo")
return nil
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "bar",
},
2015-02-05 00:44:23 +01:00
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if value != "bar" {
t.Fatalf("bad: %#v", value)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Plan_varMultiCountOne(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-var-multi-count-one")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
plan, err := ctx.Plan(nil)
if err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(plan.String())
expected := strings.TrimSpace(testTerraformPlanVarMultiCountOneStr)
if actual != expected {
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Plan_varListErr(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "plan-var-list-err")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
_, err := ctx.Plan(nil)
if err == nil {
t.Fatal("should error")
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-basic")
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
s, err := ctx.Refresh()
mod := s.RootModule()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !p.RefreshCalled {
t.Fatal("refresh should be called")
}
if p.RefreshState.ID != "foo" {
t.Fatalf("bad: %#v", p.RefreshState)
}
if !reflect.DeepEqual(mod.Resources["aws_instance.web"].Primary, p.RefreshReturn) {
t.Fatalf("bad: %#v %#v", mod.Resources["aws_instance.web"], p.RefreshReturn)
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
for _, r := range mod.Resources {
if r.Type == "" {
t.Fatalf("no type: %#v", r)
}
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_delete(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-basic")
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
},
},
},
},
},
},
2015-02-12 00:22:03 +01:00
})
p.RefreshFn = nil
p.RefreshReturn = nil
s, err := ctx.Refresh()
if err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
mod := s.RootModule()
if len(mod.Resources) > 0 {
t.Fatal("resources should be empty")
}
}
func TestContext2Refresh_ignoreUncreated(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "refresh-basic")
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: nil,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
_, err := ctx.Refresh()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if p.RefreshCalled {
t.Fatal("refresh should not be called")
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_hook(t *testing.T) {
h := new(MockHook)
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-basic")
ctx := testContext2(t, &ContextOpts{
Module: m,
Hooks: []Hook{h},
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
},
},
},
},
},
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Refresh(); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !h.PreRefreshCalled {
t.Fatal("should be called")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if !h.PostRefreshCalled {
t.Fatal("should be called")
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_modules(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-modules")
state := &State{
2015-02-05 00:44:23 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.web": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
ID: "bar",
},
},
},
},
},
2015-02-12 00:22:03 +01:00
&ModuleState{
Path: []string{"root", "child"},
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "baz",
},
},
},
},
2015-02-05 00:44:23 +01:00
},
}
2015-02-12 00:22:03 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
if s.ID != "baz" {
return s, nil
}
s.ID = "new"
return s, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
s, err := ctx.Refresh()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(s.String())
expected := strings.TrimSpace(testContextRefreshModuleStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n\n%s\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_moduleInputComputedOutput(t *testing.T) {
m := testModule(t, "refresh-module-input-computed-output")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Refresh(); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_moduleVarModule(t *testing.T) {
m := testModule(t, "refresh-module-var-module")
p := testProvider("aws")
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
if _, err := ctx.Refresh(); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
// GH-70
func TestContext2Refresh_noState(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-no-state")
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
}
if _, err := ctx.Refresh(); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_outputPartial(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "refresh-output-partial")
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
})
p.RefreshFn = nil
p.RefreshReturn = nil
s, err := ctx.Refresh()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(s.String())
expected := strings.TrimSpace(testContextRefreshOutputPartialStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad:\n\n%s\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_state(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-basic")
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
s, err := ctx.Refresh()
if err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
originalMod := state.RootModule()
mod := s.RootModule()
if !p.RefreshCalled {
t.Fatal("refresh should be called")
}
if !reflect.DeepEqual(p.RefreshState, originalMod.Resources["aws_instance.web"].Primary) {
t.Fatalf(
"bad:\n\n%#v\n\n%#v",
p.RefreshState,
originalMod.Resources["aws_instance.web"].Primary)
}
if !reflect.DeepEqual(mod.Resources["aws_instance.web"].Primary, p.RefreshReturn) {
t.Fatalf("bad: %#v", mod.Resources)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_tainted(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-basic")
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
ID: "bar",
},
},
},
},
},
},
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
s, err := ctx.Refresh()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !p.RefreshCalled {
t.Fatal("refresh should be called")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(s.String())
expected := strings.TrimSpace(testContextRefreshTaintedStr)
if actual != expected {
t.Fatalf("bad:\n\n%s\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 22:11:15 +01:00
// Doing a Refresh (or any operation really, but Refresh usually
// happens first) with a config with an unknown provider should result in
// an error. The key bug this found was that this wasn't happening if
// Providers was _empty_.
func TestContext2Refresh_unknownProvider(t *testing.T) {
m := testModule(t, "refresh-unknown-provider")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{},
})
if _, err := ctx.Refresh(); err == nil {
t.Fatal("should error")
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Refresh_vars(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "refresh-vars")
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
2015-02-05 00:44:23 +01:00
},
})
2015-02-12 00:22:03 +01:00
p.RefreshFn = nil
p.RefreshReturn = &InstanceState{
ID: "foo",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
s, err := ctx.Refresh()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := s.RootModule()
if !p.RefreshCalled {
t.Fatal("refresh should be called")
}
if p.RefreshState.ID != "foo" {
t.Fatalf("bad: %#v", p.RefreshState)
}
if !reflect.DeepEqual(mod.Resources["aws_instance.web"].Primary, p.RefreshReturn) {
t.Fatalf("bad: %#v", mod.Resources["aws_instance.web"])
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
for _, r := range mod.Resources {
if r.Type == "" {
t.Fatalf("no type: %#v", r)
}
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-good")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_badVar(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-bad-var")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
func TestContext2Validate_countNegative(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "validate-count-negative")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_countVariable(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-count-variable")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_countVariableNoDefault(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-count-variable")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) != 1 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_moduleBadOutput(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-bad-module-output")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_moduleGood(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "validate-good-module")
c := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
}
if len(e) > 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_moduleBadResource(t *testing.T) {
m := testModule(t, "validate-module-bad-rc")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ValidateResourceReturnErrors = []error{fmt.Errorf("bad")}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_moduleProviderInherit(t *testing.T) {
m := testModule(t, "validate-module-pc-inherit")
p := testProvider("aws")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
return nil, c.CheckSet([]string{"set"})
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
}
if len(e) > 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_orphans(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-good")
state := &State{
2015-02-05 00:44:23 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.web": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.ValidateResourceFn = func(
t string, c *ResourceConfig) ([]string, []error) {
return nil, c.CheckSet([]string{"foo"})
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_providerConfig_bad(t *testing.T) {
m := testModule(t, "validate-bad-pc")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ValidateReturnErrors = []error{fmt.Errorf("bad")}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if !strings.Contains(fmt.Sprintf("%s", e), "bad") {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_providerConfig_badEmpty(t *testing.T) {
m := testModule(t, "validate-bad-pc-empty")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ValidateReturnErrors = []error{fmt.Errorf("bad")}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_providerConfig_good(t *testing.T) {
m := testModule(t, "validate-bad-pc")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_provisionerConfig_bad(t *testing.T) {
m := testModule(t, "validate-bad-prov-conf")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
pr.ValidateReturnErrors = []error{fmt.Errorf("bad")}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_provisionerConfig_good(t *testing.T) {
m := testModule(t, "validate-bad-prov-conf")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
pr := testProvisioner()
2015-02-12 00:22:03 +01:00
pr.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
if c == nil {
t.Fatalf("missing resource config for provisioner")
}
return nil, c.CheckSet([]string{"command"})
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_requiredVar(t *testing.T) {
m := testModule(t, "validate-required-var")
p := testProvider("aws")
c := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
}
if len(e) == 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_resourceConfig_bad(t *testing.T) {
m := testModule(t, "validate-bad-rc")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ValidateResourceReturnErrors = []error{fmt.Errorf("bad")}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_resourceConfig_good(t *testing.T) {
m := testModule(t, "validate-bad-rc")
p := testProvider("aws")
c := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_resourceNameSymbol(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-resource-name-symbol")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) == 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_selfRef(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "validate-self-ref")
c := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %s", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_selfRefMulti(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-self-ref-multi")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_selfRefMultiAll(t *testing.T) {
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
m := testModule(t, "validate-self-ref-multi-all")
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) == 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
func TestContext2Validate_tainted(t *testing.T) {
p := testProvider("aws")
m := testModule(t, "validate-good")
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
ID: "bar",
},
},
},
},
},
},
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: state,
})
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
p.ValidateResourceFn = func(
t string, c *ResourceConfig) ([]string, []error) {
return nil, c.CheckSet([]string{"foo"})
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
w, e := c.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if len(e) > 0 {
t.Fatalf("bad: %#v", e)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_varRef(t *testing.T) {
m := testModule(t, "validate-variable-ref")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
computed := false
p.ValidateResourceFn = func(t string, c *ResourceConfig) ([]string, []error) {
computed = c.IsComputed("foo")
return nil, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
c.Validate()
if !computed {
t.Fatal("should be computed")
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
func TestContext2Validate_varRefFilled(t *testing.T) {
m := testModule(t, "validate-variable-ref")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
c := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "bar",
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
var value interface{}
p.ValidateResourceFn = func(t string, c *ResourceConfig) ([]string, []error) {
value, _ = c.Get("foo")
return nil, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
c.Validate()
if value != "bar" {
t.Fatalf("bad: %#v", value)
2015-02-05 00:44:23 +01:00
}
}
2015-02-14 02:29:38 +01:00
func TestContext2Input(t *testing.T) {
2015-02-12 00:22:03 +01:00
input := new(MockUIInput)
m := testModule(t, "input-vars")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 02:29:38 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "us-west-2",
"amis.us-east-1": "override",
},
UIInput: input,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
input.InputReturnMap = map[string]string{
"var.foo": "us-east-1",
}
if err := ctx.Input(InputModeStd); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-05 00:44:23 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
2015-02-12 00:22:03 +01:00
expected := strings.TrimSpace(testTerraformInputVarsStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
}
2015-02-14 02:59:54 +01:00
func TestContext2Input_provider(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "input-provider")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 02:59:54 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
var actual interface{}
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
c.Config["foo"] = "bar"
return c, nil
}
p.ConfigureFn = func(c *ResourceConfig) error {
actual = c.Config["foo"]
return nil
}
if err := ctx.Input(InputModeStd); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-05 00:44:23 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Apply(); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !reflect.DeepEqual(actual, "bar") {
t.Fatalf("bad: %#v", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Input_providerOnce(t *testing.T) {
m := testModule(t, "input-provider-once")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
count := 0
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
count++
return nil, nil
}
if err := ctx.Input(InputModeStd); err != nil {
t.Fatalf("err: %s", err)
}
if count != 1 {
t.Fatalf("should only be called once: %d", count)
}
}
2015-02-14 03:01:32 +01:00
func TestContext2Input_providerId(t *testing.T) {
2015-02-12 00:22:03 +01:00
input := new(MockUIInput)
m := testModule(t, "input-provider")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 03:01:32 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
UIInput: input,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
var actual interface{}
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
v, err := i.Input(&InputOpts{Id: "foo"})
if err != nil {
return nil, err
}
c.Config["foo"] = v
return c, nil
}
p.ConfigureFn = func(c *ResourceConfig) error {
actual = c.Config["foo"]
return nil
}
input.InputReturnMap = map[string]string{
"provider.aws.foo": "bar",
}
if err := ctx.Input(InputModeStd); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-05 00:44:23 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Apply(); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !reflect.DeepEqual(actual, "bar") {
t.Fatalf("bad: %#v", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-14 03:01:32 +01:00
func TestContext2Input_providerOnly(t *testing.T) {
2015-02-12 00:22:03 +01:00
input := new(MockUIInput)
m := testModule(t, "input-provider-vars")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 03:01:32 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-12 00:22:03 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
2015-02-05 00:44:23 +01:00
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "us-west-2",
},
UIInput: input,
})
input.InputReturnMap = map[string]string{
"var.foo": "us-east-1",
}
var actual interface{}
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
c.Config["foo"] = "bar"
return c, nil
}
p.ConfigureFn = func(c *ResourceConfig) error {
actual = c.Config["foo"]
return nil
}
if err := ctx.Input(InputModeProvider); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if !reflect.DeepEqual(actual, "bar") {
t.Fatalf("bad: %#v", actual)
}
actualStr := strings.TrimSpace(state.String())
expectedStr := strings.TrimSpace(testTerraformInputProviderOnlyStr)
if actualStr != expectedStr {
t.Fatalf("bad: \n%s", actualStr)
2015-02-05 00:44:23 +01:00
}
}
2015-02-14 03:01:32 +01:00
func TestContext2Input_providerVars(t *testing.T) {
2015-02-12 00:22:03 +01:00
input := new(MockUIInput)
m := testModule(t, "input-provider-with-vars")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 03:01:32 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Variables: map[string]string{
"foo": "bar",
},
UIInput: input,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
input.InputReturnMap = map[string]string{
"var.foo": "bar",
}
var actual interface{}
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
c.Config["bar"] = "baz"
return c, nil
}
p.ConfigureFn = func(c *ResourceConfig) error {
actual, _ = c.Get("foo")
return nil
}
if err := ctx.Input(InputModeStd); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-05 00:44:23 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if !reflect.DeepEqual(actual, "bar") {
t.Fatalf("bad: %#v", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-14 03:01:32 +01:00
func TestContext2Input_varOnly(t *testing.T) {
2015-02-12 00:22:03 +01:00
input := new(MockUIInput)
m := testModule(t, "input-provider-vars")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-14 03:01:32 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Variables: map[string]string{
2015-02-12 00:22:03 +01:00
"foo": "us-west-2",
2015-02-05 00:44:23 +01:00
},
2015-02-12 00:22:03 +01:00
UIInput: input,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
input.InputReturnMap = map[string]string{
"var.foo": "us-east-1",
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
var actual interface{}
p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) {
c.Raw["foo"] = "bar"
return c, nil
}
p.ConfigureFn = func(c *ResourceConfig) error {
actual = c.Raw["foo"]
return nil
}
if err := ctx.Input(InputModeVar); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if reflect.DeepEqual(actual, "bar") {
t.Fatalf("bad: %#v", actual)
}
actualStr := strings.TrimSpace(state.String())
expectedStr := strings.TrimSpace(testTerraformInputVarOnlyStr)
if actualStr != expectedStr {
t.Fatalf("bad: \n%s", actualStr)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 23:46:22 +01:00
func TestContext2Apply(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-12 23:46:22 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := state.RootModule()
if len(mod.Resources) < 2 {
t.Fatalf("bad: %#v", mod.Resources)
}
actual := strings.TrimSpace(state.String())
2015-02-12 00:22:03 +01:00
expected := strings.TrimSpace(testTerraformApplyStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 04:41:44 +01:00
func TestContext2Apply_emptyModule(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-empty-module")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 04:41:44 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
actual = strings.Replace(actual, " ", "", -1)
expected := strings.TrimSpace(testTerraformApplyEmptyModuleStr)
if actual != expected {
t.Fatalf("bad: \n%s\nexpect:\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 18:09:26 +01:00
func TestContext2Apply_createBeforeDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good-create-before")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "abc",
},
},
},
},
},
},
}
2015-02-13 18:09:26 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-13 18:09:26 +01:00
if p, err := ctx.Plan(nil); err != nil {
2015-02-12 00:22:03 +01:00
t.Fatalf("err: %s", err)
2015-02-13 18:09:26 +01:00
} else {
t.Logf(p.String())
2015-02-12 00:22:03 +01:00
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
mod := state.RootModule()
if len(mod.Resources) != 1 {
2015-02-13 18:09:26 +01:00
t.Fatalf("bad: %s", state)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCreateBeforeStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Apply_createBeforeDestroyUpdate(t *testing.T) {
m := testModule(t, "apply-good-create-before-update")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "bar",
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: state,
})
if p, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
} else {
t.Logf(p.String())
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := state.RootModule()
if len(mod.Resources) != 1 {
t.Fatalf("bad: %s", state)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCreateBeforeUpdateStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
}
2015-02-13 04:42:45 +01:00
func TestContext2Apply_minimal(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-minimal")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 04:42:45 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyMinimalStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 04:42:45 +01:00
func TestContext2Apply_badDiff(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 04:42:45 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"newp": nil,
},
}, nil
}
if _, err := ctx.Apply(); err == nil {
t.Fatal("should error")
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 18:05:09 +01:00
func TestContext2Apply_cancel(t *testing.T) {
2015-02-12 00:22:03 +01:00
stopped := false
m := testModule(t, "apply-cancel")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-13 18:05:09 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(*InstanceInfo, *InstanceState, *InstanceDiff) (*InstanceState, error) {
if !stopped {
stopped = true
go ctx.Stop()
for {
if ctx.sh.Stopped() {
break
}
}
}
return &InstanceState{
ID: "foo",
Attributes: map[string]string{
"num": "2",
},
}, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
New: "bar",
},
},
}, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
// Start the Apply in a goroutine
stateCh := make(chan *State)
go func() {
state, err := ctx.Apply()
if err != nil {
panic(err)
}
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
stateCh <- state
}()
state := <-stateCh
mod := state.RootModule()
if len(mod.Resources) != 1 {
2015-02-13 18:05:09 +01:00
t.Fatalf("bad: %s", state.String())
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCancelStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Apply_compute(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-compute")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
ctx.variables = map[string]string{"value": "1"}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyComputeStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 05:03:44 +01:00
func TestContext2Apply_countDecrease(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-count-dec")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
"aws_instance.foo.1": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
"aws_instance.foo.2": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
},
},
},
}
2015-02-13 05:03:44 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCountDecStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
2015-02-13 05:06:42 +01:00
func TestContext2Apply_countDecreaseToOne(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-count-dec-one")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
},
"aws_instance.foo.1": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
"aws_instance.foo.2": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-13 05:06:42 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCountDecToOneStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-12 00:22:03 +01:00
2015-02-13 17:50:59 +01:00
func TestContext2Apply_countTainted(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-count-tainted")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
p.DiffFn = testDiffFn
s := &State{
Modules: []*ModuleState{
&ModuleState{
2015-02-12 00:22:03 +01:00
Path: rootModulePath,
2015-02-05 00:44:23 +01:00
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.foo.0": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
2015-02-12 00:22:03 +01:00
Tainted: []*InstanceState{
&InstanceState{
ID: "bar",
Attributes: map[string]string{
"foo": "foo",
"type": "aws_instance",
},
},
2015-02-05 00:44:23 +01:00
},
},
},
},
},
}
2015-02-13 17:50:59 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: s,
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCountTaintedStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 17:51:58 +01:00
func TestContext2Apply_countVariable(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-count-variable")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 17:51:58 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
2015-02-12 00:22:03 +01:00
"aws": testProviderFuncFixed(p),
2015-02-05 00:44:23 +01:00
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyCountVariableStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 17:51:58 +01:00
func TestContext2Apply_module(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-module")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 17:51:58 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyModuleStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Apply_moduleVarResourceCount(t *testing.T) {
m := testModule(t, "apply-module-var-resource-count")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Variables: map[string]string{
"count": "2",
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
}
ctx = testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Variables: map[string]string{
"count": "5",
},
})
if _, err := ctx.Plan(&PlanOpts{Destroy: true}); err != nil {
t.Fatalf("err: %s", err)
}
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
}
}
// GH-819
func TestContext2Apply_moduleBool(t *testing.T) {
m := testModule(t, "apply-module-bool")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyModuleBoolStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
}
func TestContext2Apply_multiProvider(t *testing.T) {
m := testModule(t, "apply-multi-provider")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
pDO := testProvider("do")
pDO.ApplyFn = testApplyFn
pDO.DiffFn = testDiffFn
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
"do": testProviderFuncFixed(pDO),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := state.RootModule()
if len(mod.Resources) < 2 {
t.Fatalf("bad: %#v", mod.Resources)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyMultiProviderStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
}
2015-02-13 17:51:58 +01:00
func TestContext2Apply_nilDiff(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 17:51:58 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return nil, nil
}
if _, err := ctx.Apply(); err == nil {
t.Fatal("should error")
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 18:49:29 +01:00
func TestContext2Apply_Provisioner_compute(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-compute")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
val, ok := c.Config["foo"]
if !ok || val != "computed_dynamical" {
t.Fatalf("bad value for foo: %v %#v", val, c)
}
return nil
}
2015-02-13 18:49:29 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
Variables: map[string]string{
"value": "1",
2015-02-05 00:44:23 +01:00
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Apply_provisionerCreateFail(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-fail-create")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(
info *InstanceInfo,
is *InstanceState,
id *InstanceDiff) (*InstanceState, error) {
is.ID = "foo"
return is, fmt.Errorf("error")
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should error")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerFailCreateStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 18:54:56 +01:00
func TestContext2Apply_provisionerCreateFailNoId(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-fail-create")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(
info *InstanceInfo,
is *InstanceState,
id *InstanceDiff) (*InstanceState, error) {
return nil, fmt.Errorf("error")
}
2015-02-13 18:54:56 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should error")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerFailCreateNoIdStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 18:54:56 +01:00
func TestContext2Apply_provisionerFail(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-fail")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
pr.ApplyFn = func(*InstanceState, *ResourceConfig) error {
return fmt.Errorf("EXPLOSION")
}
2015-02-13 18:54:56 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
Variables: map[string]string{
"value": "1",
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should error")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerFailStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 23:03:17 +01:00
func TestContext2Apply_provisionerFail_createBeforeDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-fail-create-before")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
pr.ApplyFn = func(*InstanceState, *ResourceConfig) error {
return fmt.Errorf("EXPLOSION")
}
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "abc",
},
},
},
},
},
},
}
2015-02-13 23:03:17 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-11 17:51:17 +01:00
if err == nil {
t.Fatal("should error")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerFailCreateBeforeDestroyStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
2015-02-05 00:44:23 +01:00
}
func TestContext2Apply_error_createBeforeDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-error-create-before")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "abc",
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(info *InstanceInfo, is *InstanceState, id *InstanceDiff) (*InstanceState, error) {
return nil, fmt.Errorf("error")
}
p.DiffFn = testDiffFn
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should have error")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyErrorCreateBeforeDestroyStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
t.Fatalf("bad: \n%s\n\nExpected:\n\n%s", actual, expected)
2015-02-05 00:44:23 +01:00
}
}
func TestContext2Apply_errorDestroy_createBeforeDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-error-create-before")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "abc",
},
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(info *InstanceInfo, is *InstanceState, id *InstanceDiff) (*InstanceState, error) {
// Fail the destroy!
if id.Destroy {
return is, fmt.Errorf("error")
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
// Create should work
is = &InstanceState{
ID: "foo",
}
return is, nil
}
p.DiffFn = testDiffFn
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should have error")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyErrorDestroyCreateBeforeDestroyStr)
if actual != expected {
t.Fatalf("bad: actual:\n%s\n\nexpected:\n%s", actual, expected)
}
}
2015-02-13 18:54:56 +01:00
func TestContext2Apply_provisionerResourceRef(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-resource-ref")
p := testProvider("aws")
pr := testProvisioner()
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
val, ok := c.Config["foo"]
if !ok || val != "2" {
t.Fatalf("bad value for foo: %v %#v", val, c)
}
return nil
2015-02-11 17:51:17 +01:00
}
2015-02-13 18:54:56 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
2015-02-11 17:51:17 +01:00
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerResourceRefStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
}
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
2015-02-05 00:44:23 +01:00
}
}
2015-02-23 23:56:02 +01:00
func TestContext2Apply_provisionerSelfRef(t *testing.T) {
m := testModule(t, "apply-provisioner-self-ref")
p := testProvider("aws")
pr := testProvisioner()
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
val, ok := c.Config["command"]
if !ok || val != "bar" {
t.Fatalf("bad value for command: %v %#v", val, c)
}
return nil
}
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerSelfRefStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
}
}
2015-02-24 00:02:26 +01:00
func TestContext2Apply_provisionerMultiSelfRef(t *testing.T) {
var lock sync.Mutex
commands := make([]string, 0, 5)
m := testModule(t, "apply-provisioner-multi-self-ref")
p := testProvider("aws")
pr := testProvisioner()
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
lock.Lock()
defer lock.Unlock()
val, ok := c.Config["command"]
if !ok {
t.Fatalf("bad value for command: %v %#v", val, c)
}
commands = append(commands, val.(string))
return nil
}
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
})
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerMultiSelfRefStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
}
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
}
// Verify our result
sort.Strings(commands)
expectedCommands := []string{"number 0", "number 1", "number 2"}
if !reflect.DeepEqual(commands, expectedCommands) {
t.Fatalf("bad: %#v", commands)
}
}
2015-02-12 00:22:03 +01:00
// Provisioner should NOT run on a diff, only create
func TestContext2Apply_Provisioner_Diff(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-diff")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
return nil
}
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerDiffStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
}
pr.ApplyCalled = false
// Change the state to force a diff
mod := state.RootModule()
mod.Resources["aws_instance.bar"].Primary.Attributes["foo"] = "baz"
// Re-create context with state
ctx = testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
State: state,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state2, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual = strings.TrimSpace(state2.String())
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
}
// Verify apply was NOT invoked
if pr.ApplyCalled {
t.Fatalf("provisioner invoked")
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 19:11:24 +01:00
func TestContext2Apply_outputDiffVars(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.baz": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
}
2015-02-13 19:11:24 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: s,
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
for k, ad := range d.Attributes {
if ad.NewComputed {
return nil, fmt.Errorf("%s: computed", k)
}
}
result := s.MergeDiff(d)
result.ID = "foo"
return result, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"foo": &ResourceAttrDiff{
NewComputed: true,
Type: DiffAttrOutput,
},
"bar": &ResourceAttrDiff{
New: "baz",
},
},
}, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 19:11:24 +01:00
func TestContext2Apply_Provisioner_ConnInfo(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-provisioner-conninfo")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
if s.Ephemeral.ConnInfo == nil {
t.Fatalf("ConnInfo not initialized")
}
result, _ := testApplyFn(info, s, d)
result.Ephemeral.ConnInfo = map[string]string{
"type": "ssh",
"host": "127.0.0.1",
"port": "22",
}
return result, nil
}
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
conn := rs.Ephemeral.ConnInfo
if conn["type"] != "telnet" {
t.Fatalf("Bad: %#v", conn)
}
if conn["host"] != "127.0.0.1" {
t.Fatalf("Bad: %#v", conn)
}
if conn["port"] != "2222" {
t.Fatalf("Bad: %#v", conn)
}
if conn["user"] != "superuser" {
t.Fatalf("Bad: %#v", conn)
}
if conn["pass"] != "test" {
t.Fatalf("Bad: %#v", conn)
}
return nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
2015-02-13 19:11:24 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
Variables: map[string]string{
"value": "1",
"pass": "test",
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyProvisionerStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
// Verify apply was invoked
if !pr.ApplyCalled {
t.Fatalf("provisioner not invoked")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-13 19:11:24 +01:00
func TestContext2Apply_destroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-destroy")
h := new(HookRecordApplyOrder)
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 19:11:24 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
2015-02-12 00:22:03 +01:00
Hooks: []Hook{h},
2015-02-05 00:44:23 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
// First plan and apply a create operation
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
}
// Next, plan and apply a destroy operation
if _, err := ctx.Plan(&PlanOpts{Destroy: true}); err != nil {
t.Fatalf("err: %s", err)
}
h.Active = true
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
// Test that things were destroyed
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyDestroyStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
}
// Test that things were destroyed _in the right order_
expected2 := []string{"aws_instance.bar", "aws_instance.foo"}
actual2 := h.IDs
if !reflect.DeepEqual(actual2, expected2) {
t.Fatalf("bad: %#v", actual2)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_destroyOutputs(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-destroy-outputs")
h := new(HookRecordApplyOrder)
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
2015-02-12 00:22:03 +01:00
Hooks: []Hook{h},
2015-02-05 00:44:23 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
// First plan and apply a create operation
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
// Next, plan and apply a destroy operation
if _, err := ctx.Plan(&PlanOpts{Destroy: true}); err != nil {
t.Fatalf("err: %s", err)
}
h.Active = true
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := state.RootModule()
if len(mod.Resources) > 0 {
t.Fatalf("bad: %#v", mod)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_destroyOrphan(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-error")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-11 17:51:17 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.baz": &ResourceState{
2015-02-11 17:51:17 +01:00
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
2015-02-05 00:44:23 +01:00
},
}
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-11 17:51:17 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
if d.Destroy {
return nil, nil
}
result := s.MergeDiff(d)
result.ID = "foo"
return result, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
New: "bar",
},
},
}, nil
}
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
mod := state.RootModule()
if _, ok := mod.Resources["aws_instance.baz"]; ok {
t.Fatalf("bad: %#v", mod.Resources)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_destroyTaintedProvisioner(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-destroy-provisioner")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
pr := testProvisioner()
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
called := false
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
called = true
return nil
}
2015-02-11 17:51:17 +01:00
s := &State{
Modules: []*ModuleState{
&ModuleState{
2015-02-12 00:22:03 +01:00
Path: rootModulePath,
2015-02-11 17:51:17 +01:00
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.foo": &ResourceState{
2015-02-11 17:51:17 +01:00
Type: "aws_instance",
2015-02-12 00:22:03 +01:00
Tainted: []*InstanceState{
&InstanceState{
ID: "bar",
Attributes: map[string]string{
"id": "bar",
},
},
2015-02-11 17:51:17 +01:00
},
},
},
},
2015-02-05 00:44:23 +01:00
},
}
2015-02-12 00:22:03 +01:00
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
Provisioners: map[string]ResourceProvisionerFactory{
"shell": testProvisionerFuncFixed(pr),
},
2015-02-11 17:51:17 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(&PlanOpts{Destroy: true}); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
if called {
t.Fatal("provisioner should not be called")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace("<no state>")
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_error(t *testing.T) {
2015-02-12 00:22:03 +01:00
errored := false
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-error")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(*InstanceInfo, *InstanceState, *InstanceDiff) (*InstanceState, error) {
if errored {
state := &InstanceState{
ID: "bar",
}
return state, fmt.Errorf("error")
}
errored = true
return &InstanceState{
ID: "foo",
Attributes: map[string]string{
"num": "2",
},
}, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
New: "bar",
},
},
}, nil
2015-02-05 00:44:23 +01:00
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should have error")
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyErrorStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_errorPartial(t *testing.T) {
2015-02-12 00:22:03 +01:00
errored := false
m := testModule(t, "apply-error")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-11 17:51:17 +01:00
s := &State{
2015-02-05 00:44:23 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-12 00:22:03 +01:00
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
2015-02-05 00:44:23 +01:00
Primary: &InstanceState{
2015-02-11 17:51:17 +01:00
ID: "bar",
2015-02-05 00:44:23 +01:00
},
},
},
},
},
}
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-11 17:51:17 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
if errored {
return s, fmt.Errorf("error")
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
errored = true
2015-02-05 00:44:23 +01:00
2015-02-12 00:22:03 +01:00
return &InstanceState{
ID: "foo",
Attributes: map[string]string{
"num": "2",
},
}, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
2015-02-11 17:51:17 +01:00
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
2015-02-12 00:22:03 +01:00
New: "bar",
2015-02-11 17:51:17 +01:00
},
},
}, nil
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err == nil {
t.Fatal("should have error")
}
mod := state.RootModule()
if len(mod.Resources) != 2 {
t.Fatalf("bad: %#v", mod.Resources)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyErrorPartialStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_hook(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-good")
2015-02-11 17:51:17 +01:00
h := new(MockHook)
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-05 00:44:23 +01:00
p.DiffFn = testDiffFn
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
2015-02-11 17:51:17 +01:00
Hooks: []Hook{h},
2015-02-05 00:44:23 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
if _, err := ctx.Apply(); err != nil {
t.Fatalf("err: %s", err)
}
if !h.PreApplyCalled {
2015-02-11 17:51:17 +01:00
t.Fatal("should be called")
}
2015-02-12 00:22:03 +01:00
if !h.PostApplyCalled {
2015-02-11 17:51:17 +01:00
t.Fatal("should be called")
}
if !h.PostStateUpdateCalled {
t.Fatalf("should call post state update")
}
2015-02-05 00:44:23 +01:00
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_idAttr(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-idattr")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-12 00:22:03 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
result := s.MergeDiff(d)
result.ID = "foo"
result.Attributes = map[string]string{
"id": "bar",
}
return result, nil
}
p.DiffFn = func(*InstanceInfo, *InstanceState, *ResourceConfig) (*InstanceDiff, error) {
return &InstanceDiff{
Attributes: map[string]*ResourceAttrDiff{
"num": &ResourceAttrDiff{
New: "bar",
2015-02-11 17:51:17 +01:00
},
},
2015-02-12 00:22:03 +01:00
}, nil
}
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
mod := state.RootModule()
rs, ok := mod.Resources["aws_instance.foo"]
if !ok {
t.Fatal("not in state")
}
if rs.Primary.ID != "foo" {
t.Fatalf("bad: %#v", rs.Primary.ID)
}
if rs.Primary.Attributes["id"] != "foo" {
t.Fatalf("bad: %#v", rs.Primary.Attributes)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_output(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-output")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-11 17:51:17 +01:00
if err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyOutputStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:13:39 +01:00
func TestContext2Apply_outputInvalid(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-output-invalid")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-13 21:13:39 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-12 00:22:03 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
2015-02-05 00:44:23 +01:00
},
2015-02-12 00:22:03 +01:00
})
_, err := ctx.Plan(nil)
if err == nil {
t.Fatalf("err: %s", err)
}
if !strings.Contains(err.Error(), "is not a string") {
t.Fatalf("err: %s", err)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-13 21:18:27 +01:00
func TestContext2Apply_outputList(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-output-list")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
2015-02-05 00:44:23 +01:00
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyOutputListStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:18:27 +01:00
func TestContext2Apply_outputMulti(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-output-multi")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyOutputMultiStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
2015-02-11 17:51:17 +01:00
}
2015-02-13 21:18:27 +01:00
func TestContext2Apply_outputMultiIndex(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-output-multi-index")
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-12 00:22:03 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyOutputMultiIndexStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:18:27 +01:00
func TestContext2Apply_taint(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-taint")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
s := &State{
2015-02-05 00:44:23 +01:00
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
2015-02-11 17:51:17 +01:00
"aws_instance.bar": &ResourceState{
2015-02-05 00:44:23 +01:00
Type: "aws_instance",
Tainted: []*InstanceState{
&InstanceState{
2015-02-11 17:51:17 +01:00
ID: "baz",
2015-02-12 00:22:03 +01:00
Attributes: map[string]string{
"num": "2",
"type": "aws_instance",
},
2015-02-05 00:44:23 +01:00
},
},
},
},
},
},
}
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-11 17:51:17 +01:00
State: s,
2015-02-05 00:44:23 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-12 00:22:03 +01:00
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyTaintStr)
2015-02-05 00:44:23 +01:00
if actual != expected {
2015-02-11 17:51:17 +01:00
t.Fatalf("bad:\n%s", actual)
2015-02-05 00:44:23 +01:00
}
}
2015-02-13 21:18:27 +01:00
func TestContext2Apply_unknownAttribute(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-unknown")
2015-02-05 00:44:23 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-12 00:22:03 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
})
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
state, err := ctx.Apply()
if err == nil {
t.Fatal("should error")
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyUnknownAttrStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
2015-02-11 17:51:17 +01:00
}
2015-02-12 00:22:03 +01:00
}
2015-02-11 17:51:17 +01:00
2015-02-13 21:18:27 +01:00
func TestContext2Apply_vars(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-vars")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-05 00:44:23 +01:00
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-11 17:51:17 +01:00
Variables: map[string]string{
2015-02-12 00:22:03 +01:00
"foo": "us-west-2",
"amis.us-east-1": "override",
2015-02-05 00:44:23 +01:00
},
})
2015-02-12 00:22:03 +01:00
w, e := ctx.Validate()
if len(w) > 0 {
t.Fatalf("bad: %#v", w)
}
if len(e) > 0 {
t.Fatalf("bad: %s", e)
}
2015-02-11 17:51:17 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyVarsStr)
if actual != expected {
t.Fatalf("bad: \n%s", actual)
2015-02-11 17:51:17 +01:00
}
}
2015-02-14 01:28:31 +01:00
func TestContext2Apply_createBefore_depends(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-depends-create-before")
h := new(HookRecordApplyOrder)
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
p.ApplyFn = testApplyFn
2015-02-11 17:51:17 +01:00
p.DiffFn = testDiffFn
2015-02-12 00:22:03 +01:00
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "ami-old",
},
},
},
"aws_instance.lb": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "baz",
Attributes: map[string]string{
"instance": "bar",
},
},
},
},
},
},
}
2015-02-14 01:28:31 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
2015-02-12 00:22:03 +01:00
Hooks: []Hook{h},
2015-02-11 17:51:17 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
}
h.Active = true
state, err := ctx.Apply()
2015-02-05 00:44:23 +01:00
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
mod := state.RootModule()
if len(mod.Resources) < 2 {
t.Fatalf("bad: %#v", mod.Resources)
}
actual := strings.TrimSpace(state.String())
expected := strings.TrimSpace(testTerraformApplyDependsCreateBeforeStr)
2015-02-11 17:51:17 +01:00
if actual != expected {
2015-02-12 00:22:03 +01:00
t.Fatalf("bad: \n%s\n%s", actual, expected)
}
// Test that things were managed _in the right order_
order := h.States
diffs := h.Diffs
if order[0].ID != "" || diffs[0].Destroy {
t.Fatalf("should create new instance first: %#v", order)
}
if order[1].ID != "baz" {
t.Fatalf("update must happen after create: %#v", order)
}
if order[2].ID != "bar" || !diffs[2].Destroy {
t.Fatalf("destroy must happen after update: %#v", order)
2015-02-05 00:44:23 +01:00
}
2015-02-11 17:51:17 +01:00
}
2015-02-05 00:44:23 +01:00
2015-02-13 21:18:27 +01:00
func TestContext2Apply_singleDestroy(t *testing.T) {
2015-02-12 00:22:03 +01:00
m := testModule(t, "apply-depends-create-before")
h := new(HookRecordApplyOrder)
2015-02-11 17:51:17 +01:00
p := testProvider("aws")
2015-02-12 00:22:03 +01:00
invokeCount := 0
p.ApplyFn = func(info *InstanceInfo, s *InstanceState, d *InstanceDiff) (*InstanceState, error) {
invokeCount++
switch invokeCount {
case 1:
if d.Destroy {
t.Fatalf("should not destroy")
}
if s.ID != "" {
t.Fatalf("should not have ID")
}
case 2:
if d.Destroy {
t.Fatalf("should not destroy")
}
if s.ID != "baz" {
t.Fatalf("should have id")
}
case 3:
if !d.Destroy {
t.Fatalf("should destroy")
}
if s.ID == "" {
t.Fatalf("should have ID")
}
default:
t.Fatalf("bad invoke count %d", invokeCount)
}
return testApplyFn(info, s, d)
}
p.DiffFn = testDiffFn
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"aws_instance.web": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "bar",
Attributes: map[string]string{
"require_new": "ami-old",
},
},
},
"aws_instance.lb": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "baz",
Attributes: map[string]string{
"instance": "bar",
},
},
},
},
},
},
}
2015-02-13 21:18:27 +01:00
ctx := testContext2(t, &ContextOpts{
2015-02-11 17:51:17 +01:00
Module: m,
2015-02-12 00:22:03 +01:00
Hooks: []Hook{h},
2015-02-11 17:51:17 +01:00
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
2015-02-12 00:22:03 +01:00
State: state,
2015-02-11 17:51:17 +01:00
})
2015-02-12 00:22:03 +01:00
if _, err := ctx.Plan(nil); err != nil {
t.Fatalf("err: %s", err)
2015-02-05 00:44:23 +01:00
}
2015-02-12 00:22:03 +01:00
h.Active = true
state, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
2015-02-11 17:51:17 +01:00
2015-02-12 00:22:03 +01:00
if invokeCount != 3 {
t.Fatalf("bad: %d", invokeCount)
}
}
2015-02-05 00:44:23 +01:00
func testContext2(t *testing.T, opts *ContextOpts) *Context {
return NewContext(opts)
2015-02-05 00:44:23 +01:00
}
2015-02-14 03:09:45 +01:00
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
`