Skip to content

Commit 6e9002b

Browse files
authored
feat(platform): add sysdig_builtin_role data source (#718)
## Summary Adds a read-only data source to retrieve the permissions of built-in (OOTB) roles (View Only, Standard User, Advanced User, Team Manager) via the `GET /platform/v1/default-roles/{name}` endpoint. This allows users to reference built-in role permissions in their Terraform configs, e.g. to compose custom roles based on a built-in role's permission set. ```terraform data "sysdig_builtin_role" "advanced_user" { name = "Advanced User" } ```
1 parent a79d2bc commit 6e9002b

7 files changed

Lines changed: 205 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceSysdigBuiltinRole() *schema.Resource {
12+
timeout := 5 * time.Minute
13+
14+
return &schema.Resource{
15+
ReadContext: dataSourceSysdigBuiltinRoleRead,
16+
17+
Timeouts: &schema.ResourceTimeout{
18+
Read: schema.DefaultTimeout(timeout),
19+
},
20+
21+
Schema: map[string]*schema.Schema{
22+
SchemaNameKey: {
23+
Type: schema.TypeString,
24+
Required: true,
25+
},
26+
SchemaMonitorPermKey: {
27+
Type: schema.TypeSet,
28+
Computed: true,
29+
Elem: &schema.Schema{
30+
Type: schema.TypeString,
31+
},
32+
},
33+
SchemaSecurePermKey: {
34+
Type: schema.TypeSet,
35+
Computed: true,
36+
Elem: &schema.Schema{
37+
Type: schema.TypeString,
38+
},
39+
},
40+
},
41+
}
42+
}
43+
44+
func dataSourceSysdigBuiltinRoleRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
45+
client, err := m.(SysdigClients).sysdigCommonClientV2()
46+
if err != nil {
47+
return diag.FromErr(err)
48+
}
49+
50+
name := d.Get(SchemaNameKey).(string)
51+
52+
builtinRole, err := client.GetBuiltinRole(ctx, name)
53+
if err != nil {
54+
return diag.FromErr(err)
55+
}
56+
57+
d.SetId(name)
58+
59+
err = d.Set(SchemaNameKey, builtinRole.Name)
60+
if err != nil {
61+
return diag.FromErr(err)
62+
}
63+
64+
err = d.Set(SchemaMonitorPermKey, builtinRole.MonitorPermissions)
65+
if err != nil {
66+
return diag.FromErr(err)
67+
}
68+
69+
err = d.Set(SchemaSecurePermKey, builtinRole.SecurePermissions)
70+
if err != nil {
71+
return diag.FromErr(err)
72+
}
73+
74+
return nil
75+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//go:build tf_acc_sysdig_monitor || tf_acc_sysdig_secure || tf_acc_onprem_monitor || tf_acc_onprem_secure
2+
3+
package sysdig_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
11+
"github.com/draios/terraform-provider-sysdig/sysdig"
12+
)
13+
14+
func TestAccDataSourceSysdigBuiltinRole(t *testing.T) {
15+
resource.ParallelTest(t, resource.TestCase{
16+
PreCheck: preCheckAnyEnv(t, SysdigMonitorApiTokenEnv, SysdigSecureApiTokenEnv),
17+
ProviderFactories: map[string]func() (*schema.Provider, error){
18+
"sysdig": func() (*schema.Provider, error) {
19+
return sysdig.Provider(), nil
20+
},
21+
},
22+
Steps: []resource.TestStep{
23+
{
24+
Config: `data "sysdig_builtin_role" "advanced" {
25+
name = "Advanced User"
26+
}`,
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr("data.sysdig_builtin_role.advanced", "name", "Advanced User"),
29+
// Verify both permission sets are non-empty
30+
resource.TestCheckResourceAttrSet("data.sysdig_builtin_role.advanced", "monitor_permissions.#"),
31+
resource.TestCheckResourceAttrSet("data.sysdig_builtin_role.advanced", "secure_permissions.#"),
32+
// Verify well-known monitor permissions are present
33+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "monitor_permissions.*", "alerts.read"),
34+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "monitor_permissions.*", "dashboards.read"),
35+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "monitor_permissions.*", "token.view"),
36+
// Verify well-known secure permissions are present
37+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "secure_permissions.*", "scanning.read"),
38+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "secure_permissions.*", "secure.policy.read"),
39+
resource.TestCheckTypeSetElemAttr("data.sysdig_builtin_role.advanced", "secure_permissions.*", "policies.read"),
40+
),
41+
},
42+
},
43+
})
44+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
)
10+
11+
var ErrBuiltinRoleNotFound = errors.New("builtin role not found")
12+
13+
const builtinRolePath = "%s/platform/v1/default-roles/%s"
14+
15+
type BuiltinRoleInterface interface {
16+
Base
17+
GetBuiltinRole(ctx context.Context, name string) (*BuiltinRole, error)
18+
}
19+
20+
func (c *Client) GetBuiltinRole(ctx context.Context, name string) (builtinRole *BuiltinRole, err error) {
21+
response, err := c.requester.Request(ctx, http.MethodGet, c.getBuiltinRoleURL(name), nil)
22+
if err != nil {
23+
return nil, err
24+
}
25+
defer func() {
26+
if dErr := response.Body.Close(); dErr != nil {
27+
err = fmt.Errorf("unable to close response body: %w", dErr)
28+
}
29+
}()
30+
31+
if response.StatusCode != http.StatusOK {
32+
if response.StatusCode == http.StatusNotFound {
33+
return nil, ErrBuiltinRoleNotFound
34+
}
35+
return nil, c.ErrorFromResponse(response)
36+
}
37+
38+
return Unmarshal[*BuiltinRole](response.Body)
39+
}
40+
41+
func (c *Client) getBuiltinRoleURL(name string) string {
42+
return fmt.Sprintf(builtinRolePath, c.config.url, url.PathEscape(name))
43+
}

