Skip to content

Commit adc1497

Browse files
authored
feat(group mapping): added new group_mapping_config resource (#363)
* added new group_mapping_config resource * fixed lint errors * addressed code review comments
1 parent f3b38cf commit adc1497

File tree

7 files changed

+315
-2
lines changed

7 files changed

+315
-2
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
)
9+
10+
var GroupMappingConfigNotFound = errors.New("group mapping configuration not found")
11+
12+
const (
13+
GroupMappingConfigPath = "%s/api/groupmappings/settings"
14+
)
15+
16+
type GroupMappingConfigInterface interface {
17+
Base
18+
UpdateGroupMappingConfig(ctx context.Context, gmc *GroupMappingConfig) (*GroupMappingConfig, error)
19+
GetGroupMappingConfig(ctx context.Context) (*GroupMappingConfig, error)
20+
}
21+
22+
func (client *Client) UpdateGroupMappingConfig(ctx context.Context, gmc *GroupMappingConfig) (*GroupMappingConfig, error) {
23+
payload, err := Marshal(gmc)
24+
if err != nil {
25+
return nil, err
26+
}
27+
28+
response, err := client.requester.Request(ctx, http.MethodPut, client.UpdateGroupMappingConfigURL(), payload)
29+
if err != nil {
30+
return nil, err
31+
}
32+
defer response.Body.Close()
33+
34+
if response.StatusCode != http.StatusOK {
35+
return nil, client.ErrorFromResponse(response)
36+
}
37+
38+
updated, err := Unmarshal[GroupMappingConfig](response.Body)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
return &updated, nil
44+
}
45+
46+
func (client *Client) GetGroupMappingConfig(ctx context.Context) (*GroupMappingConfig, error) {
47+
response, err := client.requester.Request(ctx, http.MethodGet, client.GetGroupMappingConfigURL(), nil)
48+
if err != nil {
49+
return nil, err
50+
}
51+
defer response.Body.Close()
52+
53+
if response.StatusCode != http.StatusOK {
54+
if response.StatusCode == http.StatusNotFound {
55+
return nil, GroupMappingConfigNotFound
56+
}
57+
return nil, client.ErrorFromResponse(response)
58+
}
59+
60+
gmc, err := Unmarshal[GroupMappingConfig](response.Body)
61+
if err != nil {
62+
return nil, err
63+
}
64+
65+
return &gmc, nil
66+
}
67+
68+
func (client *Client) UpdateGroupMappingConfigURL() string {
69+
return fmt.Sprintf(GroupMappingConfigPath, client.config.url)
70+
}
71+
72+
func (client *Client) GetGroupMappingConfigURL() string {
73+
return fmt.Sprintf(GroupMappingConfigPath, client.config.url)
74+
}

sysdig/internal/client/v2/model.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ type GroupMapping struct {
113113
Weight int `json:"weight,omitempty"`
114114
}
115115

116+
type GroupMappingConfig struct {
117+
NoMappingStrategy string `json:"noMappingStrategy"`
118+
DifferentTeamSameRoleStrategy string `json:"differentRolesSameTeamStrategy"`
119+
}
120+
116121
type alertWrapper struct {
117122
Alert Alert `json:"alert"`
118123
}

