Skip to content

Commit 084be60

Browse files
committed
Merge branch 'master' of github.com:sysdiglabs/terraform-provider-sysdig into SP-4606
2 parents 6da3cff + 631a98d commit 084be60

7 files changed

+343
-1
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"errors"
7+
"strconv"
8+
"time"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
)
13+
14+
func dataSourceSysdigSecureRuleStateful() *schema.Resource {
15+
timeout := 1 * time.Minute
16+
17+
return &schema.Resource{
18+
ReadContext: dataSourceSysdigRuleStatefulRead,
19+
20+
Timeouts: &schema.ResourceTimeout{
21+
Read: schema.DefaultTimeout(timeout),
22+
},
23+
24+
Schema: map[string]*schema.Schema{
25+
"name": {
26+
Type: schema.TypeString,
27+
Required: true,
28+
ForceNew: true,
29+
},
30+
"id": {
31+
Type: schema.TypeInt,
32+
Computed: true,
33+
},
34+
"version": {
35+
Type: schema.TypeInt,
36+
Computed: true,
37+
},
38+
"source": {
39+
Type: schema.TypeString,
40+
Required: true,
41+
ValidateDiagFunc: validateDiagFunc(validateStatefulRuleSource),
42+
},
43+
"ruletype": {
44+
Type: schema.TypeString,
45+
Computed: true,
46+
},
47+
"append": {
48+
Type: schema.TypeBool,
49+
Computed: true,
50+
},
51+
"exceptions": {
52+
Type: schema.TypeList,
53+
Computed: true,
54+
Elem: &schema.Resource{
55+
Schema: map[string]*schema.Schema{
56+
"name": {
57+
Type: schema.TypeString,
58+
Required: true,
59+
},
60+
"values": {
61+
Type: schema.TypeString,
62+
Required: true,
63+
},
64+
},
65+
},
66+
},
67+
},
68+
}
69+
}
70+
71+
func dataSourceSysdigRuleStatefulRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
72+
client, err := getSecureRuleClient(meta.(SysdigClients))
73+
if err != nil {
74+
return diag.FromErr(err)
75+
}
76+
77+
nameObj, ok := d.GetOk("name")
78+
if !ok {
79+
return diag.FromErr(errors.New("name is required"))
80+
}
81+
82+
name := nameObj.(string)
83+
84+
sourceObj, ok := d.GetOk("source")
85+
if !ok {
86+
return diag.FromErr(errors.New("source is required"))
87+
}
88+
89+
source := sourceObj.(string)
90+
91+
rules, err := client.GetStatefulRuleGroup(ctx, name, source)
92+
if err != nil {
93+
return diag.FromErr(err)
94+
}
95+
96+
ruleIndexObj, ok := d.GetOk("index")
97+
ruleIndex := 0
98+
if ok {
99+
ruleIndex, ok = ruleIndexObj.(int)
100+
if !ok {
101+
return diag.FromErr(errors.New("index must be an integer"))
102+
}
103+
}
104+
105+
rule := rules[ruleIndex]
106+
107+
if len(rules) == 0 {
108+
d.SetId("")
109+
} else {
110+
d.SetId(strconv.Itoa(rule.ID))
111+
}
112+
113+
_ = d.Set("name", rule.Name)
114+
_ = d.Set("source", source)
115+
116+
if rule.Details.Append != nil {
117+
_ = d.Set("append", *rule.Details.Append)
118+
}
119+
120+
exceptions := make([]any, 0, len(rule.Details.Exceptions))
121+
for _, exception := range rule.Details.Exceptions {
122+
if exception == nil {
123+
return diag.Errorf("exception is nil")
124+
}
125+
valuesData, err := json.Marshal(exception.Values)
126+
if err != nil {
127+
return diag.Errorf("error marshalling exception values '%+v': %s", exception.Values, err)
128+
}
129+
130+
exceptions = append(exceptions, map[string]any{
131+
"name": exception.Name,
132+
"values": string(valuesData),
133+
})
134+
}
135+
136+
if err := d.Set("exceptions", exceptions); err != nil {
137+
return diag.FromErr(err)
138+
}
139+
140+
return nil
141+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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 dataSourceSysdigSecureRuleStatefulCount() *schema.Resource {
13+
timeout := 1 * time.Minute
14+
15+
return &schema.Resource{
16+
ReadContext: dataSourceSysdigRuleStatefulCountRead,
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+
Required: true,
30+
ValidateDiagFunc: validateDiagFunc(validateStatefulRuleSource),
31+
},
32+
"rule_count": {
33+
Type: schema.TypeInt,
34+
Computed: true,
35+
},
36+
},
37+
}
38+
}
39+
40+
func dataSourceSysdigRuleStatefulCountRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
41+
client, err := getSecureRuleClient(meta.(SysdigClients))
42+
if err != nil {
43+
return diag.FromErr(err)
44+
}
45+
46+
ruleName := d.Get("name").(string)
47+
ruleType := d.Get("source").(string)
48+
rules, err := client.GetStatefulRuleGroup(ctx, ruleName, ruleType)
49+
if err != nil {
50+
return diag.FromErr(err)
51+
}
52+
53+
d.SetId(fmt.Sprintf("count__%s__%s", ruleName, ruleType))
54+
_ = d.Set("name", ruleName)
55+
_ = d.Set("rule_count", len(rules))
56+
57+
return nil
58+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies || tf_acc_onprem_secure
2+
3+
package sysdig_test
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"strings"
9+
"testing"
10+
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 TestAccRuleStatefulCountDataSource(t *testing.T) {
18+
19+
if strings.HasSuffix(os.Getenv("SYSDIG_SECURE_URL"), "ibm.com") {
20+
t.Skip("Skipping stateful tests for IBM Cloud")
21+
return
22+
}
23+
24+
resource.Test(t, resource.TestCase{
25+
PreCheck: func() {
26+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
27+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
28+
}
29+
},
30+
ProviderFactories: map[string]func() (*schema.Provider, error){
31+
"sysdig": func() (*schema.Provider, error) {
32+
return sysdig.Provider(), nil
33+
},
34+
},
35+
Steps: []resource.TestStep{
36+
{
37+
Config: ruleStatefulCountDataSource(),
38+
Check: resource.ComposeTestCheckFunc(
39+
resource.TestCheckResourceAttr("data.sysdig_secure_rule_stateful_count.data_stateful_rule_append", "rule_count", "2"),
40+
),
41+
},
42+
},
43+
})
44+
}
45+
46+
func ruleStatefulCountDataSource() string {
47+
return fmt.Sprintf(`
48+
%s
49+
50+
data "sysdig_secure_rule_stateful_count" "data_stateful_rule_append" {
51+
name = "API Gateway Enumeration Detected"
52+
source = "awscloudtrail_stateful"
53+
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
54+
}
55+
`, ruleStatefulAppend())
56+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies || tf_acc_onprem_secure
2+
3+
package sysdig_test
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"strings"
9+
"testing"
10+
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 TestAccRuleStatefulDataSource(t *testing.T) {
18+
19+
if strings.HasSuffix(os.Getenv("SYSDIG_SECURE_URL"), "ibm.com") {
20+
t.Skip("Skipping stateful tests for IBM Cloud")
21+
return
22+
}
23+
24+
resource.Test(t, resource.TestCase{
25+
PreCheck: func() {
26+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
27+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
28+
}
29+
},
30+
ProviderFactories: map[string]func() (*schema.Provider, error){
31+
"sysdig": func() (*schema.Provider, error) {
32+
return sysdig.Provider(), nil
33+
},
34+
},
35+
Steps: []resource.TestStep{
36+
{
37+
Config: ruleStatefulDataSource(),
38+
},
39+
},
40+
})
41+
}
42+
43+
func ruleStatefulDataSource() string {
44+
return fmt.Sprintf(`
45+
%s
46+
47+
data "sysdig_secure_rule_stateful" "data_stateful_rule_append" {
48+
name = "API Gateway Enumeration Detected"
49+
source = "awscloudtrail_stateful"
50+
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
51+
}
52+
`, ruleStatefulAppend())
53+
}

