Skip to content

Commit 455258e

Browse files
committed
Merge branch 'sli-SUMO-172431-monitor-playbook' of https://github.com/SumoLogic/terraform-provider-sumologic into sli-SUMO-172431-monitor-playbook
2 parents 30ba8cd + 4162107 commit 455258e

10 files changed

+559
-0
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
FEATURES:
44

55
* Add a new optional field `playbook` to resource/sumologic_monitor.
6+
* Add a new optional field `evaluation_delay` to resource/sumologic_monitor.
67

78
## 2.9.9 (August 12, 2021)
89

10+
FEATURES:
11+
12+
* **New Resource:** sumologic_policies (GH-248)
13+
914
BUG FIXES:
1015

1116
* resource/sumologic_monitor: Removed deprecation warning for `triggers`.

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ func Provider() terraform.ResourceProvider {
7474
"sumologic_saml_configuration": resourceSumologicSamlConfiguration(),
7575
"sumologic_kinesis_metrics_source": resourceSumologicKinesisMetricsSource(),
7676
"sumologic_token": resourceSumologicToken(),
77+
"sumologic_policies": resourceSumologicPolicies(),
7778
},
7879
DataSourcesMap: map[string]*schema.Resource{
7980
"sumologic_admin_recommended_folder": dataSourceSumologicAdminRecommendedFolder(),

sumologic/resource_sumologic_monitors_library_monitor.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sumologic
22

33
import (
44
"log"
5+
"regexp"
56
"strings"
67

78
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
@@ -267,6 +268,13 @@ func resourceSumologicMonitorsLibraryMonitor() *schema.Resource {
267268
ValidateFunc: validation.StringInSlice([]string{"Logs", "Metrics"}, false),
268269
},
269270

271+
"evaluation_delay": {
272+
Type: schema.TypeString,
273+
Optional: true,
274+
Computed: true,
275+
ValidateFunc: validation.StringMatch(regexp.MustCompile(`((\d)+[smh])+`), "This value is not in correct format. Example: 1m30s"),
276+
},
277+
270278
"is_locked": {
271279
Type: schema.TypeBool,
272280
Optional: true,
@@ -510,6 +518,7 @@ func resourceSumologicMonitorsLibraryMonitorRead(d *schema.ResourceData, meta in
510518
d.Set("created_by", monitor.CreatedBy)
511519
d.Set("created_at", monitor.CreatedAt)
512520
d.Set("monitor_type", monitor.MonitorType)
521+
d.Set("evaluation_delay", monitor.EvaluationDelay)
513522
d.Set("modified_by", monitor.ModifiedBy)
514523
d.Set("is_mutable", monitor.IsMutable)
515524
d.Set("version", monitor.Version)
@@ -1091,6 +1100,7 @@ func resourceToMonitorsLibraryMonitor(d *schema.ResourceData) MonitorsLibraryMon
10911100
CreatedAt: d.Get("created_at").(string),
10921101
MonitorType: d.Get("monitor_type").(string),
10931102
Description: d.Get("description").(string),
1103+
EvaluationDelay: d.Get("evaluation_delay").(string),
10941104
Queries: queries,
10951105
ModifiedBy: d.Get("modified_by").(string),
10961106
IsMutable: d.Get("is_mutable").(bool),

sumologic/resource_sumologic_monitors_library_monitor_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ func TestAccSumologicMonitorsLibraryMonitor_create(t *testing.T) {
138138
testContentType := "Monitor"
139139
testMonitorType := "Logs"
140140
testIsDisabled := false
141+
testEvaluationDelay := "5m"
141142
testQueries := []MonitorQuery{
142143
{
143144
RowID: "A",
@@ -203,6 +204,7 @@ func TestAccSumologicMonitorsLibraryMonitor_create(t *testing.T) {
203204
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
204205
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
205206
resource.TestCheckResourceAttr("sumologic_monitor.test", "description", testDescription),
207+
resource.TestCheckResourceAttr("sumologic_monitor.test", "evaluation_delay", testEvaluationDelay),
206208
resource.TestCheckResourceAttr("sumologic_monitor.test", "content_type", testContentType),
207209
resource.TestCheckResourceAttr("sumologic_monitor.test", "queries.0.row_id", testQueries[0].RowID),
208210
resource.TestCheckResourceAttr("sumologic_monitor.test", "triggers.0.trigger_type", testTriggers[0].TriggerType),
@@ -251,6 +253,7 @@ func TestAccSumologicMonitorsLibraryMonitor_update(t *testing.T) {
251253
testMonitorType := "Logs"
252254
testPlaybook := "This is a test playbook"
253255
testIsDisabled := false
256+
testEvaluationDelay := "5m"
254257
testQueries := []MonitorQuery{
255258
{
256259
RowID: "A",
@@ -309,6 +312,7 @@ func TestAccSumologicMonitorsLibraryMonitor_update(t *testing.T) {
309312
testUpdatedMonitorType := "Logs"
310313
testUpdatedPlaybook := "This is an updated test playbook"
311314
testUpdatedIsDisabled := true
315+
testUpdatedEvaluationDelay := "8m"
312316
testUpdatedQueries := []MonitorQuery{
313317
{
314318
RowID: "A",
@@ -374,6 +378,7 @@ func TestAccSumologicMonitorsLibraryMonitor_update(t *testing.T) {
374378
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
375379
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
376380
resource.TestCheckResourceAttr("sumologic_monitor.test", "description", testDescription),
381+
resource.TestCheckResourceAttr("sumologic_monitor.test", "evaluation_delay", testEvaluationDelay),
377382
resource.TestCheckResourceAttr("sumologic_monitor.test", "content_type", testContentType),
378383
resource.TestCheckResourceAttr("sumologic_monitor.test", "queries.0.row_id", testQueries[0].RowID),
379384
resource.TestCheckResourceAttr("sumologic_monitor.test", "triggers.0.trigger_type", testTriggers[0].TriggerType),
@@ -390,6 +395,7 @@ func TestAccSumologicMonitorsLibraryMonitor_update(t *testing.T) {
390395
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testUpdatedName),
391396
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testUpdatedType),
392397
resource.TestCheckResourceAttr("sumologic_monitor.test", "description", testUpdatedDescription),
398+
resource.TestCheckResourceAttr("sumologic_monitor.test", "evaluation_delay", testUpdatedEvaluationDelay),
393399
resource.TestCheckResourceAttr("sumologic_monitor.test", "content_type", testUpdatedContentType),
394400
resource.TestCheckResourceAttr("sumologic_monitor.test", "queries.0.row_id", testUpdatedQueries[0].RowID),
395401
resource.TestCheckResourceAttr("sumologic_monitor.test", "triggers.0.trigger_type", testUpdatedTriggers[0].TriggerType),
@@ -450,6 +456,7 @@ func testAccCheckMonitorsLibraryMonitorAttributes(name string) resource.TestChec
450456
resource.TestCheckResourceAttrSet(name, "created_by"),
451457
resource.TestCheckResourceAttrSet(name, "is_locked"),
452458
resource.TestCheckResourceAttrSet(name, "monitor_type"),
459+
resource.TestCheckResourceAttrSet(name, "evaluation_delay"),
453460
resource.TestCheckResourceAttrSet(name, "is_system"),
454461
resource.TestCheckResourceAttrSet(name, "is_disabled"),
455462
resource.TestCheckResourceAttrSet(name, "name"),
@@ -475,6 +482,7 @@ resource "sumologic_monitor" "test" {
475482
is_disabled = false
476483
content_type = "Monitor"
477484
monitor_type = "Logs"
485+
evaluation_delay = "5m"
478486
queries {
479487
row_id = "A"
480488
query = "_sourceCategory=monitor-manager error"
@@ -520,6 +528,7 @@ resource "sumologic_monitor" "test" {
520528
is_disabled = true
521529
content_type = "Monitor"
522530
monitor_type = "Logs"
531+
evaluation_delay = "8m"
523532
queries {
524533
row_id = "A"
525534
query = "_sourceCategory=monitor-manager info"
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package sumologic
2+
3+
import (
4+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
5+
)
6+
7+
var DefaultPolicies = Policies{
8+
Audit: AuditPolicy{Enabled: false},
9+
DataAccessLevel: DataAccessLevelPolicy{Enabled: false},
10+
MaxUserSessionTimeout: MaxUserSessionTimeoutPolicy{MaxUserSessionTimeout: "7d"},
11+
SearchAudit: SearchAuditPolicy{Enabled: false},
12+
ShareDashboardsOutsideOrganization: ShareDashboardsOutsideOrganizationPolicy{Enabled: false},
13+
UserConcurrentSessionsLimit: UserConcurrentSessionsLimitPolicy{Enabled: false, MaxConcurrentSessions: 100},
14+
}
15+
16+
func resourceSumologicPolicies() *schema.Resource {
17+
return &schema.Resource{
18+
Create: resourceSumologicPoliciesCreate,
19+
Read: resourceSumologicPoliciesRead,
20+
Update: resourceSumologicPoliciesUpdate,
21+
Delete: resourceSumologicPoliciesDelete,
22+
Importer: &schema.ResourceImporter{
23+
State: schema.ImportStatePassthrough,
24+
},
25+
26+
Schema: map[string]*schema.Schema{
27+
"audit": {
28+
Type: schema.TypeBool,
29+
Optional: true,
30+
Default: DefaultPolicies.Audit.Enabled,
31+
},
32+
"data_access_level": {
33+
Type: schema.TypeBool,
34+
Optional: true,
35+
Default: DefaultPolicies.DataAccessLevel.Enabled,
36+
},
37+
"max_user_session_timeout": {
38+
Type: schema.TypeString,
39+
Optional: true,
40+
Default: DefaultPolicies.MaxUserSessionTimeout.MaxUserSessionTimeout,
41+
},
42+
"search_audit": {
43+
Type: schema.TypeBool,
44+
Optional: true,
45+
Default: DefaultPolicies.SearchAudit.Enabled,
46+
},
47+
"share_dashboards_outside_organization": {
48+
Type: schema.TypeBool,
49+
Optional: true,
50+
Default: DefaultPolicies.ShareDashboardsOutsideOrganization.Enabled,
51+
},
52+
"user_concurrent_sessions_limit": {
53+
Type: schema.TypeList,
54+
Optional: true,
55+
MaxItems: 1,
56+
Elem: &schema.Resource{
57+
Schema: map[string]*schema.Schema{
58+
"enabled": {
59+
Type: schema.TypeBool,
60+
Optional: true,
61+
Default: DefaultPolicies.UserConcurrentSessionsLimit.Enabled,
62+
},
63+
"max_concurrent_sessions": {
64+
Type: schema.TypeInt,
65+
Optional: true,
66+
Default: DefaultPolicies.UserConcurrentSessionsLimit.MaxConcurrentSessions,
67+
},
68+
},
69+
},
70+
},
71+
},
72+
}
73+
}
74+
75+
func resourceSumologicPoliciesRead(d *schema.ResourceData, meta interface{}) error {
76+
c := meta.(*Client)
77+
78+
policies, err := c.GetPolicies()
79+
if err != nil {
80+
return err
81+
}
82+
83+
setPoliciesResource(d, policies)
84+
return nil
85+
}
86+
87+
func resourceSumologicPoliciesCreate(d *schema.ResourceData, meta interface{}) error {
88+
// Since policies can only be set and not created, we just update the policies with the given fields.
89+
err := resourceSumologicPoliciesUpdate(d, meta)
90+
if err != nil {
91+
return err
92+
}
93+
94+
d.SetId("org-policies")
95+
return nil
96+
}
97+
98+
func resourceSumologicPoliciesDelete(d *schema.ResourceData, meta interface{}) error {
99+
// Since policies cannot be deleted, we just reset to the default policies configuration.
100+
c := meta.(*Client)
101+
102+
_, err := c.UpdatePolicies(DefaultPolicies)
103+
return err
104+
}
105+
106+
func resourceSumologicPoliciesUpdate(d *schema.ResourceData, meta interface{}) error {
107+
policies := resourceToPolicies(d)
108+
109+
c := meta.(*Client)
110+
updatedPolicies, err := c.UpdatePolicies(policies)
111+
if err != nil {
112+
return err
113+
}
114+
115+
setPoliciesResource(d, updatedPolicies)
116+
return nil
117+
}
118+
119+
func setPoliciesResource(d *schema.ResourceData, policies *Policies) {
120+
d.Set("audit", policies.Audit.Enabled)
121+
d.Set("data_access_level", policies.DataAccessLevel.Enabled)
122+
d.Set("max_user_session_timeout", policies.MaxUserSessionTimeout.MaxUserSessionTimeout)
123+
d.Set("search_audit", policies.SearchAudit.Enabled)
124+
d.Set("share_dashboards_outside_organization", policies.ShareDashboardsOutsideOrganization.Enabled)
125+
setUserConcurrentSessionsLimitPolicy(d, &policies.UserConcurrentSessionsLimit)
126+
}
127+
128+
func resourceToPolicies(d *schema.ResourceData) Policies {
129+
var policies Policies
130+
policies.Audit = AuditPolicy{d.Get("audit").(bool)}
131+
policies.DataAccessLevel = DataAccessLevelPolicy{d.Get("data_access_level").(bool)}
132+
policies.MaxUserSessionTimeout = MaxUserSessionTimeoutPolicy{d.Get("max_user_session_timeout").(string)}
133+
policies.SearchAudit = SearchAuditPolicy{d.Get("search_audit").(bool)}
134+
policies.ShareDashboardsOutsideOrganization = ShareDashboardsOutsideOrganizationPolicy{d.Get("share_dashboards_outside_organization").(bool)}
135+
policies.UserConcurrentSessionsLimit = getUserConcurrentSessionsLimitPolicy(d)
136+
return policies
137+
}
138+
139+
func setUserConcurrentSessionsLimitPolicy(d *schema.ResourceData, policy *UserConcurrentSessionsLimitPolicy) {
140+
userConcurrentSessionsLimitPolicyMap := make(map[string]interface{})
141+
userConcurrentSessionsLimitPolicyMap["enabled"] = policy.Enabled
142+
userConcurrentSessionsLimitPolicyMap["max_concurrent_sessions"] = policy.MaxConcurrentSessions
143+
144+
userConcurrentSessionsLimitPolicy := make([]map[string]interface{}, 1)
145+
userConcurrentSessionsLimitPolicy[0] = userConcurrentSessionsLimitPolicyMap
146+
147+
d.Set("user_concurrent_sessions_limit", userConcurrentSessionsLimitPolicy)
148+
}
149+
150+
func getUserConcurrentSessionsLimitPolicy(d *schema.ResourceData) UserConcurrentSessionsLimitPolicy {
151+
resourceAsMap := d.Get("user_concurrent_sessions_limit").([]interface{})[0].(map[string]interface{})
152+
var userConcurrentSessionsLimitPolicy UserConcurrentSessionsLimitPolicy
153+
userConcurrentSessionsLimitPolicy.Enabled = resourceAsMap["enabled"].(bool)
154+
userConcurrentSessionsLimitPolicy.MaxConcurrentSessions = resourceAsMap["max_concurrent_sessions"].(int)
155+
return userConcurrentSessionsLimitPolicy
156+
}

0 commit comments

Comments
 (0)