Skip to content

Commit d118dfc

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

File tree

7 files changed

+335
-0
lines changed

7 files changed

+335
-0
lines changed

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ func Provider() terraform.ResourceProvider {
4747
"sysdig_secure_rule_falco": resourceSysdigSecureRuleFalco(),
4848
"sysdig_secure_team": resourceSysdigSecureTeam(),
4949
"sysdig_secure_list": resourceSysdigSecureList(),
50+
"sysdig_secure_macro": resourceSysdigSecureMacro(),
5051

5152
"sysdig_monitor_alert_downtime": resourceSysdigMonitorAlertDowntime(),
5253
"sysdig_monitor_alert_metric": resourceSysdigMonitorAlertMetric(),

sysdig/resource_sysdig_secure_list.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func resourceSysdigSecureList() *schema.Resource {
4040
"append": {
4141
Type: schema.TypeBool,
4242
Optional: true,
43+
Default: false,
4344
},
4445
"version": {
4546
Type: schema.TypeInt,
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
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 resourceSysdigSecureMacro() *schema.Resource {
11+
timeout := 30 * time.Second
12+
13+
return &schema.Resource{
14+
Create: resourceSysdigMacroCreate,
15+
Update: resourceSysdigMacroUpdate,
16+
Read: resourceSysdigMacroRead,
17+
Delete: resourceSysdigMacroDelete,
18+
19+
Timeouts: &schema.ResourceTimeout{
20+
Create: schema.DefaultTimeout(timeout),
21+
Update: schema.DefaultTimeout(timeout),
22+
Read: schema.DefaultTimeout(timeout),
23+
Delete: schema.DefaultTimeout(timeout),
24+
},
25+
26+
Schema: map[string]*schema.Schema{
27+
"name": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
ForceNew: true,
31+
},
32+
"append": {
33+
Type: schema.TypeBool,
34+
Optional: true,
35+
Default: false,
36+
},
37+
"condition": {
38+
Type: schema.TypeString,
39+
Required: true,
40+
},
41+
"version": {
42+
Type: schema.TypeInt,
43+
Computed: true,
44+
},
45+
},
46+
}
47+
}
48+
49+
func resourceSysdigMacroCreate(d *schema.ResourceData, meta interface{}) error {
50+
client := meta.(*SysdigClients).sysdigSecureClient
51+
52+
macro := macroFromResourceData(d)
53+
macro, err := client.CreateMacro(macro)
54+
if err != nil {
55+
return err
56+
}
57+
58+
d.SetId(strconv.Itoa(macro.ID))
59+
d.Set("version", macro.Version)
60+
61+
return nil
62+
}
63+
64+
func resourceSysdigMacroUpdate(d *schema.ResourceData, meta interface{}) error {
65+
client := meta.(*SysdigClients).sysdigSecureClient
66+
67+
macro := macroFromResourceData(d)
68+
macro.Version = d.Get("version").(int)
69+
70+
id, _ := strconv.Atoi(d.Id())
71+
macro.ID = id
72+
73+
_, err := client.UpdateMacro(macro)
74+
return err
75+
}
76+
77+
func resourceSysdigMacroRead(d *schema.ResourceData, meta interface{}) error {
78+
client := meta.(*SysdigClients).sysdigSecureClient
79+
80+
id, _ := strconv.Atoi(d.Id())
81+
macro, err := client.GetMacroById(id)
82+
83+
if err != nil {
84+
d.SetId("")
85+
}
86+
87+
d.Set("name", macro.Name)
88+
d.Set("version", macro.Version)
89+
d.Set("items", macro.Condition.Condition)
90+
d.Set("append", macro.Append)
91+
92+
return nil
93+
}
94+
95+
func resourceSysdigMacroDelete(d *schema.ResourceData, meta interface{}) error {
96+
client := meta.(*SysdigClients).sysdigSecureClient
97+
98+
id, _ := strconv.Atoi(d.Id())
99+
100+
return client.DeleteMacro(id)
101+
}
102+
103+
func macroFromResourceData(d *schema.ResourceData) secure.Macro {
104+
return secure.Macro{
105+
Name: d.Get("name").(string),
106+
Append: d.Get("append").(bool),
107+
Condition: secure.MacroCondition{Condition: d.Get("condition").(string)},
108+
}
109+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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 TestAccMacro(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: macroWithName(rText()),
29+
},
30+
{
31+
Config: macroWithName(fixedRandomText),
32+
},
33+
{
34+
Config: macroUpdatedWithName(fixedRandomText),
35+
},
36+
{
37+
Config: macroAppendToDefault(),
38+
},
39+
{
40+
Config: macroWithMacro(rText(), rText()),
41+
},
42+
{
43+
Config: macroWithMacroAndList(rText(), rText(), rText()),
44+
},
45+
},
46+
})
47+
}
48+
49+
func macroWithName(name string) string {
50+
return fmt.Sprintf(`
51+
resource "sysdig_secure_macro" "sample" {
52+
name = "terraform_test_%s"
53+
condition = "always_true"
54+
}
55+
`, name)
56+
}
57+
58+
func macroUpdatedWithName(name string) string {
59+
return fmt.Sprintf(`
60+
resource "sysdig_secure_macro" "sample" {
61+
name = "terraform_test_%s"
62+
condition = "never_true"
63+
}
64+
`, name)
65+
}
66+
67+
func macroAppendToDefault() string {
68+
return fmt.Sprintf(`
69+
resource "sysdig_secure_macro" "sample2" {
70+
name = "container"
71+
condition = "and always_true"
72+
append = true
73+
}
74+
`)
75+
}
76+
77+
func macroWithMacro(name1, name2 string) string {
78+
return fmt.Sprintf(`
79+
resource "sysdig_secure_macro" "sample3" {
80+
name = "terraform_test_%s"
81+
condition = "always_true"
82+
}
83+
84+
resource "sysdig_secure_macro" "sample4" {
85+
name = "terraform_test_%s"
86+
condition = "never_true and ${sysdig_secure_macro.sample3.name}"
87+
}
88+
`, name1, name2)
89+
}
90+
91+
func macroWithMacroAndList(name1, name2, name3 string) string {
92+
return fmt.Sprintf(`
93+
%s
94+
95+
resource "sysdig_secure_macro" "sample5" {
96+
name = "terraform_test_%s"
97+
condition = "fd.name in (${sysdig_secure_list.sample.name})"
98+
}
99+
100+
resource "sysdig_secure_macro" "sample6" {
101+
name = "terraform_test_%s"
102+
condition = "never_true and ${sysdig_secure_macro.sample5.name}"
103+
}
104+
`, listWithName(name3), name1, name2)
105+
}

