diff --git a/builtin/bins/provider-aws/main.go b/builtin/bins/provider-aws/main.go index d994a6b64..813b68b3d 100644 --- a/builtin/bins/provider-aws/main.go +++ b/builtin/bins/provider-aws/main.go @@ -1,8 +1,8 @@ package main import ( - "github.com/hashicorp/terraform/plugin" "github.com/hashicorp/terraform/builtin/providers/aws" + "github.com/hashicorp/terraform/plugin" ) func main() { diff --git a/builtin/bins/provider-aws/main_test.go b/builtin/bins/provider-aws/main_test.go index f189a2735..06ab7d0f9 100644 --- a/builtin/bins/provider-aws/main_test.go +++ b/builtin/bins/provider-aws/main_test.go @@ -1 +1 @@ -package main +package main diff --git a/builtin/providers/aws/resource_provider.go b/builtin/providers/aws/resource_provider.go index cab8f2323..ef420a9df 100644 --- a/builtin/providers/aws/resource_provider.go +++ b/builtin/providers/aws/resource_provider.go @@ -1,8 +1,16 @@ package aws +import ( + "github.com/hashicorp/terraform/terraform" +) + type ResourceProvider struct { } func (p *ResourceProvider) Configure(map[string]interface{}) ([]string, error) { return nil, nil } + +func (p *ResourceProvider) Resources() []terraform.ResourceType { + return nil +} diff --git a/rpc/resource_provider.go b/rpc/resource_provider.go index ed4c31b1e..8e277cd85 100644 --- a/rpc/resource_provider.go +++ b/rpc/resource_provider.go @@ -26,6 +26,18 @@ func (p *ResourceProvider) Configure(c map[string]interface{}) ([]string, error) return resp.Warnings, err } +func (p *ResourceProvider) Resources() []terraform.ResourceType { + var result []terraform.ResourceType + + err := p.Client.Call(p.Name+".Resources", new(interface{}), &result) + if err != nil { + // TODO: panic, log, what? + return nil + } + + return result +} + // ResourceProviderServer is a net/rpc compatible structure for serving // a ResourceProvider. This should not be used directly. type ResourceProviderServer struct { @@ -47,3 +59,10 @@ func (s *ResourceProviderServer) Configure( } return nil } + +func (s *ResourceProviderServer) Resources( + nothing interface{}, + result *[]terraform.ResourceType) error { + *result = s.Provider.Resources() + return nil +} diff --git a/rpc/resource_provider_test.go b/rpc/resource_provider_test.go index 9e2932ba7..645eb1e7d 100644 --- a/rpc/resource_provider_test.go +++ b/rpc/resource_provider_test.go @@ -95,3 +95,29 @@ func TestResourceProvider_configure_warnings(t *testing.T) { t.Fatalf("bad: %#v", e) } } + +func TestResourceProvider_resources(t *testing.T) { + p := new(terraform.MockResourceProvider) + client, server := testClientServer(t) + name, err := Register(server, p) + if err != nil { + t.Fatalf("err: %s", err) + } + provider := &ResourceProvider{Client: client, Name: name} + + expected := []terraform.ResourceType{ + {"foo"}, + {"bar"}, + } + + p.ResourcesReturn = expected + + // Resources + result := provider.Resources() + if !p.ResourcesCalled { + t.Fatal("resources should be called") + } + if !reflect.DeepEqual(result, expected) { + t.Fatalf("bad: %#v", result) + } +} diff --git a/terraform/resource_provider.go b/terraform/resource_provider.go index 90c370a37..365764794 100644 --- a/terraform/resource_provider.go +++ b/terraform/resource_provider.go @@ -12,7 +12,7 @@ type ResourceProvider interface { // Resources returns all the available resource types that this provider // knows how to manage. - //Resources() []ResourceType + Resources() []ResourceType } // ResourceType is a type of resource that a resource provider can manage. diff --git a/terraform/resource_provider_mock.go b/terraform/resource_provider_mock.go index d579b9dba..cf85cfe8c 100644 --- a/terraform/resource_provider_mock.go +++ b/terraform/resource_provider_mock.go @@ -7,6 +7,8 @@ type MockResourceProvider struct { ConfigureConfig map[string]interface{} ConfigureReturnWarnings []string ConfigureReturnError error + ResourcesCalled bool + ResourcesReturn []ResourceType } func (p *MockResourceProvider) Configure(c map[string]interface{}) ([]string, error) { @@ -14,3 +16,8 @@ func (p *MockResourceProvider) Configure(c map[string]interface{}) ([]string, er p.ConfigureConfig = c return p.ConfigureReturnWarnings, p.ConfigureReturnError } + +func (p *MockResourceProvider) Resources() []ResourceType { + p.ResourcesCalled = true + return p.ResourcesReturn +} diff --git a/terraform/resource_provider_mock_test.go b/terraform/resource_provider_mock_test.go new file mode 100644 index 000000000..0beaf87d1 --- /dev/null +++ b/terraform/resource_provider_mock_test.go @@ -0,0 +1,9 @@ +package terraform + +import ( + "testing" +) + +func TestMockResourceProvider_impl(t *testing.T) { + var _ ResourceProvider = new(MockResourceProvider) +}