1 package org.kuali.maven.ec2;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
7 import org.apache.commons.lang.StringUtils;
8 import org.apache.maven.plugin.MojoExecutionException;
9 import org.kuali.maven.ec2.pojo.Column;
10 import org.kuali.maven.ec2.pojo.Row;
11 import org.kuali.maven.ec2.pojo.RowComparator;
12 import org.kuali.maven.ec2.pojo.Table;
13
14 import com.amazonaws.services.ec2.AmazonEC2;
15 import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
16 import com.amazonaws.services.ec2.model.DescribeInstancesResult;
17 import com.amazonaws.services.ec2.model.GroupIdentifier;
18 import com.amazonaws.services.ec2.model.Instance;
19 import com.amazonaws.services.ec2.model.Reservation;
20
21
22
23
24
25
26 public class DescribeInstancesMojo extends AbstractEC2Mojo {
27
28
29
30
31
32
33 private String tag;
34
35
36
37
38
39
40 private List<String> instanceIds;
41
42 @Override
43 public void execute() throws MojoExecutionException {
44 AmazonEC2 client = getEC2Client();
45 DescribeInstancesRequest request = new DescribeInstancesRequest();
46 request.setInstanceIds(instanceIds);
47 DescribeInstancesResult result = client.describeInstances(request);
48 List<Instance> instances = getInstances(result.getReservations());
49 Table table = getTable(instances);
50 getLog().info(getDisplay(table.getColumns()));
51 for (Row row : table.getRows()) {
52 getLog().info(getDisplay(table, row));
53 }
54 }
55
56 protected String getDisplay(List<Column> columns) {
57 StringBuilder sb = new StringBuilder();
58 for (Column c : columns) {
59 sb.append(StringUtils.rightPad(c.getTitle(), c.getWidth(), " ") + " ");
60 }
61 return sb.toString();
62 }
63
64 protected String getDisplay(Table table, Row row) {
65 StringBuilder sb = new StringBuilder();
66 List<String> elements = row.getElements();
67 for (int i = 0; i < elements.size(); i++) {
68 int width = table.getColumns().get(i).getWidth();
69 sb.append(StringUtils.rightPad(elements.get(i), width, " ") + " ");
70 }
71 return sb.toString();
72 }
73
74 protected String getSecurityGroupsDisplay(Instance i) {
75 List<GroupIdentifier> groups = i.getSecurityGroups();
76 StringBuilder sb = new StringBuilder();
77 for (int j = 0; j < groups.size(); j++) {
78 if (j != 0) {
79 sb.append(",");
80 }
81 GroupIdentifier group = groups.get(j);
82 sb.append(group.getGroupName());
83 }
84 return sb.toString();
85 }
86
87 protected List<Row> getRows(List<Instance> instances) {
88 List<Row> rows = new ArrayList<Row>();
89 for (Instance i : instances) {
90 Row row = new Row();
91 List<String> elements = new ArrayList<String>();
92 elements.add(getTagValue(i, tag));
93 elements.add(i.getInstanceId());
94 elements.add(i.getImageId());
95 elements.add(i.getPlacement().getAvailabilityZone());
96 elements.add(i.getInstanceType());
97 elements.add(i.getState().getName());
98 elements.add(getSecurityGroupsDisplay(i));
99 elements.add(i.getKeyName());
100 row.setElements(elements);
101 rows.add(row);
102 }
103 Collections.sort(rows, new RowComparator());
104 Collections.reverse(rows);
105 return rows;
106 }
107
108 protected List<Column> getColumns(List<Row> rows) {
109 List<Column> columns = new ArrayList<Column>();
110 columns.add(new Column(tag));
111 columns.add(new Column("Instance"));
112 columns.add(new Column("AMI"));
113 columns.add(new Column("Availability Zone"));
114 columns.add(new Column("Type"));
115 columns.add(new Column("State"));
116 columns.add(new Column("Security Groups"));
117 columns.add(new Column("Key Pair"));
118 setWidths(columns, rows);
119 return columns;
120 }
121
122 protected void setWidths(List<Column> columns, List<Row> rows) {
123 for (int i = 0; i < rows.size(); i++) {
124 List<String> elements = rows.get(i).getElements();
125 for (int j = 0; j < elements.size(); j++) {
126 Column c = columns.get(j);
127 c.setWidth(Math.max(c.getWidth(), elements.get(j).length()));
128 }
129 }
130 }
131
132 protected Table getTable(List<Instance> instances) {
133 Table table = new Table();
134 table.setRows(getRows(instances));
135 table.setColumns(getColumns(table.getRows()));
136 return table;
137 }
138
139 protected List<Instance> getInstances(List<Reservation> reservations) {
140 List<Instance> instances = new ArrayList<Instance>();
141 for (Reservation r : reservations) {
142 instances.addAll(r.getInstances());
143 }
144 return instances;
145 }
146
147 public String getTag() {
148 return tag;
149 }
150
151 public void setTag(String displayTag) {
152 this.tag = displayTag;
153 }
154
155 }