mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Remove outputs from the jsonplan that are not from the root module (#32503)
This commit is contained in:
parent
c125397da1
commit
af0ff90d6e
@ -437,6 +437,15 @@ func (p *plan) marshalOutputChanges(changes *plans.Changes) error {
|
|||||||
|
|
||||||
p.OutputChanges = make(map[string]Change, len(changes.Outputs))
|
p.OutputChanges = make(map[string]Change, len(changes.Outputs))
|
||||||
for _, oc := range changes.Outputs {
|
for _, oc := range changes.Outputs {
|
||||||
|
|
||||||
|
// Skip output changes that are not from the root module.
|
||||||
|
// These are automatically stripped from plans that are written to disk
|
||||||
|
// elsewhere, we just need to duplicate the logic here in case anyone
|
||||||
|
// is converting this plan directly from memory.
|
||||||
|
if !oc.Addr.Module.IsRoot() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
changeV, err := oc.Decode()
|
changeV, err := oc.Decode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -7,6 +7,9 @@ import (
|
|||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/internal/addrs"
|
||||||
|
"github.com/hashicorp/terraform/internal/plans"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOmitUnknowns(t *testing.T) {
|
func TestOmitUnknowns(t *testing.T) {
|
||||||
@ -318,6 +321,99 @@ func TestEncodePaths(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOutputs(t *testing.T) {
|
||||||
|
root := addrs.RootModuleInstance
|
||||||
|
|
||||||
|
child, diags := addrs.ParseModuleInstanceStr("module.child")
|
||||||
|
if diags.HasErrors() {
|
||||||
|
t.Fatalf("unexpected errors: %s", diags.Err())
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := map[string]struct {
|
||||||
|
changes *plans.Changes
|
||||||
|
expected map[string]Change
|
||||||
|
}{
|
||||||
|
"copies all outputs": {
|
||||||
|
changes: &plans.Changes{
|
||||||
|
Outputs: []*plans.OutputChangeSrc{
|
||||||
|
{
|
||||||
|
Addr: root.OutputValue("first"),
|
||||||
|
ChangeSrc: plans.ChangeSrc{
|
||||||
|
Action: plans.Create,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Addr: root.OutputValue("second"),
|
||||||
|
ChangeSrc: plans.ChangeSrc{
|
||||||
|
Action: plans.Create,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: map[string]Change{
|
||||||
|
"first": {
|
||||||
|
Actions: []string{"create"},
|
||||||
|
Before: json.RawMessage("null"),
|
||||||
|
After: json.RawMessage("null"),
|
||||||
|
AfterUnknown: json.RawMessage("false"),
|
||||||
|
BeforeSensitive: json.RawMessage("false"),
|
||||||
|
AfterSensitive: json.RawMessage("false"),
|
||||||
|
},
|
||||||
|
"second": {
|
||||||
|
Actions: []string{"create"},
|
||||||
|
Before: json.RawMessage("null"),
|
||||||
|
After: json.RawMessage("null"),
|
||||||
|
AfterUnknown: json.RawMessage("false"),
|
||||||
|
BeforeSensitive: json.RawMessage("false"),
|
||||||
|
AfterSensitive: json.RawMessage("false"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"skips non root modules": {
|
||||||
|
changes: &plans.Changes{
|
||||||
|
Outputs: []*plans.OutputChangeSrc{
|
||||||
|
{
|
||||||
|
Addr: root.OutputValue("first"),
|
||||||
|
ChangeSrc: plans.ChangeSrc{
|
||||||
|
Action: plans.Create,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Addr: child.OutputValue("second"),
|
||||||
|
ChangeSrc: plans.ChangeSrc{
|
||||||
|
Action: plans.Create,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: map[string]Change{
|
||||||
|
"first": {
|
||||||
|
Actions: []string{"create"},
|
||||||
|
Before: json.RawMessage("null"),
|
||||||
|
After: json.RawMessage("null"),
|
||||||
|
AfterUnknown: json.RawMessage("false"),
|
||||||
|
BeforeSensitive: json.RawMessage("false"),
|
||||||
|
AfterSensitive: json.RawMessage("false"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for name, test := range tests {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
p := newPlan()
|
||||||
|
|
||||||
|
err := p.marshalOutputChanges(test.changes)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !cmp.Equal(p.OutputChanges, test.expected) {
|
||||||
|
t.Errorf("wrong result:\n %v\n", cmp.Diff(p.OutputChanges, test.expected))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func deepObjectValue(depth int) cty.Value {
|
func deepObjectValue(depth int) cty.Value {
|
||||||
v := cty.ObjectVal(map[string]cty.Value{
|
v := cty.ObjectVal(map[string]cty.Value{
|
||||||
"a": cty.StringVal("a"),
|
"a": cty.StringVal("a"),
|
||||||
|
Loading…
Reference in New Issue
Block a user