Skip to content

Commit fbe4138

Browse files
Merge pull request #405 from SumoLogic/bugfix/SUMO-193330-monitor-folder-update
Bugfix/sumo 193330 monitor folder update
2 parents f6a49e1 + c873e6e commit fbe4138

File tree

6 files changed

+174
-12
lines changed

6 files changed

+174
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ FEATURES:
1111

1212
BUG FIXES:
1313
* Default to NIL for optional timezome field in SumoLogic source (GH-392)
14+
* Allow Monitor move between Monitor folders (GH-405)
1415

1516
## 2.16.2 (June 12, 2022)
1617

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ require (
3636
github.com/hashicorp/go-getter v1.5.3 // indirect
3737
github.com/hashicorp/go-hclog v0.16.2 // indirect
3838
github.com/hashicorp/go-multierror v1.0.0 // indirect
39-
github.com/hashicorp/go-plugin v1.3.0 // indirect
39+
github.com/hashicorp/go-plugin v1.4.0 // indirect
4040
github.com/hashicorp/go-safetemp v1.0.0 // indirect
4141
github.com/hashicorp/go-uuid v1.0.2 // indirect
4242
github.com/hashicorp/go-version v1.3.0 // indirect

go.sum

Lines changed: 3 additions & 1 deletion
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=

sumologic/resource_sumologic_monitors_library_monitor.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -734,12 +734,13 @@ func resourceSumologicMonitorsLibraryMonitorRead(d *schema.ResourceData, meta in
734734
func resourceSumologicMonitorsLibraryMonitorUpdate(d *schema.ResourceData, meta interface{}) error {
735735
c := meta.(*Client)
736736
monitor := resourceToMonitorsLibraryMonitor(d)
737-
if d.HasChange("parentId") {
738-
// monitor.ParentID = d.Get("parentId").(string)
739-
err := c.MoveMonitorsLibraryMonitor(monitor)
737+
738+
if d.HasChange("parent_id") {
739+
updatedMonitor, err := c.MoveMonitorsLibraryMonitor(monitor.ID, monitor.ParentID)
740740
if err != nil {
741741
return err
742742
}
743+
monitor = *updatedMonitor
743744
}
744745
monitor.Type = "MonitorsLibraryMonitorUpdate"
745746
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
@@ -482,6 +482,98 @@ func TestAccSumologicMonitorsLibraryMonitor_driftingCorrectionFGP(t *testing.T)
482482
})
483483
}
484484

485+
func TestAccSumologicMonitorsLibraryMonitor_update_folder(t *testing.T) {
486+
var monitorsLibraryMonitor MonitorsLibraryMonitor
487+
testNameSuffix := acctest.RandString(16)
488+
489+
testName := "terraform_test_monitor_" + testNameSuffix
490+
testType := "MonitorsLibraryMonitor"
491+
testMonitorType := "Logs"
492+
//testAlertName := "Alert from {{Name}}"
493+
folder1tfResourceKey := "sumologic_monitor_folder.tf_folder_01"
494+
folder2tfResourceKey := "sumologic_monitor_folder.tf_folder_02"
495+
496+
resource.Test(t, resource.TestCase{
497+
PreCheck: func() { testAccPreCheck(t) },
498+
Providers: testAccProviders,
499+
CheckDestroy: testAccCheckMonitorsLibraryMonitorDestroy(monitorsLibraryMonitor),
500+
Steps: []resource.TestStep{
501+
{
502+
Config: testAccSumologicMonitorsLibraryMonitorFolderUpdate(testNameSuffix, folder1tfResourceKey),
503+
Check: resource.ComposeTestCheckFunc(
504+
testAccCheckMonitorsLibraryMonitorExists("sumologic_monitor.test", &monitorsLibraryMonitor, t),
505+
testAccCheckMonitorsLibraryMonitorAttributes("sumologic_monitor.test"),
506+
resource.TestCheckResourceAttr("sumologic_monitor.test", "monitor_type", testMonitorType),
507+
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
508+
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
509+
testAccCheckMonitorsLibraryMonitorFolderMatch("sumologic_monitor.test", folder1tfResourceKey, t),
510+
),
511+
},
512+
{
513+
Config: testAccSumologicMonitorsLibraryMonitorFolderUpdate(testNameSuffix, folder2tfResourceKey),
514+
Check: resource.ComposeTestCheckFunc(
515+
testAccCheckMonitorsLibraryMonitorExists("sumologic_monitor.test", &monitorsLibraryMonitor, t),
516+
testAccCheckMonitorsLibraryMonitorAttributes("sumologic_monitor.test"),
517+
resource.TestCheckResourceAttr("sumologic_monitor.test", "monitor_type", testMonitorType),
518+
resource.TestCheckResourceAttr("sumologic_monitor.test", "name", testName),
519+
resource.TestCheckResourceAttr("sumologic_monitor.test", "type", testType),
520+
testAccCheckMonitorsLibraryMonitorFolderMatch("sumologic_monitor.test", folder2tfResourceKey, t),
521+
),
522+
},
523+
},
524+
})
525+
}
526+
527+
func testAccCheckMonitorsLibraryMonitorFolderMatch(monitorName string, folderName string, t *testing.T) resource.TestCheckFunc {
528+
return func(s *terraform.State) error {
529+
//fetching monitor information
530+
monitorResource, ok := s.RootModule().Resources[monitorName]
531+
if !ok {
532+
//need this so that we don't get an unused import error for strconv in some cases
533+
return fmt.Errorf("Error = %s. MonitorsLibraryMonitor not found: %s", strconv.FormatBool(ok), monitorName)
534+
}
535+
536+
//need this so that we don't get an unused import error for strings in some cases
537+
if strings.EqualFold(monitorResource.Primary.ID, "") {
538+
return fmt.Errorf("MonitorsLibraryMonitor ID is not set")
539+
}
540+
541+
monitorResourceId := monitorResource.Primary.ID
542+
543+
client := testAccProvider.Meta().(*Client)
544+
monitorsLibraryMonitor, err := client.MonitorsRead(monitorResourceId)
545+
546+
if err != nil {
547+
return fmt.Errorf("MonitorsLibraryMonitor %s not found", monitorResourceId)
548+
}
549+
550+
//fetching monitor folder information
551+
folderResource, ok := s.RootModule().Resources[folderName]
552+
if !ok {
553+
//need this so that we don't get an unused import error for strconv in some cases
554+
return fmt.Errorf("Error = %s. MonitorsLibraryFolder not found: %s", strconv.FormatBool(ok), folderName)
555+
}
556+
557+
//need this so that we don't get an unused import error for strings in some cases
558+
if strings.EqualFold(folderResource.Primary.ID, "") {
559+
return fmt.Errorf("MonitorsLibraryFolder ID is not set")
560+
}
561+
562+
folderResourceId := folderResource.Primary.ID
563+
monitorsLibraryFolder, err := client.MonitorsRead(folderResourceId)
564+
if err != nil {
565+
return fmt.Errorf("MonitorsLibraryFolder%s not found", monitorResourceId)
566+
}
567+
568+
//checkig if the monitor parent id matches to the correct folder id
569+
if monitorsLibraryMonitor.ParentID != monitorsLibraryFolder.ID {
570+
return fmt.Errorf("Parent Id should be %s but %s", monitorsLibraryFolder.ID, monitorsLibraryMonitor.ParentID)
571+
}
572+
573+
return nil
574+
}
575+
}
576+
485577
func testAccCheckMonitorsLibraryMonitorDestroy(monitorsLibraryMonitor MonitorsLibraryMonitor) resource.TestCheckFunc {
486578
return func(s *terraform.State) error {
487579
client := testAccProvider.Meta().(*Client)
@@ -765,6 +857,62 @@ func testAccEmulateFGPDriftingMonitor(
765857
}
766858
}
767859

860+
func testAccSumologicMonitorsLibraryMonitorFolderUpdate(testName string, parentIdTFString string) string {
861+
return fmt.Sprintf(`
862+
resource "sumologic_monitor_folder" "tf_folder_01" {
863+
name = "tf_test_folder_01_%s"
864+
description = "1st folder"
865+
}
866+
resource "sumologic_monitor_folder" "tf_folder_02" {
867+
name = "tf_test_folder_02_%s"
868+
description = "1st folder"
869+
}
870+
resource "sumologic_monitor" "test" {
871+
name = "terraform_test_monitor_%s"
872+
description = "terraform_test_monitor_description"
873+
type = "MonitorsLibraryMonitor"
874+
is_disabled = false
875+
content_type = "Monitor"
876+
monitor_type = "Logs"
877+
evaluation_delay = "8m"
878+
queries {
879+
row_id = "A"
880+
query = "_sourceCategory=monitor-manager info"
881+
}
882+
triggers {
883+
threshold_type = "GreaterThan"
884+
threshold = 40.0
885+
time_range = "30m"
886+
occurrence_type = "ResultCount"
887+
trigger_source = "AllResults"
888+
trigger_type = "Critical"
889+
detection_method = "StaticCondition"
890+
}
891+
triggers {
892+
threshold_type = "LessThanOrEqual"
893+
threshold = 40.0
894+
time_range = "30m"
895+
occurrence_type = "ResultCount"
896+
trigger_source = "AllResults"
897+
trigger_type = "ResolvedCritical"
898+
detection_method = "StaticCondition"
899+
}
900+
notifications {
901+
notification {
902+
connection_type = "Email"
903+
recipients = ["[email protected]"]
904+
subject = "test tf monitor"
905+
time_zone = "PST"
906+
message_body = "test"
907+
}
908+
run_for_trigger_types = ["Critical", "ResolvedCritical"]
909+
}
910+
playbook = "This is an updated test playbook"
911+
alert_name = "Updated Alert from {{Name}}"
912+
parent_id = %s.id
913+
}`, testName, testName, testName, parentIdTFString)
914+
}
915+
768916
func exampleMonitorWithTriggerCondition(
769917
testName string,
770918
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)