forked from sourcegraph/checkup
-
Notifications
You must be signed in to change notification settings - Fork 0
/
backuprdschecker.go
89 lines (75 loc) · 2.32 KB
/
backuprdschecker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package checkup
import (
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/rds"
)
// BackupRDSChecker implements a Checker for ami.
type BackupRDSChecker struct {
// Name is the name of the endpoint.
Name string `json:"endpoint_name"`
// Region of the bucket.
// Default is eu-west-1
Region string `json:"region"`
// rds instance.
Instance string `json:"instance"`
// MinAgeThreshold
// Default is 36 hours.
MinAgeThreshold string `json:"min_age_threshold,omitempty"`
rdsService *rds.RDS
}
// Check performs checks using c according to its configuration.
// An error is only returned if there is a configuration error.
func (c BackupRDSChecker) Check() (Result, error) {
if c.Region == "" {
c.Region = "eu-west-1"
}
var oldThreshold time.Duration
if c.MinAgeThreshold == "" {
c.MinAgeThreshold = "36h"
}
oldThreshold, _ = time.ParseDuration(c.MinAgeThreshold)
c.rdsService = rds.New(session.New(&aws.Config{Region: aws.String(c.Region)}))
result := Result{Title: c.Name, Endpoint: c.Name, Timestamp: Timestamp()}
result.Times = make(Attempts, 1)
// https://docs.aws.amazon.com/sdk-for-go/api/service/rds/#RDS.DescribeDBSnapshots
input := &rds.DescribeDBSnapshotsInput{
DBInstanceIdentifier: aws.String(c.Instance),
IncludePublic: aws.Bool(false),
IncludeShared: aws.Bool(false),
}
resp, err := c.rdsService.DescribeDBSnapshots(input)
if err != nil {
return result, err
}
var lastSnapshot *rds.DBSnapshot = nil
for _, snapshot := range resp.DBSnapshots {
if *snapshot.Status == "available" {
if lastSnapshot == nil || (*lastSnapshot.SnapshotCreateTime).Before(*snapshot.SnapshotCreateTime) {
lastSnapshot = snapshot
}
}
}
if lastSnapshot == nil {
result.Times[0].Error = "no backup"
} else {
if (*lastSnapshot.SnapshotCreateTime).Before(time.Now().Add(-1 * oldThreshold)) {
result.Times[0].Error = "no recent backup"
}
}
return c.conclude(result), nil
}
// conclude takes the data in result from the attempts and
// computes remaining values needed to fill out the result.
func (c BackupRDSChecker) conclude(result Result) Result {
// Check errors (down)
for i := range result.Times {
if result.Times[i].Error != "" {
result.Down = true
return result
}
}
result.Healthy = true
return result
}