Skip to content

Commit 765d3ba

Browse files
committed
Merge branch 'master' into vishal-search-tf-resource
2 parents 65973d0 + d5f2129 commit 765d3ba

15 files changed

+828
-100
lines changed

CHANGELOG.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
## 2.20.2 (Unreleased)
1+
## 2.22.1 (Unreleased)
22

3-
## 2.20.1 (February 27, 2023)
3+
## 2.22.0 (March 23, 2023)
4+
FEATURES:
5+
* resource/sumologic_monitor: Added support for creating SLO Monitors with multiple burn rates (GH-499)
6+
* Add new optional `resolution_payload` field to connection resource and `resolution_payload_override` field to notifications section of monitor resource (GH-482)
7+
* **New Resource:** sumologic_local_file_source (GH-477)
8+
9+
BUG FIXES:
10+
* Remove thresholdType field under searchSchedule in content resource (GH-483)
11+
12+
DEPRECATIONS:
13+
14+
* resource/sumologic_monitor: Deprecated `burn_rate_threshold` and `time_range` in favor of `burn_rate` inside `slo_burn_rate_condition` block (GH-499)
15+
16+
## 2.21.0 (February 27, 2023)
417
FEATURES:
518
* **New Resource:** sumologic_cse_first_seen_rule (GH-476)
619
* **New Resource:** sumologic_cse_automation (GH-467)

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ func Provider() terraform.ResourceProvider {
107107
"sumologic_policies": resourceSumologicPolicies(),
108108
"sumologic_hierarchy": resourceSumologicHierarchy(),
109109
"sumologic_content_permission": resourceSumologicPermissions(),
110+
"sumologic_local_file_source": resourceSumologicLocalFileSource(),
110111
"sumologic_log_search": resourceSumologicLogSearch(),
111112
},
112113
DataSourcesMap: map[string]*schema.Resource{

sumologic/resource_sumologic_connection.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ func resourceSumologicConnection() *schema.Resource {
8282
Optional: true,
8383
ValidateFunc: validation.StringInSlice([]string{"Incident", "Event"}, false),
8484
},
85+
"resolution_payload": {
86+
Type: schema.TypeString,
87+
Optional: true,
88+
ValidateFunc: validation.StringIsJSON,
89+
Computed: true,
90+
},
8591
},
8692
}
8793
}
@@ -137,6 +143,7 @@ func resourceSumologicConnectionRead(d *schema.ResourceData, meta interface{}) e
137143
return fmt.Errorf("error setting custom headers for resource %s: %s", d.Id(), err)
138144
}
139145
d.Set("default_payload", connection.DefaultPayload)
146+
d.Set("resolution_payload", connection.ResolutionPayload)
140147
d.Set("webhook_type", connection.WebhookType)
141148
d.Set("connection_subtype", connection.ConnectionSubtype)
142149
d.SetId(connection.ID)
@@ -203,6 +210,7 @@ func resourceToConnection(d *schema.ResourceData) Connection {
203210
connection.Headers = mapToHeaders(d.Get("headers").(map[string]interface{}))
204211
connection.CustomHeaders = mapToHeaders(d.Get("custom_headers").(map[string]interface{}))
205212
connection.DefaultPayload = d.Get("default_payload").(string)
213+
connection.ResolutionPayload = d.Get("resolution_payload").(string)
206214
connection.WebhookType = d.Get("webhook_type").(string)
207215
connection.ConnectionSubtype = d.Get("connection_subtype").(string)
208216

@@ -236,6 +244,7 @@ func printConnection(connection Connection) {
236244
log.Printf("Headers: %s", connection.Headers)
237245
log.Printf("CustomHeaders: %s", connection.CustomHeaders)
238246
log.Printf("DefaultPayload: %s", connection.DefaultPayload)
247+
log.Printf("ResolutionPayload: %s", connection.ResolutionPayload)
239248
log.Printf("WebhookType: %s", connection.WebhookType)
240249
log.Printf("ConnectionSubtype: %s", connection.ConnectionSubtype)
241250
}

sumologic/resource_sumologic_connection_test.go

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ func TestAccConnection_create(t *testing.T) {
1616
description := acctest.RandomWithPrefix("tf-connection-test-description")
1717
url := "https://example.com"
1818
defaultPayload := "{\"eventType\" : \"{{Name}}\"}"
19+
resolutionPayload := "{\"eventType\" : \"{{Name}}\"}"
1920
webhookType := "Webhook"
2021

2122
var connection Connection
@@ -26,7 +27,7 @@ func TestAccConnection_create(t *testing.T) {
2627
CheckDestroy: testAccCheckConnectionDestroy,
2728
Steps: []resource.TestStep{
2829
{
29-
Config: createConnectionConfig(name, connectionType, description, url, webhookType, defaultPayload),
30+
Config: createConnectionConfig(name, connectionType, description, url, webhookType, defaultPayload, resolutionPayload),
3031
Check: resource.ComposeTestCheckFunc(
3132
testAccCheckConnectionExists("sumologic_connection.test", &connection, t),
3233
testAccCheckConnectionAttributes("sumologic_connection.test"),
@@ -35,6 +36,7 @@ func TestAccConnection_create(t *testing.T) {
3536
resource.TestCheckResourceAttr("sumologic_connection.test", "description", description),
3637
resource.TestCheckResourceAttr("sumologic_connection.test", "url", url),
3738
resource.TestCheckResourceAttr("sumologic_connection.test", "default_payload", defaultPayload+"\n"),
39+
resource.TestCheckResourceAttr("sumologic_connection.test", "resolution_payload", resolutionPayload+"\n"),
3840
resource.TestCheckResourceAttr("sumologic_connection.test", "webhook_type", webhookType),
3941
),
4042
},
@@ -48,6 +50,7 @@ func TestAccConnection_createServiceNowWebhook(t *testing.T) {
4850
description := acctest.RandomWithPrefix("tf-servicenow-webhook-connection-test-description")
4951
url := "https://example.com"
5052
defaultPayload := "{\"eventType\" : \"{{Name}}\"}"
53+
resolutionPayload := "{\n \"sys_id\": \"{{SysId}}\",\n \"state\": \"6\",\n \"incident_state\": \"6\",\n \"work_notes\": \"Resolved value - Test\"\n}"
5154
webhookType := "ServiceNow"
5255
connectionSubtype := "Incident"
5356

@@ -59,7 +62,8 @@ func TestAccConnection_createServiceNowWebhook(t *testing.T) {
5962
CheckDestroy: testAccCheckConnectionDestroy,
6063
Steps: []resource.TestStep{
6164
{
62-
Config: createServiceNowWebhookConnectionConfig(name, connectionType, description, url, connectionSubtype, defaultPayload),
65+
Config: createServiceNowWebhookConnectionConfigWithResolutionPayload(name, connectionType, description, url,
66+
connectionSubtype, defaultPayload, resolutionPayload),
6367
Check: resource.ComposeTestCheckFunc(
6468
testAccCheckConnectionExists("sumologic_connection.serviceNowTest", &connection, t),
6569
testAccCheckConnectionAttributes("sumologic_connection.serviceNowTest"),
@@ -68,6 +72,7 @@ func TestAccConnection_createServiceNowWebhook(t *testing.T) {
6872
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "description", description),
6973
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "url", url),
7074
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "default_payload", defaultPayload+"\n"),
75+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "resolution_payload", resolutionPayload+"\n"),
7176
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "webhook_type", webhookType),
7277
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "connection_subtype", connectionSubtype),
7378
),
@@ -79,41 +84,48 @@ func TestAccConnection_createServiceNowWebhook(t *testing.T) {
7984
func TestAccConnection_update(t *testing.T) {
8085
var connection Connection
8186
connectionType := "WebhookConnection"
82-
name := acctest.RandomWithPrefix("tf-connection-test-name")
87+
name := acctest.RandomWithPrefix("tf-servicenow-webhook-connection-test-name")
88+
description := acctest.RandomWithPrefix("tf-connection-test-description")
8389
url := "https://example.com"
84-
defaultPayload := `{"eventType" : "{{Name}}"}`
85-
webhookType := "Webhook"
86-
fDescription := acctest.RandomWithPrefix("tf-connection-test-description")
87-
sDescription := acctest.RandomWithPrefix("tf-connection-test-description")
90+
defaultPayload := "{\"eventType\" : \"{{Name}}\"}"
91+
webhookType := "ServiceNow"
92+
connectionSubtype := "Incident"
93+
94+
updatedDefaultPayload := `{"eventType" : "{{Name}} default updated"}`
95+
updatedResolutionPayload := "{\n \"sys_id\": \"{{SysId}}\",\n \"state\": \"6\",\n \"incident_state\": \"6\",\n \"work_notes\": \"Resolved value - Test\"\n}"
8896

8997
resource.Test(t, resource.TestCase{
9098
PreCheck: func() { testAccPreCheck(t) },
9199
Providers: testAccProviders,
92100
CheckDestroy: testAccCheckConnectionDestroy,
93101
Steps: []resource.TestStep{
94102
{
95-
Config: createConnectionConfig(name, connectionType, fDescription, url, webhookType, defaultPayload),
103+
Config: createServiceNowWebhookConnectionConfig(name, connectionType, description, url, connectionSubtype, defaultPayload),
96104
Check: resource.ComposeTestCheckFunc(
97-
testAccCheckConnectionExists("sumologic_connection.test", &connection, t),
98-
testAccCheckConnectionAttributes("sumologic_connection.test"),
99-
resource.TestCheckResourceAttr("sumologic_connection.test", "type", connectionType),
100-
resource.TestCheckResourceAttr("sumologic_connection.test", "name", name),
101-
resource.TestCheckResourceAttr("sumologic_connection.test", "description", fDescription),
102-
resource.TestCheckResourceAttr("sumologic_connection.test", "url", url),
103-
resource.TestCheckResourceAttr("sumologic_connection.test", "default_payload", defaultPayload+"\n"),
104-
resource.TestCheckResourceAttr("sumologic_connection.test", "webhook_type", webhookType),
105+
testAccCheckConnectionExists("sumologic_connection.serviceNowTest", &connection, t),
106+
testAccCheckConnectionAttributes("sumologic_connection.serviceNowTest"),
107+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "type", connectionType),
108+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "name", name),
109+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "description", description),
110+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "url", url),
111+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "default_payload", defaultPayload+"\n"),
112+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "webhook_type", webhookType),
113+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "connection_subtype", connectionSubtype),
105114
),
106115
}, {
107-
Config: createConnectionConfig(name, connectionType, sDescription, url, webhookType, defaultPayload),
116+
Config: createServiceNowWebhookConnectionConfigWithResolutionPayload(name, connectionType, description, url, connectionSubtype,
117+
updatedDefaultPayload, updatedResolutionPayload),
108118
Check: resource.ComposeTestCheckFunc(
109-
testAccCheckConnectionExists("sumologic_connection.test", &connection, t),
110-
testAccCheckConnectionAttributes("sumologic_connection.test"),
111-
resource.TestCheckResourceAttr("sumologic_connection.test", "type", connectionType),
112-
resource.TestCheckResourceAttr("sumologic_connection.test", "name", name),
113-
resource.TestCheckResourceAttr("sumologic_connection.test", "description", sDescription),
114-
resource.TestCheckResourceAttr("sumologic_connection.test", "url", url),
115-
resource.TestCheckResourceAttr("sumologic_connection.test", "default_payload", defaultPayload+"\n"),
116-
resource.TestCheckResourceAttr("sumologic_connection.test", "webhook_type", webhookType),
119+
testAccCheckConnectionExists("sumologic_connection.serviceNowTest", &connection, t),
120+
testAccCheckConnectionAttributes("sumologic_connection.serviceNowTest"),
121+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "type", connectionType),
122+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "name", name),
123+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "description", description),
124+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "url", url),
125+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "default_payload", updatedDefaultPayload+"\n"),
126+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "resolution_payload", updatedResolutionPayload+"\n"),
127+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "webhook_type", webhookType),
128+
resource.TestCheckResourceAttr("sumologic_connection.serviceNowTest", "connection_subtype", connectionSubtype),
117129
),
118130
},
119131
},
@@ -171,7 +183,7 @@ func testAccCheckConnectionDestroy(s *terraform.State) error {
171183
return nil
172184
}
173185

