165 lines
5.0 KiB
Go
165 lines
5.0 KiB
Go
package terraform
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestStateFilterFilter(t *testing.T) {
|
|
cases := map[string]struct {
|
|
State string
|
|
Filters []string
|
|
Expected []string
|
|
}{
|
|
"all": {
|
|
"small.tfstate",
|
|
[]string{},
|
|
[]string{
|
|
"*terraform.ResourceState: aws_key_pair.onprem",
|
|
"*terraform.InstanceState: aws_key_pair.onprem",
|
|
"*terraform.ModuleState: module.bootstrap",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-a",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-a",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-ns",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-ns",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
},
|
|
},
|
|
|
|
"single resource": {
|
|
"small.tfstate",
|
|
[]string{"aws_key_pair.onprem"},
|
|
[]string{
|
|
"*terraform.ResourceState: aws_key_pair.onprem",
|
|
"*terraform.InstanceState: aws_key_pair.onprem",
|
|
},
|
|
},
|
|
|
|
"single resource from minimal state": {
|
|
"single-minimal-resource.tfstate",
|
|
[]string{"aws_instance.web"},
|
|
[]string{
|
|
"*terraform.ResourceState: aws_instance.web",
|
|
"*terraform.InstanceState: aws_instance.web",
|
|
},
|
|
},
|
|
|
|
"single resource with similar names": {
|
|
"small_test_instance.tfstate",
|
|
[]string{"test_instance.foo"},
|
|
[]string{
|
|
"*terraform.ResourceState: test_instance.foo",
|
|
"*terraform.InstanceState: test_instance.foo",
|
|
},
|
|
},
|
|
|
|
"single instance": {
|
|
"small.tfstate",
|
|
[]string{"aws_key_pair.onprem.primary"},
|
|
[]string{
|
|
"*terraform.InstanceState: aws_key_pair.onprem",
|
|
},
|
|
},
|
|
|
|
"module filter": {
|
|
"complete.tfstate",
|
|
[]string{"module.bootstrap"},
|
|
[]string{
|
|
"*terraform.ModuleState: module.bootstrap",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-a",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-a",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-ns",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_record.oasis-consul-bootstrap-ns",
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
},
|
|
},
|
|
|
|
"resource in module": {
|
|
"complete.tfstate",
|
|
[]string{"module.bootstrap.aws_route53_zone.oasis-consul-bootstrap"},
|
|
[]string{
|
|
"*terraform.ResourceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
"*terraform.InstanceState: module.bootstrap.aws_route53_zone.oasis-consul-bootstrap",
|
|
},
|
|
},
|
|
|
|
"resource in module 2": {
|
|
"resource-in-module-2.tfstate",
|
|
[]string{"module.foo.aws_instance.foo"},
|
|
[]string{},
|
|
},
|
|
|
|
"single count index": {
|
|
"complete.tfstate",
|
|
[]string{"module.consul.aws_instance.consul-green[0]"},
|
|
[]string{
|
|
"*terraform.ResourceState: module.consul.aws_instance.consul-green[0]",
|
|
"*terraform.InstanceState: module.consul.aws_instance.consul-green[0]",
|
|
},
|
|
},
|
|
|
|
"no count index": {
|
|
"complete.tfstate",
|
|
[]string{"module.consul.aws_instance.consul-green"},
|
|
[]string{
|
|
"*terraform.ResourceState: module.consul.aws_instance.consul-green[0]",
|
|
"*terraform.InstanceState: module.consul.aws_instance.consul-green[0]",
|
|
"*terraform.ResourceState: module.consul.aws_instance.consul-green[1]",
|
|
"*terraform.InstanceState: module.consul.aws_instance.consul-green[1]",
|
|
"*terraform.ResourceState: module.consul.aws_instance.consul-green[2]",
|
|
"*terraform.InstanceState: module.consul.aws_instance.consul-green[2]",
|
|
},
|
|
},
|
|
|
|
"nested modules": {
|
|
"nested-modules.tfstate",
|
|
[]string{"module.outer"},
|
|
[]string{
|
|
"*terraform.ModuleState: module.outer",
|
|
"*terraform.ModuleState: module.outer.module.child1",
|
|
"*terraform.ResourceState: module.outer.module.child1.aws_instance.foo",
|
|
"*terraform.InstanceState: module.outer.module.child1.aws_instance.foo",
|
|
"*terraform.ModuleState: module.outer.module.child2",
|
|
"*terraform.ResourceState: module.outer.module.child2.aws_instance.foo",
|
|
"*terraform.InstanceState: module.outer.module.child2.aws_instance.foo",
|
|
},
|
|
},
|
|
}
|
|
|
|
for n, tc := range cases {
|
|
// Load our state
|
|
f, err := os.Open(filepath.Join("./test-fixtures", "state-filter", tc.State))
|
|
if err != nil {
|
|
t.Fatalf("%q: err: %s", n, err)
|
|
}
|
|
|
|
state, err := ReadState(f)
|
|
f.Close()
|
|
if err != nil {
|
|
t.Fatalf("%q: err: %s", n, err)
|
|
}
|
|
|
|
// Create the filter
|
|
filter := &StateFilter{State: state}
|
|
|
|
// Filter!
|
|
results, err := filter.Filter(tc.Filters...)
|
|
if err != nil {
|
|
t.Fatalf("%q: err: %s", n, err)
|
|
}
|
|
|
|
actual := make([]string, len(results))
|
|
for i, result := range results {
|
|
actual[i] = result.String()
|
|
}
|
|
|
|
if !reflect.DeepEqual(actual, tc.Expected) {
|
|
t.Fatalf("%q: expected, then actual\n\n%#v\n\n%#v", n, tc.Expected, actual)
|
|
}
|
|
}
|
|
}
|