Skip to content

Commit bb43dd3

Browse files
authored
Improve global error handling (#996)
Adds a panic from `common.DataToStructPointer()` and catches it globally from `common.Resource`.
1 parent 6b72590 commit bb43dd3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+197
-256
lines changed

CONTRIBUTING.md

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,10 @@ func (a ExampleApi) Delete(id string) error {
168168
```go
169169
func ResourceExample() *schema.Resource {
170170
return common.Resource{
171-
Schema: exampleSchema,
172-
SchemaVersion: 2,
171+
Schema: exampleSchema,
173172
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
174173
var e Example
175-
err := common.DataToStructPointer(d, exampleSchema, &e)
176-
if err != nil {
177-
return err
178-
}
174+
common.DataToStructPointer(d, exampleSchema, &e)
179175
id, err := NewExampleApi(ctx, c).Create(e)
180176
if err != nil {
181177
return err
@@ -192,10 +188,7 @@ func ResourceExample() *schema.Resource {
192188
},
193189
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
194190
var e Example
195-
err := common.DataToStructPointer(d, exampleSchema, &e)
196-
if err != nil {
197-
return err
198-
}
191+
common.DataToStructPointer(d, exampleSchema, &e)
199192
return NewExampleApi(ctx, c).Update(d.Id(), e)
200193
},
201194
Delete: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
@@ -207,13 +200,17 @@ func ResourceExample() *schema.Resource {
207200

208201
*Add the resource to the top-level provider.* Simply add the resource to the provider definition in `provider/provider.go`.
209202

210-
*Write unit tests for your resource.* To write your unit tests, you can make use of `ResourceFixture` and `HTTPFixture` structs defined in the `qa` package. This starts a fake HTTP server, asserting that your resource provdier generates the correct request for a given HCL template body for your resource. Update tests should have `InstanceState` field in order to test various corner-cases, like `ForceNew` schemas. It's possible to expect fixture to require new resource by specifying `RequiresNew` field.
203+
*Write unit tests for your resource.* To write your unit tests, you can make use of `ResourceFixture` and `HTTPFixture` structs defined in the `qa` package. This starts a fake HTTP server, asserting that your resource provdier generates the correct request for a given HCL template body for your resource. Update tests should have `InstanceState` field in order to test various corner-cases, like `ForceNew` schemas. It's possible to expect fixture to require new resource by specifying `RequiresNew` field. With the help of `qa.ResourceCornerCases` and `qa.ResourceFixture` one can achieve 100% code coverage for all of the new code.
211204

212205
A simple example:
213206

214207
```go
208+
func TestExampleCornerCases(t *testing.T) {
209+
qa.ResourceCornerCases(t, ResourceExample())
210+
}
211+
215212
func TestExampleResourceCreate(t *testing.T) {
216-
d, err := qa.ResourceFixture{
213+
qa.ResourceFixture{
217214
Fixtures: []qa.HTTPFixture{
218215
{
219216
Method: "POST",
@@ -246,9 +243,7 @@ func TestExampleResourceCreate(t *testing.T) {
246243
HCL: `the_field {
247244
a = "test"
248245
}`,
249-
}.Apply(t)
250-
assert.NoError(t, err, err)
251-
assert.Equal(t, "abcd", d.Id())
246+
}.ApplyNoError(t)
252247
}
253248
```
254249

access/resource_ipaccesslist.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,7 @@ func ResourceIPAccessList() *schema.Resource {
107107
Schema: s,
108108
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
109109
var iacl createIPAccessListRequest
110-
if err := common.DataToStructPointer(d, s, &iacl); err != nil {
111-
return err
112-
}
110+
common.DataToStructPointer(d, s, &iacl)
113111
status, err := NewIPAccessListsAPI(ctx, c).Create(iacl)
114112
if err != nil {
115113
return err
@@ -122,13 +120,12 @@ func ResourceIPAccessList() *schema.Resource {
122120
if err != nil {
123121
return err
124122
}
125-
return common.StructToData(status, s, d)
123+
common.StructToData(status, s, d)
124+
return nil
126125
},
127126
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
128127
var iacl ipAccessListUpdateRequest
129-
if err := common.DataToStructPointer(d, s, &iacl); err != nil {
130-
return err
131-
}
128+
common.DataToStructPointer(d, s, &iacl)
132129
return NewIPAccessListsAPI(ctx, c).Update(d.Id(), iacl)
133130
},
134131
Delete: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {

access/resource_sql_permissions.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,7 @@ func (ta *SqlPermissions) getOrCreateCluster(clustersAPI clusters.ClustersAPI) (
284284

285285
func tableAclForUpdate(ctx context.Context, d *schema.ResourceData,
286286
s map[string]*schema.Schema, c *common.DatabricksClient) (ta SqlPermissions, err error) {
287-
if err = common.DataToStructPointer(d, s, &ta); err != nil {
288-
return
289-
}
287+
common.DataToStructPointer(d, s, &ta)
290288
err = ta.initCluster(ctx, d, c)
291289
return
292290
}
@@ -342,7 +340,8 @@ func ResourceSqlPermissions() *schema.Resource {
342340
// reflect resource is skipping empty privilege_assignments
343341
d.Set("privilege_assignments", []interface{}{})
344342
}
345-
return common.StructToData(ta, s, d)
343+
common.StructToData(ta, s, d)
344+
return nil
346345
},
347346
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
348347
ta, err := tableAclForUpdate(ctx, d, s, c)

aws/resource_instance_profile.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,7 @@ func ResourceInstanceProfile() *schema.Resource {
157157
},
158158
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
159159
var profile InstanceProfileInfo
160-
if err := common.DataToStructPointer(d, instanceProfileSchema, &profile); err != nil {
161-
return err
162-
}
160+
common.DataToStructPointer(d, instanceProfileSchema, &profile)
163161
if err := NewInstanceProfilesAPI(ctx, c).Create(profile); err != nil {
164162
return err
165163
}

catalog/resource_catalog.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ func ResourceCatalog() *schema.Resource {
5252
Schema: catalogSchema,
5353
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
5454
var ci CatalogInfo
55-
if err := common.DataToStructPointer(d, catalogSchema, &ci); err != nil {
56-
return err
57-
}
55+
common.DataToStructPointer(d, catalogSchema, &ci)
5856
if err := NewCatalogsAPI(ctx, c).createCatalog(&ci); err != nil {
5957
return err
6058
}
@@ -73,9 +71,7 @@ func ResourceCatalog() *schema.Resource {
7371
},
7472
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
7573
var ci CatalogInfo
76-
if err := common.DataToStructPointer(d, catalogSchema, &ci); err != nil {
77-
return err
78-
}
74+
common.DataToStructPointer(d, catalogSchema, &ci)
7975
return NewCatalogsAPI(ctx, c).updateCatalog(ci)
8076
},
8177
Delete: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {

catalog/resource_grants.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -214,16 +214,12 @@ func ResourceGrants() *schema.Resource {
214214
Schema: s,
215215
CustomizeDiff: func(ctx context.Context, d *schema.ResourceDiff, c interface{}) error {
216216
var grants PermissionsList
217-
if err := common.DiffToStructPointer(d, s, &grants); err != nil {
218-
return err
219-
}
217+
common.DiffToStructPointer(d, s, &grants)
220218
return mapping.validate(d, grants)
221219
},
222220
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
223221
var grants PermissionsList
224-
if err := common.DataToStructPointer(d, s, &grants); err != nil {
225-
return err
226-
}
222+
common.DataToStructPointer(d, s, &grants)
227223
securable, name := mapping.kv(d)
228224
err := NewPermissionsAPI(ctx, c).updatePermissions(securable, name, grants.toCreate())
229225
if err != nil {
@@ -250,9 +246,7 @@ func ResourceGrants() *schema.Resource {
250246
},
251247
Delete: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
252248
var grants PermissionsList
253-
if err := common.DataToStructPointer(d, s, &grants); err != nil {
254-
return err
255-
}
249+
common.DataToStructPointer(d, s, &grants)
256250
securable, name := mapping.kv(d)
257251
return NewPermissionsAPI(ctx, c).updatePermissions(securable, name, grants.toDelete())
258252
},

catalog/resource_metastore.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,7 @@ func ResourceMetastore() *schema.Resource {
9898
Schema: s,
9999
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
100100
var create CreateMetastore
101-
if err := common.DataToStructPointer(d, s, &create); err != nil {
102-
return err
103-
}
101+
common.DataToStructPointer(d, s, &create)
104102
mi, err := NewMetastoresAPI(ctx, c).createMetastore(create)
105103
if err != nil {
106104
return err

catalog/resource_metastore_assignment.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ func ResourceMetastoreAssignment() *schema.Resource {
4848
Schema: s,
4949
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
5050
var ma MetastoreAssignment
51-
if err := common.DataToStructPointer(d, s, &ma); err != nil {
52-
return err
53-
}
51+
common.DataToStructPointer(d, s, &ma)
5452
if err := NewMetastoreAssignmentAPI(ctx, c).createMetastoreAssignment(ma); err != nil {
5553
return err
5654
}
@@ -63,9 +61,7 @@ func ResourceMetastoreAssignment() *schema.Resource {
6361
},
6462
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
6563
var ma MetastoreAssignment
66-
if err := common.DataToStructPointer(d, s, &ma); err != nil {
67-
return err
68-
}
64+
common.DataToStructPointer(d, s, &ma)
6965
return NewMetastoreAssignmentAPI(ctx, c).updateMetastoreAssignment(ma)
7066
},
7167
Delete: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {

catalog/resource_metastore_data_access.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ func ResourceDataAccessConfiguration() *schema.Resource {
7575
Schema: s,
7676
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
7777
var dac DataAccessConfiguration
78-
if err := common.DataToStructPointer(d, s, &dac); err != nil {
79-
return err
80-
}
78+
common.DataToStructPointer(d, s, &dac)
8179
metastoreID := d.Get("metastore_id").(string)
8280
if err := NewDataAccessConfigurationsAPI(ctx, c).Create(metastoreID, &dac); err != nil {
8381
return err

catalog/resource_schema.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ func ResourceSchema() *schema.Resource {
5353
Schema: s,
5454
Create: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
5555
var si SchemaInfo
56-
if err := common.DataToStructPointer(d, s, &si); err != nil {
57-
return err
58-
}
56+
common.DataToStructPointer(d, s, &si)
5957
if err := NewSchemasAPI(ctx, c).createSchema(&si); err != nil {
6058
return err
6159
}
@@ -71,9 +69,7 @@ func ResourceSchema() *schema.Resource {
7169
},
7270
Update: func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {
7371
var si SchemaInfo
74-
if err := common.DataToStructPointer(d, s, &si); err != nil {
75-
return err
76-
}
72+
common.DataToStructPointer(d, s, &si)
7773
si.FullName = d.Id()
7874
return NewSchemasAPI(ctx, c).updateSchema(si)
7975
},

0 commit comments

Comments
 (0)