Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci-provider-docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
- uses: actions/cache@v4
continue-on-error: true
id: cache-terraform-plugin-dir
timeout-minutes: 2
Expand All @@ -34,12 +34,12 @@ jobs:
run: |
echo "GOCACHE=$(go env GOCACHE)" >> $GITHUB_ENV
- if: steps.cache-terraform-plugin-dir.outputs.cache-hit != 'true' || steps.cache-terraform-plugin-dir.outcome == 'failure'
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ${{ env.GOCACHE }}
key: ${{ runner.os }}-GOCACHE-${{ hashFiles('go.sum') }}-${{ hashFiles('sysdig/**') }}
- if: steps.cache-terraform-plugin-dir.outputs.cache-hit != 'true' || steps.cache-terraform-plugin-dir.outcome == 'failure'
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-pkg-mod-${{ hashFiles('go.sum') }}
Expand All @@ -53,15 +53,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
- uses: actions/cache@v4
continue-on-error: true
id: cache-terraform-providers-schema
timeout-minutes: 2
with:
path: terraform-providers-schema
key: ${{ runner.os }}-terraform-providers-schema-${{ hashFiles('go.sum') }}-${{ hashFiles('sysdig/**') }}
- if: steps.cache-terraform-providers-schema.outputs.cache-hit != 'true' || steps.cache-terraform-providers-schema.outcome == 'failure'
uses: actions/cache@v2
uses: actions/cache@v4
timeout-minutes: 2
with:
path: terraform-plugin-dir
Expand Down Expand Up @@ -97,14 +97,14 @@ jobs:
go-version: ${{ env.GO_VERSION }}
check-latest: true
cache: true
- uses: actions/cache@v2
- uses: actions/cache@v4
continue-on-error: true
timeout-minutes: 2
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-pkg-mod-${{ hashFiles('go.sum') }}
- run: cd /tmp && go install github.com/bflad/tfproviderdocs@latest
- uses: actions/cache@v2
- uses: actions/cache@v4
timeout-minutes: 2
with:
path: terraform-providers-schema
Expand Down
138 changes: 138 additions & 0 deletions sysdig/data_source_sysdig_secure_rule_stateful.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package sysdig

import (
"context"
"encoding/json"
"errors"
"strconv"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceSysdigSecureRuleStateful() *schema.Resource {
timeout := 1 * time.Minute

return &schema.Resource{
ReadContext: dataSourceSysdigRuleStatefulRead,

Timeouts: &schema.ResourceTimeout{
Read: schema.DefaultTimeout(timeout),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"id": {
Type: schema.TypeInt,
Computed: true,
},
"version": {
Type: schema.TypeInt,
Computed: true,
},
"source": {
Type: schema.TypeString,
Required: true,
ValidateDiagFunc: validateDiagFunc(validateStatefulRuleSource),
},
"ruletype": {
Type: schema.TypeString,
Computed: true,
},
"append": {
Type: schema.TypeBool,
Computed: true,
},
"exceptions": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"values": {
Type: schema.TypeString,
Required: true,
},
},
},
},
},
}
}

func dataSourceSysdigRuleStatefulRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client, err := getSecureRuleClient(meta.(SysdigClients))
if err != nil {
return diag.FromErr(err)
}

nameObj, ok := d.GetOk("name")
if !ok {
return diag.FromErr(errors.New("name is required"))
}

name := nameObj.(string)

sourceObj, ok := d.GetOk("source")
if !ok {
return diag.FromErr(errors.New("source is required"))
}

source := sourceObj.(string)

rules, err := client.GetStatefulRuleGroup(ctx, name, source)
if err != nil {
return diag.FromErr(err)
}

ruleIndexObj, ok := d.GetOk("index")
ruleIndex := 0
if ok {
ruleIndex = ruleIndexObj.(int)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Could we use the ruleIndex, ok form here to avoid panic since we are not enforcing a schema on this field?

}

rule := rules[ruleIndex]

if len(rules) == 0 {
d.SetId("")
} else {
d.SetId(strconv.Itoa(rule.ID))
}

_ = d.Set("name", rule.Name)
_ = d.Set("source", source)

if rule.Details.Append != nil {
_ = d.Set("append", *rule.Details.Append)
}

exceptions := make([]any, 0, len(rule.Details.Exceptions))
for _, exception := range rule.Details.Exceptions {
if exception == nil {
return diag.Errorf("exception is nil")
}
valuesData, err := json.Marshal(exception.Values)
if err != nil {
return diag.Errorf("error marshalling exception values '%+v': %s", exception.Values, err)
}

exceptions = append(exceptions, map[string]any{
"name": exception.Name,
"values": string(valuesData),
})
}

if err := d.Set("exceptions", exceptions); err != nil {
return diag.FromErr(err)
}

return nil
}
58 changes: 58 additions & 0 deletions sysdig/data_source_sysdig_secure_rule_stateful_count.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package sysdig

