Skip to content

Commit e504790

Browse files
authored
[Fix] Tolerate databricks_permissions resources for SQL warehouses with /warehouses/... IDs (#4158)
## Changes #4143 reported a regression to the `databricks_permissions` resource caused by #3956. Normally, the ID for this resource when configured for a SQL warehouse is `/sql/warehouses/<ID>`. However, it seems like at some point in the past, some users may have had an ID of `/warehouses/<ID>`. It's possible that importing this resource worked like this: when calling the permissions REST API, whether using object type `sql/warehouses` or `warehouses`, the API returns permissions for the same resources: ``` 15:13:01 DEBUG GET /api/2.0/permissions/sql/warehouses/<ID> < HTTP/2.0 200 OK < { < "access_control_list": [ < { < "all_permissions": [ < { < "inherited": false, < "permission_level": "IS_OWNER" < } < ], < "display_name": "<ME>", < "user_name": "<ME>" < }, < { < "all_permissions": [ < { < "inherited": true, < "inherited_from_object": [ < "/sql/warehouses/" < ], < "permission_level": "CAN_MANAGE" < } < ], < "group_name": "admins" < } < ], < "object_id": "/sql/warehouses/<ID>", < "object_type": "warehouses" < } pid=53287 sdk=true ... 15:12:56 DEBUG GET /api/2.0/permissions/warehouses/<ID> < HTTP/2.0 200 OK < { < "access_control_list": [ < { < "all_permissions": [ < { < "inherited": false, < "permission_level": "IS_OWNER" < } < ], < "display_name": "<ME>", < "user_name": "<ME>" < }, < { < "all_permissions": [ < { < "inherited": true, < "inherited_from_object": [ < "/sql/warehouses/" < ], < "permission_level": "CAN_MANAGE" < } < ], < "group_name": "admins" < } < ], < "object_id": "/sql/warehouses/<ID>", < "object_type": "warehouses" < } pid=53248 sdk=true ``` This PR modifies the SQL warehouse configuration for `databricks_permissions` to be chosen for instances with an ID of the form `/warehouses/...`. ## Tests The additional integration test ensures that a resource can be imported with the `/warehouses/<ID>` format.
1 parent 8b2a735 commit e504790

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

internal/acceptance/permissions_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,16 @@ func TestAccPermissions_SqlWarehouses(t *testing.T) {
617617
resource "databricks_sql_endpoint" "this" {
618618
name = "{var.STICKY_RANDOM}"
619619
cluster_size = "2X-Small"
620+
tags {
621+
custom_tags {
622+
key = "Owner"
623+
value = "eng-dev-ecosystem-team_at_databricks.com"
624+
}
625+
}
620626
}`
627+
ctx := context.Background()
628+
w := databricks.Must(databricks.NewWorkspaceClient())
629+
var warehouseId string
621630
WorkspaceLevel(t, Step{
622631
Template: sqlWarehouseTemplate + makePermissionsTestStage("sql_endpoint_id", "databricks_sql_endpoint.this.id", groupPermissions("CAN_USE")),
623632
}, Step{
@@ -638,15 +647,24 @@ func TestAccPermissions_SqlWarehouses(t *testing.T) {
638647
}, Step{
639648
Template: sqlWarehouseTemplate,
640649
Check: func(s *terraform.State) error {
641-
w := databricks.Must(databricks.NewWorkspaceClient())
642-
id := s.RootModule().Resources["databricks_sql_endpoint.this"].Primary.ID
643-
warehouse, err := w.Warehouses.GetById(context.Background(), id)
650+
warehouseId = s.RootModule().Resources["databricks_sql_endpoint.this"].Primary.ID
651+
warehouse, err := w.Warehouses.GetById(ctx, warehouseId)
644652
assert.NoError(t, err)
645-
permissions, err := w.Permissions.GetByRequestObjectTypeAndRequestObjectId(context.Background(), "warehouses", id)
653+
permissions, err := w.Permissions.GetByRequestObjectTypeAndRequestObjectId(context.Background(), "warehouses", warehouseId)
646654
assert.NoError(t, err)
647655
assertContainsPermission(t, permissions, currentPrincipalType(t), warehouse.CreatorName, iam.PermissionLevelIsOwner)
648656
return nil
649657
},
658+
}, Step{
659+
// To test import, a new permission must be added to the warehouse, as it is not possible to import databricks_permissions
660+
// for a warehouse that has the default permissions (i.e. current user has IS_OWNER and admins have CAN_MANAGE).
661+
Template: sqlWarehouseTemplate + makePermissionsTestStage("sql_endpoint_id", "databricks_sql_endpoint.this.id", groupPermissions("CAN_USE")),
662+
}, Step{
663+
Template: sqlWarehouseTemplate + makePermissionsTestStage("sql_endpoint_id", "databricks_sql_endpoint.this.id", groupPermissions("CAN_USE")),
664+
// Verify that we can use "/warehouses/<ID>" instead of "/sql/warehouses/<ID>"
665+
ResourceName: "databricks_permissions.this",
666+
ImportState: true,
667+
ImportStateIdFunc: func(s *terraform.State) (string, error) { return "/warehouses/" + warehouseId, nil },
650668
})
651669
}
652670

permissions/permission_definitions.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,11 @@ func allResourcePermissions() []resourcePermissions {
558558
field: "sql_endpoint_id",
559559
objectType: "warehouses",
560560
requestObjectType: "sql/warehouses",
561+
// ISSUE-4143: some older warehouse permissions have an ID that starts with "/warehouses" instead of "/sql/warehouses"
562+
// Because no idRetriever is defined, any warehouse permissions resources will be created with the "/sql/warehouses" prefix.
563+
idMatcher: func(id string) bool {
564+
return strings.HasPrefix(id, "/sql/warehouses/") || strings.HasPrefix(id, "/warehouses/")
565+
},
561566
allowedPermissionLevels: map[string]permissionLevelOptions{
562567
"CAN_USE": {isManagementPermission: false},
563568
"CAN_MANAGE": {isManagementPermission: true},

0 commit comments

Comments
 (0)