forked from minamijoyo/myaws
/
ec2ri_ls.go
98 lines (78 loc) · 2.88 KB
/
ec2ri_ls.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
package myaws
import (
"fmt"
"strings"
"github.com/aws/aws-sdk-go/service/ec2"
)
// EC2RILsOptions customize the behavior of the Ls command.
type EC2RILsOptions struct {
All bool
Quiet bool
Fields []string
}
// EC2RILs describes EC2 Reserved Instances.
func (client *Client) EC2RILs(options EC2RILsOptions) error {
instances, err := client.FindEC2ReservedInstances(options.All)
if err != nil {
return err
}
for _, instance := range instances {
fmt.Fprintln(client.stdout, formatEC2RIInstance(client, options, instance))
}
return nil
}
func formatEC2RIInstance(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
formatFuncs := map[string]func(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string{
"ReservedInstancesId": formatEC2ReservedInstanceID,
"AvailabilityZone": formatEC2RIAvailabilityZone,
"InstanceType": formatEC2RIInstanceType,
"InstanceCount": formatEC2RIInstanceCount,
"State": formatEC2RIState,
"Scope": formatEC2RIScope,
"Start": formatEC2RIStart,
"End": formatEC2RIEnd,
"Duration": formatEC2RIDuration,
}
var outputFields []string
if options.Quiet {
outputFields = []string{"InstanceId"}
} else {
outputFields = options.Fields
}
output := []string{}
for _, field := range outputFields {
value := formatFuncs[field](client, options, instance)
output = append(output, value)
}
return strings.Join(output[:], "\t")
}
func formatEC2ReservedInstanceID(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return *instance.ReservedInstancesId
}
func formatEC2RIAvailabilityZone(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
if instance.AvailabilityZone != nil {
return *instance.AvailabilityZone
}
return "N/A"
}
func formatEC2RIInstanceType(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return *instance.InstanceType
}
func formatEC2RIInstanceCount(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return fmt.Sprintf("%3d", *instance.InstanceCount)
}
func formatEC2RIState(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return *instance.State
}
func formatEC2RIScope(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return *instance.Scope
}
func formatEC2RIStart(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return instance.Start.Format("2006-01-02")
}
func formatEC2RIEnd(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return instance.End.Format("2006-01-02")
}
func formatEC2RIDuration(client *Client, options EC2RILsOptions, instance *ec2.ReservedInstances) string {
return fmt.Sprintf("%2dyear", *instance.Duration/(3600*24*365))
}