Skip to content

Commit dd7fbf6

Browse files
committed
SUMO-19330, Addressed issue where monitor folder update is not working
- on update of folder, calling move api to update the folder for the monitor - added test case to verify the monitor folder update use case
1 parent d0dd09e commit dd7fbf6

File tree

5 files changed

+176
-12
lines changed

5 files changed

+176
-12
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/go-errors/errors v1.4.0
1010
github.com/go-test/deep v1.0.7 // indirect
1111
github.com/hashicorp/go-hclog v0.16.2 // indirect
12+
github.com/hashicorp/go-plugin v1.4.0 // indirect
1213
github.com/hashicorp/go-retryablehttp v0.7.0
1314
github.com/hashicorp/go-uuid v1.0.2 // indirect
1415
github.com/hashicorp/hcl v1.0.0 // indirect
@@ -19,4 +20,5 @@ require (
1920
github.com/oklog/run v1.1.0 // indirect
2021
github.com/posener/complete v1.2.3 // indirect
2122
github.com/ulikunitz/xz v0.5.10 // indirect
23+
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
2224
)

go.sum

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,14 @@ github.com/hashicorp/go-getter v1.5.3 h1:NF5+zOlQegim+w/EUhSLh6QhXHmZMEeHLQzllkQ
218218
github.com/hashicorp/go-getter v1.5.3/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI=
219219
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
220220
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
221+
github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
221222
github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs=
222223
github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
223224
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
224225
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
225-
github.com/hashicorp/go-plugin v1.3.0 h1:4d/wJojzvHV1I4i/rrjVaeuyxWrLzDE1mDCyDy8fXS8=
226226
github.com/hashicorp/go-plugin v1.3.0/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYtXdgmf1AVNs0=
227+
github.com/hashicorp/go-plugin v1.4.0 h1:b0O7rs5uiJ99Iu9HugEzsM67afboErkHUWddUSpUO3A=
228+
github.com/hashicorp/go-plugin v1.4.0/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ=
227229
github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4=
228230
github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
229231
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
@@ -372,8 +374,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
372374
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
373375
github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8=
374376
github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
375-
github.com/vmihailenco/msgpack v3.3.3+incompatible h1:wapg9xDUZDzGCNFlwc5SqI1rvcciqcxEHac4CYj89xI=
376377
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
378+
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
379+
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
377380
github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U=
378381
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
379382
github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY=

