Skip to content

Commit c04ca75

Browse files
committed
Refactor service principal permissions validation and enhance local comments
1 parent e9a0056 commit c04ca75

File tree

2 files changed

+22
-22
lines changed

2 files changed

+22
-22
lines changed

modules/iam/main.tf

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@ resource "databricks_service_principal" "this" {
88
}
99

1010
locals {
11-
# For each Databricks service principal, convert permission objects to access control rule objects.
12-
#
11+
# For each Databricks service principal, convert permission objects to access
12+
# control rule objects. Service principals are currently the only type of
13+
# object in Databricks that do not support the "databricks_permissions"
14+
# resource for managing access control. In this module, we provide a
15+
# permissions-like interface for managing service principal access control
16+
# using the "databricks_access_control_rule_set" resource. If support for
17+
# using the "databricks_permissions" resource is added in the future, we
18+
# should be able to make the switch without changing this interface.
1319
access_control_rules = {
1420
for key, sp in var.service_principals : key => [for permission in sp.permissions : {
1521
acl_user_id = permission.user_name != null ? "users/${permission.user_name}" : null
@@ -23,15 +29,13 @@ locals {
2329
}
2430
}
2531

26-
data "databricks_current_user" "this" {}
27-
2832
resource "databricks_access_control_rule_set" "service_principal" {
2933
for_each = databricks_service_principal.this
3034

3135
name = "accounts/${var.account_id}/servicePrincipals/${each.value.application_id}/ruleSets/default"
3236

3337
grant_rules {
34-
principals = concat([data.databricks_current_user.this.acl_principal_id], [for rule in local.access_control_rules[each.key] : coalesce(rule.acl_user_id, rule.acl_group_id, rule.acl_service_principal_id) if rule.role == "roles/servicePrincipal.manager"])
38+
principals = [for rule in local.access_control_rules[each.key] : coalesce(rule.acl_user_id, rule.acl_group_id, rule.acl_service_principal_id) if rule.role == "roles/servicePrincipal.manager"]
3539
role = "roles/servicePrincipal.manager"
3640
}
3741

modules/iam/variables.tf

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
variable "account_id" {
2-
# TODO: add description.
3-
type = string
4-
nullable = false
2+
description = "The ID of the Databricks account to manage service principal permissions for."
3+
type = string
4+
nullable = false
55
}
66

77
variable "service_principals" {
@@ -16,27 +16,23 @@ variable "service_principals" {
1616
group_name = optional(string)
1717
service_principal_name = optional(string)
1818
permission_level = string
19-
})))
19+
})), [])
2020
}))
2121
nullable = false
22-
default = {
23-
"example" = {
24-
display_name = "example-sp"
25-
permissions = [
26-
{
27-
user_name = "example-user"
28-
group_name = "example-group"
29-
permission_level = "foo"
30-
}
31-
]
32-
}
22+
default = {}
23+
24+
validation {
25+
condition = alltrue([
26+
for _, sp in var.service_principals : length(sp.permissions) > 0
27+
])
28+
error_message = "At least one permission object must be specified."
3329
}
3430

3531
validation {
3632
condition = alltrue([
3733
for _, sp in var.service_principals :
3834
alltrue([
39-
for p in coalesce(sp.permissions, []) :
35+
for p in sp.permissions :
4036
length(compact([p.user_name, p.group_name, p.service_principal_name])) == 1
4137
])
4238
])
@@ -47,7 +43,7 @@ variable "service_principals" {
4743
condition = alltrue([
4844
for _, sp in var.service_principals :
4945
alltrue([
50-
for p in coalesce(sp.permissions, []) :
46+
for p in sp.permissions :
5147
p.permission_level == "CAN_MANAGE" || p.permission_level == "CAN_USE"
5248
])
5349
])

0 commit comments

Comments
 (0)