sysdig/secure/client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ type SysdigSecureClient interface {
3838
GetListById(int) (List, error)
3939
DeleteList(int) error
4040
UpdateList(List) (List, error)
41+
42+
CreateMacro(Macro) (Macro, error)
43+
GetMacroById(int) (Macro, error)
44+
DeleteMacro(int) error
45+
UpdateMacro(Macro) (Macro, error)
4146
}
4247

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

sysdig/secure/macros.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) CreateMacro(macroRequest Macro) (macro Macro, err error) {
11+
response, err := client.doSysdigSecureRequest(http.MethodPost, client.GetMacrosUrl(), macroRequest.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+
macro, err = MacroFromJSON(body)
25+
return
26+
}
27+
28+
func (client *sysdigSecureClient) GetMacroById(id int) (macro Macro, err error) {
29+
response, err := client.doSysdigSecureRequest(http.MethodGet, client.GetMacroUrl(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+
macro, err = MacroFromJSON(body)
43+
if err != nil {
44+
return
45+
}
46+
47+
if macro.Version == 0 {
48+
err = fmt.Errorf("Macro with ID: %d does not exists", id)
49+
return
50+
}
51+
return
52+
}
53+
54+
func (client *sysdigSecureClient) UpdateMacro(macroRequest Macro) (macro Macro, err error) {
55+
response, err := client.doSysdigSecureRequest(http.MethodPut, client.GetMacroUrl(macroRequest.ID), macroRequest.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 MacroFromJSON(body)
69+
}
70+
71+
func (client *sysdigSecureClient) DeleteMacro(id int) error {
72+
response, err := client.doSysdigSecureRequest(http.MethodDelete, client.GetMacroUrl(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) GetMacrosUrl() string {
85+
return fmt.Sprintf("%s/api/secure/falco/macros", client.URL)
86+
}
87+
88+
func (client *sysdigSecureClient) GetMacroUrl(id int) string {
89+
return fmt.Sprintf("%s/api/secure/falco/macros/%d", client.URL, id)
90+
}

sysdig/secure/models.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,30 @@ func ListFromJSON(body []byte) (list List, err error) {
229229
return
230230
}
231231

232+
// -------- Macro -------
233+
234+
type Macro struct {
235+
ID int `json:"id,omitempty"`
236+
Version int `json:"version,omitempty"`
237+
Name string `json:"name"`
238+
Condition MacroCondition `json:"condition"`
239+
Append bool `json:"append"`
240+
}
241+
242+
type MacroCondition struct {
243+
Condition string `json:"condition"`
244+
}
245+
246+
func (l *Macro) ToJSON() io.Reader {
247+
payload, _ := json.Marshal(l)
248+
return bytes.NewBuffer(payload)
249+
}
250+
251+
func MacroFromJSON(body []byte) (macro Macro, err error) {
252+
err = json.Unmarshal(body, &macro)
253+
return
254+
}
255+
232256
// -------- User --------
233257
type User struct {
234258
ID int `json:"id,omitempty"`

0 commit comments

Comments
 (0)