@@ -2,41 +2,74 @@ package grafana_test
22
33import (
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
1514func 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
4881func 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 ( `
139214resource "grafana_dashboard" "testDashboard" {
140215 config_json = <<EOT
141216{
@@ -164,93 +239,8 @@ resource "grafana_service_account" "test" {
164239}
165240
166241resource "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