Skip to content

Commit 2359eb0

Browse files
Validate metastore_id field in worspace UC resources (#3035)
* Validate metastore_id field in worspace UC resources * Update docs * Fix lint * Fix test * Rename test * Update docs * Address PR comments
1 parent dcc95c3 commit 2359eb0

21 files changed

+281
-16
lines changed

catalog/resource_artifact_allowlist.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ func ResourceArtifactAllowlist() *schema.Resource {
3030
if err != nil {
3131
return err
3232
}
33+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
34+
if err != nil {
35+
return err
36+
}
3337

3438
var createAllowlist ArtifactAllowlistInfo
3539
common.DataToStructPointer(d, allowlistSchema, &createAllowlist)
@@ -83,6 +87,11 @@ func ResourceArtifactAllowlist() *schema.Resource {
8387
return err
8488
}
8589

90+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
91+
if err != nil {
92+
return err
93+
}
94+
8695
_, artifactType, err := p.Unpack(d)
8796
if err != nil {
8897
return err

catalog/resource_catalog.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ func ResourceCatalog() *schema.Resource {
5959
return err
6060
}
6161

62+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
63+
if err != nil {
64+
return err
65+
}
66+
6267
var createCatalogRequest catalog.CreateCatalog
6368
common.DataToStructPointer(d, catalogSchema, &createCatalogRequest)
6469
ci, err := w.Catalogs.Create(ctx, createCatalogRequest)
@@ -122,6 +127,12 @@ func ResourceCatalog() *schema.Resource {
122127
if err != nil {
123128
return err
124129
}
130+
131+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
132+
if err != nil {
133+
return err
134+
}
135+
125136
var updateCatalogRequest catalog.UpdateCatalog
126137
common.DataToStructPointer(d, catalogSchema, &updateCatalogRequest)
127138
ci, err := w.Catalogs.Update(ctx, updateCatalogRequest)
@@ -158,6 +169,12 @@ func ResourceCatalog() *schema.Resource {
158169
if err != nil {
159170
return err
160171
}
172+
173+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
174+
if err != nil {
175+
return err
176+
}
177+
161178
force := d.Get("force_destroy").(bool)
162179
// If the workspace has isolation mode ISOLATED, we need to add the current workspace to its
163180
// bindings before deleting.

catalog/resource_catalog_test.go

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,13 @@ func TestCatalogCreateCannotDeleteDefaultSchema(t *testing.T) {
235235
func TestUpdateCatalog(t *testing.T) {
236236
qa.ResourceFixture{
237237
Fixtures: []qa.HTTPFixture{
238+
{
239+
Method: "GET",
240+
Resource: "/api/2.1/unity-catalog/current-metastore-assignment",
241+
Response: catalog.MetastoreAssignment{
242+
MetastoreId: "d",
243+
},
244+
},
238245
{
239246
Method: "PATCH",
240247
Resource: "/api/2.1/unity-catalog/catalogs/a",
@@ -277,6 +284,144 @@ func TestUpdateCatalog(t *testing.T) {
277284
}.ApplyNoError(t)
278285
}
279286

287+
func TestFailIfMetastoreIdIsWrong(t *testing.T) {
288+
qa.ResourceFixture{
289+
Fixtures: []qa.HTTPFixture{
290+
{
291+
Method: "GET",
292+
Resource: "/api/2.1/unity-catalog/current-metastore-assignment",
293+
Response: catalog.MetastoreAssignment{
294+
MetastoreId: "old_id",
295+
},
296+
},
297+
},
298+
Resource: ResourceCatalog(),
299+
Update: true,
300+
ID: "a",
301+
InstanceState: map[string]string{
302+
"metastore_id": "old_id",
303+
"name": "a",
304+
"comment": "c",
305+
},
306+
HCL: `
307+
metastore_id = "new_id"
308+
name = "a"
309+
comment = "c"
310+
owner = "administrators"
311+
`,
312+
}.ExpectError(t, "metastore_id must be empty or equal to the metastore id assigned to the workspace: old_id. "+
313+
"If the metastore assigned to the workspace has changed, the new metastore id must be explicitly set")
314+
}
315+
316+
func TestUpdateCatalogIfMetastoreIdChanges(t *testing.T) {
317+
qa.ResourceFixture{
318+
Fixtures: []qa.HTTPFixture{
319+
{
320+
Method: "GET",
321+
Resource: "/api/2.1/unity-catalog/current-metastore-assignment",
322+
Response: catalog.MetastoreAssignment{
323+
MetastoreId: "correct_id",
324+
},
325+
},
326+
{
327+
Method: "PATCH",
328+
Resource: "/api/2.1/unity-catalog/catalogs/a",
329+
ExpectedRequest: catalog.UpdateCatalog{
330+
Name: "a",
331+
Comment: "c",
332+
Owner: "administrators",
333+
},
334+
Response: catalog.CatalogInfo{
335+
Name: "a",
336+
MetastoreId: "correct_id",
337+
Comment: "c",
338+
Owner: "administrators",
339+
},
340+
},
341+
{
342+
Method: "GET",
343+
Resource: "/api/2.1/unity-catalog/catalogs/a?",
344+
Response: catalog.CatalogInfo{
345+
Name: "a",
346+
MetastoreId: "correct_id",
347+
Comment: "c",
348+
Owner: "administrators",
349+
},
350+
},
351+
},
352+
Resource: ResourceCatalog(),
353+
Update: true,
354+
ID: "a",
355+
InstanceState: map[string]string{
356+
"metastore_id": "wrong_id",
357+
"name": "a",
358+
"comment": "c",
359+
},
360+
HCL: `
361+
metastore_id = "correct_id"
362+
name = "a"
363+
comment = "c"
364+
owner = "administrators"
365+
`,
366+
}.ApplyAndExpectData(t, map[string]any{
367+
"metastore_id": "correct_id",
368+
"name": "a",
369+
"comment": "c",
370+
})
371+
}
372+
373+
func TestUpdateCatalogIfMetastoreIdNotExplicitelySet(t *testing.T) {
374+
qa.ResourceFixture{
375+
Fixtures: []qa.HTTPFixture{
376+
{
377+
Method: "GET",
378+
Resource: "/api/2.1/unity-catalog/current-metastore-assignment",
379+
Response: catalog.MetastoreAssignment{
380+
MetastoreId: "correct_id",
381+
},
382+
},
383+
{
384+
Method: "PATCH",
385+
Resource: "/api/2.1/unity-catalog/catalogs/a",
386+
ExpectedRequest: catalog.UpdateCatalog{
387+
Name: "a",
388+
Comment: "c",
389+
Owner: "administrators",
390+
},
391+
Response: catalog.CatalogInfo{
392+
Name: "a",
393+
MetastoreId: "correct_id",
394+
Comment: "c",
395+
Owner: "administrators",
396+
},
397+
},
398+
{
399+
Method: "GET",
400+
Resource: "/api/2.1/unity-catalog/catalogs/a?",
401+
Response: catalog.CatalogInfo{
402+
Name: "a",
403+
MetastoreId: "correct_id",
404+
Comment: "c",
405+
Owner: "administrators",
406+
},
407+
},
408+
},
409+
Resource: ResourceCatalog(),
410+
Update: true,
411+
ID: "a",
412+
InstanceState: map[string]string{
413+
"metastore_id": "correct_id",
414+
"name": "a",
415+
"comment": "c",
416+
},
417+
HCL: `
418+
name = "a"
419+
comment = "c"
420+
owner = "administrators"
421+
`,
422+
}.ApplyNoError(t)
423+
}
424+
280425
func TestForceDeleteCatalog(t *testing.T) {
281426
qa.ResourceFixture{
282427
Fixtures: []qa.HTTPFixture{

catalog/resource_connection.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ func ResourceConnection() *schema.Resource {
5454
if err != nil {
5555
return err
5656
}
57+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
58+
if err != nil {
59+
return err
60+
}
5761
var createConnectionRequest catalog.CreateConnection
5862
common.DataToStructPointer(d, s, &createConnectionRequest)
5963
conn, err := w.Connections.Create(ctx, createConnectionRequest)
@@ -95,6 +99,10 @@ func ResourceConnection() *schema.Resource {
9599
if err != nil {
96100
return err
97101
}
102+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
103+
if err != nil {
104+
return err
105+
}
98106
var updateConnectionRequest catalog.UpdateConnection
99107
common.DataToStructPointer(d, s, &updateConnectionRequest)
100108
_, connName, err := pi.Unpack(d)

catalog/resource_external_location.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ func ResourceExternalLocation() *schema.Resource {
4646
if err != nil {
4747
return err
4848
}
49+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
50+
if err != nil {
51+
return err
52+
}
4953
var createExternalLocationRequest catalog.CreateExternalLocation
5054
common.DataToStructPointer(d, s, &createExternalLocationRequest)
5155
el, err := w.ExternalLocations.Create(ctx, createExternalLocationRequest)
@@ -84,6 +88,10 @@ func ResourceExternalLocation() *schema.Resource {
8488
if err != nil {
8589
return err
8690
}
91+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
92+
if err != nil {
93+
return err
94+
}
8795
var updateExternalLocationRequest catalog.UpdateExternalLocation
8896
common.DataToStructPointer(d, s, &updateExternalLocationRequest)
8997
updateExternalLocationRequest.Force = force
@@ -99,6 +107,10 @@ func ResourceExternalLocation() *schema.Resource {
99107
if err != nil {
100108
return err
101109
}
110+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
111+
if err != nil {
112+
return err
113+
}
102114
return w.ExternalLocations.Delete(ctx, catalog.DeleteExternalLocationRequest{
103115
Name: d.Id(),
104116
Force: force,

catalog/resource_metastore.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ func ResourceMetastore() *schema.Resource {
8484
}
8585
return nil
8686
}, func(w *databricks.WorkspaceClient) error {
87+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
88+
if err != nil {
89+
return err
90+
}
8791
mi, err := w.Metastores.Create(ctx, create)
8892
if err != nil {
8993
return err
@@ -127,8 +131,12 @@ func ResourceMetastore() *schema.Resource {
127131
}
128132
return nil
129133
}, func(w *databricks.WorkspaceClient) error {
134+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
135+
if err != nil {
136+
return err
137+
}
130138
update.Id = d.Id()
131-
_, err := w.Metastores.Update(ctx, update)
139+
_, err = w.Metastores.Update(ctx, update)
132140
if err != nil {
133141
return err
134142
}
@@ -140,6 +148,10 @@ func ResourceMetastore() *schema.Resource {
140148
return c.AccountOrWorkspaceRequest(func(acc *databricks.AccountClient) error {
141149
return acc.Metastores.Delete(ctx, catalog.DeleteAccountMetastoreRequest{Force: force, MetastoreId: d.Id()})
142150
}, func(w *databricks.WorkspaceClient) error {
151+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
152+
if err != nil {
153+
return err
154+
}
143155
return w.Metastores.Delete(ctx, catalog.DeleteMetastoreRequest{Force: force, Id: d.Id()})
144156
})
145157
},

catalog/resource_schema.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func ResourceSchema() *schema.Resource {
3939
if err != nil {
4040
return err
4141
}
42+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
43+
if err != nil {
44+
return err
45+
}
4246
var createSchemaRequest catalog.CreateSchema
4347
common.DataToStructPointer(d, s, &createSchemaRequest)
4448
schema, err := w.Schemas.Create(ctx, createSchemaRequest)
@@ -77,6 +81,10 @@ func ResourceSchema() *schema.Resource {
7781
if err != nil {
7882
return err
7983
}
84+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
85+
if err != nil {
86+
return err
87+
}
8088
var updateSchemaRequest catalog.UpdateSchema
8189
common.DataToStructPointer(d, s, &updateSchemaRequest)
8290
updateSchemaRequest.FullName = d.Id()
@@ -96,6 +104,10 @@ func ResourceSchema() *schema.Resource {
96104
if err != nil {
97105
return err
98106
}
107+
err = validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
108+
if err != nil {
109+
return err
110+
}
99111
if force {
100112
// delete all tables & views
101113
tables, err := w.Tables.ListAll(ctx, catalog.ListTablesRequest{

catalog/resource_schema_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ func TestCreateSchemaWithOwner(t *testing.T) {
102102
func TestUpdateSchema(t *testing.T) {
103103
qa.ResourceFixture{
104104
Fixtures: []qa.HTTPFixture{
105+
{
106+
Method: "GET",
107+
Resource: "/api/2.1/unity-catalog/current-metastore-assignment",
108+
Response: catalog.MetastoreAssignment{
109+
MetastoreId: "d",
110+
},
111+
},
105112
{
106113
Method: "PATCH",
107114
Resource: "/api/2.1/unity-catalog/schemas/b.a",

catalog/resource_storage_credential.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ func ResourceStorageCredential() *schema.Resource {
7979
}
8080
return nil
8181
}, func(w *databricks.WorkspaceClient) error {
82+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
83+
if err != nil {
84+
return err
85+
}
8286
storageCredential, err := w.StorageCredentials.Create(ctx, create)
8387
if err != nil {
8488
return err
@@ -131,7 +135,11 @@ func ResourceStorageCredential() *schema.Resource {
131135
}
132136
return nil
133137
}, func(w *databricks.WorkspaceClient) error {
134-
_, err := w.StorageCredentials.Update(ctx, update)
138+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
139+
if err != nil {
140+
return err
141+
}
142+
_, err = w.StorageCredentials.Update(ctx, update)
135143
if err != nil {
136144
return err
137145
}
@@ -147,6 +155,10 @@ func ResourceStorageCredential() *schema.Resource {
147155
MetastoreId: d.Get("metastore_id").(string),
148156
})
149157
}, func(w *databricks.WorkspaceClient) error {
158+
err := validateMetastoreId(ctx, w, d.Get("metastore_id").(string))
159+
if err != nil {
160+
return err
161+
}
150162
return w.StorageCredentials.Delete(ctx, catalog.DeleteStorageCredentialRequest{
151163
Force: force,
152164
Name: d.Id(),

0 commit comments

Comments
 (0)