From 1e308da3af0fb82b923aaf5ecff26471bd3e4dd2 Mon Sep 17 00:00:00 2001 From: Andrew Starr-Bochicchio Date: Mon, 13 Feb 2023 12:35:08 -0500 Subject: [PATCH] Add sweeper for uptime and monitoring alerts. (#944) * Add sweeper for monitoring alerts. * Add sweeper for uptime. --- .../monitoring/import_monitor_alert_test.go | 2 +- .../monitoring/resource_monitor_alert_test.go | 12 ++--- digitalocean/monitoring/sweep.go | 47 ++++++++++++++++++ digitalocean/sweep/sweep_test.go | 2 + digitalocean/uptime/sweep.go | 49 +++++++++++++++++++ 5 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 digitalocean/monitoring/sweep.go create mode 100644 digitalocean/uptime/sweep.go diff --git a/digitalocean/monitoring/import_monitor_alert_test.go b/digitalocean/monitoring/import_monitor_alert_test.go index a449dc7ad..6a0989377 100644 --- a/digitalocean/monitoring/import_monitor_alert_test.go +++ b/digitalocean/monitoring/import_monitor_alert_test.go @@ -19,7 +19,7 @@ func TestAccDigitalOceanMonitorAlert_importBasic(t *testing.T) { CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "10m", "v1/insights/droplet/memory_utilization_percent", "Alert about memory usage"), + Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "10m", "v1/insights/droplet/memory_utilization_percent", randName), }, { ResourceName: resourceName, diff --git a/digitalocean/monitoring/resource_monitor_alert_test.go b/digitalocean/monitoring/resource_monitor_alert_test.go index c16466884..c2f8a14e6 100644 --- a/digitalocean/monitoring/resource_monitor_alert_test.go +++ b/digitalocean/monitoring/resource_monitor_alert_test.go @@ -67,7 +67,7 @@ resource "digitalocean_monitor_alert" "%s" { compare = "GreaterThan" value = 95 entities = [digitalocean_droplet.web.id] - description = "Alert about CPU usage" + description = "%s" } ` @@ -139,7 +139,7 @@ func TestAccDigitalOceanMonitorAlert(t *testing.T) { PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "5m", "v1/insights/droplet/cpu", "Alert about CPU usage"), + Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "5m", "v1/insights/droplet/cpu", randName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(resourceName, "type", "v1/insights/droplet/cpu"), resource.TestCheckResourceAttr(resourceName, "compare", "GreaterThan"), @@ -162,7 +162,7 @@ func TestAccDigitalOceanMonitorAlertSlackEmailAlerts(t *testing.T) { PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccAlertPolicySlackEmailAlerts, randName, randName), + Config: fmt.Sprintf(testAccAlertPolicySlackEmailAlerts, randName, randName, randName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(resourceName, "type", "v1/insights/droplet/cpu"), resource.TestCheckResourceAttr(resourceName, "compare", "GreaterThan"), @@ -187,9 +187,9 @@ func TestAccDigitalOceanMonitorAlertUpdate(t *testing.T) { PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "10m", "v1/insights/droplet/cpu", "Alert about CPU usage"), + Config: fmt.Sprintf(testAccAlertPolicy, randName, randName, "", "10m", "v1/insights/droplet/cpu", randName), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "description", "Alert about CPU usage"), + resource.TestCheckResourceAttr(resourceName, "description", randName), resource.TestCheckResourceAttr(resourceName, "type", "v1/insights/droplet/cpu"), resource.TestCheckResourceAttr(resourceName, "compare", "GreaterThan"), resource.TestCheckResourceAttr(resourceName, "alerts.#", "1"), @@ -234,7 +234,7 @@ func TestAccDigitalOceanMonitorAlertWithTag(t *testing.T) { PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccAlertPolicyWithTag, tagName, randName, randName, "5m", "v1/insights/droplet/cpu", "Alert about CPU usage"), + Config: fmt.Sprintf(testAccAlertPolicyWithTag, tagName, randName, randName, "5m", "v1/insights/droplet/cpu", randName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(resourceName, "type", "v1/insights/droplet/cpu"), resource.TestCheckResourceAttr(resourceName, "compare", "GreaterThan"), diff --git a/digitalocean/monitoring/sweep.go b/digitalocean/monitoring/sweep.go new file mode 100644 index 000000000..b5276d3a0 --- /dev/null +++ b/digitalocean/monitoring/sweep.go @@ -0,0 +1,47 @@ +package monitoring + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_monitor_alert", &resource.Sweeper{ + Name: "digitalocean_monitor_alert", + F: sweepMonitoringAlerts, + }) + +} + +func sweepMonitoringAlerts(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + alerts, _, err := client.Monitoring.ListAlertPolicies(context.Background(), opt) + if err != nil { + return err + } + + for _, a := range alerts { + if strings.HasPrefix(a.Description, sweep.TestNamePrefix) { + log.Printf("[DEBUG] Destroying alert %s", a.Description) + + if _, err := client.Monitoring.DeleteAlertPolicy(context.Background(), a.UUID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/sweep/sweep_test.go b/digitalocean/sweep/sweep_test.go index 760b126b9..b52ac8718 100644 --- a/digitalocean/sweep/sweep_test.go +++ b/digitalocean/sweep/sweep_test.go @@ -12,10 +12,12 @@ import ( _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/image" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/kubernetes" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/loadbalancer" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/monitoring" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/project" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/reservedip" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/snapshot" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sshkey" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/uptime" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/volume" _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/vpc" diff --git a/digitalocean/uptime/sweep.go b/digitalocean/uptime/sweep.go new file mode 100644 index 000000000..a875b998c --- /dev/null +++ b/digitalocean/uptime/sweep.go @@ -0,0 +1,49 @@ +package uptime + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_uptime_check", &resource.Sweeper{ + Name: "digitalocean_uptime_check", + F: sweepUptimeCheck, + }) + + // Note: Deleting the check will delete associated alerts. So no sweeper is + // needed for digitalocean_uptime_alert +} + +func sweepUptimeCheck(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + checks, _, err := client.UptimeChecks.List(context.Background(), opt) + if err != nil { + return err + } + + for _, c := range checks { + if strings.HasPrefix(c.Name, sweep.TestNamePrefix) { + log.Printf("[DEBUG] Deleting uptime check %s", c.Name) + + if _, err := client.UptimeChecks.Delete(context.Background(), c.ID); err != nil { + return err + } + } + } + + return nil +}