mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-25 08:21:07 -06:00
068b2b2dec
This adds a Meta field (similar to InstanceState.Meta) to InstanceDiff. This allows providers to store arbitrary k/v data as part of a diff and have it persist through to the Apply. This will be used by helper/schema for timeout storage being done by @catsby. The type here is `map[string]interface{}`. A couple notes: * **Not using `string`**: The Meta field of InstanceState is a string value. We've learned that forcing things to strings is bad. Let's just allow types. * **Primitives only**: Even though it is type `interface{}`, it must be able to cleanly pass the go-plugin RPC barrier as well as be encoded to a file as Gob. Given these constraints, the value must only comprise of primitive types and collections. No structs, functions, channels, etc.
78 lines
1.5 KiB
Go
78 lines
1.5 KiB
Go
package terraform
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
|
|
"testing"
|
|
)
|
|
|
|
func TestReadWritePlan(t *testing.T) {
|
|
plan := &Plan{
|
|
Module: testModule(t, "new-good"),
|
|
Diff: &Diff{
|
|
Modules: []*ModuleDiff{
|
|
&ModuleDiff{
|
|
Path: rootModulePath,
|
|
Resources: map[string]*InstanceDiff{
|
|
"nodeA": &InstanceDiff{
|
|
Attributes: map[string]*ResourceAttrDiff{
|
|
"foo": &ResourceAttrDiff{
|
|
Old: "foo",
|
|
New: "bar",
|
|
},
|
|
"bar": &ResourceAttrDiff{
|
|
Old: "foo",
|
|
NewComputed: true,
|
|
},
|
|
"longfoo": &ResourceAttrDiff{
|
|
Old: "foo",
|
|
New: "bar",
|
|
RequiresNew: true,
|
|
},
|
|
},
|
|
|
|
Meta: map[string]interface{}{
|
|
"foo": []interface{}{1, 2, 3},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
State: &State{
|
|
Modules: []*ModuleState{
|
|
&ModuleState{
|
|
Path: rootModulePath,
|
|
Resources: map[string]*ResourceState{
|
|
"foo": &ResourceState{
|
|
Primary: &InstanceState{
|
|
ID: "bar",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Vars: map[string]interface{}{
|
|
"foo": "bar",
|
|
},
|
|
}
|
|
|
|
buf := new(bytes.Buffer)
|
|
if err := WritePlan(plan, buf); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
actual, err := ReadPlan(buf)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
actualStr := strings.TrimSpace(actual.String())
|
|
expectedStr := strings.TrimSpace(plan.String())
|
|
if actualStr != expectedStr {
|
|
t.Fatalf("bad:\n\n%s\n\nexpected:\n\n%s", actualStr, expectedStr)
|
|
}
|
|
}
|