Skip to content

Commit 8366ba1

Browse files
Folder Permissions: Reconcile if the folder was deleted (#1351)
Closes #1339 Currently, the provider will try to fetch the permissions but it crashes because the folder is gone Also, I gave random names to the test resources because I had a bit of trouble with conflicts locally
1 parent d0bbcf7 commit 8366ba1

File tree

2 files changed

+57
-21
lines changed

2 files changed

+57
-21
lines changed

internal/resources/grafana/resource_folder_permission.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ func UpdateFolderPermissions(ctx context.Context, d *schema.ResourceData, meta i
128128
func ReadFolderPermissions(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
129129
client, orgID, folderUID := OAPIClientFromExistingOrgResource(meta, d.Id())
130130

131+
// Check if the folder still exists
132+
_, err := client.Folders.GetFolderByUID(folderUID)
133+
if err, shouldReturn := common.CheckReadError("folder", d, err); shouldReturn {
134+
return err
135+
}
136+
131137
resp, err := client.AccessControl.GetResourcePermissions(folderUID, foldersPermissionsType)
132138
if err, shouldReturn := common.CheckReadError("folder permissions", d, err); shouldReturn {
133139
return err

internal/resources/grafana/resource_folder_permission_test.go

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import (
44
"fmt"
55
"testing"
66

7+
"github.com/grafana/grafana-openapi-client-go/client/folders"
78
"github.com/grafana/grafana-openapi-client-go/models"
89
"github.com/grafana/terraform-provider-grafana/internal/resources/grafana"
910
"github.com/grafana/terraform-provider-grafana/internal/testutils"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
1012
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1113
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1214
)
@@ -15,17 +17,18 @@ func TestAccFolderPermission_basic(t *testing.T) {
1517
testutils.CheckOSSTestsEnabled(t, ">=9.0.0") // Folder permissions only work for service accounts in Grafana 9+, so we're just not testing versions before 9.
1618

1719
var (
18-
folder models.Folder
19-
team models.TeamDTO
20-
user models.UserProfileDTO
21-
sa models.ServiceAccountDTO
20+
folder models.Folder
21+
team models.TeamDTO
22+
user models.UserProfileDTO
23+
sa models.ServiceAccountDTO
24+
randomName = acctest.RandString(6)
2225
)
2326

2427
resource.ParallelTest(t, resource.TestCase{
2528
ProviderFactories: testutils.ProviderFactories,
2629
Steps: []resource.TestStep{
2730
{
28-
Config: testAccFolderPermissionConfig_Basic,
31+
Config: testAccFolderPermissionConfig_Basic(randomName),
2932
Check: resource.ComposeAggregateTestCheckFunc(
3033
folderCheckExists.exists("grafana_folder.testFolder", &folder),
3134
teamCheckExists.exists("grafana_team.testTeam", &team),
@@ -40,9 +43,30 @@ func TestAccFolderPermission_basic(t *testing.T) {
4043
ImportState: true,
4144
ImportStateVerify: true,
4245
},
46+
// Test delete the folder and check that TF sees a difference
47+
{
48+
PreConfig: func() {
49+
client := grafana.OAPIGlobalClient(testutils.Provider.Meta())
50+
params := folders.NewDeleteFolderParams().WithFolderUID(folder.UID)
51+
_, err := client.Folders.DeleteFolder(params)
52+
if err != nil {
53+
t.Fatalf("error deleting folder: %s", err)
54+
}
55+
},
56+
RefreshState: true,
57+
ExpectNonEmptyPlan: true,
58+
},
59+
// Write back the folder to check that TF can reconcile
60+
{
61+
Config: testAccFolderPermissionConfig_Basic(randomName),
62+
Check: resource.ComposeAggregateTestCheckFunc(
63+
folderCheckExists.exists("grafana_folder.testFolder", &folder),
64+
resource.TestCheckResourceAttr("grafana_folder_permission.testPermission", "permissions.#", "5"),
65+
),
66+
},
4367
// Test remove permissions by not setting any permissions
4468
{
45-
Config: testAccFolderPermissionConfig_NoPermissions,
69+
Config: testAccFolderPermissionConfig_NoPermissions(randomName),
4670
Check: resource.ComposeAggregateTestCheckFunc(
4771
folderCheckExists.exists("grafana_folder.testFolder", &folder),
4872
resource.TestCheckResourceAttr("grafana_folder_permission.testPermission", "permissions.#", "0"),
@@ -51,7 +75,7 @@ func TestAccFolderPermission_basic(t *testing.T) {
5175
},
5276
// Reapply permissions
5377
{
54-
Config: testAccFolderPermissionConfig_Basic,
78+
Config: testAccFolderPermissionConfig_Basic(randomName),
5579
Check: resource.ComposeAggregateTestCheckFunc(
5680
folderCheckExists.exists("grafana_folder.testFolder", &folder),
5781
teamCheckExists.exists("grafana_team.testTeam", &team),
@@ -63,7 +87,7 @@ func TestAccFolderPermission_basic(t *testing.T) {
6387
},
6488
// Test remove permissions by removing the resource
6589
{
66-
Config: testutils.WithoutResource(t, testAccFolderPermissionConfig_Basic, "grafana_folder_permission.testPermission"),
90+
Config: testutils.WithoutResource(t, testAccFolderPermissionConfig_Basic(randomName), "grafana_folder_permission.testPermission"),
6791
Check: resource.ComposeAggregateTestCheckFunc(
6892
folderCheckExists.exists("grafana_folder.testFolder", &folder),
6993
checkFolderPermissionsEmpty(&folder),
@@ -139,30 +163,33 @@ func checkFolderPermissions(folder *models.Folder, expectedPerms []*models.Dashb
139163
return nil
140164
}
141165

142-
const testAccFolderPermissionConfig_Common = `
166+
func testAccFolderPermissionConfig_Common(name string) string {
167+
return fmt.Sprintf(`
143168
resource "grafana_folder" "testFolder" {
144-
title = "terraform-test-folder-permissions"
169+
title = "%[1]s"
145170
}
146171
147172
resource "grafana_team" "testTeam" {
148-
name = "terraform-test-team-permissions"
173+
name = "%[1]s"
149174
}
150175
151176
resource "grafana_user" "testAdminUser" {
152-
email = "terraform-test-permissions@localhost"
153-
name = "Terraform Test Permissions"
154-
login = "ttp"
177+
email = "%[1]s@localhost"
178+
name = "%[1]s"
179+
login = "%[1]s"
155180
password = "zyx987"
156181
}
157182
158183
resource "grafana_service_account" "test" {
159-
name = "terraform-test-service-account-folder-perms"
184+
name = "%[1]s"
160185
role = "Editor"
161186
is_disabled = false
162187
}
163-
`
188+
`, name)
189+
}
164190

165-
const testAccFolderPermissionConfig_Basic = testAccFolderPermissionConfig_Common + `
191+
func testAccFolderPermissionConfig_Basic(name string) string {
192+
return testAccFolderPermissionConfig_Common(name) + `
166193
resource "grafana_folder_permission" "testPermission" {
167194
folder_uid = grafana_folder.testFolder.uid
168195
permissions {
@@ -187,9 +214,12 @@ resource "grafana_folder_permission" "testPermission" {
187214
}
188215
}
189216
`
217+
}
190218

191-
const testAccFolderPermissionConfig_NoPermissions = testAccFolderPermissionConfig_Common + `
192-
resource "grafana_folder_permission" "testPermission" {
193-
folder_uid = grafana_folder.testFolder.uid
219+
func testAccFolderPermissionConfig_NoPermissions(name string) string {
220+
return testAccFolderPermissionConfig_Common(name) + `
221+
resource "grafana_folder_permission" "testPermission" {
222+
folder_uid = grafana_folder.testFolder.uid
223+
}
224+
`
194225
}
195-
`

0 commit comments

Comments
 (0)