From 5ef20cf3a24f9b8ca8fe32b35ed37295edc71cc1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 28 May 2014 15:18:14 -0700 Subject: [PATCH] rpc: Make a Register function to make working with easier --- rpc/resource_provider.go | 3 ++- rpc/resource_provider_test.go | 10 +++++----- rpc/rpc.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 rpc/rpc.go diff --git a/rpc/resource_provider.go b/rpc/resource_provider.go index 9336639c6..c1026dd05 100644 --- a/rpc/resource_provider.go +++ b/rpc/resource_provider.go @@ -8,11 +8,12 @@ import ( type ResourceProvider struct { Client *rpc.Client + Name string } func (p *ResourceProvider) Configure(c map[string]interface{}) ([]string, error) { var resp ResourceProviderConfigureResponse - err := p.Client.Call("ResourceProvider.Configure", c, &resp) + err := p.Client.Call(p.Name+".Configure", c, &resp) if err != nil { return nil, err } diff --git a/rpc/resource_provider_test.go b/rpc/resource_provider_test.go index 00724c0be..624255983 100644 --- a/rpc/resource_provider_test.go +++ b/rpc/resource_provider_test.go @@ -10,11 +10,11 @@ import ( func TestResourceProvider_configure(t *testing.T) { p := new(terraform.MockResourceProvider) client, server := testClientServer(t) - server.RegisterName("ResourceProvider", &ResourceProviderServer{ - Provider: p, - }) - - provider := &ResourceProvider{Client: client} + name, err := Register(server, p) + if err != nil { + t.Fatalf("err: %s", err) + } + provider := &ResourceProvider{Client: client, Name: name} // Configure config := map[string]interface{}{"foo": "bar"} diff --git a/rpc/rpc.go b/rpc/rpc.go new file mode 100644 index 000000000..5f178ae93 --- /dev/null +++ b/rpc/rpc.go @@ -0,0 +1,32 @@ +package rpc + +import ( + "errors" + "fmt" + "net/rpc" + "sync" + + "github.com/hashicorp/terraform/terraform" +) + +// nextId is the next ID to use for names registered. +var nextId uint32 = 0 +var nextLock sync.Mutex + +// Register registers a Terraform thing with the RPC server and returns +// the name it is registered under. +func Register(server *rpc.Server, thing interface{}) (name string, err error) { + nextLock.Lock() + defer nextLock.Unlock() + + switch t := thing.(type) { + case terraform.ResourceProvider: + name = fmt.Sprintf("Terraform%d", nextId) + err = server.RegisterName(name, &ResourceProviderServer{Provider: t}) + default: + return "", errors.New("Unknown type to register for RPC server.") + } + + nextId += 1 + return +}