Skip to content

Commit 71a2a74

Browse files
author
Ben Lucas
authored
feat(policies): data source for "container" rules (#337)
* implementation and tests for data source fer container rules * documentation for container rule data source. fix previous documentation for consistency.
1 parent 1b7463c commit 71a2a74

11 files changed

+239
-9
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package sysdig
2+
3+
import (
4+
"strconv"
5+
6+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
)
9+
10+
// Creates a schema with a default schema that a Secure Rule data source should have
11+
// Additional fields will be passed in via the parameter
12+
func createRuleDataSourceSchema(original map[string]*schema.Schema) map[string]*schema.Schema {
13+
ruleSchema := map[string]*schema.Schema{
14+
"name": {
15+
Type: schema.TypeString,
16+
Required: true,
17+
},
18+
"id": {
19+
Type: schema.TypeInt,
20+
Computed: true,
21+
},
22+
"description": {
23+
Type: schema.TypeString,
24+
Computed: true,
25+
},
26+
"tags": {
27+
Type: schema.TypeList,
28+
Computed: true,
29+
Elem: &schema.Schema{Type: schema.TypeString},
30+
},
31+
"version": {
32+
Type: schema.TypeInt,
33+
Computed: true,
34+
},
35+
}
36+
37+
for k, v := range original {
38+
ruleSchema[k] = v
39+
}
40+
41+
return ruleSchema
42+
}
43+
44+
func ruleDataSourceToResourceData(rule v2.Rule, d *schema.ResourceData) {
45+
d.SetId(strconv.Itoa(rule.ID))
46+
47+
_ = d.Set("name", rule.Name)
48+
_ = d.Set("description", rule.Description)
49+
_ = d.Set("tags", rule.Tags)
50+
_ = d.Set("version", rule.Version)
51+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceSysdigSecureRuleContainer() *schema.Resource {
13+
timeout := 5 * time.Minute
14+
15+
return &schema.Resource{
16+
ReadContext: dataSourceSysdigRuleContainerRead,
17+
18+
Timeouts: &schema.ResourceTimeout{
19+
Read: schema.DefaultTimeout(timeout),
20+
},
21+
22+
Schema: createRuleDataSourceSchema(map[string]*schema.Schema{
23+
"matching": {
24+
Type: schema.TypeBool,
25+
Computed: true,
26+
},
27+
"containers": {
28+
Type: schema.TypeList,
29+
Computed: true,
30+
Elem: &schema.Schema{
31+
Type: schema.TypeString,
32+
},
33+
},
34+
}),
35+
}
36+
}
37+
38+
func dataSourceSysdigRuleContainerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
39+
client, err := getSecureRuleClient(meta.(SysdigClients))
40+
if err != nil {
41+
return diag.FromErr(err)
42+
}
43+
44+
ruleName := d.Get("name").(string)
45+
ruleType := v2.RuleTypeContainer
46+
47+
rules, err := client.GetRuleGroup(ctx, ruleName, ruleType)
48+
if err != nil {
49+
return diag.FromErr(err)
50+
}
51+
52+
if len(rules) == 0 {
53+
return diag.Errorf("unable to find rule")
54+
}
55+
56+
if len(rules) > 1 {
57+
return diag.Errorf("more than one rule with that name was found")
58+
}
59+
60+
rule := rules[0]
61+
62+
ruleDataSourceToResourceData(rule, d)
63+
64+
_ = d.Set("matching", rule.Details.Containers.MatchItems)
65+
_ = d.Set("containers", rule.Details.Containers.Items)
66+
67+
return nil
68+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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 TestAccRuleContainerDataSource(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: ruleContainerDataSource(rText()),
34+
},
35+
},
36+
})
37+
}
38+
39+
func ruleContainerDataSource(name string) string {
40+
return fmt.Sprintf(`
41+
%s
42+
43+
data "sysdig_secure_rule_container" "data_sample" {
44+
name = "TERRAFORM TEST %s"
45+
depends_on = [ sysdig_secure_rule_container.sample ]
46+
}
47+
`, ruleContainerWithName(name), name)
48+
}

sysdig/internal/client/v2/model.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ type Rule struct {
258258
Version int `json:"version,omitempty"`
259259
}
260260

261+
const (
262+
RuleTypeContainer = "CONTAINER"
263+
)
264+
261265
type Details struct {
262266
// Containers
263267
Containers *Containers `json:"containers,omitempty"`

sysdig/internal/client/v2/rules.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"context"
55
"fmt"
66
"net/http"
7+
"net/url"
78
)
89

