View Javadoc

1   /**
2    *
3    * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
4    *
5    * ====================================================================
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   * ====================================================================
18   */
19  package org.jclouds.aws.ec2.domain;
20  
21  import static com.google.common.base.Preconditions.checkNotNull;
22  
23  import java.util.Date;
24  import java.util.Map;
25  import java.util.Set;
26  
27  import javax.annotation.Nullable;
28  
29  import org.jclouds.ec2.domain.BlockDevice;
30  import org.jclouds.ec2.domain.InstanceState;
31  import org.jclouds.ec2.domain.RootDeviceType;
32  import org.jclouds.ec2.domain.RunningInstance;
33  
34  import com.google.common.collect.ImmutableMap;
35  import com.google.common.collect.ImmutableSet;
36  import com.google.common.collect.Maps;
37  import com.google.common.collect.Sets;
38  
39  /**
40   * 
41   * @see <a href=
42   *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html"
43   *      />
44   * @author Adrian Cole
45   */
46  public class AWSRunningInstance extends RunningInstance {
47     public static Builder builder() {
48        return new Builder();
49     }
50  
51     public static class Builder extends org.jclouds.ec2.domain.RunningInstance.Builder {
52        private MonitoringState monitoringState;
53        private String placementGroup;
54        private Set<String> productCodes = Sets.newLinkedHashSet();
55        private String subnetId;
56        private String spotInstanceRequestId;
57        private String vpcId;
58        private Map<String, String> securityGroupIdToNames = Maps.newLinkedHashMap();
59  
60        public Builder securityGroupIdToNames(Map<String, String> securityGroupIdToNames) {
61           this.securityGroupIdToNames = ImmutableMap.copyOf(checkNotNull(securityGroupIdToNames,
62                 "securityGroupIdToNames"));
63           return this;
64        }
65  
66        public Builder securityGroupIdToName(String key, String value) {
67           if (key != null && value != null)
68              this.securityGroupIdToNames.put(key, value);
69           return this;
70        }
71  
72        public Builder monitoringState(MonitoringState monitoringState) {
73           this.monitoringState = monitoringState;
74           return this;
75        }
76  
77        public Builder placementGroup(String placementGroup) {
78           this.placementGroup = placementGroup;
79           return this;
80        }
81  
82        public Builder productCodes(Iterable<String> productCodes) {
83           this.productCodes = ImmutableSet.copyOf(checkNotNull(productCodes, "productCodes"));
84           return this;
85        }
86  
87        public Builder productCode(String productCode) {
88           if (productCode != null)
89              this.productCodes.add(productCode);
90           return this;
91        }
92  
93        public Builder subnetId(String subnetId) {
94           this.subnetId = subnetId;
95           return this;
96        }
97  
98        public Builder spotInstanceRequestId(String spotInstanceRequestId) {
99           this.spotInstanceRequestId = spotInstanceRequestId;
100          return this;
101       }
102 
103       public Builder vpcId(String vpcId) {
104          this.vpcId = vpcId;
105          return this;
106       }
107 
108       @Override
109       public Builder amiLaunchIndex(String amiLaunchIndex) {
110          return Builder.class.cast(super.amiLaunchIndex(amiLaunchIndex));
111       }
112 
113       @Override
114       public Builder availabilityZone(String availabilityZone) {
115          return Builder.class.cast(super.availabilityZone(availabilityZone));
116       }
117 
118       @Override
119       public Builder devices(Map<String, BlockDevice> ebsBlockDevices) {
120          return Builder.class.cast(super.devices(ebsBlockDevices));
121       }
122 
123       @Override
124       public Builder dnsName(String dnsName) {
125          return Builder.class.cast(super.dnsName(dnsName));
126       }
127 
128       @Override
129       public Builder imageId(String imageId) {
130          return Builder.class.cast(super.imageId(imageId));
131       }
132 
133       @Override
134       public Builder instanceId(String instanceId) {
135          return Builder.class.cast(super.instanceId(instanceId));
136       }
137 
138       @Override
139       public Builder instanceState(InstanceState instanceState) {
140          return Builder.class.cast(super.instanceState(instanceState));
141       }
142 
143       @Override
144       public Builder instanceType(String instanceType) {
145          return Builder.class.cast(super.instanceType(instanceType));
146       }
147 
148       @Override
149       public Builder ipAddress(String ipAddress) {
150          return Builder.class.cast(super.ipAddress(ipAddress));
151       }
152 
153       @Override
154       public Builder kernelId(String kernelId) {
155          return Builder.class.cast(super.kernelId(kernelId));
156       }
157 
158       @Override
159       public Builder keyName(String keyName) {
160          return Builder.class.cast(super.keyName(keyName));
161       }
162 
163       @Override
164       public Builder launchTime(Date launchTime) {
165          return Builder.class.cast(super.launchTime(launchTime));
166       }
167 
168       @Override
169       public Builder platform(String platform) {
170          return Builder.class.cast(super.platform(platform));
171       }
172 
173       @Override
174       public Builder privateDnsName(String privateDnsName) {
175          return Builder.class.cast(super.privateDnsName(privateDnsName));
176       }
177 
178       @Override
179       public Builder privateIpAddress(String privateIpAddress) {
180          return Builder.class.cast(super.privateIpAddress(privateIpAddress));
181       }
182 
183       @Override
184       public Builder ramdiskId(String ramdiskId) {
185          return Builder.class.cast(super.ramdiskId(ramdiskId));
186       }
187 
188       @Override
189       public Builder reason(String reason) {
190          return Builder.class.cast(super.reason(reason));
191       }
192 
193       @Override
194       public Builder region(String region) {
195          return Builder.class.cast(super.region(region));
196       }
197 
198       @Override
199       public Builder rootDeviceName(String rootDeviceName) {
200          return Builder.class.cast(super.rootDeviceName(rootDeviceName));
201       }
202 
203       @Override
204       public Builder rootDeviceType(RootDeviceType rootDeviceType) {
205          return Builder.class.cast(super.rootDeviceType(rootDeviceType));
206       }
207 
208       @Override
209       public Builder virtualizationType(String virtualizationType) {
210          return Builder.class.cast(super.virtualizationType(virtualizationType));
211       }
212 
213       @Override
214       public Builder device(String key, BlockDevice value) {
215          return Builder.class.cast(super.device(key, value));
216       }
217 
218       @Override
219       public Builder groupId(String groupId) {
220          return Builder.class.cast(super.groupId(groupId));
221       }
222 
223       @Override
224       public Builder groupIds(Iterable<String> groupIds) {
225          return Builder.class.cast(super.groupIds(groupIds));
226       }
227 
228       @Override
229       public AWSRunningInstance build() {
230          return new AWSRunningInstance(region, securityGroupIdToNames, amiLaunchIndex, dnsName, imageId, instanceId,
231                instanceState, instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone,
232                virtualizationType, platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType,
233                rootDeviceName, ebsBlockDevices, monitoringState, placementGroup, productCodes, subnetId,
234                spotInstanceRequestId, vpcId);
235       }
236 
237    }
238 
239    private final MonitoringState monitoringState;
240    @Nullable
241    private final String placementGroup;
242    private final Set<String> productCodes;
243    @Nullable
244    private final String subnetId;
245    @Nullable
246    private final String spotInstanceRequestId;
247    @Nullable
248    private final String vpcId;
249    private final Map<String, String> securityGroupIdToNames;
250 
251    protected AWSRunningInstance(String region, Map<String, String> securityGroupIdToNames, String amiLaunchIndex,
252          String dnsName, String imageId, String instanceId, InstanceState instanceState, String instanceType,
253          String ipAddress, String kernelId, String keyName, Date launchTime, String availabilityZone,
254          String virtualizationType, String platform, String privateDnsName, String privateIpAddress, String ramdiskId,
255          String reason, RootDeviceType rootDeviceType, String rootDeviceName, Map<String, BlockDevice> ebsBlockDevices,
256          MonitoringState monitoringState, String placementGroup, Iterable<String> productCodes, String subnetId,
257          String spotInstanceRequestId, String vpcId) {
258       super(region, securityGroupIdToNames.values(), amiLaunchIndex, dnsName, imageId, instanceId, instanceState,
259             instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType, platform,
260             privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, ebsBlockDevices);
261       this.monitoringState = checkNotNull(monitoringState, "monitoringState");
262       this.placementGroup = placementGroup;
263       this.productCodes = ImmutableSet.copyOf(checkNotNull(productCodes, "productCodes"));
264       this.subnetId = subnetId;
265       this.spotInstanceRequestId = spotInstanceRequestId;
266       this.vpcId = vpcId;
267       this.securityGroupIdToNames = ImmutableMap.<String, String> copyOf(checkNotNull(securityGroupIdToNames,
268             "securityGroupIdToNames"));
269    }
270 
271    public Map<String, String> getSecurityGroupIdToNames() {
272       return securityGroupIdToNames;
273    }
274 
275    /**
276     * State of monitoring for the instance.
277     */
278    public MonitoringState getMonitoringState() {
279       return monitoringState;
280    }
281 
282    /**
283     * The name of the placement group the instance is in (for cluster compute
284     * instances).
285     */
286    public String getPlacementGroup() {
287       return placementGroup;
288    }
289 
290    /**
291     * Product codes attached to this instance.
292     */
293    public Set<String> getProductCodes() {
294       return productCodes;
295    }
296 
297    /**
298     * The ID of the Spot Instance request
299     */
300    public String getSpotInstanceRequestId() {
301       return spotInstanceRequestId;
302    }
303 
304    /**
305     * Specifies the VPC in which the instance is running (Amazon Virtual Private
306     * Cloud).
307     */
308    public String getVpcId() {
309       return vpcId;
310    }
311 
312    /**
313     * Specifies the subnet ID in which the instance is running (Amazon Virtual
314     * Private Cloud).
315     */
316    public String getSubnetId() {
317       return subnetId;
318    }
319 
320    @Override
321    public int hashCode() {
322       final int prime = 31;
323       int result = super.hashCode();
324       result = prime * result + ((placementGroup == null) ? 0 : placementGroup.hashCode());
325       result = prime * result + ((productCodes == null) ? 0 : productCodes.hashCode());
326       result = prime * result + ((spotInstanceRequestId == null) ? 0 : spotInstanceRequestId.hashCode());
327       result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode());
328       result = prime * result + ((vpcId == null) ? 0 : vpcId.hashCode());
329       return result;
330    }
331 
332    @Override
333    public boolean equals(Object obj) {
334       if (this == obj)
335          return true;
336       if (!super.equals(obj))
337          return false;
338       if (getClass() != obj.getClass())
339          return false;
340       AWSRunningInstance other = (AWSRunningInstance) obj;
341       if (placementGroup == null) {
342          if (other.placementGroup != null)
343             return false;
344       } else if (!placementGroup.equals(other.placementGroup))
345          return false;
346       if (productCodes == null) {
347          if (other.productCodes != null)
348             return false;
349       } else if (!productCodes.equals(other.productCodes))
350          return false;
351       if (spotInstanceRequestId == null) {
352          if (other.spotInstanceRequestId != null)
353             return false;
354       } else if (!spotInstanceRequestId.equals(other.spotInstanceRequestId))
355          return false;
356       if (subnetId == null) {
357          if (other.subnetId != null)
358             return false;
359       } else if (!subnetId.equals(other.subnetId))
360          return false;
361       if (vpcId == null) {
362          if (other.vpcId != null)
363             return false;
364       } else if (!vpcId.equals(other.vpcId))
365          return false;
366       return true;
367    }
368 
369    @Override
370    public String toString() {
371       return "[region=" + region + ", availabilityZone=" + availabilityZone + ", instanceId=" + instanceId
372             + ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType="
373             + virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName
374             + ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + keyName
375             + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + rootDeviceName
376             + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + ", monitoringState="
377             + monitoringState + ", placementGroup=" + placementGroup + ", productCodes=" + productCodes
378             + ", spotInstanceRequestId=" + spotInstanceRequestId + ", subnetId=" + subnetId + ", vpcId=" + vpcId + "]";
379    }
380 
381 }