Skip to content

Commit ee4828b

Browse files
committed
feat(resource): Add sysdig_secure_list resource
Signed-off-by: Federico Barcelona <[email protected]>
1 parent 61ad471 commit ee4828b

File tree

7 files changed

+327
-1
lines changed

7 files changed

+327
-1
lines changed

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func Provider() terraform.ResourceProvider {
4646
"sysdig_secure_rule_syscall": resourceSysdigSecureRuleSyscall(),
4747
"sysdig_secure_rule_falco": resourceSysdigSecureRuleFalco(),
4848
"sysdig_secure_team": resourceSysdigSecureTeam(),
49+
"sysdig_secure_list": resourceSysdigSecureList(),
4950

5051
"sysdig_monitor_alert_downtime": resourceSysdigMonitorAlertDowntime(),
5152
"sysdig_monitor_alert_metric": resourceSysdigMonitorAlertMetric(),
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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+
"strings"
8+
"time"
9+
)
10+
11+
func resourceSysdigSecureList() *schema.Resource {
12+
timeout := 30 * time.Second
13+
14+
return &schema.Resource{
15+
Create: resourceSysdigListCreate,
16+
Update: resourceSysdigListUpdate,
17+
Read: resourceSysdigListRead,
18+
Delete: resourceSysdigListDelete,
19+
20+
Timeouts: &schema.ResourceTimeout{
21+
Create: schema.DefaultTimeout(timeout),
22+
Update: schema.DefaultTimeout(timeout),
23+
Read: schema.DefaultTimeout(timeout),
24+
Delete: schema.DefaultTimeout(timeout),
25+
},
26+
27+
Schema: map[string]*schema.Schema{
28+
"name": {
29+
Type: schema.TypeString,
30+
Required: true,
31+
ForceNew: true,
32+
},
33+
"items": {
34+
Type: schema.TypeList,
35+
Required: true,
36+
Elem: &schema.Schema{
37+
Type: schema.TypeString,
38+
},
39+
},
40+
"append": {
41+
Type: schema.TypeBool,
42+
Optional: true,
43+
},
44+
"version": {
45+
Type: schema.TypeInt,
46+
Computed: true,
47+
},
48+
},
49+
}
50+
}
51+
52+
func resourceSysdigListCreate(d *schema.ResourceData, meta interface{}) error {
53+
client := meta.(*SysdigClients).sysdigSecureClient
54+
55+
list := listFromResourceData(d)
56+
list, err := client.CreateList(list)
57+
if err != nil {
58+
return err
59+
}
60+
61+
d.SetId(strconv.Itoa(list.ID))
62+
d.Set("version", list.Version)
63+
64+
return nil
65+
}
66+
67+
func resourceSysdigListUpdate(d *schema.ResourceData, meta interface{}) error {
68+
client := meta.(*SysdigClients).sysdigSecureClient
69+
70+
list := listFromResourceData(d)
71+
list.Version = d.Get("version").(int)
72+
73+
id, _ := strconv.Atoi(d.Id())
74+
list.ID = id
75+
76+
_, err := client.UpdateList(list)
77+
return err
78+
}
79+
80+
func resourceSysdigListRead(d *schema.ResourceData, meta interface{}) error {
81+
client := meta.(*SysdigClients).sysdigSecureClient
82+
83+
id, _ := strconv.Atoi(d.Id())
84+
list, err := client.GetListById(id)
85+
86+
if err != nil {
87+
d.SetId("")
88+
}
89+
90+
d.Set("name", list.Name)
91+
d.Set("version", list.Version)
92+
d.Set("items", list.Items.Items)
93+
d.Set("append", list.Append)
94+
95+
return nil
96+
}
97+
98+
func resourceSysdigListDelete(d *schema.ResourceData, meta interface{}) error {
99+
client := meta.(*SysdigClients).sysdigSecureClient
100+
101+
id, _ := strconv.Atoi(d.Id())
102+
103+
return client.DeleteList(id)
104+
}
105+
106+
func listFromResourceData(d *schema.ResourceData) secure.List {
107+
list := secure.List{
108+
Name: d.Get("name").(string),
109+
Append: d.Get("append").(bool),
110+
Items: secure.Items{Items: []string{}},
111+
}
112+
113+
items := d.Get("items").([]interface{})
114+
for _, item := range items {
115+
if item_str, ok := item.(string); ok {
116+
item_str = strings.TrimSpace(item_str)
117+
list.Items.Items = append(list.Items.Items, item_str)
118+
}
119+
}
120+
121+
return list
122+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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 TestAccList(t *testing.T) {
14+
rText := func() string { return acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum) }
15+
fixedRandomText := rText()
16+
17+
resource.ParallelTest(t, resource.TestCase{
18+
PreCheck: func() {
19+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
20+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
21+
}
22+
},
23+
Providers: map[string]terraform.ResourceProvider{
24+
"sysdig": sysdig.Provider(),
25+
},
26+
Steps: []resource.TestStep{
27+
{
28+
Config: listWithName(rText()),
29+
},
30+
{
31+
Config: listWithName(fixedRandomText),
32+
},
33+
{
34+
Config: listUpdatedWithName(fixedRandomText),
35+
},
36+
{
37+
Config: listAppendToDefault(),
38+
},
39+
{
40+
Config: listWithList(rText(), rText()),
41+
},
42+
},
43+
})
44+
}
45+
46+
func listWithName(name string) string {
47+
return fmt.Sprintf(`
48+
resource "sysdig_secure_list" "sample" {
49+
name = "terraform_test_%s"
50+
items = ["foo", "bar"]
51+
}
52+
`, name)
53+
}
54+
55+
func listUpdatedWithName(name string) string {
56+
return fmt.Sprintf(`
57+
resource "sysdig_secure_list" "sample" {
58+
name = "terraform_test_%s"
59+
items = ["foo", "bar", "baz"]
60+
}
61+
`, name)
62+
}
63+
64+
func listAppendToDefault() string {
65+
return fmt.Sprintf(`
66+
resource "sysdig_secure_list" "sample2" {
67+
name = "allowed_k8s_nodes"
68+
items = ["foo", "bar"]
69+
append = true
70+
}
71+
`)
72+
}
73+
74+
func listWithList(name1, name2 string) string {
75+
return fmt.Sprintf(`
76+
resource "sysdig_secure_list" "sample3" {
77+
name = "terraform_test_%s"
78+
items = ["foo", "bar"]
79+
}
80+
81+
resource "sysdig_secure_list" "sample4" {
82+
name = "terraform_test_%s"
83+
items = [sysdig_secure_list.sample3.name]
84+
}
85+
`, name1, name2)
86+
}