910
const (
10-
CreateRulePath = "%s/api/secure/rules"
11-
GetRuleByIDPath = "%s/api/secure/rules/%d"
12-
UpdateRulePath = "%s/api/secure/rules/%d"
13-
DeleteURLPath = "%s/api/secure/rules/%d"
11+
CreateRulePath = "%s/api/secure/rules"
12+
GetRuleByIDPath = "%s/api/secure/rules/%d"
13+
UpdateRulePath = "%s/api/secure/rules/%d"
14+
DeleteURLPath = "%s/api/secure/rules/%d"
15+
GetRuleGroupPath = "%s/api/secure/rules/groups?name=%s&type=%s"
1416
)
1517

1618
type RuleInterface interface {
@@ -19,6 +21,7 @@ type RuleInterface interface {
1921
GetRuleByID(ctx context.Context, ruleID int) (Rule, error)
2022
UpdateRule(ctx context.Context, rule Rule) (Rule, error)
2123
DeleteRule(ctx context.Context, ruleID int) error
24+
GetRuleGroup(ctx context.Context, ruleName string, ruleType string) ([]Rule, error)
2225
}
2326

2427
func (client *Client) CreateRule(ctx context.Context, rule Rule) (Rule, error) {
@@ -88,6 +91,21 @@ func (client *Client) DeleteRule(ctx context.Context, ruleID int) error {
8891
return err
8992
}
9093

94+
func (client *Client) GetRuleGroup(ctx context.Context, ruleName string, ruleType string) ([]Rule, error) {
95+
response, err := client.requester.Request(ctx, http.MethodGet, client.GetRuleGroupURL(ruleName, ruleType), nil)
96+
if err != nil {
97+
return []Rule{}, err
98+
}
99+
defer response.Body.Close()
100+
101+
if response.StatusCode != http.StatusOK {
102+
return []Rule{}, client.ErrorFromResponse(response)
103+
}
104+
105+
return Unmarshal[[]Rule](response.Body)
106+
107+
}
108+
91109
func (client *Client) CreateRuleURL() string {
92110
return fmt.Sprintf(CreateRulePath, client.config.url)
93111
}
@@ -103,3 +121,7 @@ func (client *Client) UpdateRuleURL(ruleID int) string {
103121
func (client *Client) DeleteRuleURL(ruleID int) string {
104122
return fmt.Sprintf(DeleteURLPath, client.config.url, ruleID)
105123
}
124+
125+
func (client *Client) GetRuleGroupURL(ruleName string, ruleType string) string {
126+
return fmt.Sprintf(GetRuleGroupPath, client.config.url, url.QueryEscape(ruleName), url.QueryEscape(ruleType))
127+
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func Provider() *schema.Provider {
128128
"sysdig_secure_notification_channel": dataSourceSysdigSecureNotificationChannel(),
129129
"sysdig_secure_managed_policy": dataSourceSysdigSecureManagedPolicy(),
130130
"sysdig_secure_managed_ruleset": dataSourceSysdigSecureManagedRuleset(),
131+
"sysdig_secure_rule_container": dataSourceSysdigSecureRuleContainer(),
131132

132133
"sysdig_current_user": dataSourceSysdigCurrentUser(),
133134
"sysdig_user": dataSourceSysdigUser(),

sysdig/resource_sysdig_secure_rule_container.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package sysdig
22

33
import (
44
"context"
5-
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
65
"strconv"
76
"time"
87

8+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
9+
910
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1011

1112
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -134,7 +135,7 @@ func resourceSysdigRuleContainerDelete(ctx context.Context, d *schema.ResourceDa
134135

135136
func resourceSysdigRuleContainerFromResourceData(d *schema.ResourceData) v2.Rule {
136137
rule := ruleFromResourceData(d)
137-
rule.Details.RuleType = "CONTAINER"
138+
rule.Details.RuleType = v2.RuleTypeContainer
138139

139140
rule.Details.Containers = &v2.Containers{}
140141
rule.Details.Containers.MatchItems = d.Get("matching").(bool)

website/docs/d/secure_managed_policy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: |-
66
Retrieves a Sysdig Secure Managed Policy.
77
---
88

9-
# sysdig_secure_managed_policy
9+
# Data Source: sysdig_secure_managed_policy
1010

1111
Retrieves the information of an existing Sysdig Secure Managed Policy.
1212

website/docs/d/secure_managed_ruleset.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: |-
66
Retrieves a Sysdig Secure Managed Ruleset.
77
---
88

9-
# sysdig_secure_managed_ruleset
9+
# Data Source: sysdig_secure_managed_ruleset
1010

1111
Retrieves the information of an existing Sysdig Secure Managed Ruleset.
1212

website/docs/d/secure_notification_channel.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: |-
66
Retrieves a Sysdig Secure Notification Channel.
77
---
88

9-
# sysdig_secure_notification_channel
9+
# Data Source: sysdig_secure_notification_channel
1010

1111
Retrieves the information of an existing Sysdig Secure Notification Channel.
1212

0 commit comments

Comments
 (0)