mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
backend/local: Sort planned resource changes before rendering them
As in the old plan renderer, they are ordered by the natural ordering of the resource addresses.
This commit is contained in:
parent
04d8c17be8
commit
20318ca193
@ -5,6 +5,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/backend"
|
"github.com/hashicorp/terraform/backend"
|
||||||
@ -202,7 +203,21 @@ func (b *Local) renderPlan(plan *plans.Plan, schemas *terraform.Schemas) {
|
|||||||
|
|
||||||
b.CLI.Output("Terraform will perform the following actions:\n")
|
b.CLI.Output("Terraform will perform the following actions:\n")
|
||||||
|
|
||||||
for _, rcs := range plan.Changes.Resources {
|
// Note: we're modifying the backing slice of this plan object in-place
|
||||||
|
// here. The ordering of resource changes in a plan is not significant,
|
||||||
|
// but we can only do this safely here because we can assume that nobody
|
||||||
|
// is concurrently modifying our changes while we're trying to print it.
|
||||||
|
rChanges := plan.Changes.Resources
|
||||||
|
sort.Slice(rChanges, func(i, j int) bool {
|
||||||
|
iA := rChanges[i].Addr
|
||||||
|
jA := rChanges[j].Addr
|
||||||
|
if iA.String() == jA.String() {
|
||||||
|
return rChanges[i].DeposedKey < rChanges[j].DeposedKey
|
||||||
|
}
|
||||||
|
return iA.Less(jA)
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, rcs := range rChanges {
|
||||||
if rcs.Action == plans.NoOp {
|
if rcs.Action == plans.NoOp {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -229,13 +244,13 @@ func (b *Local) renderPlan(plan *plans.Plan, schemas *terraform.Schemas) {
|
|||||||
// - it considers only resource changes
|
// - it considers only resource changes
|
||||||
// - it simplifies "replace" into both a create and a delete
|
// - it simplifies "replace" into both a create and a delete
|
||||||
stats := map[plans.Action]int{}
|
stats := map[plans.Action]int{}
|
||||||
for _, change := range plan.Changes.Resources {
|
for _, change := range rChanges {
|
||||||
switch change.Action {
|
switch change.Action {
|
||||||
case plans.Replace:
|
case plans.Replace:
|
||||||
counts[plans.Create]++
|
stats[plans.Create]++
|
||||||
counts[plans.Delete]++
|
stats[plans.Delete]++
|
||||||
default:
|
default:
|
||||||
counts[change.Action]++
|
stats[change.Action]++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.CLI.Output(b.Colorize().Color(fmt.Sprintf(
|
b.CLI.Output(b.Colorize().Color(fmt.Sprintf(
|
||||||
|
Loading…
Reference in New Issue
Block a user