Skip to content

Commit 341a1f4

Browse files
Folder/Dashboard Permissions Tests: Use OpenAPI (#1232)
Also: - Make the tests for these two resource roughly the same. These resources have the same interface - Actually test that permissions are applied in Grafana. The current checks were only fetching without checking. But you can fetch permissions on a folder/dashboard without any permissions - For dashboard, check that either setting empty permissions or deleting the resource actually removes the permissions
1 parent d5b3d87 commit 341a1f4

File tree

2 files changed

+241
-253
lines changed

2 files changed

+241
-253
lines changed

internal/resources/grafana/resource_dashboard_permission_test.go

Lines changed: 144 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,74 @@ package grafana_test
22

33
import (
44
"fmt"
5-
"strconv"
65
"testing"
76

8-
"github.com/grafana/terraform-provider-grafana/internal/common"
7+
"github.com/grafana/grafana-openapi-client-go/models"
98
"github.com/grafana/terraform-provider-grafana/internal/resources/grafana"
109
"github.com/grafana/terraform-provider-grafana/internal/testutils"
1110
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1211
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1312
)
1413

1514
func TestAccDashboardPermission_basic(t *testing.T) {
16-
testutils.CheckOSSTestsEnabled(t, ">=9.0.0") // Dashboard UIDs are only available as references in Grafana 9+
15+
testutils.CheckOSSTestsEnabled(t, ">=9.0.0")
1716

18-
dashboardUID := ""
17+
var (
18+
dashboard models.DashboardFullWithMeta
19+
team models.TeamDTO
20+
user models.UserProfileDTO
21+
sa models.ServiceAccountDTO
22+
)
1923

2024
// TODO: Make parallelizable
2125
resource.Test(t, resource.TestCase{
2226
ProviderFactories: testutils.ProviderFactories,
2327
Steps: []resource.TestStep{
2428
{
25-
Config: testAccDashboardPermissionConfig_Basic,
29+
Config: testAccDashboardPermissionConfig(true, true),
2630
Check: resource.ComposeAggregateTestCheckFunc(
27-
testAccDashboardPermissionsCheckExistsUID("grafana_dashboard_permission.testPermission", &dashboardUID),
31+
dashboardCheckExists.exists("grafana_dashboard.testDashboard", &dashboard),
32+
teamCheckExists.exists("grafana_team.testTeam", &team),
33+
userCheckExists.exists("grafana_user.testAdminUser", &user),
34+
serviceAccountCheckExists.exists("grafana_service_account.test", &sa),
35+
2836
resource.TestCheckResourceAttr("grafana_dashboard_permission.testPermission", "permissions.#", "5"),
37+
checkDashboardPermissionsSet(&dashboard, &team, &user, &sa),
2938
),
3039
},
3140
{
3241
ImportState: true,
3342
ResourceName: "grafana_dashboard_permission.testPermission",
3443
ImportStateVerify: true,
3544
},
45+
// Test remove permissions by not setting any permissions
46+
{
47+
Config: testAccDashboardPermissionConfig(true, false),
48+
Check: resource.ComposeAggregateTestCheckFunc(
49+
dashboardCheckExists.exists("grafana_dashboard.testDashboard", &dashboard),
50+
resource.TestCheckResourceAttr("grafana_dashboard_permission.testPermission", "permissions.#", "0"),
51+
checkDashboardPermissionsEmpty(&dashboard),
52+
),
53+
},
54+
// Reapply permissions
55+
{
56+
Config: testAccDashboardPermissionConfig(true, true),
57+
Check: resource.ComposeAggregateTestCheckFunc(
58+
dashboardCheckExists.exists("grafana_dashboard.testDashboard", &dashboard),
59+
teamCheckExists.exists("grafana_team.testTeam", &team),
60+
userCheckExists.exists("grafana_user.testAdminUser", &user),
61+
serviceAccountCheckExists.exists("grafana_service_account.test", &sa),
62+
63+
resource.TestCheckResourceAttr("grafana_dashboard_permission.testPermission", "permissions.#", "5"),
64+
checkDashboardPermissionsSet(&dashboard, &team, &user, &sa),
65+
),
66+
},
67+
// Test remove permissions by removing the resource
3668
{
37-
Config: testAccDashboardPermissionConfig_Remove,
69+
Config: testutils.WithoutResource(t, testAccDashboardPermissionConfig(true, true), "grafana_dashboard_permission.testPermission"),
3870
Check: resource.ComposeAggregateTestCheckFunc(
39-
testAccDashboardPermissionsCheckEmptyUID(&dashboardUID),
71+
dashboardCheckExists.exists("grafana_dashboard.testDashboard", &dashboard),
72+
checkDashboardPermissionsEmpty(&dashboard),
4073
),
4174
},
4275
},
@@ -46,96 +79,138 @@ func TestAccDashboardPermission_basic(t *testing.T) {
4679
// Testing the deprecated case of using a dashboard ID instead of a dashboard UID
4780
// TODO: Remove in next major version
4881
func TestAccDashboardPermission_fromDashboardID(t *testing.T) {
49-
testutils.CheckOSSTestsEnabled(t)
82+
testutils.CheckOSSTestsEnabled(t, ">=9.0.0")
5083

51-
dashboardID := int64(-1)
84+
var (
85+
dashboard models.DashboardFullWithMeta
86+
team models.TeamDTO
87+
user models.UserProfileDTO
88+
sa models.ServiceAccountDTO
89+
)
5290

5391
// TODO: Make parallelizable
5492
resource.Test(t, resource.TestCase{
5593
ProviderFactories: testutils.ProviderFactories,
5694
Steps: []resource.TestStep{
5795
{
58-
Config: testAccDashboardPermissionConfig_FromID,
96+
Config: testAccDashboardPermissionConfig(false, true),
5997
Check: resource.ComposeAggregateTestCheckFunc(
60-
testAccDashboardPermissionsCheckExists("grafana_dashboard_permission.testPermission", &dashboardID),
61-
resource.TestCheckResourceAttr("grafana_dashboard_permission.testPermission", "permissions.#", "4"),
98+
dashboardCheckExists.exists("grafana_dashboard.testDashboard", &dashboard),
99+
teamCheckExists.exists("grafana_team.testTeam", &team),
100+
userCheckExists.exists("grafana_user.testAdminUser", &user),
101+
serviceAccountCheckExists.exists("grafana_service_account.test", &sa),
102+
103+
resource.TestCheckResourceAttr("grafana_dashboard_permission.testPermission", "permissions.#", "5"),
104+
checkDashboardPermissionsSet(&dashboard, &team, &user, &sa),
62105
),
63106
},
107+
{
108+
ImportState: true,
109+
ResourceName: "grafana_dashboard_permission.testPermission",
110+
ImportStateVerify: true,
111+
},
64112
},
65113
})
66114
}
67115

68-
func testAccDashboardPermissionsCheckExistsUID(rn string, dashboardUID *string) resource.TestCheckFunc {
116+
func checkDashboardPermissionsSet(dashboard *models.DashboardFullWithMeta, team *models.TeamDTO, user *models.UserProfileDTO, sa *models.ServiceAccountDTO) resource.TestCheckFunc {
69117
return func(s *terraform.State) error {
70-
rs, ok := s.RootModule().Resources[rn]
71-
if !ok {
72-
return fmt.Errorf("Resource not found: %s\n %#v", rn, s.RootModule().Resources)
73-
}
74-
75-
if rs.Primary.ID == "" {
76-
return fmt.Errorf("Resource id not set")
77-
}
78-
79-
orgID, gotDashboardUID := grafana.SplitOrgResourceID(rs.Primary.ID)
80-
client := testutils.Provider.Meta().(*common.Client).DeprecatedGrafanaAPI.WithOrgID(orgID)
81-
82-
_, err := client.DashboardPermissionsByUID(gotDashboardUID)
83-
if err != nil {
84-
return fmt.Errorf("Error getting dashboard permissions: %s", err)
118+
expectedPerms := []*models.DashboardACLInfoDTO{
119+
{
120+
Role: "Viewer",
121+
PermissionName: "View",
122+
},
123+
{
124+
Role: "Editor",
125+
PermissionName: "Edit",
126+
},
127+
{
128+
TeamID: team.ID,
129+
PermissionName: "View",
130+
},
131+
{
132+
UserID: user.ID,
133+
PermissionName: "Admin",
134+
},
135+
{
136+
UserID: sa.ID,
137+
PermissionName: "Admin",
138+
},
85139
}
86140

87-
*dashboardUID = gotDashboardUID
88-
89-
return nil
141+
return checkDashboardPermissions(dashboard, expectedPerms)
90142
}
91143
}
92144

93-
func testAccDashboardPermissionsCheckExists(rn string, dashboardID *int64) resource.TestCheckFunc {
145+
func checkDashboardPermissionsEmpty(dashboard *models.DashboardFullWithMeta) resource.TestCheckFunc {
94146
return func(s *terraform.State) error {
95-
rs, ok := s.RootModule().Resources[rn]
96-
if !ok {
97-
return fmt.Errorf("Resource not found: %s\n %#v", rn, s.RootModule().Resources)
98-
}
147+
return checkDashboardPermissions(dashboard, []*models.DashboardACLInfoDTO{})
148+
}
149+
}
99150

100-
if rs.Primary.ID == "" {
101-
return fmt.Errorf("Resource id not set")
102-
}
151+
func checkDashboardPermissions(dashboard *models.DashboardFullWithMeta, expectedPerms []*models.DashboardACLInfoDTO) error {
152+
client := grafana.OAPIGlobalClient(testutils.Provider.Meta())
153+
uid := dashboard.Dashboard.(map[string]interface{})["uid"].(string)
154+
resp, err := client.DashboardPermissions.GetDashboardPermissionsListByUID(uid)
155+
if err != nil {
156+
return fmt.Errorf("error getting dashboard permissions: %s", err)
157+
}
158+
gotPerms := resp.Payload
103159

104-
orgID, dashboardIDStr := grafana.SplitOrgResourceID(rs.Primary.ID)
105-
client := testutils.Provider.Meta().(*common.Client).DeprecatedGrafanaAPI.WithOrgID(orgID)
160+
if len(gotPerms) != len(expectedPerms) {
161+
return fmt.Errorf("got %d perms, expected %d", len(gotPerms), len(expectedPerms))
162+
}
106163

107-
gotDashboardID, err := strconv.ParseInt(dashboardIDStr, 10, 64)
108-
if err != nil {
109-
return fmt.Errorf("dashboard id is malformed")
164+
for _, expectedPerm := range expectedPerms {
165+
found := false
166+
for _, gotPerm := range gotPerms {
167+
if gotPerm.PermissionName == expectedPerm.PermissionName &&
168+
gotPerm.Role == expectedPerm.Role &&
169+
gotPerm.UserID == expectedPerm.UserID &&
170+
gotPerm.TeamID == expectedPerm.TeamID {
171+
found = true
172+
break
173+
}
110174
}
111-
112-
_, err = client.DashboardPermissions(gotDashboardID)
113-
if err != nil {
114-
return fmt.Errorf("Error getting dashboard permissions: %s", err)
175+
if !found {
176+
return fmt.Errorf("didn't find permission matching %+v", expectedPerm)
115177
}
116-
117-
*dashboardID = gotDashboardID
118-
119-
return nil
120178
}
179+
180+
return nil
121181
}
122182

123-
func testAccDashboardPermissionsCheckEmptyUID(dashboardUID *string) resource.TestCheckFunc {
124-
return func(s *terraform.State) error {
125-
client := testutils.Provider.Meta().(*common.Client).DeprecatedGrafanaAPI
126-
permissions, err := client.DashboardPermissionsByUID(*dashboardUID)
127-
if err != nil {
128-
return fmt.Errorf("Error getting dashboard permissions %s: %s", *dashboardUID, err)
129-
}
130-
if len(permissions) > 0 {
131-
return fmt.Errorf("Permissions were not empty when expected")
132-
}
183+
func testAccDashboardPermissionConfig(refDashboardByUID bool, hasPermissions bool) string {
184+
ref := "dashboard_id = grafana_dashboard.testDashboard.dashboard_id"
185+
if refDashboardByUID {
186+
ref = "dashboard_uid = grafana_dashboard.testDashboard.uid"
187+
}
133188

134-
return nil
189+
perms := ""
190+
if hasPermissions {
191+
perms = `permissions {
192+
role = "Viewer"
193+
permission = "View"
194+
}
195+
permissions {
196+
role = "Editor"
197+
permission = "Edit"
198+
}
199+
permissions {
200+
team_id = grafana_team.testTeam.id
201+
permission = "View"
202+
}
203+
permissions {
204+
user_id = grafana_user.testAdminUser.id
205+
permission = "Admin"
206+
}
207+
permissions {
208+
user_id = grafana_service_account.test.id
209+
permission = "Admin"
210+
}`
135211
}
136-
}
137212

138-
const testAccDashboardPermissionConfig_Basic = `
213+
return fmt.Sprintf(`
139214
resource "grafana_dashboard" "testDashboard" {
140215
config_json = <<EOT
141216
{
@@ -164,93 +239,8 @@ resource "grafana_service_account" "test" {
164239
}
165240
166241
resource "grafana_dashboard_permission" "testPermission" {
167-
dashboard_uid = grafana_dashboard.testDashboard.uid
168-
permissions {
169-
role = "Viewer"
170-
permission = "View"
171-
}
172-
permissions {
173-
role = "Editor"
174-
permission = "Edit"
175-
}
176-
permissions {
177-
team_id = grafana_team.testTeam.id
178-
permission = "View"
179-
}
180-
permissions {
181-
user_id = grafana_user.testAdminUser.id
182-
permission = "Admin"
183-
}
184-
permissions {
185-
user_id = grafana_service_account.test.id
186-
permission = "Admin"
187-
}
188-
}
189-
`
190-
const testAccDashboardPermissionConfig_Remove = `
191-
resource "grafana_dashboard" "testDashboard" {
192-
config_json = <<EOT
193-
{
194-
"title": "Terraform Dashboard Permission Test Dashboard",
195-
"id": 14,
196-
"version": "43",
197-
"uid": "someuid"
198-
}
199-
EOT
200-
}
201-
202-
resource "grafana_team" "testTeam" {
203-
name = "terraform-test-team-dashboard-permissions"
204-
}
205-
206-
resource "grafana_user" "testAdminUser" {
207-
email = "terraform-test-dashboard-permissions@localhost"
208-
name = "Terraform Test Dashboard Permissions"
209-
login = "ttdp"
210-
password = "zyx987"
211-
}
212-
`
213-
214-
const testAccDashboardPermissionConfig_FromID = `
215-
resource "grafana_dashboard" "testDashboard" {
216-
config_json = <<EOT
217-
{
218-
"title": "Terraform Dashboard Permission Test Dashboard",
219-
"id": 14,
220-
"version": "43",
221-
"uid": "someuid"
222-
}
223-
EOT
242+
%s
243+
%s
224244
}
225-
226-
resource "grafana_team" "testTeam" {
227-
name = "terraform-test-team-permissions"
228-
}
229-
230-
resource "grafana_user" "testAdminUser" {
231-
email = "terraform-test-dashboard-permissions@localhost"
232-
name = "Terraform Test Dashboard Permissions"
233-
login = "ttdp"
234-
password = "zyx987"
235-
}
236-
237-
resource "grafana_dashboard_permission" "testPermission" {
238-
dashboard_id = grafana_dashboard.testDashboard.dashboard_id
239-
permissions {
240-
role = "Viewer"
241-
permission = "View"
242-
}
243-
permissions {
244-
role = "Editor"
245-
permission = "Edit"
246-
}
247-
permissions {
248-
team_id = grafana_team.testTeam.id
249-
permission = "View"
250-
}
251-
permissions {
252-
user_id = grafana_user.testAdminUser.id
253-
permission = "Admin"
254-
}
245+
`, ref, perms)
255246
}
256-
`

0 commit comments

Comments
 (0)