Skip to content

Commit 7866876

Browse files
authored
feat: Add team resource (#15)
Signed-off-by: Hiroki Suezawa <[email protected]>
1 parent a6aef79 commit 7866876

File tree

7 files changed

+488
-0
lines changed

7 files changed

+488
-0
lines changed

examples/team.tf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
resource "sysdig_secure_team" "sample" {
2+
name = "sample-team"
3+
description = "sample"
4+
scope_by = "container"
5+
filter = "container.image.repo = \"sysdig/agent\""
6+
use_sysdig_capture = false
7+
8+
user_roles {
9+
10+
role = "ROLE_TEAM_STANDARD"
11+
}
12+
13+
user_roles {
14+
15+
role = "ROLE_TEAM_EDIT"
16+
}
17+
18+
}
19+

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func Provider() terraform.ResourceProvider {
4444
"sysdig_secure_rule_syscall": resourceSysdigSecureRuleSyscall(),
4545
"sysdig_secure_rule_falco": resourceSysdigSecureRuleFalco(),
4646
"sysdig_user": resourceSysdigUser(),
47+
"sysdig_secure_team": resourceSysdigSecureTeam(),
4748

4849
"sysdig_monitor_alert_downtime": resourceSysdigMonitorAlertDowntime(),
4950
"sysdig_monitor_alert_metric": resourceSysdigMonitorAlertMetric(),
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package sysdig
2+
3+
import (
4+
"github.com/draios/terraform-provider-sysdig/sysdig/secure"
5+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
6+
"strconv"
7+
"time"
8+
)
9+
10+
func resourceSysdigSecureTeam() *schema.Resource {
11+
timeout := 30 * time.Second
12+
13+
return &schema.Resource{
14+
Create: resourceSysdigTeamCreate,
15+
Update: resourceSysdigTeamUpdate,
16+
Read: resourceSysdigTeamRead,
17+
Delete: resourceSysdigTeamDelete,
18+
19+
Timeouts: &schema.ResourceTimeout{
20+
Create: schema.DefaultTimeout(timeout),
21+
},
22+
23+
Schema: map[string]*schema.Schema{
24+
"theme": {
25+
Type: schema.TypeString,
26+
Optional: true,
27+
Default: "#73A1F7",
28+
},
29+
"name": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
},
33+
"description": {
34+
Type: schema.TypeString,
35+
Optional: true,
36+
},
37+
"scope_by": {
38+
Type: schema.TypeString,
39+
Optional: true,
40+
Default: "container",
41+
},
42+
"filter": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
},
46+
"use_sysdig_capture": {
47+
Type: schema.TypeBool,
48+
Optional: true,
49+
Default: true,
50+
},
51+
"user_roles": {
52+
Type: schema.TypeSet,
53+
Optional: true,
54+
Elem: &schema.Resource{
55+
Schema: map[string]*schema.Schema{
56+
"email": {
57+
Type: schema.TypeString,
58+
Required: true,
59+
},
60+
61+
"role": {
62+
Type: schema.TypeString,
63+
Optional: true,
64+
Default: "ROLE_TEAM_STANDARD",
65+
},
66+
},
67+
},
68+
},
69+
"default_team": {
70+
Type: schema.TypeBool,
71+
Optional: true,
72+
Default: false,
73+
},
74+
"version": {
75+
Type: schema.TypeInt,
76+
Computed: true,
77+
},
78+
},
79+
}
80+
}
81+
82+
func resourceSysdigTeamCreate(d *schema.ResourceData, meta interface{}) error {
83+
client := meta.(*SysdigClients).sysdigSecureClient
84+
85+
team := teamFromResourceData(d)
86+
87+
team, err := client.CreateTeam(team)
88+
if err != nil {
89+
return err
90+
}
91+
92+
d.SetId(strconv.Itoa(team.ID))
93+
d.Set("version", team.Version)
94+
95+
return nil
96+
}
97+
98+
// Retrieves the information of a resource form the file and loads it in Terraform
99+
func resourceSysdigTeamRead(d *schema.ResourceData, meta interface{}) error {
100+
client := meta.(*SysdigClients).sysdigSecureClient
101+
102+
id, _ := strconv.Atoi(d.Id())
103+
t, err := client.GetTeamById(id)
104+
105+
if err != nil {
106+
d.SetId("")
107+
return err
108+
}
109+
110+
d.Set("version", t.Version)
111+
d.Set("theme", t.Theme)
112+
d.Set("name", t.Name)
113+
d.Set("description", t.Description)
114+
d.Set("scope_by", t.ScopeBy)
115+
d.Set("filter", t.Filter)
116+
d.Set("canUseSysdigCapture", t.CanUseSysdigCapture)
117+
d.Set("default_team", t.DefaultTeam)
118+
d.Set("user_roles", t.UserRoles)
119+
120+
return nil
121+
}
122+
123+
func resourceSysdigTeamUpdate(d *schema.ResourceData, meta interface{}) error {
124+
client := meta.(*SysdigClients).sysdigSecureClient
125+
126+
t := teamFromResourceData(d)
127+
128+
t.Version = d.Get("version").(int)
129+
t.ID, _ = strconv.Atoi(d.Id())
130+
131+
_, err := client.UpdateTeam(t)
132+
133+
return err
134+
}
135+
136+
func resourceSysdigTeamDelete(d *schema.ResourceData, meta interface{}) error {
137+
client := meta.(*SysdigClients).sysdigSecureClient
138+
139+
id, _ := strconv.Atoi(d.Id())
140+
141+
return client.DeleteTeam(id)
142+
}
143+
144+
func teamFromResourceData(d *schema.ResourceData) secure.Team {
145+
t := secure.Team{
146+
Theme: d.Get("theme").(string),
147+
Name: d.Get("name").(string),
148+
Description: d.Get("description").(string),
149+
ScopeBy: d.Get("scope_by").(string),
150+
Filter: d.Get("filter").(string),
151+
CanUseSysdigCapture: d.Get("use_sysdig_capture").(bool),
152+
DefaultTeam: d.Get("default_team").(bool),
153+
Products: []string{"SDS"},
154+
}
155+
156+
userRoles := []secure.UserRoles{}
157+
for _, userRole := range d.Get("user_roles").(*schema.Set).List() {
158+
ur := userRole.(map[string]interface{})
159+
userRoles = append(userRoles, secure.UserRoles{
160+
Email: ur["email"].(string),
161+
Role: ur["role"].(string),
162+
})
163+
}
164+
t.UserRoles = userRoles
165+
166+
return t
167+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package sysdig_test
2+
3+
import (
4+
"fmt"
5+
"github.com/draios/terraform-provider-sysdig/sysdig"
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
9+
"os"
10+
"testing"
11+
)
12+
13+
func TestAccTeam(t *testing.T) {
14+
rText := func() string { return acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum) }
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() {
18+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
19+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
20+
}
21+
},
22+
Providers: map[string]terraform.ResourceProvider{
23+
"sysdig": sysdig.Provider(),
24+
},
25+
Steps: []resource.TestStep{
26+
{
27+
Config: teamWithName(rText()),
28+
},
29+
{
30+
Config: teamWithOneUser(rText()),
31+
},
32+
{
33+
Config: teamWithTwoUser(rText()),
34+
},
35+
{
36+
Config: teamMinimumConfiguration(rText()),
37+
},
38+
},
39+
})
40+
}
41+
42+
func teamWithName(name string) string {
43+
return fmt.Sprintf(`
44+
resource "sysdig_secure_team" "sample" {
45+
name = "sample-%s"
46+
description = "%s"
47+
scope_by = "container"
48+
filter = "container.image.repo = \"sysdig/agent\""
49+
}`, name, name)
50+
}
51+
52+
func teamWithOneUser(name string) string {
53+
return fmt.Sprintf(`
54+
resource "sysdig_user" "sample" {
55+
56+
}
57+
58+
resource "sysdig_secure_team" "sample" {
59+
name = "sample-%s"
60+
description = "%s"
61+
scope_by = "container"
62+
filter = "container.image.repo = \"sysdig/agent\""
63+
use_sysdig_capture = false
64+
65+
user_roles {
66+
email = sysdig_user.sample.email
67+
role = "ROLE_TEAM_EDIT"
68+
}
69+
}`, name, name)
70+
}
71+
72+
func teamWithTwoUser(name string) string {
73+
return fmt.Sprintf(`
74+
resource "sysdig_user" "sample1" {
75+
76+
}
77+
78+
resource "sysdig_user" "sample2" {
79+
80+
}
81+
82+
resource "sysdig_secure_team" "sample" {
83+
name = "sample-%s"
84+
description = "%s"
85+
scope_by = "container"
86+
filter = "container.image.repo = \"sysdig/agent\""
87+
use_sysdig_capture = false
88+
89+
user_roles {
90+
email = sysdig_user.sample1.email
91+
role = "ROLE_TEAM_EDIT"
92+
}
93+
94+
user_roles {
95+
email = sysdig_user.sample2.email
96+
role = "ROLE_TEAM_MANAGER"
97+
}
98+
}`, name, name)
99+
}
100+
101+
func teamMinimumConfiguration(name string) string {
102+
return fmt.Sprintf(`
103+
resource "sysdig_secure_team" "sample" {
104+
name = "sample-%s"
105+
}`, name)
106+
}

