terraform/terraform/state_add_test.go

661 lines
12 KiB
Go
Raw Normal View History

package terraform
import (
2016-11-22 00:13:15 +01:00
"fmt"
"testing"
)
func TestStateAdd(t *testing.T) {
2016-11-22 00:13:15 +01:00
cases := []struct {
Name string
Err bool
2016-04-12 18:46:16 +02:00
From, To string
Value interface{}
One, Two *State
}{
2016-11-22 00:13:15 +01:00
{
"ModuleState => Module Addr (new)",
false,
2016-04-12 18:46:16 +02:00
"",
"module.foo",
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ModuleState => Nested Module Addr (new)",
false,
"",
"module.foo.module.bar",
&ModuleState{
Path: rootModulePath,
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo", "bar"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ModuleState w/ outputs and deps => Module Addr (new)",
false,
2016-04-12 18:46:16 +02:00
"",
"module.foo",
&ModuleState{
Path: rootModulePath,
Outputs: map[string]*OutputState{
"foo": &OutputState{
Type: "string",
Sensitive: false,
Value: "bar",
},
},
Dependencies: []string{"foo"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
Outputs: map[string]*OutputState{
"foo": &OutputState{
Type: "string",
Sensitive: false,
Value: "bar",
},
},
Dependencies: []string{"foo"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"test_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ModuleState => Module Addr (existing)",
true,
2016-04-12 18:46:16 +02:00
"",
"module.foo",
&ModuleState{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
Resources: map[string]*ResourceState{
"test_instance.baz": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
nil,
},
2016-04-12 03:22:11 +02:00
2016-11-22 00:13:15 +01:00
{
"ModuleState with children => Module Addr (new)",
2016-08-18 21:05:42 +02:00
false,
"module.foo",
"module.bar",
[]*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
2016-08-18 21:05:42 +02:00
Resources: map[string]*ResourceState{},
},
&ModuleState{
Path: []string{"root", "foo", "child1"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
&ModuleState{
Path: []string{"root", "foo", "child2"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
// Should be ignored
&ModuleState{
Path: []string{"root", "baz", "child2"},
2016-08-18 21:05:42 +02:00
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "bar"},
Resources: map[string]*ResourceState{},
},
2016-08-18 21:05:42 +02:00
&ModuleState{
Path: []string{"root", "bar", "child1"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
&ModuleState{
Path: []string{"root", "bar", "child2"},
Resources: map[string]*ResourceState{
"test_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState => Resource Addr (new)",
2016-04-12 03:22:11 +02:00
false,
2016-04-12 18:46:16 +02:00
"aws_instance.bar",
2016-04-12 03:22:11 +02:00
"aws_instance.foo",
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState w/ deps, provider => Resource Addr (new)",
false,
2016-04-12 18:46:16 +02:00
"aws_instance.bar",
"aws_instance.foo",
&ResourceState{
Type: "test_instance",
Provider: "foo",
Dependencies: []string{"bar"},
Primary: &InstanceState{
ID: "foo",
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "test_instance",
Provider: "foo",
Dependencies: []string{"bar"},
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState tainted => Resource Addr (new)",
2016-04-12 03:41:48 +02:00
false,
2016-04-12 18:46:16 +02:00
"aws_instance.bar",
2016-04-12 03:41:48 +02:00
"aws_instance.foo",
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
Tainted: true,
2016-04-12 03:41:48 +02:00
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
Tainted: true,
2016-04-12 03:41:48 +02:00
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState with count unspecified => Resource Addr (new)",
false,
"aws_instance.bar",
"aws_instance.foo",
[]*ResourceState{
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
"aws_instance.foo.1": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState with count unspecified => Resource Addr (new with count)",
true,
"aws_instance.bar",
"aws_instance.foo[0]",
[]*ResourceState{
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "bar",
},
},
},
&State{},
nil,
},
2016-11-22 00:13:15 +01:00
{
"ResourceState with single count unspecified => Resource Addr (new with count)",
false,
"aws_instance.bar",
"aws_instance.foo[0]",
[]*ResourceState{
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState => Resource Addr (new with count)",
false,
"aws_instance.bar",
"aws_instance.foo[0]",
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo.0": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-11-22 00:13:15 +01:00
{
"ResourceState => Resource Addr (existing)",
true,
2016-04-12 18:46:16 +02:00
"aws_instance.bar",
"aws_instance.foo",
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
nil,
},
2016-04-12 18:46:16 +02:00
2016-11-22 00:13:15 +01:00
{
"ResourceState => Module (new)",
2016-04-12 18:46:16 +02:00
false,
"aws_instance.bar",
"module.foo",
&ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "test_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-04-12 18:51:43 +02:00
2016-11-22 00:13:15 +01:00
{
"InstanceState => Resource (new)",
2016-04-12 18:51:43 +02:00
false,
"aws_instance.bar.primary",
"aws_instance.baz",
&InstanceState{
ID: "foo",
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root"},
Resources: map[string]*ResourceState{
"aws_instance.baz": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
2016-04-12 18:55:17 +02:00
2016-11-22 00:13:15 +01:00
{
"InstanceState => Module (new)",
2016-04-12 18:55:17 +02:00
false,
"aws_instance.bar.primary",
"module.foo",
&InstanceState{
ID: "foo",
},
&State{},
&State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "foo"},
Resources: map[string]*ResourceState{
"aws_instance.bar": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
},
},
}
2016-11-22 00:13:15 +01:00
for i, tc := range cases {
t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
// Make sure they're both initialized as normal
tc.One.init()
if tc.Two != nil {
tc.Two.init()
}
// Add the value
err := tc.One.Add(tc.From, tc.To, tc.Value)
if (err != nil) != tc.Err {
t.Fatal(err)
}
if tc.Err {
return
}
// Prune them both to be sure
tc.One.prune()
tc.Two.prune()
// Verify equality
if !tc.One.Equal(tc.Two) {
//t.Fatalf("Bad: %s\n\n%#v\n\n%#v", k, tc.One, tc.Two)
t.Fatalf("Bad: \n\n%s\n\n%s", tc.One.String(), tc.Two.String())
}
})
}
}