sysdig/secure/client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ type SysdigSecureClient interface {
3333
GetTeamById(int) (Team, error)
3434
DeleteTeam(int) error
3535
UpdateTeam(Team) (Team, error)
36+
37+
CreateList(List) (List, error)
38+
GetListById(int) (List, error)
39+
DeleteList(int) error
40+
UpdateList(List) (List, error)
3641
}
3742

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

sysdig/secure/lists.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package secure
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"io/ioutil"
7+
"net/http"
8+
)
9+
10+
func (client *sysdigSecureClient) CreateList(listRequest List) (list List, err error) {
11+
response, err := client.doSysdigSecureRequest(http.MethodPost, client.GetListsUrl(), listRequest.ToJSON())
12+
if err != nil {
13+
return
14+
}
15+
defer response.Body.Close()
16+
17+
body, _ := ioutil.ReadAll(response.Body)
18+
19+
if response.StatusCode != http.StatusOK && response.StatusCode != http.StatusCreated {
20+
err = errors.New(response.Status)
21+
return
22+
}
23+
24+
list, err = ListFromJSON(body)
25+
return
26+
}
27+
28+
func (client *sysdigSecureClient) GetListById(id int) (list List, err error) {
29+
response, err := client.doSysdigSecureRequest(http.MethodGet, client.GetListUrl(id), nil)
30+
if err != nil {
31+
return
32+
}
33+
defer response.Body.Close()
34+
35+
body, _ := ioutil.ReadAll(response.Body)
36+
37+
if response.StatusCode != http.StatusOK {
38+
err = errors.New(response.Status)
39+
return
40+
}
41+
42+
list, err = ListFromJSON(body)
43+
if err != nil {
44+
return
45+
}
46+
47+
if list.Version == 0 {
48+
err = fmt.Errorf("List with ID: %d does not exists", id)
49+
return
50+
}
51+
return
52+
}
53+
54+
func (client *sysdigSecureClient) UpdateList(listRequest List) (list List, err error) {
55+
response, err := client.doSysdigSecureRequest(http.MethodPut, client.GetListUrl(listRequest.ID), listRequest.ToJSON())
56+
if err != nil {
57+
return
58+
}
59+
defer response.Body.Close()
60+
61+
body, _ := ioutil.ReadAll(response.Body)
62+
63+
if response.StatusCode != http.StatusOK {
64+
err = errors.New(response.Status)
65+
return
66+
}
67+
68+
return ListFromJSON(body)
69+
}
70+
71+
func (client *sysdigSecureClient) DeleteList(id int) error {
72+
response, err := client.doSysdigSecureRequest(http.MethodDelete, client.GetListUrl(id), nil)
73+
if err != nil {
74+
return err
75+
}
76+
defer response.Body.Close()
77+
78+
if response.StatusCode != http.StatusNoContent && response.StatusCode != http.StatusOK {
79+
return errors.New(response.Status)
80+
}
81+
return nil
82+
}
83+
84+
func (client *sysdigSecureClient) GetListsUrl() string {
85+
return fmt.Sprintf("%s/api/secure/falco/lists", client.URL)
86+
}
87+
88+
func (client *sysdigSecureClient) GetListUrl(id int) string {
89+
return fmt.Sprintf("%s/api/secure/falco/lists/%d", client.URL, id)
90+
}

sysdig/secure/models.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,29 @@ func RuleFromJSON(body []byte) (rule Rule, err error) {
206206
return
207207
}
208208

209+
// -------- List --------
210+
211+
type List struct {
212+
Name string `json:"name"`
213+
Items Items `json:"items"`
214+
Append bool `json:"append"`
215+
ID int `json:"id,omitempty"`
216+
Version int `json:"version,omitempty"`
217+
}
218+
type Items struct {
219+
Items []string `json:"items"`
220+
}
221+
222+
func (l *List) ToJSON() io.Reader {
223+
payload, _ := json.Marshal(l)
224+
return bytes.NewBuffer(payload)
225+
}
226+
227+
func ListFromJSON(body []byte) (list List, err error) {
228+
err = json.Unmarshal(body, &list)
229+
return
230+
}
231+
209232
// -------- User --------
210233
type User struct {
211234
ID int `json:"id,omitempty"`

sysdig/secure/notification_channels.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ func (client *sysdigSecureClient) UpdateNotificationChannel(ncRequest Notificati
9191

9292
nc = NotificationChannelFromJSON(body)
9393
return
94-
9594
}
9695

9796
func (client *sysdigSecureClient) DeleteNotificationChannel(id int) error {

0 commit comments

Comments
 (0)