Skip to content

Commit 6102da5

Browse files
committed
add support for stateful rule count
1 parent d9332ce commit 6102da5

6 files changed

+160
-22
lines changed

sysdig/data_source_sysdig_secure_rule_stateful.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import (
44
"context"
55
"encoding/json"
66
"errors"
7-
"strconv"
87
"time"
98

10-
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
119
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1210
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1311
)
@@ -37,8 +35,9 @@ func dataSourceSysdigSecureRuleStateful() *schema.Resource {
3735
Computed: true,
3836
},
3937
"source": {
40-
Type: schema.TypeString,
41-
Computed: true,
38+
Type: schema.TypeString,
39+
Required: true,
40+
ValidateDiagFunc: validateDiagFunc(validateStatefulRuleSource),
4241
},
4342
"ruletype": {
4443
Type: schema.TypeString,
@@ -74,11 +73,6 @@ func dataSourceSysdigRuleStatefulRead(ctx context.Context, d *schema.ResourceDat
7473
return diag.FromErr(err)
7574
}
7675

77-
id, err := strconv.Atoi(d.Id())
78-
if err != nil {
79-
return diag.FromErr(err)
80-
}
81-
8276
nameObj, ok := d.GetOk("name")
8377
if !ok {
8478
return diag.FromErr(errors.New("name is required"))
@@ -98,17 +92,16 @@ func dataSourceSysdigRuleStatefulRead(ctx context.Context, d *schema.ResourceDat
9892
return diag.FromErr(err)
9993
}
10094

101-
if len(rules) == 0 {
102-
d.SetId("")
95+
ruleIndexObj, ok := d.GetOk("index")
96+
ruleIndex := 0
97+
if ok {
98+
ruleIndex = ruleIndexObj.(int)
10399
}
104100

105-
var rule v2.Rule
101+
rule := rules[ruleIndex]
106102

107-
for _, r := range rules {
108-
if r.ID == id {
109-
rule = r
110-
break
111-
}
103+
if len(rules) == 0 {
104+
d.SetId("")
112105
}
113106

114107
exceptions := make([]any, 0, len(rule.Details.Exceptions))
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", ruleName))
54+
_ = d.Set("name", ruleName)
55+
_ = d.Set("rule_count", len(rules))
56+
57+
return nil
58+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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", "1"),
40+
),
41+
},
42+
},
43+
})
44+
}
45+
46+
func ruleStatefulCountDataSource() string {
47+
return fmt.Sprintf(`
48+
%s
49+
50+
data "sysdig_secure_rule_stateful" "data_stateful_rule_append" {
51+
name = "API Gateway Enumeration Detected"
52+
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
53+
}
54+
`, ruleStatefulAppend())
55+
}

sysdig/data_source_sysdig_secure_rule_stateful_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ func TestAccRuleStatefulDataSource(t *testing.T) {
3333
},
3434
},
3535
Steps: []resource.TestStep{
36-
{
37-
Config: ruleStatefulAppend(),
38-
},
3936
{
4037
Config: ruleStatefulDataSource(),
4138
},
@@ -44,11 +41,12 @@ func TestAccRuleStatefulDataSource(t *testing.T) {
4441
}
4542

4643
func ruleStatefulDataSource() string {
47-
return fmt.Sprint(`
44+
return fmt.Sprintf(`
45+
%s
4846
4947
data "sysdig_secure_rule_stateful" "data_stateful_rule_append" {
5048
name = "API Gateway Enumeration Detected"
5149
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
5250
}
53-
`)
51+
`, ruleStatefulAppend())
5452
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
235235
"sysdig_secure_posture_policies": dataSourceSysdigSecurePosturePolicies(),
236236
"sysdig_secure_custom_role_permissions": dataSourceSysdigSecureCustomRolePermissions(),
237237
"sysdig_secure_rule_stateful": dataSourceSysdigSecureRuleStateful(),
238+
"sysdig_secure_rule_stateful_count": dataSourceSysdigSecureRuleStatefulCount(),
238239

239240
"sysdig_current_user": dataSourceSysdigCurrentUser(),
240241
"sysdig_user": dataSourceSysdigUser(),
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)