Skip to content

Commit f2c01e0

Browse files
author
Ben Lucas
authored
feat(policies): data source falco rules (#344)
* initial implementation for data source for falco rules * separate implementation of sysdig_secure_rule_falco from sysdig_secure_rule_falco_count. Add tests * add documentation for data sources * switch fields to computed for data source
1 parent e136ad9 commit f2c01e0

9 files changed

+469
-3
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceSysdigSecureRuleFalco() *schema.Resource {
12+
timeout := 5 * time.Minute
13+
14+
return &schema.Resource{
15+
ReadContext: dataSourceSysdigRuleFalcoRead,
16+
17+
Timeouts: &schema.ResourceTimeout{
18+
Read: schema.DefaultTimeout(timeout),
19+
},
20+
21+
Schema: createRuleDataSourceSchema(map[string]*schema.Schema{
22+
"source": {
23+
Type: schema.TypeString,
24+
Optional: true,
25+
Default: "",
26+
ValidateDiagFunc: validateDiagFunc(validateFalcoRuleSource),
27+
},
28+
"index": {
29+
Type: schema.TypeInt,
30+
Optional: true,
31+
Default: 0,
32+
},
33+
"condition": {
34+
Type: schema.TypeString,
35+
Computed: true,
36+
},
37+
"output": {
38+
Type: schema.TypeString,
39+
Computed: true,
40+
},
41+
"priority": {
42+
Type: schema.TypeString,
43+
Computed: true,
44+
},
45+
"append": {
46+
47+
Type: schema.TypeBool,
48+
Computed: true,
49+
},
50+
"exceptions": {
51+
Type: schema.TypeList,
52+
Computed: true,
53+
Elem: &schema.Resource{
54+
Schema: map[string]*schema.Schema{
55+
"name": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
},
59+
"comps": {
60+
Type: schema.TypeList,
61+
Computed: true,
62+
Elem: &schema.Schema{Type: schema.TypeString},
63+
},
64+
"values": {
65+
Type: schema.TypeString,
66+
Computed: true,
67+
},
68+
"fields": {
69+
Type: schema.TypeList,
70+
Computed: true,
71+
Elem: &schema.Schema{Type: schema.TypeString},
72+
},
73+
},
74+
},
75+
},
76+
}),
77+
}
78+
}
79+
80+
func dataSourceSysdigRuleFalcoRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
81+
client, err := getSecureRuleClient(meta.(SysdigClients))
82+
if err != nil {
83+
return diag.FromErr(err)
84+
}
85+
86+
ruleName := d.Get("name").(string)
87+
ruleType := d.Get("source").(string)
88+
ruleIndex := d.Get("index").(int)
89+
rules, err := client.GetRuleGroup(ctx, ruleName, ruleType)
90+
if err != nil {
91+
return diag.FromErr(err)
92+
}
93+
94+
if len(rules) == 0 {
95+
return diag.Errorf("unable to find rule")
96+
}
97+
98+
if ruleIndex >= len(rules) {
99+
return diag.Errorf("unable to find rule at the index provided")
100+
}
101+
rule := rules[ruleIndex]
102+
103+
ruleDataSourceToResourceData(rule, d)
104+
105+
if rule.Details.Condition != nil {
106+
_ = d.Set("condition", rule.Details.Condition.Condition)
107+
}
108+
_ = d.Set("output", rule.Details.Output)
109+
_ = d.Set("priority", rule.Details.Priority)
110+
_ = d.Set("source", rule.Details.Source)
111+
if rule.Details.Append != nil {
112+
_ = d.Set("append", *rule.Details.Append)
113+
}
114+
if err := updateResourceDataExceptions(d, rule.Details.Exceptions); err != nil {
115+
return diag.FromErr(err)
116+
}
117+
118+
return nil
119+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceSysdigSecureRuleFalcoCount() *schema.Resource {
13+
timeout := 5 * time.Minute
14+
15+
return &schema.Resource{
16+
ReadContext: dataSourceSysdigRuleFalcoCountRead,
17+
18+
Timeouts: &schema.ResourceTimeout{
19+
Read: schema.DefaultTimeout(timeout),
20+
},
21+
22+
Schema: map[string]*schema.Schema{
23+
"name": {
24+
Type: schema.TypeString,
25+
Required: true,
26+
},
27+
"source": {
28+
Type: schema.TypeString,
29+
Optional: true,
30+
Default: "",
31+
ValidateDiagFunc: validateDiagFunc(validateFalcoRuleSource),
32+
},
33+
"rule_count": {
34+
Type: schema.TypeInt,
35+
Computed: true,
36+
},
37+
},
38+
}
39+
}
40+
41+
func dataSourceSysdigRuleFalcoCountRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
42+
client, err := getSecureRuleClient(meta.(SysdigClients))
43+
if err != nil {
44+
return diag.FromErr(err)
45+
}
46+
47+
ruleName := d.Get("name").(string)
48+
ruleType := d.Get("source").(string)
49+
rules, err := client.GetRuleGroup(ctx, ruleName, ruleType)
50+
if err != nil {
51+
return diag.FromErr(err)
52+
}
53+
54+
d.SetId(fmt.Sprintf("count_%s", ruleName))
55+
_ = d.Set("name", ruleName)
56+
_ = d.Set("rule_count", len(rules))
57+
58+
return nil
59+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies
2+
3+
package sysdig_test
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
14+
"github.com/draios/terraform-provider-sysdig/sysdig"
15+
)
16+
17+
func TestAccRuleFalcoCountDataSource(t *testing.T) {
18+
rText := func() string { return acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum) }
19+
20+
resource.ParallelTest(t, resource.TestCase{
21+
PreCheck: func() {
22+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
23+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
24+
}
25+
},
26+
ProviderFactories: map[string]func() (*schema.Provider, error){
27+
"sysdig": func() (*schema.Provider, error) {
28+
return sysdig.Provider(), nil
29+
},
30+
},
31+
Steps: []resource.TestStep{
32+
{
33+
Config: ruleFalcoCountDataSource(rText()),
34+
Check: resource.ComposeTestCheckFunc(
35+
resource.TestCheckResourceAttr("data.sysdig_secure_rule_falco_count.data_terminal_shell", "rule_count", "1"),
36+
),
37+
},
38+
{
39+
Config: ruleFalcoCountDataSourceWithAppends(rText()),
40+
Check: resource.ComposeTestCheckFunc(
41+
resource.TestCheckResourceAttr("data.sysdig_secure_rule_falco_count.data_terminal_shell", "rule_count", "2"),
42+
),
43+
},
44+
},
45+
})
46+
}
47+
48+
func ruleFalcoCountDataSource(name string) string {
49+
return fmt.Sprintf(`
50+
%s
51+
52+
data "sysdig_secure_rule_falco_count" "data_terminal_shell" {
53+
name = "TERRAFORM TEST %s - Terminal Shell"
54+
depends_on = [ sysdig_secure_rule_falco.terminal_shell ]
55+
}
56+
`, ruleFalcoTerminalShell(name), name)
57+
}
58+
59+
func ruleFalcoCountDataSourceWithAppends(name string) string {
60+
return fmt.Sprintf(`
61+
%s
62+
63+
resource "sysdig_secure_rule_falco" "terminal_shell_append" {
64+
name = "TERRAFORM TEST %s - Terminal Shell"
65+
66+
condition = "and never_true"
67+
source = "syscall" // syscall or k8s_audit
68+
append = true
69+
depends_on = [ sysdig_secure_rule_falco.terminal_shell ]
70+
}
71+
72+
data "sysdig_secure_rule_falco_count" "data_terminal_shell" {
73+
name = "TERRAFORM TEST %s - Terminal Shell"
74+
depends_on = [ sysdig_secure_rule_falco.terminal_shell, sysdig_secure_rule_falco.terminal_shell_append ]
75+
}
76+
`, ruleFalcoTerminalShell(name), name, name)
77+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies
2+
3+
package sysdig_test
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
14+
"github.com/draios/terraform-provider-sysdig/sysdig"
15+
)
16+
17+
func TestAccRuleFalcoDataSource(t *testing.T) {
18+
rText := func() string { return acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum) }
19+
rTextForAppendTest := rText()
20+
21+
resource.ParallelTest(t, resource.TestCase{
22+
PreCheck: func() {
23+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
24+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
25+
}
26+
},
27+
ProviderFactories: map[string]func() (*schema.Provider, error){
28+
"sysdig": func() (*schema.Provider, error) {
29+
return sysdig.Provider(), nil
30+
},
31+
},
32+
Steps: []resource.TestStep{
33+
{
34+
Config: ruleFalcoDataSource(rText()),
35+
},
36+
{
37+
Config: setupRuleFalcoDataSourceWithAppends(rTextForAppendTest),
38+
},
39+
{
40+
Config: ruleFalcoDataSourceWithAppends(rTextForAppendTest),
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttrSet("data.sysdig_secure_rule_falco.data_terminal_shell.0", "id"),
43+
resource.TestCheckResourceAttrSet("data.sysdig_secure_rule_falco.data_terminal_shell.1", "id"),
44+
),
45+
},
46+
},
47+
})
48+
}
49+
50+
func ruleFalcoDataSource(name string) string {
51+
return fmt.Sprintf(`
52+
%s
53+
54+
data "sysdig_secure_rule_falco" "data_terminal_shell" {
55+
name = "TERRAFORM TEST %s - Terminal Shell"
56+
depends_on = [ sysdig_secure_rule_falco.terminal_shell ]
57+
}
58+
`, ruleFalcoTerminalShell(name), name)
59+
}
60+
61+
func setupRuleFalcoDataSourceWithAppends(name string) string {
62+
return fmt.Sprintf(`
63+
%s
64+
65+
resource "sysdig_secure_rule_falco" "terminal_shell_append" {
66+
name = "TERRAFORM TEST %s - Terminal Shell"
67+
68+
condition = "and never_true"
69+
source = "syscall" // syscall or k8s_audit
70+
append = true
71+
depends_on = [ sysdig_secure_rule_falco.terminal_shell ]
72+
}
73+
`, ruleFalcoTerminalShell(name), name)
74+
}
75+
func ruleFalcoDataSourceWithAppends(name string) string {
76+
return fmt.Sprintf(`
77+
data "sysdig_secure_rule_falco_count" "terminal_shell_count" {
78+
name = "TERRAFORM TEST %s - Terminal Shell"
79+
}
80+
81+
data "sysdig_secure_rule_falco" "data_terminal_shell" {
82+
count = data.sysdig_secure_rule_falco_count.terminal_shell_count.rule_count
83+
name = "TERRAFORM TEST %s - Terminal Shell"
84+
index = "${count.index}"
85+
86+
depends_on = [ data.sysdig_secure_rule_falco_count.terminal_shell_count ]
87+
}
88+
`, name, name)
89+
}

sysdig/internal/client/v2/model.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ type Rule struct {
260260

261261
const (
262262
RuleTypeContainer = "CONTAINER"
263+
RuleTypeFalco = "FALCO"
263264
RuleTypeFilesystem = "FILESYSTEM"
264265
)
265266

sysdig/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ func Provider() *schema.Provider {
131131
"sysdig_secure_managed_policy": dataSourceSysdigSecureManagedPolicy(),
132132
"sysdig_secure_managed_ruleset": dataSourceSysdigSecureManagedRuleset(),
133133
"sysdig_secure_rule_container": dataSourceSysdigSecureRuleContainer(),
134+
"sysdig_secure_rule_falco": dataSourceSysdigSecureRuleFalco(),
135+
"sysdig_secure_rule_falco_count": dataSourceSysdigSecureRuleFalcoCount(),
134136
"sysdig_secure_rule_filesystem": dataSourceSysdigSecureRuleFilesystem(),
135137

136138
"sysdig_current_user": dataSourceSysdigCurrentUser(),

0 commit comments

Comments
 (0)