sysdig/internal/client/v2/sysdig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type SysdigRequest struct {
1919
type SysdigCommon interface {
2020
Common
2121
GroupMappingInterface
22+
GroupMappingConfigInterface
2223
}
2324

2425
type SysdigMonitor interface {

sysdig/provider.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ func Provider() *schema.Provider {
7474
},
7575
},
7676
ResourcesMap: map[string]*schema.Resource{
77-
"sysdig_user": resourceSysdigUser(),
78-
"sysdig_group_mapping": resourceSysdigGroupMapping(),
77+
"sysdig_user": resourceSysdigUser(),
78+
"sysdig_group_mapping": resourceSysdigGroupMapping(),
79+
"sysdig_group_mapping_config": resourceSysdigGroupMappingConfig(),
7980

8081
"sysdig_secure_custom_policy": resourceSysdigSecureCustomPolicy(),
8182
"sysdig_secure_managed_policy": resourceSysdigSecureManagedPolicy(),
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func resourceSysdigGroupMappingConfig() *schema.Resource {
13+
timeout := 5 * time.Minute
14+
return &schema.Resource{
15+
ReadContext: resourceSysdigGroupMappingConfigRead,
16+
CreateContext: resourceSysdigGroupMappingConfigCreate,
17+
UpdateContext: resourceSysdigGroupMappingConfigUpdate,
18+
DeleteContext: resourceSysdigGroupMappingConfigDelete,
19+
Importer: &schema.ResourceImporter{
20+
StateContext: schema.ImportStatePassthroughContext,
21+
},
22+
Timeouts: &schema.ResourceTimeout{
23+
Create: schema.DefaultTimeout(timeout),
24+
Update: schema.DefaultTimeout(timeout),
25+
Read: schema.DefaultTimeout(timeout),
26+
Delete: schema.DefaultTimeout(timeout),
27+
},
28+
Schema: map[string]*schema.Schema{
29+
"no_mapping_strategy": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
},
33+
"different_team_same_role_strategy": {
34+
Type: schema.TypeString,
35+
Required: true,
36+
},
37+
},
38+
}
39+
}
40+
41+
func resourceSysdigGroupMappingConfigRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
42+
client, err := m.(SysdigClients).sysdigCommonClientV2()
43+
if err != nil {
44+
return diag.FromErr(err)
45+
}
46+
47+
groupMappingConfig, err := client.GetGroupMappingConfig(ctx)
48+
if err != nil {
49+
if err == v2.GroupMappingConfigNotFound {
50+
return nil
51+
}
52+
return diag.FromErr(err)
53+
}
54+
55+
err = groupMappingConfigToResourceData(groupMappingConfig, d)
56+
if err != nil {
57+
return diag.FromErr(err)
58+
}
59+
60+
return nil
61+
}
62+
63+
func resourceSysdigGroupMappingConfigCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
64+
client, err := m.(SysdigClients).sysdigCommonClientV2()
65+
if err != nil {
66+
return diag.FromErr(err)
67+
}
68+
69+
groupMappingConfig := groupMappingConfigFromResourceData(d)
70+
_, err = client.UpdateGroupMappingConfig(ctx, groupMappingConfig)
71+
if err != nil {
72+
return diag.FromErr(err)
73+
}
74+
75+
d.SetId("conflicts_resolution_strategies")
76+
77+
resourceSysdigGroupMappingConfigRead(ctx, d, m)
78+
79+
return nil
80+
}
81+
82+
func resourceSysdigGroupMappingConfigUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
83+
client, err := m.(SysdigClients).sysdigCommonClientV2()
84+
if err != nil {
85+
return diag.FromErr(err)
86+
}
87+
88+
groupMappingConfig := groupMappingConfigFromResourceData(d)
89+
_, err = client.UpdateGroupMappingConfig(ctx, groupMappingConfig)
90+
if err != nil {
91+
return diag.FromErr(err)
92+
}
93+
94+
resourceSysdigGroupMappingConfigRead(ctx, d, m)
95+
96+
return nil
97+
}
98+
99+
func resourceSysdigGroupMappingConfigDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
100+
return nil
101+
}
102+
103+
func groupMappingConfigToResourceData(groupMappingConfig *v2.GroupMappingConfig, d *schema.ResourceData) error {
104+
err := d.Set("no_mapping_strategy", groupMappingConfig.NoMappingStrategy)
105+
if err != nil {
106+
return err
107+
}
108+
return d.Set("different_team_same_role_strategy", groupMappingConfig.DifferentTeamSameRoleStrategy)
109+
}
110+
111+
func groupMappingConfigFromResourceData(d *schema.ResourceData) *v2.GroupMappingConfig {
112+
return &v2.GroupMappingConfig{
113+
NoMappingStrategy: d.Get("no_mapping_strategy").(string),
114+
DifferentTeamSameRoleStrategy: d.Get("different_team_same_role_strategy").(string),
115+
}
116+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//go:build tf_acc_sysdig_monitor
2+
3+
package sysdig_test
4+
5+
import (
6+
"github.com/draios/terraform-provider-sysdig/sysdig"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"testing"
10+
)
11+
12+
func TestAccGroupMappingConfig(t *testing.T) {
13+
14+
resource.ParallelTest(t, resource.TestCase{
15+
PreCheck: preCheckAnyEnv(t, SysdigMonitorApiTokenEnv),
16+
ProviderFactories: map[string]func() (*schema.Provider, error){
17+
"sysdig": func() (*schema.Provider, error) {
18+
return sysdig.Provider(), nil
19+
},
20+
},
21+
Steps: []resource.TestStep{
22+
{
23+
Config: groupMappingConfigDefault(),
24+
Check: resource.ComposeTestCheckFunc(
25+
resource.TestCheckResourceAttr(
26+
"sysdig_group_mapping_config.default",
27+
"no_mapping_strategy",
28+
"UNAUTHORIZED",
29+
),
30+
resource.TestCheckResourceAttr(
31+
"sysdig_group_mapping_config.default",
32+
"different_team_same_role_strategy",
33+
"UNAUTHORIZED",
34+
),
35+
),
36+
},
37+
{
38+
Config: groupMappingConfigUpdate(),
39+
Check: resource.ComposeTestCheckFunc(
40+
resource.TestCheckResourceAttr(
41+
"sysdig_group_mapping_config.default",
42+
"no_mapping_strategy",
43+
"DEFAULT_TEAM_DEFAULT_ROLE",
44+
),
45+
),
46+
},
47+
{
48+
ResourceName: "sysdig_group_mapping_config.default",
49+
ImportState: true,
50+
ImportStateVerify: true,
51+
},
52+
},
53+
})
54+
}
55+
56+
func groupMappingConfigDefault() string {
57+
return `
58+
resource "sysdig_group_mapping_config" "default" {
59+
no_mapping_strategy = "UNAUTHORIZED"
60+
different_team_same_role_strategy = "UNAUTHORIZED"
61+
}
62+
`
63+
}
64+
65+
func groupMappingConfigUpdate() string {
66+
return `
67+
resource "sysdig_group_mapping_config" "default" {
68+
no_mapping_strategy = "DEFAULT_TEAM_DEFAULT_ROLE"
69+
different_team_same_role_strategy = "UNAUTHORIZED"
70+
}
71+
`
72+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
subcategory: "Sysdig Platform"
3+
layout: "sysdig"
4+
page_title: "Sysdig: sysdig_group_mapping_config"
5+
description: |-
6+
Sets the group mapping conflicts resolution strategies in Sysdig.
7+
---
8+
9+
# Resource: sysdig_group_mapping_config
10+
11+
Sets the group mapping conflicts resolution strategies in Sysdig.
12+
13+
> **Warning**
14+
> This resource is global and is allowed to have only one configuration per customer
15+
16+
The `sysdig_group_mapping_config` behaves differently from normal resources, in that Terraform does not destroy this resource.
17+
On resource destruction, Terraform performs no actions in Sysdig.
18+
19+
## Example Usage
20+
21+
```terraform
22+
resource "sysdig_group_mapping_config" "resolution_strategies" {
23+
no_mapping_strategy = "UNAUTHORIZED"
24+
different_team_same_role_strategy = "UNAUTHORIZED"
25+
}
26+
```
27+
28+
## Argument Reference
29+
30+
* `no_mapping_strategy` - (Required) Sets how the system behaves when no group mapping information received from the IdP or Group information received, but the user is not a member of any mapped group. Possible values are: `UNAUTHORIZED`, `DEFAULT_TEAM_DEFAULT_ROLE`
31+
32+
* `different_team_same_role_strategy` - (Required) Sets how the system behaves when conflicting group mapping information received. Possible values are: `UNAUTHORIZED`, `FIRST_MATCH`, `WEIGHTED`
33+
34+
## Attributes Reference
35+
36+
No additional attributes are exported.
37+
38+
## Import
39+
40+
Sysdig group mapping config can be imported, e.g.
41+
42+
```
43+
$ terraform import sysdig_group_mapping_config.resolution_strategies conflicts_resolution_strategies
44+
```

0 commit comments

Comments
 (0)