Skip to content

Commit dc03cfa

Browse files
authored
Merge pull request #21 from data-platform-hq/feat/entitlements_databricks_account_level_groups
feat: entitlements for databricks_account_level_groups
2 parents c06fa00 + 280425b commit dc03cfa

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

iam.tf

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,50 @@ locals {
88
}
99

1010
members_object_list = concat(
11-
flatten([for group, params in var.iam : [
11+
flatten([for group, params in var.iam_workspace_groups : [
1212
for pair in setproduct([group], params.user) : {
1313
type = "user", group = pair[0], member = pair[1]
1414
}] if params.user != null
1515
]),
16-
flatten([for group, params in var.iam : [
16+
flatten([for group, params in var.iam_workspace_groups : [
1717
for pair in setproduct([group], params.service_principal) : {
1818
type = "service_principal", group = pair[0], member = pair[1]
1919
}] if params.service_principal != null
2020
])
2121
)
22+
23+
iam_account_map = tomap({
24+
for group in var.iam_account_groups : group.group_name => group.entitlements
25+
if group.group_name != null
26+
})
27+
28+
iam_workspace_map = {
29+
for group, params in var.iam_workspace_groups : group => params.entitlements
30+
}
31+
}
32+
33+
data "databricks_group" "account_groups" {
34+
for_each = local.iam_account_map
35+
36+
display_name = each.key
2237
}
2338

2439
data "databricks_group" "admin" {
40+
count = length(local.iam_account_map) != 0 ? 0 : 1
41+
2542
display_name = "admins"
2643
}
2744

2845
resource "databricks_group" "this" {
29-
for_each = toset(keys(var.iam))
46+
for_each = length(local.iam_account_map) != 0 ? [] : toset(keys(var.iam_workspace_groups))
3047

3148
display_name = each.key
3249
lifecycle { ignore_changes = [external_id, allow_cluster_create, allow_instance_pool_create, databricks_sql_access, workspace_access] }
3350
}
3451

3552
resource "databricks_user" "this" {
3653
for_each = toset(flatten(concat(
37-
values({ for group, member in var.iam : group => member.user if member.user != null }),
54+
values({ for group, member in var.iam_workspace_groups : group => member.user if member.user != null }),
3855
values(local.admin_user_map)
3956
)))
4057

@@ -44,7 +61,7 @@ resource "databricks_user" "this" {
4461

4562
resource "databricks_service_principal" "this" {
4663
for_each = toset(flatten(concat(
47-
values({ for group, member in var.iam : group => member.service_principal if member.service_principal != null }),
64+
values({ for group, member in var.iam_workspace_groups : group => member.service_principal if member.service_principal != null }),
4865
values(local.admin_sp_map)
4966
)))
5067

@@ -54,14 +71,14 @@ resource "databricks_service_principal" "this" {
5471
}
5572

5673
resource "databricks_group_member" "admin" {
57-
for_each = merge(local.admin_user_map, local.admin_sp_map)
74+
for_each = length(local.iam_account_map) != 0 ? {} : merge(local.admin_user_map, local.admin_sp_map)
5875

59-
group_id = data.databricks_group.admin.id
76+
group_id = data.databricks_group.admin[0].id
6077
member_id = startswith(each.key, "user") ? databricks_user.this[each.value].id : databricks_service_principal.this[each.value].id
6178
}
6279

6380
resource "databricks_group_member" "this" {
64-
for_each = {
81+
for_each = length(local.iam_account_map) != 0 ? {} : {
6582
for entry in local.members_object_list : "${entry.type}.${entry.group}.${entry.member}" => entry
6683
}
6784

@@ -70,14 +87,12 @@ resource "databricks_group_member" "this" {
7087
}
7188

7289
resource "databricks_entitlements" "this" {
73-
for_each = {
74-
for group, params in var.iam : group => params
75-
}
90+
for_each = length(local.iam_account_map) != 0 ? local.iam_account_map : local.iam_workspace_map
7691

77-
group_id = databricks_group.this[each.key].id
78-
allow_cluster_create = contains(coalesce(each.value.entitlements, ["none"]), "allow_cluster_create")
79-
allow_instance_pool_create = contains(coalesce(each.value.entitlements, ["none"]), "allow_instance_pool_create")
80-
databricks_sql_access = contains(coalesce(each.value.entitlements, ["none"]), "databricks_sql_access")
92+
group_id = length(local.iam_account_map) != 0 ? data.databricks_group.account_groups[each.key].id : databricks_group.this[each.key].id
93+
allow_cluster_create = contains(coalesce(each.value, ["none"]), "allow_cluster_create")
94+
allow_instance_pool_create = contains(coalesce(each.value, ["none"]), "allow_instance_pool_create")
95+
databricks_sql_access = contains(coalesce(each.value, ["none"]), "databricks_sql_access")
8196
workspace_access = true
8297

8398
depends_on = [databricks_group_member.this]

permissions.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ resource "databricks_permissions" "clusters" {
1717
dynamic "access_control" {
1818
for_each = each.value.permissions
1919
content {
20-
group_name = databricks_group.this[access_control.value.group_name].display_name
20+
group_name = length(var.iam_workspace_groups) != 0 ? data.databricks_group.account_groups[access_control.value.group_name].display_name : databricks_group.this[access_control.value.group_name].display_name
2121
permission_level = access_control.value.permission_level
2222
}
2323
}
@@ -34,7 +34,7 @@ resource "databricks_permissions" "sql_endpoint" {
3434
dynamic "access_control" {
3535
for_each = each.value.permissions
3636
content {
37-
group_name = databricks_group.this[access_control.value.group_name].display_name
37+
group_name = length(var.iam_workspace_groups) != 0 ? data.databricks_group.account_groups[access_control.value.group_name].display_name : databricks_group.this[access_control.value.group_name].display_name
3838
permission_level = access_control.value.permission_level
3939
}
4040
}
@@ -44,6 +44,6 @@ resource "databricks_secret_acl" "this" {
4444
for_each = { for entry in local.secrets_acl_objects_list : "${entry.scope}.${entry.principal}.${entry.permission}" => entry }
4545

4646
scope = databricks_secret_scope.this[each.value.scope].name
47-
principal = databricks_group.this[each.value.principal].display_name
47+
principal = length(var.iam_workspace_groups) != 0 ? data.databricks_group.account_groups[each.value.principal].display_name : databricks_group.this[each.value.principal].display_name
4848
permission = each.value.permission
4949
}

variables.tf

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,16 @@ variable "workspace_admins" {
4343
}
4444
}
4545

46-
variable "iam" {
46+
variable "iam_account_groups" {
47+
type = list(object({
48+
group_name = optional(string)
49+
entitlements = optional(list(string))
50+
}))
51+
description = "List of objects with group name and entitlements for this group"
52+
default = []
53+
}
54+
55+
variable "iam_workspace_groups" {
4756
type = map(object({
4857
user = optional(list(string))
4958
service_principal = optional(list(string))
@@ -53,8 +62,8 @@ variable "iam" {
5362
default = {}
5463

5564
validation {
56-
condition = length([for item in values(var.iam)[*] : item.entitlements if item.entitlements != null]) != 0 ? alltrue([
57-
for entry in flatten(values(var.iam)[*].entitlements) : contains(["allow_cluster_create", "allow_instance_pool_create", "databricks_sql_access"], entry) if entry != null
65+
condition = length([for item in values(var.iam_workspace_groups)[*] : item.entitlements if item.entitlements != null]) != 0 ? alltrue([
66+
for entry in flatten(values(var.iam_workspace_groups)[*].entitlements) : contains(["allow_cluster_create", "allow_instance_pool_create", "databricks_sql_access"], entry) if entry != null
5867
]) : true
5968
error_message = "Entitlements validation. The only suitable values are: databricks_sql_access, allow_instance_pool_create, allow_cluster_create"
6069
}

0 commit comments

Comments
 (0)