terraform: don't prune if there are known tainted resources

This commit is contained in:
Mitchell Hashimoto 2015-02-16 11:08:30 -08:00
parent 8d2ed22e97
commit 9c14315336
2 changed files with 24 additions and 2 deletions

View File

@ -105,7 +105,7 @@ func (b *BuiltinGraphBuilder) Steps() []GraphTransformer {
// Create the destruction nodes // Create the destruction nodes
&DestroyTransformer{}, &DestroyTransformer{},
&CreateBeforeDestroyTransformer{}, &CreateBeforeDestroyTransformer{},
&PruneDestroyTransformer{Diff: b.Diff}, //&PruneDestroyTransformer{Diff: b.Diff, State: b.State},
// Make sure we create one root // Make sure we create one root
&RootTransformer{}, &RootTransformer{},

View File

@ -172,14 +172,19 @@ func (t *CreateBeforeDestroyTransformer) Transform(g *Graph) error {
// PruneDestroyTransformer is a GraphTransformer that removes the destroy // PruneDestroyTransformer is a GraphTransformer that removes the destroy
// nodes that aren't in the diff. // nodes that aren't in the diff.
type PruneDestroyTransformer struct { type PruneDestroyTransformer struct {
Diff *Diff Diff *Diff
State *State
} }
func (t *PruneDestroyTransformer) Transform(g *Graph) error { func (t *PruneDestroyTransformer) Transform(g *Graph) error {
var modDiff *ModuleDiff var modDiff *ModuleDiff
var modState *ModuleState
if t.Diff != nil { if t.Diff != nil {
modDiff = t.Diff.ModuleByPath(g.Path) modDiff = t.Diff.ModuleByPath(g.Path)
} }
if t.State != nil {
modState = t.State.ModuleByPath(g.Path)
}
for _, v := range g.Vertices() { for _, v := range g.Vertices() {
// If it is not a destroyer, we don't care // If it is not a destroyer, we don't care
@ -194,7 +199,10 @@ func (t *PruneDestroyTransformer) Transform(g *Graph) error {
continue continue
} }
// Assume we're removing it
remove := true remove := true
// We don't remove it if we find it in the diff
if modDiff != nil { if modDiff != nil {
for k, _ := range modDiff.Resources { for k, _ := range modDiff.Resources {
if strings.HasPrefix(k, prefix) { if strings.HasPrefix(k, prefix) {
@ -204,6 +212,20 @@ func (t *PruneDestroyTransformer) Transform(g *Graph) error {
} }
} }
// We don't remove it if we find a tainted resource
if modState != nil {
for k, v := range modState.Resources {
if !strings.HasPrefix(k, prefix) {
continue
}
if len(v.Tainted) > 0 {
remove = false
break
}
}
}
// Remove the node if we have to // Remove the node if we have to
if remove { if remove {
g.Remove(v) g.Remove(v)