Skip to content

Commit 1365c81

Browse files
committed
diagnostic support to ConfigureContextFunc
1 parent 0bd2ae9 commit 1365c81

File tree

4 files changed

+32
-24
lines changed

4 files changed

+32
-24
lines changed

helper/schema/provider.go

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ type ConfigureFunc func(*ResourceData) (interface{}, error)
7878
// the subsequent resources as the meta parameter. This return value is
7979
// usually used to pass along a configured API client, a configuration
8080
// structure, etc.
81-
type ConfigureContextFunc func(context.Context, *ResourceData) (interface{}, error)
81+
type ConfigureContextFunc func(context.Context, *ResourceData) (interface{}, diag.Diagnostics)
8282

8383
// InternalValidate should be called to validate the structure
8484
// of the provider.
@@ -233,11 +233,14 @@ func (p *Provider) ValidateResource(
233233
//
234234
// This won't be called at all if no provider configuration is given.
235235
//
236-
// Configure returns an error if it occurred.
237-
func (p *Provider) Configure(ctx context.Context, c *terraform.ResourceConfig) error {
236+
// Configure returns Diagnostics.
237+
func (p *Provider) Configure(ctx context.Context, c *terraform.ResourceConfig) diag.Diagnostics {
238+
239+
var diags diag.Diagnostics
240+
238241
// No configuration
239242
if p.ConfigureFunc == nil && p.ConfigureContextFunc == nil {
240-
return nil
243+
return diags
241244
}
242245

243246
sm := schemaMap(p.Schema)
@@ -246,26 +249,31 @@ func (p *Provider) Configure(ctx context.Context, c *terraform.ResourceConfig) e
246249
// generate an intermediary "diff" although that is never exposed.
247250
diff, err := sm.Diff(ctx, nil, c, nil, p.meta, true)
248251
if err != nil {
249-
return err
252+
return append(diags, diag.FromErr(err))
250253
}
251254

252255
data, err := sm.Data(nil, diff)
253256
if err != nil {
254-
return err
257+
return append(diags, diag.FromErr(err))
255258
}
256259

257-
var meta interface{}
258-
if p.ConfigureContextFunc != nil {
259-
meta, err = p.ConfigureContextFunc(ctx, data)
260-
} else {
261-
meta, err = p.ConfigureFunc(data)
260+
if p.ConfigureFunc != nil {
261+
meta, err := p.ConfigureFunc(data)
262+
if err != nil {
263+
return append(diags, diag.FromErr(err))
264+
}
265+
p.meta = meta
262266
}
263-
if err != nil {
264-
return err
267+
if p.ConfigureContextFunc != nil {
268+
meta, ds := p.ConfigureContextFunc(ctx, data)
269+
diags = append(diags, ds...)
270+
if diags.HasError() {
271+
return diags
272+
}
273+
p.meta = meta
265274
}
266275

267-
p.meta = meta
268-
return nil
276+
return diags
269277
}
270278

271279
// Resources returns all the available resource types that this provider

helper/schema/provider_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/google/go-cmp/cmp"
1212
"github.com/hashicorp/go-cty/cty"
1313

14+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1415
"github.com/hashicorp/terraform-plugin-sdk/v2/internal/configs/configschema"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1617
)
@@ -137,12 +138,12 @@ func TestProviderConfigure(t *testing.T) {
137138
},
138139
},
139140

140-
ConfigureContextFunc: func(ctx context.Context, d *ResourceData) (interface{}, error) {
141+
ConfigureContextFunc: func(ctx context.Context, d *ResourceData) (interface{}, diag.Diagnostics) {
141142
if d.Get("foo").(int) == 42 {
142143
return nil, nil
143144
}
144145

145-
return nil, fmt.Errorf("nope")
146+
return nil, diag.Diagnostics{diag.FromErr(fmt.Errorf("nope"))}
146147
},
147148
},
148149
Config: map[string]interface{}{
@@ -177,9 +178,9 @@ func TestProviderConfigure(t *testing.T) {
177178

178179
for i, tc := range cases {
179180
c := terraform.NewResourceConfigRaw(tc.Config)
180-
err := tc.P.Configure(context.Background(), c)
181-
if err != nil != tc.Err {
182-
t.Fatalf("%d: %s", i, err)
181+
diags := tc.P.Configure(context.Background(), c)
182+
if diags.HasError() != tc.Err {
183+
t.Fatalf("%d: %s", i, errorDiags(diags))
183184
}
184185
}
185186
}
@@ -551,7 +552,7 @@ func TestProvider_InternalValidate(t *testing.T) {
551552
ConfigureFunc: func(d *ResourceData) (interface{}, error) {
552553
return nil, nil
553554
},
554-
ConfigureContextFunc: func(ctx context.Context, d *ResourceData) (interface{}, error) {
555+
ConfigureContextFunc: func(ctx context.Context, d *ResourceData) (interface{}, diag.Diagnostics) {
555556
return nil, nil
556557
},
557558
},

helper/schema/resource.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,6 @@ func (r *Resource) RefreshWithoutUpgrade(
514514
rt := ResourceTimeout{}
515515
if _, ok := s.Meta[TimeoutKey]; ok {
516516
if err := rt.StateDecode(s); err != nil {
517-
// TODO should this be added to diags?
518517
log.Printf("[ERR] Error decoding ResourceTimeout: %s", err)
519518
}
520519
}

internal/helper/plugin/grpc_provider.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,8 @@ func (s *GRPCProviderServer) Configure(ctx context.Context, req *proto.Configure
498498
}
499499

500500
config := terraform.NewResourceConfigShimmed(configVal, schemaBlock)
501-
err = s.provider.Configure(ctx, config)
502-
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
501+
diags := s.provider.Configure(ctx, config)
502+
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, diags)
503503

504504
return resp, nil
505505
}

0 commit comments

Comments
 (0)