sysdig/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ func (p *SysdigProvider) Provider() *schema.Provider {
235235
"sysdig_secure_rule_syscall": dataSourceSysdigSecureRuleSyscall(),
236236
"sysdig_secure_posture_policies": dataSourceSysdigSecurePosturePolicies(),
237237
"sysdig_secure_custom_role_permissions": dataSourceSysdigSecureCustomRolePermissions(),
238+
"sysdig_secure_rule_stateful": dataSourceSysdigSecureRuleStateful(),
239+
"sysdig_secure_rule_stateful_count": dataSourceSysdigSecureRuleStatefulCount(),
238240
"sysdig_secure_zone": dataSourceSysdigSecureZone(),
239241

240242
"sysdig_current_user": dataSourceSysdigCurrentUser(),

website/docs/d/secure_rule_stateful.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,3 @@ Supported fields for exceptions:
4444
* `name` - The name of the existing exception definition.
4545
* `values` - Contains tuples of values. Each item in the tuple should align 1-1 with the corresponding field
4646
and comparison operator.
47-
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
subcategory: "Sysdig Secure"
3+
layout: "sysdig"
4+
page_title: "Sysdig: sysdig_secure_rule_stateful_count"
5+
description: |-
6+
Retrieves the count of rules (including appends) for a named stateful rule.
7+
---
8+
9+
# Data Source: sysdig_secure_rule_stateful_count
10+
11+
Retrieves the count of rules (including appends) for a named stateful rule.
12+
13+
-> **Note:** Sysdig Terraform Provider is under rapid development at this point. If you experience any issue or discrepancy while using it, please make sure you have the latest version. If the issue persists, or you have a Feature Request to support an additional set of resources, please open a [new issue](https://github.com/sysdiglabs/terraform-provider-sysdig/issues/new) in the GitHub repository.
14+
15+
## Example Usage
16+
17+
```terraform
18+
data "sysdig_secure_rule_stateful_count" "example" {
19+
name = "API Gateway Enumeration Detected"
20+
source = "awscloudtrail_stateful"
21+
}
22+
```
23+
24+
## Argument Reference
25+
26+
* `name` - (Required) The name of the Secure stateful rule to retrieve.
27+
* `source` - (Required) The source of the Secure stateful rule to retrieve.
28+
29+
## Attributes Reference
30+
31+
In addition to the argument above, the following attributes are exported:
32+
33+
* `rule_count` - The number of rules (including appends).

0 commit comments

Comments
 (0)