core: fix crash on provider warning
When a provider validation only returns a warning, we were cutting the evaltree short by returning an error. This is fine during a `walkValidate` but was causing trouble during `walkPlan` and `walkApply`. fixes #2870
This commit is contained in:
parent
b6b3626f90
commit
5ebbda3334
|
@ -78,6 +78,46 @@ func TestContext2Apply_providerAlias(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GH-2870
|
||||||
|
func TestContext2Apply_providerWarning(t *testing.T) {
|
||||||
|
m := testModule(t, "apply-provider-warning")
|
||||||
|
p := testProvider("aws")
|
||||||
|
p.ApplyFn = testApplyFn
|
||||||
|
p.DiffFn = testDiffFn
|
||||||
|
p.ValidateFn = func(c *ResourceConfig) (ws []string, es []error) {
|
||||||
|
ws = append(ws, "Just a warning")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Module: m,
|
||||||
|
Providers: map[string]ResourceProviderFactory{
|
||||||
|
"aws": testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if _, err := ctx.Plan(); 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(`
|
||||||
|
aws_instance.foo:
|
||||||
|
ID = foo
|
||||||
|
`)
|
||||||
|
if actual != expected {
|
||||||
|
t.Fatalf("got: \n%s\n\nexpected:\n%s", actual, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !p.ConfigureCalled {
|
||||||
|
t.Fatalf("provider Configure() was never called!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestContext2Apply_emptyModule(t *testing.T) {
|
func TestContext2Apply_emptyModule(t *testing.T) {
|
||||||
m := testModule(t, "apply-empty-module")
|
m := testModule(t, "apply-empty-module")
|
||||||
p := testProvider("aws")
|
p := testProvider("aws")
|
||||||
|
|
|
@ -40,9 +40,8 @@ func ProviderEvalTree(n string, config *config.RawConfig) EvalNode {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// Apply stuff
|
|
||||||
seq = append(seq, &EvalOpFilter{
|
seq = append(seq, &EvalOpFilter{
|
||||||
Ops: []walkOperation{walkValidate, walkRefresh, walkPlan, walkApply},
|
Ops: []walkOperation{walkValidate},
|
||||||
Node: &EvalSequence{
|
Node: &EvalSequence{
|
||||||
Nodes: []EvalNode{
|
Nodes: []EvalNode{
|
||||||
&EvalGetProvider{
|
&EvalGetProvider{
|
||||||
|
@ -70,6 +69,32 @@ func ProviderEvalTree(n string, config *config.RawConfig) EvalNode {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Apply stuff
|
||||||
|
seq = append(seq, &EvalOpFilter{
|
||||||
|
Ops: []walkOperation{walkRefresh, walkPlan, walkApply},
|
||||||
|
Node: &EvalSequence{
|
||||||
|
Nodes: []EvalNode{
|
||||||
|
&EvalGetProvider{
|
||||||
|
Name: n,
|
||||||
|
Output: &provider,
|
||||||
|
},
|
||||||
|
&EvalInterpolate{
|
||||||
|
Config: config,
|
||||||
|
Output: &resourceConfig,
|
||||||
|
},
|
||||||
|
&EvalBuildProviderConfig{
|
||||||
|
Provider: n,
|
||||||
|
Config: &resourceConfig,
|
||||||
|
Output: &resourceConfig,
|
||||||
|
},
|
||||||
|
&EvalSetProviderConfig{
|
||||||
|
Provider: n,
|
||||||
|
Config: &resourceConfig,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
// We configure on everything but validate, since validate may
|
// We configure on everything but validate, since validate may
|
||||||
// not have access to all the variables.
|
// not have access to all the variables.
|
||||||
seq = append(seq, &EvalOpFilter{
|
seq = append(seq, &EvalOpFilter{
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
resource "aws_instance" "foo" {}
|
Loading…
Reference in New Issue