/
report_cost.go
99 lines (91 loc) · 2.45 KB
/
report_cost.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
90
91
92
93
94
95
96
97
98
99
package chanute
import (
"strings"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/richardwilkes/toolbox/errs"
)
type CostReport struct {
EC2 *EC2Report
LoadBalancers *LoadBalancerReport
EBS *EBSReport
RDS *RDSReport
Redshift *RedshiftReport
EIPs *UnassociatedElasticIPAddressesReport
}
func costReport(cfg *Config, sess *session.Session, lookups map[Check][]*TrustedAdvisorCheck) (*CostReport, error) {
r := &CostReport{}
var err error
for lookup, values := range lookups {
var reportErr error
switch lookup {
case CheckLowUtilizationAmazonEC2Instances:
r.EC2, reportErr = ec2LowUtilization(cfg, sess, values)
case CheckIdleLoadBalancers:
r.LoadBalancers, reportErr = idleLoadBalancers(cfg, sess, values)
case CheckUnderutilizedAmazonEBSVolumes:
r.EBS, reportErr = ebsLowUtilization(cfg, sess, values)
case CheckAmazonRDSIdleDBInstances:
r.RDS, reportErr = rdsIdleInstances(cfg, sess, values)
case CheckUnderutilizedAmazonRedshiftClusters:
r.Redshift, reportErr = redshiftLowUtilization(cfg, sess, values)
case CheckUnassociatedElasticIPAddresses:
r.EIPs, reportErr = unassociatedElasticIPAddresses(cfg, sess, values)
default:
printUnhandledCheck(CheckTypeCost, lookup, values)
}
if reportErr != nil {
err = errs.Append(err, reportErr)
}
}
return r, err
}
func (r *CostReport) AsciiReport() string {
o := &strings.Builder{}
if r.EC2 != nil {
o.WriteString(r.EC2.AsciiReport())
o.WriteString("\n")
}
if r.LoadBalancers != nil {
o.WriteString(r.LoadBalancers.AsciiReport())
o.WriteString("\n")
}
if r.EBS != nil {
o.WriteString(r.EBS.AsciiReport())
o.WriteString("\n")
}
if r.RDS != nil {
o.WriteString(r.RDS.AsciiReport())
o.WriteString("\n")
}
if r.Redshift != nil {
o.WriteString(r.Redshift.AsciiReport())
o.WriteString("\n")
}
if r.EIPs != nil {
o.WriteString(r.EIPs.AsciiReport())
o.WriteString("\n")
}
return o.String()
}
func (r *CostReport) AggregateRows(a Aggregator) []*AggregateRow {
var o []*AggregateRow
if r.EC2 != nil {
o = append(o, r.EC2.AggregateRows(a)...)
}
if r.LoadBalancers != nil {
o = append(o, r.LoadBalancers.AggregateRows(a)...)
}
if r.EBS != nil {
o = append(o, r.EBS.AggregateRows(a)...)
}
if r.RDS != nil {
o = append(o, r.RDS.AggregateRows(a)...)
}
if r.Redshift != nil {
o = append(o, r.Redshift.AggregateRows(a)...)
}
if r.EIPs != nil {
o = append(o, r.EIPs.AggregateRows(a)...)
}
return o
}