terraform: don't execute provisioners on destroy
This commit is contained in:
parent
b2d674b431
commit
f03ab178bf
|
@ -11,6 +11,7 @@ BUG FIXES:
|
||||||
marked as tainted. [GH-434]
|
marked as tainted. [GH-434]
|
||||||
* core: Set types are validated to be sets. [GH-413]
|
* core: Set types are validated to be sets. [GH-413]
|
||||||
* core: Fix crash case when destroying with tainted resources. [GH-412]
|
* core: Fix crash case when destroying with tainted resources. [GH-412]
|
||||||
|
* core: Don't execute provisioners in some cases on destroy.
|
||||||
* providers/aws: Refresh of launch configs and autoscale groups load
|
* providers/aws: Refresh of launch configs and autoscale groups load
|
||||||
the correct data and don't incorrectly recreate themselves. [GH-425]
|
the correct data and don't incorrectly recreate themselves. [GH-425]
|
||||||
* providers/aws: Fix case where ELB would incorrectly plan to modify
|
* providers/aws: Fix case where ELB would incorrectly plan to modify
|
||||||
|
|
|
@ -700,7 +700,7 @@ func (c *walkContext) applyWalkFn() depgraph.WalkFunc {
|
||||||
// We create a new instance if there was no ID
|
// We create a new instance if there was no ID
|
||||||
// previously or the diff requires re-creating the
|
// previously or the diff requires re-creating the
|
||||||
// underlying instance
|
// underlying instance
|
||||||
createNew := is.ID == "" || diff.RequiresNew()
|
createNew := (is.ID == "" && !diff.Destroy) || diff.RequiresNew()
|
||||||
|
|
||||||
// With the completed diff, apply!
|
// With the completed diff, apply!
|
||||||
log.Printf("[DEBUG] %s: Executing Apply", r.Id)
|
log.Printf("[DEBUG] %s: Executing Apply", r.Id)
|
||||||
|
|
|
@ -2067,6 +2067,71 @@ func TestContextApply_destroyOrphan(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContextApply_destroyTaintedProvisioner(t *testing.T) {
|
||||||
|
m := testModule(t, "apply-destroy-provisioner")
|
||||||
|
p := testProvider("aws")
|
||||||
|
pr := testProvisioner()
|
||||||
|
p.ApplyFn = testApplyFn
|
||||||
|
p.DiffFn = testDiffFn
|
||||||
|
|
||||||
|
called := false
|
||||||
|
pr.ApplyFn = func(rs *InstanceState, c *ResourceConfig) error {
|
||||||
|
called = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"aws_instance.foo": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Tainted: []*InstanceState{
|
||||||
|
&InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"id": "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := testContext(t, &ContextOpts{
|
||||||
|
Module: m,
|
||||||
|
Providers: map[string]ResourceProviderFactory{
|
||||||
|
"aws": testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
Provisioners: map[string]ResourceProvisionerFactory{
|
||||||
|
"shell": testProvisionerFuncFixed(pr),
|
||||||
|
},
|
||||||
|
State: s,
|
||||||
|
})
|
||||||
|
|
||||||
|
if _, err := ctx.Plan(&PlanOpts{Destroy: true}); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
state, err := ctx.Apply()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if called {
|
||||||
|
t.Fatal("provisioner should not be called")
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := strings.TrimSpace(state.String())
|
||||||
|
expected := strings.TrimSpace("<no state>")
|
||||||
|
if actual != expected {
|
||||||
|
t.Fatalf("bad: \n%s", actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestContextApply_error(t *testing.T) {
|
func TestContextApply_error(t *testing.T) {
|
||||||
errored := false
|
errored := false
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
resource "aws_instance" "foo" {
|
||||||
|
id = "foo"
|
||||||
|
|
||||||
|
provisioner "shell" {}
|
||||||
|
}
|
Loading…
Reference in New Issue