Skip to content

Commit 7a7d3a6

Browse files
authored
Merge pull request #281 from SumoLogic/APP-1083_rule_tuning_expressions
Add support for CSE rule tuning expression
2 parents 817ab7b + 9b31115 commit 7a7d3a6

File tree

6 files changed

+418
-0
lines changed

6 files changed

+418
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
## 2.11.0 (Unreleased)
2+
FEATURES:
3+
4+
* **New Resource:** sumologic_cse_rule_tuning_expression (GH-281)
5+
26

37
## 2.10.0 (September 22, 2021)
48

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func Provider() terraform.ResourceProvider {
4343
},
4444
},
4545
ResourcesMap: map[string]*schema.Resource{
46+
"sumologic_cse_rule_tuning_expression": resourceSumologicCSERuleTuningExpression(),
4647
"sumologic_cse_network_block": resourceSumologicCSENetworkBlock(),
4748
"sumologic_collector": resourceSumologicCollector(),
4849
"sumologic_http_source": resourceSumologicHTTPSource(),
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package sumologic
2+
3+
import (
4+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
5+
"log"
6+
)
7+
8+
func resourceSumologicCSERuleTuningExpression() *schema.Resource {
9+
return &schema.Resource{
10+
Create: resourceSumologicCSERuleTuningExpressionCreate,
11+
Read: resourceSumologicCSERuleTuningExpressionRead,
12+
Delete: resourceSumologicCSERuleTuningExpressionDelete,
13+
Update: resourceSumologicCSERuleTuningExpressionUpdate,
14+
Importer: &schema.ResourceImporter{
15+
State: schema.ImportStatePassthrough,
16+
},
17+
18+
Schema: map[string]*schema.Schema{
19+
"description": {
20+
Type: schema.TypeString,
21+
Required: true,
22+
ForceNew: false,
23+
},
24+
"name": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
ForceNew: false,
28+
},
29+
"expression": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
ForceNew: false,
33+
},
34+
"enabled": {
35+
Type: schema.TypeBool,
36+
Required: true,
37+
ForceNew: false,
38+
},
39+
"exclude": {
40+
Type: schema.TypeBool,
41+
Required: true,
42+
ForceNew: false,
43+
},
44+
"is_global": {
45+
Type: schema.TypeBool,
46+
Required: true,
47+
ForceNew: false,
48+
},
49+
"rule_ids": {
50+
Type: schema.TypeList,
51+
Required: true,
52+
ForceNew: false,
53+
Elem: &schema.Schema{
54+
Type: schema.TypeString,
55+
},
56+
},
57+
},
58+
}
59+
}
60+
61+
func resourceSumologicCSERuleTuningExpressionRead(d *schema.ResourceData, meta interface{}) error {
62+
c := meta.(*Client)
63+
64+
var CSERuleTuningExpressionGet *CSERuleTuningExpression
65+
id := d.Id()
66+
67+
CSERuleTuningExpressionGet, err := c.GetCSERuleTuningExpression(id)
68+
if err != nil {
69+
log.Printf("[WARN] CSE Insights Status not found when looking by id: %s, err: %v", id, err)
70+
71+
}
72+
73+
if CSERuleTuningExpressionGet == nil {
74+
log.Printf("[WARN] CSE Insights Status not found, removing from state: %v - %v", id, err)
75+
d.SetId("")
76+
return nil
77+
}
78+
79+
d.Set("name", CSERuleTuningExpressionGet.Name)
80+
d.Set("description", CSERuleTuningExpressionGet.Description)
81+
d.Set("expression", CSERuleTuningExpressionGet.Expression)
82+
d.Set("enabled", CSERuleTuningExpressionGet.Enabled)
83+
d.Set("exclude", CSERuleTuningExpressionGet.Exclude)
84+
d.Set("is_global", CSERuleTuningExpressionGet.IsGlobal)
85+
d.Set("rule_Ids", CSERuleTuningExpressionGet.RuleIds)
86+
87+
return nil
88+
}
89+
90+
func resourceSumologicCSERuleTuningExpressionDelete(d *schema.ResourceData, meta interface{}) error {
91+
c := meta.(*Client)
92+
93+
return c.DeleteCSERuleTuningExpression(d.Id())
94+
95+
}
96+
97+
func resourceSumologicCSERuleTuningExpressionCreate(d *schema.ResourceData, meta interface{}) error {
98+
c := meta.(*Client)
99+
100+
if d.Id() == "" {
101+
id, err := c.CreateCSERuleTuningExpression(CSERuleTuningExpression{
102+
Name: d.Get("name").(string),
103+
Description: d.Get("description").(string),
104+
Expression: d.Get("expression").(string),
105+
Enabled: d.Get("enabled").(bool),
106+
Exclude: d.Get("exclude").(bool),
107+
IsGlobal: d.Get("is_global").(bool),
108+
RuleIds: resourceRuleIdsToStringArray(d.Get("rule_ids").([]interface{})),
109+
})
110+
111+
if err != nil {
112+
return err
113+
}
114+
log.Printf("[INFO] got id: %s", id)
115+
d.SetId(id)
116+
}
117+
118+
return resourceSumologicCSERuleTuningExpressionUpdate(d, meta)
119+
}
120+
121+
func resourceSumologicCSERuleTuningExpressionUpdate(d *schema.ResourceData, meta interface{}) error {
122+
CSERuleTuningExpression, err := resourceToCSERuleTuningExpression(d)
123+
if err != nil {
124+
return err
125+
}
126+
127+
c := meta.(*Client)
128+
if err = c.UpdateCSERuleTuningExpression(CSERuleTuningExpression); err != nil {
129+
return err
130+
}
131+
132+
return resourceSumologicCSERuleTuningExpressionRead(d, meta)
133+
}
134+
135+
func resourceRuleIdsToStringArray(resourceRuleIds []interface{}) []string {
136+
ruleIds := make([]string, len(resourceRuleIds))
137+
138+
for i, ruleId := range resourceRuleIds {
139+
ruleIds[i] = ruleId.(string)
140+
}
141+
142+
return ruleIds
143+
}
144+
145+
func resourceToCSERuleTuningExpression(d *schema.ResourceData) (CSERuleTuningExpression, error) {
146+
id := d.Id()
147+
if id == "" {
148+
return CSERuleTuningExpression{}, nil
149+
}
150+
151+
return CSERuleTuningExpression{
152+
ID: id,
153+
Description: d.Get("description").(string),
154+
Name: d.Get("name").(string),
155+
Expression: d.Get("expression").(string),
156+
Enabled: d.Get("enabled").(bool),
157+
Exclude: d.Get("exclude").(bool),
158+
IsGlobal: d.Get("is_global").(bool),
159+
RuleIds: resourceRuleIdsToStringArray(d.Get("rule_ids").([]interface{})),
160+
}, nil
161+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package sumologic
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
9+
)
10+
11+
func TestAccSumologicSCERuleTuningExpression_create(t *testing.T) {
12+
var ruleTuningExpression CSERuleTuningExpression
13+
nName := "New Rule Tuning Name"
14+
nDescription := "New Rule Tuning Description"
15+
nExpression := "expression"
16+
nEnabled := true
17+
nExclude := true
18+
nIsGlobal := false
19+
nRuleIds := []string{"LEGACY-S00084"}
20+
resourceName := "sumologic_cse_rule_tuning_expression.rule_tuning_expression"
21+
resource.Test(t, resource.TestCase{
22+
PreCheck: func() { testAccPreCheck(t) },
23+
Providers: testAccProviders,
24+
CheckDestroy: testAccCSERuleTuningExpressionDestroy,
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testCreateCSERuleTuningExpressionConfig(nName, nDescription, nExpression, nEnabled, nExclude, nIsGlobal, nRuleIds),
28+
Check: resource.ComposeTestCheckFunc(
29+
testCheckCSERuleTuningExpressionExists(resourceName, &ruleTuningExpression),
30+
testCheckRuleTuningExpressionValues(&ruleTuningExpression, nName, nDescription, nExpression, nEnabled, nExclude, nIsGlobal),
31+
resource.TestCheckResourceAttrSet(resourceName, "id"),
32+
),
33+
},
34+
},
35+
})
36+
}
37+
38+
func testAccCSERuleTuningExpressionDestroy(s *terraform.State) error {
39+
client := testAccProvider.Meta().(*Client)
40+
41+
for _, rs := range s.RootModule().Resources {
42+
if rs.Type != "sumologic_cse_rule_tuning_expression" {
43+
continue
44+
}
45+
46+
if rs.Primary.ID == "" {
47+
return fmt.Errorf("CSE Rule Tuning Expression destruction check: CSE Rule Tuning Expresion ID is not set")
48+
}
49+
50+
s, err := client.GetCSERuleTuningExpression(rs.Primary.ID)
51+
if err != nil {
52+
return fmt.Errorf("Encountered an error: " + err.Error())
53+
}
54+
if s != nil {
55+
return fmt.Errorf("rule tuning expression still exists")
56+
}
57+
}
58+
return nil
59+
}
60+
61+
func testCreateCSERuleTuningExpressionConfig(nName string, nDescription string, nExpression string, nEnabled bool, nExclude bool, nIsGlobal bool, nRuleIds []string) string {
62+
return fmt.Sprintf(`
63+
resource "sumologic_cse_rule_tuning_expression" "rule_tuning_expression" {
64+
name = "%s"
65+
description = "%s"
66+
expression = "%s"
67+
enabled = "%t"
68+
exclude = "%t"
69+
is_global = "%t"
70+
rule_ids = ["%s"]
71+
}
72+
`, nName, nDescription, nExpression, nEnabled, nExclude, nIsGlobal, nRuleIds[0])
73+
}
74+
75+
func testCheckCSERuleTuningExpressionExists(n string, ruleTuningExpression *CSERuleTuningExpression) resource.TestCheckFunc {
76+
return func(s *terraform.State) error {
77+
rs, ok := s.RootModule().Resources[n]
78+
if !ok {
79+
return fmt.Errorf("not found: %s", n)
80+
}
81+
82+
if rs.Primary.ID == "" {
83+
return fmt.Errorf("rule tuning expression ID is not set")
84+
}
85+
86+
c := testAccProvider.Meta().(*Client)
87+
ruleTuningExpressionResp, err := c.GetCSERuleTuningExpression(rs.Primary.ID)
88+
if err != nil {
89+
return err
90+
}
91+
92+
*ruleTuningExpression = *ruleTuningExpressionResp
93+
94+
return nil
95+
}
96+
}
97+
98+
func testCheckRuleTuningExpressionValues(ruleTuningExpression *CSERuleTuningExpression, nName string, nDescription string, nExpression string, nEnabled bool, nExclude bool, nIsGlobal bool) resource.TestCheckFunc {
99+
return func(s *terraform.State) error {
100+
if ruleTuningExpression.Name != nName {
101+
return fmt.Errorf("bad name, expected \"%s\", got: %#v", nName, ruleTuningExpression.Name)
102+
}
103+
if ruleTuningExpression.Description != nDescription {
104+
return fmt.Errorf("bad description, expected \"%s\", got: %#v", nDescription, ruleTuningExpression.Description)
105+
}
106+
if ruleTuningExpression.Expression != nExpression {
107+
return fmt.Errorf("bad expression, expected \"%s\", got: %#v", nExpression, ruleTuningExpression.Expression)
108+
}
109+
if ruleTuningExpression.Enabled != nEnabled {
110+
return fmt.Errorf("bad enabled flag, expected \"%t\", got: %#v", nEnabled, ruleTuningExpression.Enabled)
111+
}
112+
if ruleTuningExpression.Exclude != nExclude {
113+
return fmt.Errorf("bad exclude flag, expected \"%t\", got: %#v", nExclude, ruleTuningExpression.Exclude)
114+
}
115+
if ruleTuningExpression.IsGlobal != nIsGlobal {
116+
return fmt.Errorf("bad isGlobal flag, expected \"%t\", got: %#v", nIsGlobal, ruleTuningExpression.IsGlobal)
117+
}
118+
119+
return nil
120+
}
121+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package sumologic
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
func (s *Client) GetCSERuleTuningExpression(id string) (*CSERuleTuningExpression, error) {
9+
data, _, err := s.Get(fmt.Sprintf("sec/v1/rule-tuning-expressions/%s", id))
10+
if err != nil {
11+
return nil, err
12+
}
13+
14+
if data == nil {
15+
return nil, nil
16+
}
17+
18+
var response CSERuleTuningExpressionResponse
19+
err = json.Unmarshal(data, &response)
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
return &response.CSERuleTuningExpression, nil
25+
}
26+
27+
func (s *Client) DeleteCSERuleTuningExpression(id string) error {
28+
_, err := s.Delete(fmt.Sprintf("sec/v1/rule-tuning-expressions/%s", id))
29+
30+
return err
31+
}
32+
33+
func (s *Client) CreateCSERuleTuningExpression(CSERuleTuningExpression CSERuleTuningExpression) (string, error) {
34+
35+
request := CSERuleTuningExpressionRequest{
36+
CSERuleTuningExpression: CSERuleTuningExpression,
37+
}
38+
39+
var response CSERuleTuningExpressionResponse
40+
41+
responseBody, err := s.Post("sec/v1/rule-tuning-expressions", request)
42+
if err != nil {
43+
return "", err
44+
}
45+
46+
err = json.Unmarshal(responseBody, &response)
47+
48+
if err != nil {
49+
return "", err
50+
}
51+
52+
return response.CSERuleTuningExpression.ID, nil
53+
}
54+
55+
func (s *Client) UpdateCSERuleTuningExpression(CSERuleTuningExpression CSERuleTuningExpression) error {
56+
url := fmt.Sprintf("sec/v1/rule-tuning-expressions/%s", CSERuleTuningExpression.ID)
57+
58+
CSERuleTuningExpression.ID = ""
59+
request := CSERuleTuningExpressionRequest{
60+
CSERuleTuningExpression: CSERuleTuningExpression,
61+
}
62+
63+
_, err := s.Put(url, request)
64+
65+
return err
66+
}
67+
68+
type CSERuleTuningExpressionRequest struct {
69+
CSERuleTuningExpression CSERuleTuningExpression `json:"fields"`
70+
}
71+
72+
type CSERuleTuningExpressionResponse struct {
73+
CSERuleTuningExpression CSERuleTuningExpression `json:"data"`
74+
}
75+
76+
type CSERuleTuningExpression struct {
77+
ID string `json:"id,omitempty"`
78+
Description string `json:"description"`
79+
Name string `json:"name"`
80+
Expression string `json:"expression"`
81+
Enabled bool `json:"enabled"`
82+
Exclude bool `json:"exclude"`
83+
IsGlobal bool `json:"isGlobal"`
84+
RuleIds []string `json:"ruleIds"`
85+
}

0 commit comments

Comments
 (0)