sumologic/resource_sumologic_monitors_library_monitor.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -703,12 +703,13 @@ func resourceSumologicMonitorsLibraryMonitorRead(d *schema.ResourceData, meta in
703703
func resourceSumologicMonitorsLibraryMonitorUpdate(d *schema.ResourceData, meta interface{}) error {
704704
c := meta.(*Client)
705705
monitor := resourceToMonitorsLibraryMonitor(d)
706-
if d.HasChange("parentId") {
707-
// monitor.ParentID = d.Get("parentId").(string)
708-
err := c.MoveMonitorsLibraryMonitor(monitor)
706+
707+
if d.HasChange("parent_id") {
708+
updatedMonitor, err := c.MoveMonitorsLibraryMonitor(monitor.ID, monitor.ParentID)
709709
if err != nil {
710710
return err
711711
}
712+
monitor = *updatedMonitor
712713
}
713714
monitor.Type = "MonitorsLibraryMonitorUpdate"
714715
err := c.UpdateMonitorsLibraryMonitor(monitor)

sumologic/resource_sumologic_monitors_library_monitor_test.go

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,98 @@ func TestAccSumologicMonitorsLibraryMonitor_update(t *testing.T) {
414414
})
415415
}
416416

417+
func TestAccSumologicMonitorsLibraryMonitorFolder_update(t *testing.T) {
418+
var monitorsLibraryMonitor MonitorsLibraryMonitor
419+
testNameSuffix := acctest.RandString(16)
420+
421+
testName := "terraform_test_monitor_" + testNameSuffix
422+
testType := "MonitorsLibraryMonitor"
423+
testMonitorType := "Logs"
424+
//testAlertName := "Alert from {{Name}}"
425+
folder1tfResourceKey := "sumologic_monitor_folder.tf_folder_01"
426+
folder2tfResourceKey := "sumologic_monitor_folder.tf_folder_02"
427+
428+
resource.Test(t, resource.TestCase{
429+
PreCheck: func() { testAccPreCheck(t) },
430+
Providers: testAccProviders,
431+
CheckDestroy: testAccCheckMonitorsLibraryMonitorDestroy(monitorsLibraryMonitor),
432+
Steps: []resource.TestStep{
433+
{
434+
Config: testAccSumologicMonitorsLibraryMonitorFolderUpdate(testNameSuffix, folder1tfResourceKey),
435+
Check: resource.ComposeTestCheckFunc(
436+
testAccCheckMonitorsLibraryMonitorExists("sumologic_monitor.test", &monitorsLibraryMonitor, t),
437+
testAccCheckMonitorsLibraryMonitorAttributes("sumologic_monitor.test"),
438+
resource.TestCheckResourceAttr("sumologic_monitor.test", "monitor_type", testMonitorType),
439+
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
440+
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
441+
testAccCheckMonitorsLibraryMonitorFolderMatch("sumologic_monitor.test", folder1tfResourceKey, t),
442+
),
443+
},
444+
{
445+
Config: testAccSumologicMonitorsLibraryMonitorFolderUpdate(testNameSuffix, folder2tfResourceKey),
446+
Check: resource.ComposeTestCheckFunc(
447+
testAccCheckMonitorsLibraryMonitorExists("sumologic_monitor.test", &monitorsLibraryMonitor, t),
448+
testAccCheckMonitorsLibraryMonitorAttributes("sumologic_monitor.test"),
449+
resource.TestCheckResourceAttr("sumologic_monitor.test", "monitor_type", testMonitorType),
450+
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
451+
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
452+
testAccCheckMonitorsLibraryMonitorFolderMatch("sumologic_monitor.test", folder2tfResourceKey, t),
453+
),
454+
},
455+
},
456+
})
457+
}
458+
459+
func testAccCheckMonitorsLibraryMonitorFolderMatch(monitorName string, folderName string, t *testing.T) resource.TestCheckFunc {
460+
return func(s *terraform.State) error {
461+
//fetching monitor information
462+
monitorResource, ok := s.RootModule().Resources[monitorName]
463+
if !ok {
464+
//need this so that we don't get an unused import error for strconv in some cases
465+
return fmt.Errorf("Error = %s. MonitorsLibraryMonitor not found: %s", strconv.FormatBool(ok), monitorName)
466+
}
467+
468+
//need this so that we don't get an unused import error for strings in some cases
469+
if strings.EqualFold(monitorResource.Primary.ID, "") {
470+
return fmt.Errorf("MonitorsLibraryMonitor ID is not set")
471+
}
472+
473+
monitorResourceId := monitorResource.Primary.ID
474+
475+
client := testAccProvider.Meta().(*Client)
476+
monitorsLibraryMonitor, err := client.MonitorsRead(monitorResourceId)
477+
478+
if err != nil {
479+
return fmt.Errorf("MonitorsLibraryMonitor %s not found", monitorResourceId)
480+
}
481+
482+
//fetching monitor folder information
483+
folderResource, ok := s.RootModule().Resources[folderName]
484+
if !ok {
485+
//need this so that we don't get an unused import error for strconv in some cases
486+
return fmt.Errorf("Error = %s. MonitorsLibraryFolder not found: %s", strconv.FormatBool(ok), folderName)
487+
}
488+
489+
//need this so that we don't get an unused import error for strings in some cases
490+
if strings.EqualFold(folderResource.Primary.ID, "") {
491+
return fmt.Errorf("MonitorsLibraryFolder ID is not set")
492+
}
493+
494+
folderResourceId := folderResource.Primary.ID
495+
monitorsLibraryFolder, err := client.MonitorsRead(folderResourceId)
496+
if err != nil {
497+
return fmt.Errorf("MonitorsLibraryFolder%s not found", monitorResourceId)
498+
}
499+
500+
//checkig if the monitor parent id matches to the correct folder id
501+
if monitorsLibraryMonitor.ParentID != monitorsLibraryFolder.ID {
502+
return fmt.Errorf("Parent Id should be %s but %s", monitorsLibraryFolder.ID, monitorsLibraryMonitor.ParentID)
503+
}
504+
505+
return nil
506+
}
507+
}
508+
417509
func testAccCheckMonitorsLibraryMonitorDestroy(monitorsLibraryMonitor MonitorsLibraryMonitor) resource.TestCheckFunc {
418510
return func(s *terraform.State) error {
419511
client := testAccProvider.Meta().(*Client)
@@ -573,6 +665,62 @@ resource "sumologic_monitor" "test" {
573665
}`, testName)
574666
}
575667

668+
func testAccSumologicMonitorsLibraryMonitorFolderUpdate(testName string, parentIdTFString string) string {
669+
return fmt.Sprintf(`
670+
resource "sumologic_monitor_folder" "tf_folder_01" {
671+
name = "tf_test_folder_01_%s"
672+
description = "1st folder"
673+
}
674+
resource "sumologic_monitor_folder" "tf_folder_02" {
675+
name = "tf_test_folder_02_%s"
676+
description = "1st folder"
677+
}
678+
resource "sumologic_monitor" "test" {
679+
name = "terraform_test_monitor_%s"
680+
description = "terraform_test_monitor_description"
681+
type = "MonitorsLibraryMonitor"
682+
is_disabled = false
683+
content_type = "Monitor"
684+
monitor_type = "Logs"
685+
evaluation_delay = "8m"
686+
queries {
687+
row_id = "A"
688+
query = "_sourceCategory=monitor-manager info"
689+
}
690+
triggers {
691+
threshold_type = "GreaterThan"
692+
threshold = 40.0
693+
time_range = "30m"
694+
occurrence_type = "ResultCount"
695+
trigger_source = "AllResults"
696+
trigger_type = "Critical"
697+
detection_method = "StaticCondition"
698+
}
699+
triggers {
700+
threshold_type = "LessThanOrEqual"
701+
threshold = 40.0
702+
time_range = "30m"
703+
occurrence_type = "ResultCount"
704+
trigger_source = "AllResults"
705+
trigger_type = "ResolvedCritical"
706+
detection_method = "StaticCondition"
707+
}
708+
notifications {
709+
notification {
710+
connection_type = "Email"
711+
recipients = ["[email protected]"]
712+
subject = "test tf monitor"
713+
time_zone = "PST"
714+
message_body = "test"
715+
}
716+
run_for_trigger_types = ["Critical", "ResolvedCritical"]
717+
}
718+
playbook = "This is an updated test playbook"
719+
alert_name = "Updated Alert from {{Name}}"
720+
parent_id = %s.id
721+
}`, testName, testName, testName, parentIdTFString)
722+
}
723+
576724
func exampleMonitorWithTriggerCondition(
577725
testName string,
578726
monitorType string,

sumologic/sumologic_monitors_library_monitor.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,33 @@ func (s *Client) UpdateMonitorsLibraryMonitor(monitorsLibraryMonitor MonitorsLib
9494
return err
9595
}
9696

97-
func (s *Client) MoveMonitorsLibraryMonitor(monitorsLibraryMonitor MonitorsLibraryMonitor) error {
98-
urlWithoutParams := "v1/monitors/%s"
97+
func (s *Client) MoveMonitorsLibraryMonitor(monitorID string, newParentID string) (*MonitorsLibraryMonitor, error) {
98+
urlWithoutParams := "v1/monitors/%s/move"
9999
paramString := ""
100100
sprintfArgs := []interface{}{}
101-
sprintfArgs = append(sprintfArgs, monitorsLibraryMonitor.ID)
101+
sprintfArgs = append(sprintfArgs, monitorID)
102102

103103
paramString += "?"
104-
queryParam := fmt.Sprintf("parentId=%s&", monitorsLibraryMonitor.ParentID)
104+
queryParam := fmt.Sprintf("parentId=%s", newParentID)
105105
paramString += queryParam
106106

107107
urlWithParams := fmt.Sprintf(urlWithoutParams+paramString, sprintfArgs...)
108108

109-
monitorsLibraryMonitor.ID = ""
109+
data, err := s.Post(urlWithParams, nil)
110110

111-
_, err := s.Put(urlWithParams, monitorsLibraryMonitor)
111+
if err != nil {
112+
return nil, err
113+
}
112114

113-
return err
115+
var monitorsLibraryMonitor MonitorsLibraryMonitor
116+
117+
err = json.Unmarshal(data, &monitorsLibraryMonitor)
118+
119+
if err != nil {
120+
return nil, err
121+
}
122+
123+
return &monitorsLibraryMonitor, nil
114124
}
115125

116126
// ---------- TYPES ----------

0 commit comments

Comments
 (0)