sysdig/internal/client/v2/model.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ type CustomRole struct {
5555
MonitorPermissions []string `json:"monitorPermissions,omitempty"`
5656
SecurePermissions []string `json:"securePermissions,omitempty"`
5757
}
58+
59+
type BuiltinRole struct {
60+
Name string `json:"name"`
61+
MonitorPermissions []string `json:"monitorPermissions,omitempty"`
62+
SecurePermissions []string `json:"securePermissions,omitempty"`
63+
}
5864
type customRoleListWrapper struct {
5965
Roles []CustomRole `json:"roles"`
6066
}

sysdig/internal/client/v2/sysdig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type SysdigCommon interface {
2121

2222
CustomRoleInterface
2323
CustomRolePermissionInterface
24+
BuiltinRoleInterface
2425
GroupMappingConfigInterface
2526
GroupMappingInterface
2627
IPFilteringSettingsInterface

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
200200
"sysdig_agent_access_key": dataSourceSysdigAgentAccessKey(),
201201
"sysdig_current_user": dataSourceSysdigCurrentUser(),
202202
"sysdig_custom_role": dataSourceSysdigCustomRole(),
203+
"sysdig_builtin_role": dataSourceSysdigBuiltinRole(),
203204
"sysdig_fargate_workload_agent": dataSourceSysdigFargateWorkloadAgent(),
204205
"sysdig_user": dataSourceSysdigUser(),
205206

website/docs/d/builtin_role.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
subcategory: "Sysdig Platform"
3+
layout: "sysdig"
4+
page_title: "Sysdig: sysdig_builtin_role"
5+
description: |-
6+
Retrieves information about a built-in (OOTB) role from the name.
7+
---
8+
9+
# Data Source: sysdig_builtin_role
10+
11+
Retrieves information about a built-in (out-of-the-box) role from the name.
12+
13+
Built-in roles are the roles provided by Sysdig: View Only, Standard User, Advanced User, and Team Manager.
14+
15+
-> **Note:** Sysdig Terraform Provider is under rapid development at this point. If you experience any issue or discrepancy while using it, please make sure you have the latest version. If the issue persists, or you have a Feature Request to support an additional set of resources, please open a [new issue](https://github.com/sysdiglabs/terraform-provider-sysdig/issues/new) in the GitHub repository.
16+
17+
## Example Usage
18+
19+
```terraform
20+
data "sysdig_builtin_role" "advanced_user" {
21+
name = "Advanced User"
22+
}
23+
```
24+
25+
## Argument Reference
26+
27+
* `name` - (Required) The name of the built-in role. Valid values are: `View Only`, `Standard User`, `Advanced User`, `Team Manager`.
28+
29+
## Attributes Reference
30+
31+
In addition to all arguments above, the following attributes are exported:
32+
33+
* `monitor_permissions` - The built-in role's monitor permissions.
34+
35+
* `secure_permissions` - The built-in role's secure permissions.

0 commit comments

Comments
 (0)