sysdig/secure/client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ type SysdigSecureClient interface {
2525
GetUserById(int) (User, error)
2626
DeleteUser(int) error
2727
UpdateUser(User) (User, error)
28+
29+
CreateTeam(Team) (Team, error)
30+
GetTeamById(int) (Team, error)
31+
DeleteTeam(int) error
32+
UpdateTeam(Team) (Team, error)
2833
}
2934

3035
func NewSysdigSecureClient(sysdigSecureAPIToken string, url string) SysdigSecureClient {

sysdig/secure/models.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,3 +220,57 @@ func UserFromJSON(body []byte) User {
220220
type userWrapper struct {
221221
User User `json:"user"`
222222
}
223+
224+
// -------- Team --------
225+
type Team struct {
226+
ID int `json:"id,omitempty"`
227+
Version int `json:"version,omitempty"`
228+
Theme string `json:"theme"`
229+
Name string `json:"name"`
230+
Description string `json:"description"`
231+
ScopeBy string `json:"show"`
232+
Filter string `json:"filter"`
233+
CanUseSysdigCapture bool `json:"canUseSysdigCapture"`
234+
UserRoles []UserRoles `json:"userRoles,omitempty"`
235+
DefaultTeam bool `json:"default"`
236+
Products []string `json:"products"`
237+
}
238+
239+
type UserRoles struct {
240+
UserId int `json:"userId"`
241+
Email string `json:"userName",omitempty`
242+
Role string `json:"role"`
243+
}
244+
245+
func (t *Team) ToJSON() io.Reader {
246+
payload, _ := json.Marshal(*t)
247+
return bytes.NewBuffer(payload)
248+
}
249+
250+
func TeamFromJSON(body []byte) Team {
251+
var result teamWrapper
252+
json.Unmarshal(body, &result)
253+
254+
return result.Team
255+
}
256+
257+
type teamWrapper struct {
258+
Team Team `json:"team"`
259+
}
260+
261+
// -------- UsersList --------
262+
type UsersList struct {
263+
ID int `json:"id"`
264+
Email string `json:"username"`
265+
}
266+
267+
func UsersListFromJSON(body []byte) []UsersList {
268+
var result usersListWrapper
269+
json.Unmarshal(body, &result)
270+
271+
return result.UsersList
272+
}
273+
274+
type usersListWrapper struct {
275+
UsersList []UsersList `json:"users"`
276+
}

0 commit comments

Comments
 (0)