Skip to content

Commit 9183068

Browse files
committed
rpc: tests and impl of latest API
1 parent a6ae723 commit 9183068

2 files changed

Lines changed: 152 additions & 0 deletions

File tree

‎rpc/resource_provider.go‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,30 @@ func (p *ResourceProvider) Validate(c *terraform.ResourceConfig) ([]string, []er
3535
return resp.Warnings, errs
3636
}
3737

38+
func (p *ResourceProvider) ValidateResource(
39+
t string, c *terraform.ResourceConfig) ([]string, []error) {
40+
var resp ResourceProviderValidateResourceResponse
41+
args := ResourceProviderValidateResourceArgs{
42+
Config: c,
43+
Type: t,
44+
}
45+
46+
err := p.Client.Call(p.Name+".ValidateResource", &args, &resp)
47+
if err != nil {
48+
return nil, []error{err}
49+
}
50+
51+
var errs []error
52+
if len(resp.Errors) > 0 {
53+
errs = make([]error, len(resp.Errors))
54+
for i, err := range resp.Errors {
55+
errs[i] = err
56+
}
57+
}
58+
59+
return resp.Warnings, errs
60+
}
61+
3862
func (p *ResourceProvider) Configure(c *terraform.ResourceConfig) error {
3963
var resp ResourceProviderConfigureResponse
4064
err := p.Client.Call(p.Name+".Configure", c, &resp)
@@ -157,6 +181,16 @@ type ResourceProviderValidateResponse struct {
157181
Errors []*BasicError
158182
}
159183

184+
type ResourceProviderValidateResourceArgs struct {
185+
Config *terraform.ResourceConfig
186+
Type string
187+
}
188+
189+
type ResourceProviderValidateResourceResponse struct {
190+
Warnings []string
191+
Errors []*BasicError
192+
}
193+
160194
func (s *ResourceProviderServer) Validate(
161195
args *ResourceProviderValidateArgs,
162196
reply *ResourceProviderValidateResponse) error {
@@ -172,6 +206,21 @@ func (s *ResourceProviderServer) Validate(
172206
return nil
173207
}
174208

209+
func (s *ResourceProviderServer) ValidateResource(
210+
args *ResourceProviderValidateResourceArgs,
211+
reply *ResourceProviderValidateResourceResponse) error {
212+
warns, errs := s.Provider.ValidateResource(args.Type, args.Config)
213+
berrs := make([]*BasicError, len(errs))
214+
for i, err := range errs {
215+
berrs[i] = NewBasicError(err)
216+
}
217+
*reply = ResourceProviderValidateResourceResponse{
218+
Warnings: warns,
219+
Errors: berrs,
220+
}
221+
return nil
222+
}
223+
175224
func (s *ResourceProviderServer) Configure(
176225
config *terraform.ResourceConfig,
177226
reply *ResourceProviderConfigureResponse) error {

‎rpc/resource_provider_test.go‎

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,3 +341,106 @@ func TestResourceProvider_validate_warns(t *testing.T) {
341341
t.Fatalf("bad: %#v", w)
342342
}
343343
}
344+
345+
func TestResourceProvider_validateResource(t *testing.T) {
346+
p := new(terraform.MockResourceProvider)
347+
client, server := testClientServer(t)
348+
name, err := Register(server, p)
349+
if err != nil {
350+
t.Fatalf("err: %s", err)
351+
}
352+
provider := &ResourceProvider{Client: client, Name: name}
353+
354+
// Configure
355+
config := &terraform.ResourceConfig{
356+
Raw: map[string]interface{}{"foo": "bar"},
357+
}
358+
w, e := provider.ValidateResource("foo", config)
359+
if !p.ValidateResourceCalled {
360+
t.Fatal("configure should be called")
361+
}
362+
if p.ValidateResourceType != "foo" {
363+
t.Fatalf("bad: %#v", p.ValidateResourceType)
364+
}
365+
if !reflect.DeepEqual(p.ValidateResourceConfig, config) {
366+
t.Fatalf("bad: %#v", p.ValidateResourceConfig)
367+
}
368+
if w != nil {
369+
t.Fatalf("bad: %#v", w)
370+
}
371+
if e != nil {
372+
t.Fatalf("bad: %#v", e)
373+
}
374+
}
375+
376+
func TestResourceProvider_validateResource_errors(t *testing.T) {
377+
p := new(terraform.MockResourceProvider)
378+
p.ValidateResourceReturnErrors = []error{errors.New("foo")}
379+
380+
client, server := testClientServer(t)
381+
name, err := Register(server, p)
382+
if err != nil {
383+
t.Fatalf("err: %s", err)
384+
}
385+
provider := &ResourceProvider{Client: client, Name: name}
386+
387+
// Configure
388+
config := &terraform.ResourceConfig{
389+
Raw: map[string]interface{}{"foo": "bar"},
390+
}
391+
w, e := provider.ValidateResource("foo", config)
392+
if !p.ValidateResourceCalled {
393+
t.Fatal("configure should be called")
394+
}
395+
if p.ValidateResourceType != "foo" {
396+
t.Fatalf("bad: %#v", p.ValidateResourceType)
397+
}
398+
if !reflect.DeepEqual(p.ValidateResourceConfig, config) {
399+
t.Fatalf("bad: %#v", p.ValidateResourceConfig)
400+
}
401+
if w != nil {
402+
t.Fatalf("bad: %#v", w)
403+
}
404+
405+
if len(e) != 1 {
406+
t.Fatalf("bad: %#v", e)
407+
}
408+
if e[0].Error() != "foo" {
409+
t.Fatalf("bad: %#v", e)
410+
}
411+
}
412+
413+
func TestResourceProvider_validateResource_warns(t *testing.T) {
414+
p := new(terraform.MockResourceProvider)
415+
p.ValidateResourceReturnWarns = []string{"foo"}
416+
417+
client, server := testClientServer(t)
418+
name, err := Register(server, p)
419+
if err != nil {
420+
t.Fatalf("err: %s", err)
421+
}
422+
provider := &ResourceProvider{Client: client, Name: name}
423+
424+
// Configure
425+
config := &terraform.ResourceConfig{
426+
Raw: map[string]interface{}{"foo": "bar"},
427+
}
428+
w, e := provider.ValidateResource("foo", config)
429+
if !p.ValidateResourceCalled {
430+
t.Fatal("configure should be called")
431+
}
432+
if p.ValidateResourceType != "foo" {
433+
t.Fatalf("bad: %#v", p.ValidateResourceType)
434+
}
435+
if !reflect.DeepEqual(p.ValidateResourceConfig, config) {
436+
t.Fatalf("bad: %#v", p.ValidateResourceConfig)
437+
}
438+
if e != nil {
439+
t.Fatalf("bad: %#v", e)
440+
}
441+
442+
expected := []string{"foo"}
443+
if !reflect.DeepEqual(w, expected) {
444+
t.Fatalf("bad: %#v", w)
445+
}
446+
}

0 commit comments

Comments
 (0)