Skip to content

Commit bbaf485

Browse files
feat(policies) add stateful policy and rule support (#604)
* add stateful policy and rule support * fix tests * Update resource_sysdig_secure_rule_stateful_test.go * add tests for stateful policy, skip in ibm * only run tests on secure * use existing exception name * add docs * only allow name/values in exceptions * address review comments part 1 * address review comments part 2 * address review comments part 3 * add version to resource * add docs * address lint errors * Small fix to test * Fix test failure * Remove computed enabled flag for managed policy data source --------- Co-authored-by: ombellare <omkar.bellare@sysdig.com>
1 parent 68cab2a commit bbaf485

9 files changed

+574
-16
lines changed

sysdig/data_source_sysdig_secure_managed_policy_test.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package sysdig_test
44

55
import (
66
"os"
7+
"strings"
78
"testing"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -13,6 +14,18 @@ import (
1314
)
1415

1516
func TestAccManagedPolicyDataSource(t *testing.T) {
17+
steps := []resource.TestStep{
18+
{
19+
Config: managedPolicyDataSource(),
20+
},
21+
}
22+
23+
if !strings.HasSuffix(os.Getenv("SYSDIG_SECURE_URL"), "ibm.com") {
24+
steps = append(steps, resource.TestStep{
25+
Config: managedStatefulPolicyDataSource(),
26+
},
27+
)
28+
}
1629
resource.ParallelTest(t, resource.TestCase{
1730
PreCheck: func() {
1831
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
@@ -24,11 +37,7 @@ func TestAccManagedPolicyDataSource(t *testing.T) {
2437
return sysdig.Provider(), nil
2538
},
2639
},
27-
Steps: []resource.TestStep{
28-
{
29-
Config: managedPolicyDataSource(),
30-
},
31-
},
40+
Steps: steps,
3241
})
3342
}
3443

@@ -40,3 +49,12 @@ data "sysdig_secure_managed_policy" "example" {
4049
}
4150
`
4251
}
52+
53+
func managedStatefulPolicyDataSource() string {
54+
return `
55+
data "sysdig_secure_managed_policy" "stateful_example" {
56+
name = "Sysdig AWS Behavioral Analytics Threat Detection"
57+
type = "awscloudtrail_stateful"
58+
}
59+
`
60+
}

sysdig/internal/client/v2/model.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -520,12 +520,15 @@ type Rule struct {
520520
}
521521

522522
const (
523-
RuleTypeContainer = "CONTAINER"
524-
RuleTypeFalco = "FALCO"
525-
RuleTypeFilesystem = "FILESYSTEM"
526-
RuleTypeNetwork = "NETWORK"
527-
RuleTypeProcess = "PROCESS"
528-
RuleTypeSyscall = "SYSCALL"
523+
RuleTypeContainer = "CONTAINER"
524+
RuleTypeFalco = "FALCO"
525+
RuleTypeFilesystem = "FILESYSTEM"
526+
RuleTypeNetwork = "NETWORK"
527+
RuleTypeProcess = "PROCESS"
528+
RuleTypeSyscall = "SYSCALL"
529+
RuleTypeStatefulSequence = "STATEFUL_SEQUENCE"
530+
RuleTypeStatefulUniqPercent = "STATEFUL_UNIQ_PERCENT"
531+
RuleTypeStatefulCount = "STATEFUL_COUNT"
529532
)
530533

531534
type Details struct {

sysdig/internal/client/v2/rules.go

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ import (
88
)
99

1010
const (
11-
CreateRulePath = "%s/api/secure/rules?skipPolicyV2Msg=%t"
12-
GetRuleByIDPath = "%s/api/secure/rules/%d"
13-
UpdateRulePath = "%s/api/secure/rules/%d?skipPolicyV2Msg=%t"
14-
DeleteURLPath = "%s/api/secure/rules/%d?skipPolicyV2Msg=%t"
15-
GetRuleGroupPath = "%s/api/secure/rules/groups?name=%s&type=%s"
11+
CreateRulePath = "%s/api/secure/rules?skipPolicyV2Msg=%t"
12+
GetRuleByIDPath = "%s/api/secure/rules/%d"
13+
UpdateRulePath = "%s/api/secure/rules/%d?skipPolicyV2Msg=%t"
14+
DeleteURLPath = "%s/api/secure/rules/%d?skipPolicyV2Msg=%t"
15+
GetRuleGroupPath = "%s/api/secure/rules/groups?name=%s&type=%s"
16+
CreateStatefulRulePath = "%s/api/policies/v3/statefulRules"
17+
UpdateStatefulRulePath = "%s/api/policies/v3/statefulRules/%d"
18+
DeleteStatefulRulePath = "%s/api/policies/v3/statefulRules/%d"
19+
GetStatefulRuleGroupPath = "%s/api/policies/v3/statefulRules/groups?name=%s&type=%s"
1620
)
1721

1822
type RuleInterface interface {
@@ -22,6 +26,10 @@ type RuleInterface interface {
2226
UpdateRule(ctx context.Context, rule Rule) (Rule, error)
2327
DeleteRule(ctx context.Context, ruleID int) error
2428
GetRuleGroup(ctx context.Context, ruleName string, ruleType string) ([]Rule, error)
29+
CreateStatefulRule(ctx context.Context, rule Rule) (Rule, error)
30+
UpdateStatefulRule(ctx context.Context, rule Rule) (Rule, error)
31+
DeleteStatefulRule(ctx context.Context, ruleID int) error
32+
GetStatefulRuleGroup(ctx context.Context, ruleName string, ruleType string) ([]Rule, error)
2533
}
2634

2735
func (client *Client) CreateRule(ctx context.Context, rule Rule) (Rule, error) {
@@ -125,3 +133,85 @@ func (client *Client) DeleteRuleURL(ruleID int) string {
125133
func (client *Client) GetRuleGroupURL(ruleName string, ruleType string) string {
126134
return fmt.Sprintf(GetRuleGroupPath, client.config.url, url.QueryEscape(ruleName), url.QueryEscape(ruleType))
127135
}
136+
137+
func (client *Client) CreateStatefulRuleURL() string {
138+
return fmt.Sprintf(CreateStatefulRulePath, client.config.url)
139+
}
140+
141+
func (client *Client) UpdateStatefulRuleURL(ruleID int) string {
142+
return fmt.Sprintf(UpdateStatefulRulePath, client.config.url, ruleID)
143+
}
144+
145+
func (client *Client) DeleteStatefulRuleURL(ruleID int) string {
146+
return fmt.Sprintf(DeleteStatefulRulePath, client.config.url, ruleID)
147+
}
148+
149+
func (client *Client) GetStatefulRuleGroupURL(ruleName string, ruleType string) string {
150+
return fmt.Sprintf(GetStatefulRuleGroupPath, client.config.url, url.QueryEscape(ruleName), url.QueryEscape(ruleType))
151+
}
152+
153+
func (client *Client) CreateStatefulRule(ctx context.Context, rule Rule) (Rule, error) {
154+
payload, err := Marshal(rule)
155+
if err != nil {
156+
return Rule{}, err
157+
}
158+
response, err := client.requester.Request(ctx, http.MethodPost, client.CreateStatefulRuleURL(), payload)
159+
if err != nil {
160+
return Rule{}, err
161+
}
162+
defer response.Body.Close()
163+
164+
if response.StatusCode != http.StatusOK {
165+
return Rule{}, client.ErrorFromResponse(response)
166+
}
167+
168+
return Unmarshal[Rule](response.Body)
169+
}
170+
171+
func (client *Client) UpdateStatefulRule(ctx context.Context, rule Rule) (Rule, error) {
172+
payload, err := Marshal(rule)
173+
if err != nil {
174+
return Rule{}, err
175+
}
176+
177+
response, err := client.requester.Request(ctx, http.MethodPut, client.UpdateStatefulRuleURL(rule.ID), payload)
178+
if err != nil {
179+
return Rule{}, err
180+
}
181+
182+
defer response.Body.Close()
183+
184+
if response.StatusCode != http.StatusOK {
185+
return Rule{}, client.ErrorFromResponse(response)
186+
}
187+
188+
return Unmarshal[Rule](response.Body)
189+
}
190+
191+
func (client *Client) DeleteStatefulRule(ctx context.Context, ruleID int) error {
192+
response, err := client.requester.Request(ctx, http.MethodDelete, client.DeleteStatefulRuleURL(ruleID), nil)
193+
if err != nil {
194+
return err
195+
}
196+
defer response.Body.Close()
197+
198+
if response.StatusCode != http.StatusNoContent && response.StatusCode != http.StatusOK {
199+
return client.ErrorFromResponse(response)
200+
}
201+
202+
return err
203+
}
204+
205+
func (client *Client) GetStatefulRuleGroup(ctx context.Context, ruleName string, ruleType string) ([]Rule, error) {
206+
response, err := client.requester.Request(ctx, http.MethodGet, client.GetStatefulRuleGroupURL(ruleName, ruleType), nil)
207+
if err != nil {
208+
return []Rule{}, err
209+
}
210+
defer response.Body.Close()
211+
212+
if response.StatusCode != http.StatusOK {
213+
return []Rule{}, client.ErrorFromResponse(response)
214+
}
215+
216+
return Unmarshal[[]Rule](response.Body)
217+
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
148148
"sysdig_secure_rule_process": resourceSysdigSecureRuleProcess(),
149149
"sysdig_secure_rule_syscall": resourceSysdigSecureRuleSyscall(),
150150
"sysdig_secure_rule_falco": resourceSysdigSecureRuleFalco(),
151+
"sysdig_secure_rule_stateful": resourceSysdigSecureStatefulRule(),
151152
"sysdig_secure_team": resourceSysdigSecureTeam(),
152153
"sysdig_secure_list": resourceSysdigSecureList(),
153154
"sysdig_secure_macro": resourceSysdigSecureMacro(),

sysdig/resource_sysdig_secure_policy.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var validatePolicyType = validation.StringInSlice([]string{
3333
"aws_machine_learning",
3434
"machine_learning",
3535
"guardduty",
36+
"awscloudtrail_stateful",
3637
}, false)
3738

3839
func resourceSysdigSecurePolicy() *schema.Resource {

0 commit comments

Comments
 (0)