Skip to content

Commit

Permalink
refactor: process each changes instead of plan
Browse files Browse the repository at this point in the history
  • Loading branch information
takaishi committed Jul 27, 2023
1 parent 6be1ede commit d5c8f1f
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 123 deletions.
19 changes: 1 addition & 18 deletions internal/format/format_json.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,10 @@ package format

import (
"encoding/json"
"errors"
tfjson "github.com/hashicorp/terraform-json"
)

func FormatJsonPlan(plan *tfjson.Plan) (*tfjson.Plan, error) {
var err error
if plan == nil {
return nil, errors.New("nil plan supplied")
}

for i := range plan.ResourceChanges {
plan.ResourceChanges[i].Change, err = formatJsonChange(plan.ResourceChanges[i].Change)
if err != nil {
return nil, err
}
}

return plan, nil
}

func formatJsonChange(change *tfjson.Change) (*tfjson.Change, error) {
func FormatJsonChange(change *tfjson.Change) (*tfjson.Change, error) {
var err error

change.Before, err = formatJsonChangeValue(change.Before)
Expand Down
19 changes: 1 addition & 18 deletions internal/format/format_unknown.go
Original file line number Diff line number Diff line change
@@ -1,27 +1,10 @@
package format

import (
"errors"
tfjson "github.com/hashicorp/terraform-json"
)

func FormatUnknownPlan(plan *tfjson.Plan) (*tfjson.Plan, error) {
var err error
if plan == nil {
return nil, errors.New("nil plan supplied")
}

for i := range plan.ResourceChanges {
plan.ResourceChanges[i].Change, err = formatUnknownChange(plan.ResourceChanges[i].Change)
if err != nil {
return nil, err
}
}

return plan, nil
}

func formatUnknownChange(change *tfjson.Change) (*tfjson.Change, error) {
func FormatUnknownChange(change *tfjson.Change) (*tfjson.Change, error) {
if change.Actions.Update() {
for k, v := range change.AfterUnknown.(map[string]interface{}) {
switch v.(type) {
Expand Down
39 changes: 26 additions & 13 deletions internal/terraform/plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,30 +143,43 @@ func (plan *PlanData) Render(w io.Writer, escapeHTML bool) error {
return nil
}

func processPlan(plan *tfjson.Plan) (*tfjson.Plan, error) {
var err error

for i := range plan.ResourceChanges {
plan.ResourceChanges[i].Change, err = sanitize.SanitizeChange(plan.ResourceChanges[i].Change, sanitize.DefaultSensitiveValue)
if err != nil {
return nil, fmt.Errorf("failed to sanitize plan: %w", err)
}

plan.ResourceChanges[i].Change, err = format.FormatJsonChange(plan.ResourceChanges[i].Change)
if err != nil {
return nil, fmt.Errorf("failed to prettify plan: %w", err)
}

plan.ResourceChanges[i].Change, err = format.FormatUnknownChange(plan.ResourceChanges[i].Change)
if err != nil {
return nil, fmt.Errorf("failed to prettify plan: %w", err)
}
}

return plan, nil
}

func NewPlanData(input io.Reader) (*PlanData, error) {
var err error
var plan tfjson.Plan
if err := json.NewDecoder(input).Decode(&plan); err != nil {
return nil, fmt.Errorf("cannot parse input: %w", err)
}

sanitizedPlan, err := sanitize.SanitizePlan(&plan)
if err != nil {
return nil, fmt.Errorf("failed to sanitize plan: %w", err)
}

formattedJsonPlan, err := format.FormatJsonPlan(sanitizedPlan)
processedPlan, err := processPlan(&plan)
if err != nil {
return nil, fmt.Errorf("failed to prettify plan: %w", err)
}

formattedUnknownPlan, err := format.FormatUnknownPlan(formattedJsonPlan)
if err != nil {
return nil, fmt.Errorf("failed to prettify plan: %w", err)
return nil, err
}

planData := PlanData{}
for _, c := range formattedUnknownPlan.ResourceChanges {
for _, c := range processedPlan.ResourceChanges {
if c.Change.Actions.NoOp() || c.Change.Actions.Read() {
continue
}
Expand Down
56 changes: 16 additions & 40 deletions test/format_json_test/format_json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,80 +9,56 @@ import (

func TestFormatJsonPlan(t *testing.T) {
type args struct {
old *tfjson.Plan
old *tfjson.Change
}
tests := []struct {
name string
args args
want *tfjson.Plan
want *tfjson.Change
wantErr bool
}{
{
name: "plain string",
args: args{
old: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Before: "plain string",
After: "plain string",
},
},
},
old: &tfjson.Change{
Before: "plain string",
After: "plain string",
},
},
want: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Before: "plain string",
After: "plain string",
},
},
},
want: &tfjson.Change{
Before: "plain string",
After: "plain string",
},
wantErr: false,
},
{
name: "json string",
args: args{
old: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Before: `{"foo":"bar"}`,
After: `{"foo":"bar"}`,
},
},
},
old: &tfjson.Change{
Before: `{"foo":"bar"}`,
After: `{"foo":"bar"}`,
},
},
want: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Before: `{
want: &tfjson.Change{
Before: `{
"foo": "bar"
}`,
After: `{
After: `{
"foo": "bar"
}`,
},
},
},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := format.FormatJsonPlan(tt.args.old)
got, err := format.FormatJsonChange(tt.args.old)
if (err != nil) != tt.wantErr {
t.Errorf("FormatJsonPlan() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("FormatJsonPlan() got = \n%v\n, want \n%v", got.ResourceChanges[0].Change.After, tt.want.ResourceChanges[0].Change.After)
t.Errorf("FormatJsonPlan() got = \n%v\n, want \n%v", got.After, tt.want.After)
}
})
}
Expand Down
56 changes: 22 additions & 34 deletions test/format_json_test/format_unknown_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,52 @@ import (

func TestFormatUnknownPlan(t *testing.T) {
type args struct {
old *tfjson.Plan
old *tfjson.Change
}
tests := []struct {
name string
args args
want *tfjson.Plan
want *tfjson.Change
wantErr bool
}{
{
name: "plain string",
args: args{
old: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionUpdate},
Before: map[string]interface{}{
"foo": "bar",
},
After: map[string]interface{}{},
AfterUnknown: map[string]interface{}{
"foo": true,
},
},
},
old: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionUpdate},
Before: map[string]interface{}{
"foo": "bar",
},
After: map[string]interface{}{},
AfterUnknown: map[string]interface{}{
"foo": true,
},
},
},
want: &tfjson.Plan{
ResourceChanges: []*tfjson.ResourceChange{
{
Change: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionUpdate},
Before: map[string]interface{}{
"foo": "bar",
},
After: map[string]interface{}{
"foo": "(known after apply)",
},
AfterUnknown: map[string]interface{}{
"foo": true,
},
},
},
want: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionUpdate},
Before: map[string]interface{}{
"foo": "bar",
},
After: map[string]interface{}{
"foo": "(known after apply)",
},
AfterUnknown: map[string]interface{}{
"foo": true,
},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := format.FormatUnknownPlan(tt.args.old)
got, err := format.FormatUnknownChange(tt.args.old)
if (err != nil) != tt.wantErr {
t.Errorf("FormatJsonPlan() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("FormatJsonPlan() got = \n%v\n, want \n%v", got.ResourceChanges[0].Change.After, tt.want.ResourceChanges[0].Change.After)
t.Errorf("FormatJsonPlan() got = \n%v\n, want \n%v", got.After, tt.want.After)
}
})
}
Expand Down

0 comments on commit d5c8f1f

Please sign in to comment.