diff --git a/glrdomon.go b/glrdomon.go index 992db62e84bda7fb8523f885391d67fb3b4221b8..29b2f1e7dafcca6bfa4e8c7a1d636fc2b21157e6 100644 --- a/glrdomon.go +++ b/glrdomon.go @@ -115,7 +115,7 @@ func checkAPI() { for _, droplet := range droplets { wg.Add(1) - go checkDropletAge(droplet) + go checkDroplet(droplet) } } @@ -148,24 +148,38 @@ func listDroplets(ctx context.Context, client *godo.Client) ([]godo.Droplet, err return list, nil } -func checkDropletAge(droplet godo.Droplet) { +func checkDroplet(droplet godo.Droplet) { defer wg.Done() + if !checkDropletAge(droplet) { + return + } + + deleted := deleteDroplet(droplet) + if deleteStale { + if deleted { + logger.Printf("Removed droplet %s (%d)", droplet.Name, droplet.ID) + } else { + logger.Printf("Failed to delete droplet %s (%d)", droplet.Name, droplet.ID) + } + } +} + +func checkDropletAge(droplet godo.Droplet) bool { thr := time.Now().Add(time.Duration(-threshold)) created, err := time.Parse(time.RFC3339, droplet.Created) if err != nil { logger.Printf("Could not parse created-timestamp for droplet ID %d", droplet.ID) - return + return false } - if thr.After(created) { - logger.Printf("Stale droplet => ID: %d; name: \"%s\"; created: %s, %s (%d)", droplet.ID, droplet.Name, humanize.Time(created), droplet.Created, created.Unix()) + stale := thr.After(created) - deleted := deleteDroplet(droplet) - if deleteStale && !deleted { - logger.Printf("Failed to delete droplet ID %d", droplet.ID) - } + if stale { + logger.Printf("Stale droplet => ID: %d; name: \"%s\"; created: %s, %s (%d)", droplet.ID, droplet.Name, humanize.Time(created), droplet.Created, created.Unix()) } + + return stale } func deleteDroplet(droplet godo.Droplet) bool { @@ -173,12 +187,12 @@ func deleteDroplet(droplet godo.Droplet) bool { return false } - logger.Printf("Deleting droplet %d", droplet.ID) + logger.Printf("Deleting droplet %s (%d)", droplet.Name, droplet.ID) ctx := context.TODO() _, err := client.Droplets.Delete(ctx, droplet.ID) - return err != nil + return err == nil } func setUpLogger() { diff --git a/glrdomon_test.go b/glrdomon_test.go index 4c11ca1018f4854c8b070347000ccaea2b4c1d78..67330b1cd61359b6288df190dfbf30f370bebd06 100644 --- a/glrdomon_test.go +++ b/glrdomon_test.go @@ -1,6 +1,34 @@ package main -import "testing" +import ( + "testing" + "time" + + "github.com/digitalocean/godo" +) + +func TestCheckDropletAge(t *testing.T) { + staleDroplet := godo.Droplet{ + ID: 1234, + Name: "very-old", + Created: "2000-08-19T19:07:04Z", + } + + if !checkDropletAge(staleDroplet) { + t.Error("Failed to assert that very old droplet is stale") + } + + now := time.Now() + newDroplet := godo.Droplet{ + ID: 5678, + Name: "new", + Created: now.Format(time.RFC3339), + } + + if checkDropletAge(newDroplet) { + t.Error("Asserted that brand-new droplet is stale") + } +} func TestValidatePath(t *testing.T) { emptyString := ""