Skip to content

Commit f1a498b

Browse files
Access control: Fix a bug with data source permission resource and allow assigning permissions for basic roles (#692)
* set and update builtin roles * don't allow updating admin role * fix tests * extend docs * feedback * fix a typo * remove restrictions for admin basic role * doc update * update Golang API client dependency * update docs
1 parent d138f12 commit f1a498b

File tree

6 files changed

+26
-10
lines changed

6 files changed

+26
-10
lines changed

docs/resources/data_source_permission.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ resource "grafana_data_source_permission" "fooPermissions" {
4242
user_id = 3 // 3 is the admin user in cloud. It can't be queried
4343
permission = "Edit"
4444
}
45+
permissions {
46+
built_in_role = "Viewer"
47+
permission = "Query"
48+
}
4549
}
4650
```
4751

@@ -66,6 +70,7 @@ Required:
6670

6771
Optional:
6872

73+
- `built_in_role` (String) Name of the basic role to manage permissions for. Options: `Viewer`, `Editor` or `Admin`. Can only be set from Grafana v9.2.3+. Defaults to ``.
6974
- `team_id` (Number) ID of the team to manage permissions for. Defaults to `0`.
7075
- `user_id` (Number) ID of the user to manage permissions for. Defaults to `0`.
7176

examples/resources/grafana_data_source_permission/resource.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,8 @@ resource "grafana_data_source_permission" "fooPermissions" {
2727
user_id = 3 // 3 is the admin user in cloud. It can't be queried
2828
permission = "Edit"
2929
}
30+
permissions {
31+
built_in_role = "Viewer"
32+
permission = "Query"
33+
}
3034
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.18
55
require (
66
github.com/Masterminds/semver/v3 v3.1.1
77
github.com/grafana/amixr-api-go-client v0.0.5
8-
github.com/grafana/grafana-api-golang-client v0.13.0
8+
github.com/grafana/grafana-api-golang-client v0.13.1
99
github.com/grafana/machine-learning-go-client v0.2.0
1010
github.com/grafana/synthetic-monitoring-agent v0.10.2
1111
github.com/grafana/synthetic-monitoring-api-go-client v0.6.3

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
7676
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7777
github.com/grafana/amixr-api-go-client v0.0.5 h1:jqmljnd5FozuOsCNuyhZVpooxmj0BW9MmeLA7PaLK6U=
7878
github.com/grafana/amixr-api-go-client v0.0.5/go.mod h1:N6x26XUrM5zGtK5zL5vNJnAn2JFMxLFPPLTw/6pDkFE=
79-
github.com/grafana/grafana-api-golang-client v0.13.0 h1:o/gL3F7EjBSBKgrpjH9/+sYFJ0HBUofvAYlKhrT2opE=
80-
github.com/grafana/grafana-api-golang-client v0.13.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E=
79+
github.com/grafana/grafana-api-golang-client v0.13.1 h1:a5R8bIwL98xd79zFTQnYgpva3ns7Nm5/DnVAWYBdWVk=
80+
github.com/grafana/grafana-api-golang-client v0.13.1/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E=
8181
github.com/grafana/machine-learning-go-client v0.2.0 h1:5JgfJn5Q72D0jZlXnM0gZ9lV4Q4zzq9X0GVfPu8Vxis=
8282
github.com/grafana/machine-learning-go-client v0.2.0/go.mod h1:QFfZz8NkqVF8++skjkKQXJEZfpCYd8S0yTWJUpsLLTA=
8383
github.com/grafana/synthetic-monitoring-agent v0.10.2 h1:lbz1o+ETxOk+2ylY2JJ4PNcbwqT17Rb0ZexyyD0dI4Y=

grafana/resource_datasource_permission.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ func ResourceDatasourcePermission() *schema.Resource {
5151
Default: 0,
5252
Description: "ID of the user to manage permissions for.",
5353
},
54+
"built_in_role": {
55+
Type: schema.TypeString,
56+
Optional: true,
57+
Default: "",
58+
ValidateFunc: validation.StringInSlice([]string{"Viewer", "Editor", "Admin"}, false),
59+
Description: "Name of the basic role to manage permissions for. Options: `Viewer`, `Editor` or `Admin`. Can only be set from Grafana v9.2.3+.",
60+
},
5461
"permission": {
5562
Type: schema.TypeString,
5663
Required: true,
@@ -83,6 +90,9 @@ func UpdateDatasourcePermissions(ctx context.Context, d *schema.ResourceData, me
8390
if permission["user_id"].(int) != -1 {
8491
permissionItem.UserID = int64(permission["user_id"].(int))
8592
}
93+
if permission["built_in_role"].(string) != "" {
94+
permissionItem.BuiltInRole = permission["built_in_role"].(string)
95+
}
8696
var err error
8797
if permissionItem.Permission, err = mapDatasourcePermissionStringToType(permission["permission"].(string)); err != nil {
8898
return diag.FromErr(err)
@@ -121,8 +131,10 @@ func ReadDatasourcePermissions(ctx context.Context, d *schema.ResourceData, meta
121131
permissionItems := make([]interface{}, len(response.Permissions))
122132
for i, permission := range response.Permissions {
123133
permissionItem := make(map[string]interface{})
134+
permissionItem["built_in_role"] = permission.BuiltInRole
124135
permissionItem["team_id"] = permission.TeamID
125136
permissionItem["user_id"] = permission.UserID
137+
126138
if permissionItem["permission"], err = mapDatasourcePermissionTypeToString(permission.Permission); err != nil {
127139
return diag.FromErr(err)
128140
}
@@ -154,7 +166,7 @@ func DeleteDatasourcePermissions(ctx context.Context, d *schema.ResourceData, me
154166

155167
func updateDatasourcePermissions(client *gapi.Client, id int64, permissions []*gapi.DatasourcePermissionAddPayload, enable, disable bool) error {
156168
areEqual := func(a *gapi.DatasourcePermission, b *gapi.DatasourcePermissionAddPayload) bool {
157-
return a.Permission == b.Permission && a.TeamID == b.TeamID && a.UserID == b.UserID
169+
return a.Permission == b.Permission && a.TeamID == b.TeamID && a.UserID == b.UserID && a.BuiltInRole == b.BuiltInRole
158170
}
159171

160172
response, err := client.DatasourcePermissions(id)

grafana/resource_datasource_permission_test.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import (
1010
)
1111

1212
func TestAccDatasourcePermission_basic(t *testing.T) {
13-
t.Skip("skipping this test as the resource is going be deprecated soon and the test is flaky due to the Grafana server implementation")
14-
1513
CheckCloudInstanceTestsEnabled(t)
1614

1715
datasourceID := int64(-1)
@@ -23,7 +21,7 @@ func TestAccDatasourcePermission_basic(t *testing.T) {
2321
Config: testAccExample(t, "resources/grafana_data_source_permission/resource.tf"),
2422
Check: resource.ComposeAggregateTestCheckFunc(
2523
testAccDatasourcePermissionsCheckExists("grafana_data_source_permission.fooPermissions", &datasourceID),
26-
resource.TestCheckResourceAttr("grafana_data_source_permission.fooPermissions", "permissions.#", "2"),
24+
resource.TestCheckResourceAttr("grafana_data_source_permission.fooPermissions", "permissions.#", "3"),
2725
),
2826
},
2927
{
@@ -72,9 +70,6 @@ func testAccDatasourcePermissionCheckDestroy(datasourceID *int64) resource.TestC
7270
if err != nil {
7371
return fmt.Errorf("error getting datasource permissions %d: %s", *datasourceID, err)
7472
}
75-
if response.Enabled {
76-
return fmt.Errorf("datasource permissions %d still enabled", *datasourceID)
77-
}
7873
if len(response.Permissions) > 0 {
7974
return fmt.Errorf("permissions were not empty when expected")
8075
}

0 commit comments

Comments
 (0)