Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions docs/data-sources/folder_permission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "grafana_folder_permission Data Source - terraform-provider-grafana"
subcategory: "Grafana OSS"
description: |-
Official documentation https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/HTTP API https://grafana.com/docs/grafana/latest/developers/http_api/folder_permissions/
---

# grafana_folder_permission (Data Source)

* [Official documentation](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/)
* [HTTP API](https://grafana.com/docs/grafana/latest/developers/http_api/folder_permissions/)



<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `folder_uid` (String) The UID of the folder.

### Optional

- `org_id` (String) The Organization ID. If not set, the Org ID defined in the provider block will be used.

### Read-Only

- `id` (String) The ID of this resource.
- `permissions` (Set of Object) (see [below for nested schema](#nestedatt--permissions))

<a id="nestedatt--permissions"></a>
### Nested Schema for `permissions`

Read-Only:

- `permission` (String)
- `role` (String)
- `team_id` (String)
- `user_id` (String)
93 changes: 93 additions & 0 deletions internal/resources/grafana/data_source_folder_permission.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package grafana

import (
"context"
"strconv"

"github.com/grafana/grafana-openapi-client-go/models"

"github.com/grafana/terraform-provider-grafana/v3/internal/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func datasourceFolderPermission() *common.DataSource {
schema := &schema.Resource{
Description: `
* [Official documentation](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/)
* [HTTP API](https://grafana.com/docs/grafana/latest/developers/http_api/folder_permissions/)
`,
ReadContext: dataSourceFolderPermissionRead,
Schema: map[string]*schema.Schema{
"org_id": orgIDAttribute(),
"folder_uid": {
Type: schema.TypeString,
Required: true,
Description: "The UID of the folder.",
},
"permissions": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"team_id": {
Type: schema.TypeString,
Computed: true,
Description: "ID of the team to manage permissions for.",
},
"user_id": {
Type: schema.TypeString,
Computed: true,
Description: "ID of the user or service account to manage permissions for.",
},
"permission": {
Type: schema.TypeString,
Computed: true,
Description: "Permission to associate with item. Must be one of `View`, `Edit`, or `Admin`.",
},
"role": {
Type: schema.TypeString,
Computed: true,
Description: "Role to associate with item. Must be one of `Viewer`, `Editor`, or `Admin`.",
},
},
},
},
},
}
return common.NewLegacySDKDataSource(common.CategoryGrafanaOSS, "grafana_folder_permission", schema)
}

func dataSourceFolderPermissionRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client, orgID := OAPIClientFromNewOrgResource(meta, d)
uid := d.Get("folder_uid").(string)

resp, err := client.FolderPermissions.GetFolderPermissionList(uid)
if err != nil {
return diag.FromErr(err)
}

var resourcePermissions []models.DashboardACLInfoDTO
for _, perm := range resp.Payload {
resourcePermissions = append(resourcePermissions, *perm)
}

var permissionItems []interface{}
for _, permission := range resourcePermissions {
permissionItem := make(map[string]interface{})
if permission.Role != "" {
permissionItem["role"] = permission.Role
}
permissionItem["team_id"] = permission.TeamUID
permissionItem["user_id"] = permission.UserUID
permissionItem["permission"] = permission.PermissionName

permissionItems = append(permissionItems, permissionItem)
}

d.SetId(MakeOrgResourceID(orgID, uid))
d.Set("org_id", strconv.FormatInt(orgID, 10))
d.Set("permissions", permissionItems)

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package grafana_test

import (
"fmt"
"testing"

"github.com/grafana/grafana-openapi-client-go/models"
"github.com/grafana/terraform-provider-grafana/v3/internal/testutils"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccDatasourceFolder_permissions(t *testing.T) {
testutils.CheckOSSTestsEnabled(t, ">=10.3.0")

var test models.Folder
randomName := acctest.RandStringFromCharSet(6, acctest.CharSetAlpha)

resource.ParallelTest(t, resource.TestCase{
ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
folderCheckExists.destroyed(&test, nil),
),
Steps: []resource.TestStep{
{
Config: testFolderPermissionData(randomName),
Check: resource.ComposeTestCheckFunc(
folderCheckExists.exists("grafana_folder.test", &test),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "folder_uid", randomName),
resource.TestMatchResourceAttr("data.grafana_folder_permission.test", "id", defaultOrgIDRegexp),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.#", "3"),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.0.permission", "Admin"),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.1.role", "Editor"),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.1.permission", "Edit"),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.2.role", "Viewer"),
resource.TestCheckResourceAttr("data.grafana_folder_permission.test", "permissions.2.permission", "View"),
),
},
},
})
}

func testFolderPermissionData(name string) string {
return fmt.Sprintf(`
resource "grafana_folder" "test" {
title = "%[1]s"
uid = "%[1]s"
}

data "grafana_folder_permission" "test" {
folder_uid = grafana_folder.test.uid
}

`, name)
}
1 change: 1 addition & 0 deletions internal/resources/grafana/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ var DataSources = addValidationToDataSources(
datasourceDashboards(),
datasourceDatasource(),
datasourceFolder(),
datasourceFolderPermission(),
datasourceFolders(),
datasourceLibraryPanel(),
datasourceLibraryPanels(),
Expand Down