Skip to content

Commit 41b58eb

Browse files
authored
Exporter: Add support for databricks_mws_permission_assignment resource (#3562)
This resource could be exported only on account level
1 parent 69fc374 commit 41b58eb

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

docs/guides/experimental-exporter.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Services are just logical groups of resources used for filtering and organizatio
6262
-> **Note**
6363
Please note that for services not marked with **listing**, we'll export resources only if they are referenced from other resources.
6464

65-
* `access` - [databricks_permissions](../resources/permissions.md), [databricks_instance_profile](../resources/instance_profile.md) and [databricks_ip_access_list](../resources/ip_access_list.md).
65+
* `access` - [databricks_permissions](../resources/permissions.md), [databricks_instance_profile](../resources/instance_profile.md), [databricks_ip_access_list](../resources/ip_access_list.md), [databricks_mws_permission_assignment](../resources/mws_permission_assignment.md) and [databricks_access_control_rule_set](../resources/access_control_rule_set.md).
6666
* `compute` - **listing** [databricks_cluster](../resources/cluster.md).
6767
* `directories` - **listing** [databricks_directory](../resources/directory.md).
6868
* `dlt` - **listing** [databricks_pipeline](../resources/pipeline.md).
@@ -143,6 +143,7 @@ Exporter aims to generate HCL code for most of the resources within the Databric
143143
| [databricks_mlflow_model](../resources/mlflow_model.md) | No | No | No | No |
144144
| [databricks_mlflow_webhook](../resources/mlflow_webhook.md) | Yes | Yes | Yes | No |
145145
| [databricks_model_serving](../resources/model_serving) | Yes | Yes | Yes | No |
146+
| [databricks_mws_permission_assignment](../resources/mws_permission_assignment.md) | Yes | No | No | Yes |
146147
| [databricks_notebook](../resources/notebook.md) | Yes | Yes | Yes | No |
147148
| [databricks_obo_token](../resources/obo_token.md) | Not Applicable | No | No | No |
148149
| [databricks_permissions](../resources/permissions.md) | Yes | No | Yes | No |

exporter/importables.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/databricks/terraform-provider-databricks/clusters"
2828
"github.com/databricks/terraform-provider-databricks/common"
2929
"github.com/databricks/terraform-provider-databricks/jobs"
30+
"github.com/databricks/terraform-provider-databricks/mws"
3031
"github.com/databricks/terraform-provider-databricks/permissions"
3132
"github.com/databricks/terraform-provider-databricks/pipelines"
3233
"github.com/databricks/terraform-provider-databricks/repos"
@@ -2985,4 +2986,69 @@ var resourcesMap map[string]importable = map[string]importable{
29852986
{Path: "path", Resource: "databricks_volume", Match: "volume_path", MatchType: MatchLongestPrefix},
29862987
},
29872988
},
2989+
"databricks_mws_permission_assignment": {
2990+
AccountLevel: true,
2991+
Service: "access",
2992+
List: func(ic *importContext) error {
2993+
workspaces, err := ic.accountClient.Workspaces.List(ic.Context)
2994+
if err != nil {
2995+
return err
2996+
}
2997+
for _, ws := range workspaces {
2998+
pas, err := ic.accountClient.WorkspaceAssignment.ListByWorkspaceId(ic.Context, ws.WorkspaceId)
2999+
if err != nil {
3000+
log.Printf("[ERROR] listing workspace permission assignments for workspace %d: %s", ws.WorkspaceId, err.Error())
3001+
continue
3002+
}
3003+
log.Printf("[DEBUG] Emitting permission assignments for workspace %d", ws.WorkspaceId)
3004+
for _, pa := range pas.PermissionAssignments {
3005+
perm := "unknown"
3006+
if len(pa.Permissions) > 0 {
3007+
perm = pa.Permissions[0].String()
3008+
}
3009+
nm := fmt.Sprintf("mws_pa_%d_%s_%s_%d", ws.WorkspaceId, pa.Principal.DisplayName,
3010+
perm, pa.Principal.PrincipalId)
3011+
// We generate Data directly to avoid calling APIs
3012+
data := mws.ResourceMwsPermissionAssignment().ToResource().TestResourceData()
3013+
scm := ic.Resources["databricks_mws_permission_assignment"].Schema
3014+
data.MarkNewResource()
3015+
paId := fmt.Sprintf("%d|%d", ws.WorkspaceId, pa.Principal.PrincipalId)
3016+
data.SetId(paId)
3017+
common.StructToData(pa, scm, data)
3018+
data.Set("workspace_id", ws.WorkspaceId)
3019+
data.Set("principal_id", pa.Principal.PrincipalId)
3020+
ic.Emit(&resource{
3021+
Resource: "databricks_mws_permission_assignment",
3022+
ID: paId,
3023+
Name: nameNormalizationRegex.ReplaceAllString(nm, "_"),
3024+
Data: data,
3025+
})
3026+
// Emit principals
3027+
strPrincipalId := fmt.Sprintf("%d", pa.Principal.PrincipalId)
3028+
if pa.Principal.ServicePrincipalName != "" {
3029+
ic.Emit(&resource{
3030+
Resource: "databricks_service_principal",
3031+
ID: strPrincipalId,
3032+
})
3033+
} else if pa.Principal.UserName != "" {
3034+
ic.Emit(&resource{
3035+
Resource: "databricks_user",
3036+
ID: strPrincipalId,
3037+
})
3038+
} else if pa.Principal.GroupName != "" {
3039+
ic.Emit(&resource{
3040+
Resource: "databricks_group",
3041+
ID: strPrincipalId,
3042+
})
3043+
}
3044+
}
3045+
}
3046+
return nil
3047+
},
3048+
Depends: []reference{
3049+
{Resource: "databricks_service_principal", Path: "principal_id"},
3050+
{Resource: "databricks_user", Path: "principal_id"},
3051+
{Resource: "databricks_group", Path: "principal_id"},
3052+
},
3053+
},
29883054
}

0 commit comments

Comments
 (0)