Skip to content

Commit 6308195

Browse files
committed
feat: iam refactor; entitlements
1 parent 340b226 commit 6308195

File tree

3 files changed

+82
-52
lines changed

3 files changed

+82
-52
lines changed

iam.tf

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,83 @@
1-
data "databricks_group" "admins" {
2-
display_name = "admins"
1+
locals {
2+
admin_user_map = var.workspace_admins.user == null ? {} : {
3+
for user in var.workspace_admins.user : "user.${user}" => user if user != null
4+
}
5+
6+
admin_sp_map = var.workspace_admins.service_principal == null ? {} : {
7+
for sp in var.workspace_admins.service_principal : "service_principal.${sp}" => sp if sp != null
8+
}
9+
10+
members_object_list = concat(
11+
flatten([for group, params in var.iam : [
12+
for pair in setproduct([group], params.user) : {
13+
type = "user", group = pair[0], member = pair[1]
14+
}] if params.user != null
15+
]),
16+
flatten([for group, params in var.iam : [
17+
for pair in setproduct([group], params.service_principal) : {
18+
type = "service_principal", group = pair[0], member = pair[1]
19+
}] if params.service_principal != null
20+
])
21+
)
322
}
423

524
resource "databricks_group" "this" {
6-
for_each = toset([for group in keys(var.iam) : group if group != "admins"])
25+
for_each = toset(keys(var.iam))
726

827
display_name = each.key
9-
lifecycle { ignore_changes = [external_id] }
28+
lifecycle { ignore_changes = [external_id, allow_cluster_create, allow_instance_pool_create, databricks_sql_access, workspace_access] }
1029
}
1130

1231
resource "databricks_user" "this" {
13-
for_each = toset(flatten([for k, v in { for group, member in var.iam : group => member["user"] } : distinct(flatten(v))]))
32+
for_each = toset(flatten(concat(
33+
values({ for group, member in var.iam : group => member.user if member.user != null }),
34+
values(local.admin_user_map)
35+
)))
1436

15-
user_name = each.value
16-
databricks_sql_access = true
17-
lifecycle { ignore_changes = [external_id] }
37+
user_name = each.key
38+
lifecycle { ignore_changes = [external_id, allow_cluster_create, allow_instance_pool_create, databricks_sql_access, workspace_access] }
1839
}
1940

2041
resource "databricks_service_principal" "this" {
21-
for_each = toset(flatten([for k, v in { for group, member in var.iam : group => member["service_principal"] } : distinct(flatten(v))]))
22-
23-
display_name = each.value
24-
application_id = lookup(var.user_object_ids, each.value)
25-
databricks_sql_access = true
26-
}
27-
28-
resource "databricks_group_member" "admin_users" {
29-
for_each = { for entry in flatten([for group, types in var.iam : [for type in types : [for member in type : {
30-
group = group, member = member
31-
} if group == "admins" && type == types["user"]]]]) : "${entry.group}.${entry.member}" => entry }
32-
33-
group_id = data.databricks_group.admins.id
34-
member_id = databricks_user.this[each.value.member].id
42+
for_each = toset(flatten(concat(
43+
values({ for group, member in var.iam : group => member.service_principal if member.service_principal != null }),
44+
values(local.admin_sp_map)
45+
)))
46+
47+
display_name = each.key
48+
application_id = lookup(var.user_object_ids, each.value)
49+
lifecycle { ignore_changes = [external_id, allow_cluster_create, allow_instance_pool_create, databricks_sql_access, workspace_access] }
3550
}
3651

37-
resource "databricks_group_member" "admin_service_principals" {
38-
for_each = { for entry in flatten([for group, types in var.iam : [for type in types : [for member in type : {
39-
group = group, member = member
40-
} if group == "admins" && type == types["service_principal"]]]]) : "${entry.group}.${entry.member}" => entry }
52+
resource "databricks_permission_assignment" "this" {
53+
for_each = merge(local.admin_user_map, local.admin_sp_map)
4154

42-
group_id = data.databricks_group.admins.id
43-
member_id = databricks_service_principal.this[each.value.member].id
55+
principal_id = startswith(each.key, "user") ? databricks_user.this[each.value].id : databricks_service_principal.this[each.value].id
56+
permissions = ["ADMIN"]
4457
}
4558

46-
resource "databricks_group_member" "users" {
47-
for_each = { for entry in flatten([for group, types in var.iam : [for type in types : [for member in type : {
48-
group = group, member = member
49-
} if group != "admins" && group != "users" && type == types["user"]]]]) : "${entry.group}.${entry.member}" => entry }
59+
resource "databricks_group_member" "this" {
60+
for_each = {
61+
for entry in local.members_object_list : "${entry.type}.${entry.group}.${entry.member}" => entry
62+
}
5063

5164
group_id = databricks_group.this[each.value.group].id
52-
member_id = databricks_user.this[each.value.member].id
65+
member_id = startswith(each.key, "user") ? databricks_user.this[each.value.member].id : databricks_service_principal.this[each.value.member].id
5366
}
5467

55-
resource "databricks_group_member" "service_principals" {
56-
for_each = { for entry in flatten([for group, types in var.iam : [for type in types : [for member in type : {
57-
group = group, member = member
58-
} if group != "admins" && group != "users" && type == types["service_principal"]]]]) : "${entry.group}.${entry.member}" => entry }
68+
resource "databricks_entitlements" "this" {
69+
for_each = {
70+
for group, params in var.iam : group => params.entitlements
71+
if params.entitlements != null
72+
}
5973

60-
group_id = databricks_group.this[each.value.group].id
61-
member_id = databricks_service_principal.this[each.value.member].id
74+
group_id = databricks_group.this[each.key].id
75+
allow_cluster_create = contains(each.value, "allow_cluster_create")
76+
allow_instance_pool_create = contains(each.value, "allow_instance_pool_create")
77+
databricks_sql_access = contains(each.value, "databricks_sql_access")
78+
workspace_access = true
79+
80+
depends_on = [databricks_group_member.this]
6281
}
6382

6483
resource "databricks_permissions" "sql_endpoint" {

variables.tf

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,32 @@ variable "user_object_ids" {
1414
default = {}
1515
}
1616

17-
variable "iam" {
18-
type = map(object({
17+
variable "workspace_admins" {
18+
type = object({
1919
user = list(string)
2020
service_principal = list(string)
21-
}))
22-
description = "Map of groups and members of users and service principals to be created. You can add you own groups and members. E.g., `'group' = { user = ['user1','user2'] service_principal = ['sp1']}` and etc."
21+
})
22+
description = "Provide users or service principals to grant them Admin permissions."
2323
default = {
24-
"admins" = {
25-
"user" = []
26-
"service_principal" = []
27-
}
28-
"default" = {
29-
"user" = []
30-
"service_principal" = []
31-
}
24+
user = null
25+
service_principal = null
26+
}
27+
}
28+
29+
variable "iam" {
30+
type = map(object({
31+
user = optional(list(string))
32+
service_principal = optional(list(string))
33+
entitlements = optional(list(string))
34+
}))
35+
description = "Used to create workspace group. Map of group name and its parameters, such as users and service principals added to the group. Also possible to configure group entitlements."
36+
default = {}
37+
38+
validation {
39+
condition = contains(values(var.iam), "entitlements") ? alltrue([
40+
for item in toset(flatten([for group, params in var.iam : params.entitlements])) : contains(["allow_cluster_create", "allow_instance_pool_create", "databricks_sql_access"], item)
41+
]) : true
42+
error_message = "Entitlements validation. The only suitable values are: databricks_sql_access, allow_instance_pool_create, allow_cluster_create"
3243
}
3344
}
3445

versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ terraform {
44
required_providers {
55
databricks = {
66
source = "databricks/databricks"
7-
version = ">=1.4.0"
7+
version = ">=1.9.0"
88
}
99
}
1010
}

0 commit comments

Comments
 (0)