-
Notifications
You must be signed in to change notification settings - Fork 458
Description
Use-cases
The databricks provider currently offers resources such as databricks_grants
and databricks_permissions
(and probably several others that work in the same manner, but those are the two I am working with right now). These resources require you to assign all grants/permissions for a specific entity (such as a metastore, catalog, etc.) within the same resource.
For example (from the official docs):
resource "databricks_grants" "sandbox" {
metastore = databricks_metastore.this.id
grant {
principal = "Data Engineers"
privileges = ["CREATE_CATALOG", "CREATE_EXTERNAL_LOCATION"]
}
grant {
principal = "Data Sharer"
privileges = ["CREATE_RECIPIENT", "CREATE_SHARE"]
}
}
The above is the only place where I can add grants to the databricks_metastore.this.id
resource. Any additional combinations of entity, principal and privilege can only be added here. This makes composition in complicated terraform projects extremely difficult. We generally follow the principle of modular composition where each individual module is self-contained and additional, self-contained modules can be added without needing to change existing ones. With a resource such as databricks_grants
this is not possible. We would prefer to set a singular resources such as databricks_grant
(and databricks_permission
etc.) for each specific combination of entity/principal/privileges.
This would be in line with how role assignments are for example dealt with by the Azure Resource Manager.
resource "azurerm_role_assignment" "example2" {
name = "role-assignement-1" //this field is optional. if left out a GUID will be generated
scope = var.my_resource_id
principal_id = var_principal_id
role_definition_id = var_role_definition_1_resource_id
}
resource "azurerm_role_assignment" "example2" {
name = "role-assignement-2"
scope = var.my_resource_id
principal_id = var_principal_id
role_definition_id = var_role_definition_2_resource_id
}
This is possible because the "name" field is what uniquely defines the role assignment resource.
Proposal
I would suggest allow for a databricks_grant
(and similar for other resources) as follows:
resource "databricks_grant" "data_sharers" {
name = "data-sharer-1" // make this field optional; generate GUID if not set. This is the resource ID
metastore = databricks_metastore.this.id
principal = "Data Sharer"
privileges = ["CREATE_RECIPIENT", "CREATE_SHARE"]
}
resource "databricks_grant" "data_engineers" {
name = "data-engineers-1" // make this field optional; generate GUID if not set. This is the resource ID
metastore = databricks_metastore.this.id
principal = "Data Engineers"
privileges = ["CREATE_CATALOG", "CREATE_EXTERNAL_LOCATION"]
}