174-
func createConnectionConfig(name, connectionType, desc, url, webhookType, defaultPayload string) string {
186+
func createConnectionConfig(name, connectionType, desc, url, webhookType, defaultPayload string, resolutionPayload string) string {
175187
return fmt.Sprintf(`
176188
resource "sumologic_connection" "test" {
177189
name = "%s"
@@ -181,9 +193,12 @@ resource "sumologic_connection" "test" {
181193
webhook_type = "%s"
182194
default_payload = <<JSON
183195
%s
196+
JSON
197+
resolution_payload = <<JSON
198+
%s
184199
JSON
185200
}
186-
`, name, connectionType, desc, url, webhookType, defaultPayload)
201+
`, name, connectionType, desc, url, webhookType, defaultPayload, resolutionPayload)
187202
}
188203

189204
func createServiceNowWebhookConnectionConfig(name, connectionType, desc, url, connectionSubtype, defaultPayload string) string {
@@ -204,3 +219,24 @@ JSON
204219
}
205220
`, name, connectionType, desc, url, connectionSubtype, defaultPayload)
206221
}
222+
func createServiceNowWebhookConnectionConfigWithResolutionPayload(name, connectionType, desc, url, connectionSubtype, defaultPayload string, resolutionPayload string) string {
223+
return fmt.Sprintf(`
224+
resource "sumologic_connection" "serviceNowTest" {
225+
name = "%s"
226+
type = "%s"
227+
description = "%s"
228+
url = "%s"
229+
headers = {
230+
"Authorization": "Basic SOMERANDOMAUTHSTRING"
231+
}
232+
webhook_type = "ServiceNow"
233+
connection_subtype = "%s"
234+
default_payload = <<JSON
235+
%s
236+
JSON
237+
resolution_payload = <<JSON
238+
%s
239+
JSON
240+
}
241+
`, name, connectionType, desc, url, connectionSubtype, defaultPayload, resolutionPayload)
242+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package sumologic
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"strconv"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9+
)
10+
11+
func resourceSumologicLocalFileSource() *schema.Resource {
12+
localFileSource := resourceSumologicSource()
13+
localFileSource.Create = resourceSumologicLocalFileSourceCreate
14+
localFileSource.Read = resourceSumologicLocalFileSourceRead
15+
localFileSource.Update = resourceSumologicLocalFileSourceUpdate
16+
localFileSource.Importer = &schema.ResourceImporter{
17+
State: resourceSumologicSourceImport,
18+
}
19+
20+
localFileSource.Schema["path_expression"] = &schema.Schema{
21+
Type: schema.TypeString,
22+
Required: true,
23+
}
24+
25+
localFileSource.Schema["encoding"] = &schema.Schema{
26+
Type: schema.TypeString,
27+
Optional: true,
28+
Default: "UTF-8",
29+
}
30+
31+
localFileSource.Schema["deny_list"] = &schema.Schema{
32+
Type: schema.TypeSet,
33+
Optional: true,
34+
Elem: &schema.Schema{Type: schema.TypeString},
35+
}
36+
37+
return localFileSource
38+
}
39+
40+
func resourceSumologicLocalFileSourceCreate(d *schema.ResourceData, meta interface{}) error {
41+
c := meta.(*Client)
42+
43+
if d.Id() == "" {
44+
source := resourceToLocalFileSource(d)
45+
46+
id, err := c.CreateLocalFileSource(source, d.Get("collector_id").(int))
47+
48+
if err != nil {
49+
return err
50+
}
51+
52+
d.SetId(strconv.Itoa(id))
53+
}
54+
55+
return resourceSumologicLocalFileSourceRead(d, meta)
56+
}
57+
58+
func resourceSumologicLocalFileSourceUpdate(d *schema.ResourceData, meta interface{}) error {
59+
c := meta.(*Client)
60+
61+
source := resourceToLocalFileSource(d)
62+
63+
err := c.UpdateLocalFileSource(source, d.Get("collector_id").(int))
64+
65+
if err != nil {
66+
return err
67+
}
68+
69+
return resourceSumologicLocalFileSourceRead(d, meta)
70+
}
71+
72+
func resourceToLocalFileSource(d *schema.ResourceData) LocalFileSource {
73+
rawDenyList := d.Get("deny_list").(*schema.Set).List()
74+
var denylist []string
75+
for _, j := range rawDenyList {
76+
denylist = append(denylist, j.(string))
77+
}
78+
source := resourceToSource(d)
79+
source.Type = "LocalFile"
80+
81+
localFileSource := LocalFileSource{
82+
Source: source,
83+
PathExpression: d.Get("path_expression").(string),
84+
Encoding: d.Get("encoding").(string),
85+
DenyList: denylist,
86+
}
87+
88+
return localFileSource
89+
}
90+
91+
func resourceSumologicLocalFileSourceRead(d *schema.ResourceData, meta interface{}) error {
92+
c := meta.(*Client)
93+
94+
id, _ := strconv.Atoi(d.Id())
95+
source, err := c.GetLocalFileSource(d.Get("collector_id").(int), id)
96+
97+
if err != nil {
98+
return err
99+
}
100+
101+
if source == nil {
102+
log.Printf("[WARN] LocalFile source not found, removing from state: %v - %v", id, err)
103+
d.SetId("")
104+
105+
return nil
106+
}
107+
108+
if err := resourceSumologicSourceRead(d, source.Source); err != nil {
109+
return fmt.Errorf("%s", err)
110+
}
111+
d.Set("path_expression", source.PathExpression)
112+
d.Set("encoding", source.Encoding)
113+
d.Set("deny_list", source.DenyList)
114+
115+
return nil
116+
}

0 commit comments

Comments
 (0)