From bd0f23ce25645191f5242590abef1f93491a016a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 24 Jun 2014 10:27:39 -0700 Subject: [PATCH] Move diff to helper/diff, helper/resource knows about it --- builtin/providers/aws/diff.go | 32 ------------ builtin/providers/aws/resource_provider.go | 8 +-- builtin/providers/aws/resources.go | 24 +++++++++ diff/lazy_resource_map.go | 51 ------------------- diff/lazy_resource_map_test.go | 45 ---------------- {diff => helper/diff}/diff_test.go | 0 {diff => helper/diff}/resource_builder.go | 0 .../diff}/resource_builder_test.go | 0 helper/resource/map.go | 13 +++++ 9 files changed, 38 insertions(+), 135 deletions(-) delete mode 100644 builtin/providers/aws/diff.go delete mode 100644 diff/lazy_resource_map.go delete mode 100644 diff/lazy_resource_map_test.go rename {diff => helper/diff}/diff_test.go (100%) rename {diff => helper/diff}/resource_builder.go (100%) rename {diff => helper/diff}/resource_builder_test.go (100%) diff --git a/builtin/providers/aws/diff.go b/builtin/providers/aws/diff.go deleted file mode 100644 index 68c930a63..000000000 --- a/builtin/providers/aws/diff.go +++ /dev/null @@ -1,32 +0,0 @@ -package aws - -import ( - "github.com/hashicorp/terraform/diff" -) - -var diffMap *diff.LazyResourceMap - -func init() { - diffMap = &diff.LazyResourceMap{ - Resources: map[string]diff.ResourceBuilderFactory{ - "aws_instance": diffBuilder_aws_instance, - }, - } -} - -func diffBuilder_aws_instance() *diff.ResourceBuilder { - return &diff.ResourceBuilder{ - CreateComputedAttrs: []string{ - "public_dns", - "public_ip", - "private_dns", - "private_ip", - }, - - RequiresNewAttrs: []string{ - "ami", - "availability_zone", - "instance_type", - }, - } -} diff --git a/builtin/providers/aws/resource_provider.go b/builtin/providers/aws/resource_provider.go index b66434231..1c1b1a5a7 100644 --- a/builtin/providers/aws/resource_provider.go +++ b/builtin/providers/aws/resource_provider.go @@ -1,7 +1,6 @@ package aws import ( - "fmt" "log" "github.com/hashicorp/terraform/helper/config" @@ -60,12 +59,7 @@ func (p *ResourceProvider) Apply( func (p *ResourceProvider) Diff( s *terraform.ResourceState, c *terraform.ResourceConfig) (*terraform.ResourceDiff, error) { - b := diffMap.Get(s.Type) - if b == nil { - return nil, fmt.Errorf("Unknown type: %s", s.Type) - } - - return b.Diff(s, c) + return resourceMap.Diff(s, c, p) } func (p *ResourceProvider) Refresh( diff --git a/builtin/providers/aws/resources.go b/builtin/providers/aws/resources.go index 9955ef1ba..3a5d383b0 100644 --- a/builtin/providers/aws/resources.go +++ b/builtin/providers/aws/resources.go @@ -4,6 +4,7 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/diff" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "github.com/mitchellh/goamz/ec2" @@ -19,6 +20,7 @@ func init() { "aws_instance": resource.Resource{ Create: resource_aws_instance_create, Destroy: resource_aws_instance_destroy, + Diff: resource_aws_instance_diff, Refresh: resource_aws_instance_refresh, }, }, @@ -101,6 +103,28 @@ func resource_aws_instance_destroy( return nil } +func resource_aws_instance_diff( + s *terraform.ResourceState, + c *terraform.ResourceConfig, + meta interface{}) (*terraform.ResourceDiff, error) { + b := &diff.ResourceBuilder{ + CreateComputedAttrs: []string{ + "public_dns", + "public_ip", + "private_dns", + "private_ip", + }, + + RequiresNewAttrs: []string{ + "ami", + "availability_zone", + "instance_type", + }, + } + + return b.Diff(s, c) +} + func resource_aws_instance_refresh( s *terraform.ResourceState, meta interface{}) (*terraform.ResourceState, error) { diff --git a/diff/lazy_resource_map.go b/diff/lazy_resource_map.go deleted file mode 100644 index 4039c0570..000000000 --- a/diff/lazy_resource_map.go +++ /dev/null @@ -1,51 +0,0 @@ -package diff - -import ( - "sync" -) - -// LazyResourceMap is a way to lazy-load resource builders. -// -// By lazy loading resource builders, a considerable amount of compute -// effort for building the builders can be avoided. This is especially -// helpful in Terraform providers that support many resource types. -type LazyResourceMap struct { - Resources map[string]ResourceBuilderFactory - - l sync.Mutex - memoized map[string]*ResourceBuilder -} - -// ResourceBuilderFactory is a factory function for creating a resource -// builder that is used for lazy loading resource builders in the Builder -// struct. -type ResourceBuilderFactory func() *ResourceBuilder - -// Get gets the ResourceBuilder for the given resource type, and returns -// nil if the resource builder cannot be found. -// -// This will memoize the result, returning the same result for the same -// type if called again. -func (m *LazyResourceMap) Get(r string) *ResourceBuilder { - m.l.Lock() - defer m.l.Unlock() - - // If we have it saved, return that - if rb, ok := m.memoized[r]; ok { - return rb - } - - // Get the factory function - f, ok := m.Resources[r] - if !ok { - return nil - } - - // Save it so that we don't rebuild - if m.memoized == nil { - m.memoized = make(map[string]*ResourceBuilder) - } - m.memoized[r] = f() - - return m.memoized[r] -} diff --git a/diff/lazy_resource_map_test.go b/diff/lazy_resource_map_test.go deleted file mode 100644 index 53568123f..000000000 --- a/diff/lazy_resource_map_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package diff - -import ( - "testing" -) - -func TestLazyResourceMap(t *testing.T) { - rb1 := new(ResourceBuilder) - rb2 := new(ResourceBuilder) - - rm := &LazyResourceMap{ - Resources: map[string]ResourceBuilderFactory{ - "foo": testRBFactory(rb1), - "bar": testRBFactory(rb2), - "diff": func() *ResourceBuilder { - return new(ResourceBuilder) - }, - }, - } - - actual := rm.Get("foo") - if actual == nil { - t.Fatal("should not be nil") - } - if actual != rb1 { - t.Fatalf("bad: %p %p", rb1, actual) - } - if actual == rm.Get("bar") { - t.Fatalf("bad: %p %p", actual, rm.Get("bar")) - } - - actual = rm.Get("diff") - if actual == nil { - t.Fatal("should not be nil") - } - if actual != rm.Get("diff") { - t.Fatal("should memoize") - } -} - -func testRBFactory(rb *ResourceBuilder) ResourceBuilderFactory { - return func() *ResourceBuilder { - return rb - } -} diff --git a/diff/diff_test.go b/helper/diff/diff_test.go similarity index 100% rename from diff/diff_test.go rename to helper/diff/diff_test.go diff --git a/diff/resource_builder.go b/helper/diff/resource_builder.go similarity index 100% rename from diff/resource_builder.go rename to helper/diff/resource_builder.go diff --git a/diff/resource_builder_test.go b/helper/diff/resource_builder_test.go similarity index 100% rename from diff/resource_builder_test.go rename to helper/diff/resource_builder_test.go diff --git a/helper/resource/map.go b/helper/resource/map.go index 390070df6..07eaa4310 100644 --- a/helper/resource/map.go +++ b/helper/resource/map.go @@ -31,6 +31,19 @@ func (m *Map) Apply( } } +// Diff peforms a diff on the proper resource type. +func (m *Map) Diff( + s *terraform.ResourceState, + c *terraform.ResourceConfig, + meta interface{}) (*terraform.ResourceDiff, error) { + r, ok := m.Mapping[s.Type] + if !ok { + return nil, fmt.Errorf("Unknown resource type: %s", s.Type) + } + + return r.Diff(s, c, meta) +} + // Refresh performs a Refresh on the proper resource type. // // Refresh on the Resource won't be called if the state represents a