import (
"context"
"fmt"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceSysdigSecureRuleStatefulCount() *schema.Resource {
timeout := 1 * time.Minute

return &schema.Resource{
ReadContext: dataSourceSysdigRuleStatefulCountRead,

Timeouts: &schema.ResourceTimeout{
Read: schema.DefaultTimeout(timeout),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"source": {
Type: schema.TypeString,
Required: true,
ValidateDiagFunc: validateDiagFunc(validateStatefulRuleSource),
},
"rule_count": {
Type: schema.TypeInt,
Computed: true,
},
},
}
}

func dataSourceSysdigRuleStatefulCountRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client, err := getSecureRuleClient(meta.(SysdigClients))
if err != nil {
return diag.FromErr(err)
}

ruleName := d.Get("name").(string)
ruleType := d.Get("source").(string)
rules, err := client.GetStatefulRuleGroup(ctx, ruleName, ruleType)
if err != nil {
return diag.FromErr(err)
}

d.SetId(fmt.Sprintf("count_%s", ruleName))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the id be count__ruleName__ruleType (with double underscores)?

_ = d.Set("name", ruleName)
_ = d.Set("rule_count", len(rules))

return nil
}
56 changes: 56 additions & 0 deletions sysdig/data_source_sysdig_secure_rule_stateful_count_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies || tf_acc_onprem_secure

package sysdig_test

import (
"fmt"
"os"
"strings"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/draios/terraform-provider-sysdig/sysdig"
)

func TestAccRuleStatefulCountDataSource(t *testing.T) {

if strings.HasSuffix(os.Getenv("SYSDIG_SECURE_URL"), "ibm.com") {
t.Skip("Skipping stateful tests for IBM Cloud")
return
}

resource.Test(t, resource.TestCase{
PreCheck: func() {
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
}
},
ProviderFactories: map[string]func() (*schema.Provider, error){
"sysdig": func() (*schema.Provider, error) {
return sysdig.Provider(), nil
},
},
Steps: []resource.TestStep{
{
Config: ruleStatefulCountDataSource(),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("data.sysdig_secure_rule_stateful_count.data_stateful_rule_append", "rule_count", "2"),
),
},
},
})
}

func ruleStatefulCountDataSource() string {
return fmt.Sprintf(`
%s

data "sysdig_secure_rule_stateful_count" "data_stateful_rule_append" {
name = "API Gateway Enumeration Detected"
source = "awscloudtrail_stateful"
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
}
`, ruleStatefulAppend())
}
53 changes: 53 additions & 0 deletions sysdig/data_source_sysdig_secure_rule_stateful_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//go:build tf_acc_sysdig || tf_acc_sysdig_secure || tf_acc_policies || tf_acc_onprem_secure

package sysdig_test

import (
"fmt"
"os"
"strings"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/draios/terraform-provider-sysdig/sysdig"
)

func TestAccRuleStatefulDataSource(t *testing.T) {

if strings.HasSuffix(os.Getenv("SYSDIG_SECURE_URL"), "ibm.com") {
t.Skip("Skipping stateful tests for IBM Cloud")
return
}

resource.Test(t, resource.TestCase{
PreCheck: func() {
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
}
},
ProviderFactories: map[string]func() (*schema.Provider, error){
"sysdig": func() (*schema.Provider, error) {
return sysdig.Provider(), nil
},
},
Steps: []resource.TestStep{
{
Config: ruleStatefulDataSource(),
},
},
})
}

func ruleStatefulDataSource() string {
return fmt.Sprintf(`
%s

data "sysdig_secure_rule_stateful" "data_stateful_rule_append" {
name = "API Gateway Enumeration Detected"
source = "awscloudtrail_stateful"
depends_on = [ sysdig_secure_rule_stateful.stateful_rule_append ]
}
`, ruleStatefulAppend())
}
2 changes: 2 additions & 0 deletions sysdig/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ func (p *SysdigProvider) Provider() *schema.Provider {
"sysdig_secure_rule_syscall": dataSourceSysdigSecureRuleSyscall(),
"sysdig_secure_posture_policies": dataSourceSysdigSecurePosturePolicies(),
"sysdig_secure_custom_role_permissions": dataSourceSysdigSecureCustomRolePermissions(),
"sysdig_secure_rule_stateful": dataSourceSysdigSecureRuleStateful(),
"sysdig_secure_rule_stateful_count": dataSourceSysdigSecureRuleStatefulCount(),

"sysdig_current_user": dataSourceSysdigCurrentUser(),
"sysdig_user": dataSourceSysdigUser(),
Expand Down
1 change: 0 additions & 1 deletion website/docs/d/secure_rule_stateful.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,3 @@ Supported fields for exceptions:
* `name` - The name of the existing exception definition.
* `values` - Contains tuples of values. Each item in the tuple should align 1-1 with the corresponding field
and comparison operator.

Loading
Loading