blob: 9b502d6bf9ebe47b3b3d6dda4642edf620b57f3c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Strings;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
/**
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html"
* />
* @author Adrian Cole
*/
public class RunningInstance implements Comparable<RunningInstance> {
public static Builder<?> builder() {
return new ConcreteBuilder();
}
public Builder<?> toBuilder() {
return new ConcreteBuilder().fromRunningInstance(this);
}
public abstract static class Builder<T extends Builder<T>> {
protected abstract T self();
protected String region;
protected Set<String> groupNames = Sets.newLinkedHashSet();
protected String amiLaunchIndex;
protected String dnsName;
protected String imageId;
protected String instanceId;
protected InstanceState instanceState;
protected String rawState;
protected String instanceType;
protected String ipAddress;
protected String kernelId;
protected String keyName;
protected Date launchTime;
protected String availabilityZone;
protected String virtualizationType = "paravirtual";
protected String platform;
protected String privateDnsName;
protected String privateIpAddress;
protected String ramdiskId;
protected String reason;
protected RootDeviceType rootDeviceType = RootDeviceType.INSTANCE_STORE;
protected String rootDeviceName;
protected Map<String, BlockDevice> ebsBlockDevices = Maps.newLinkedHashMap();
protected Map<String, String> tags = Maps.newLinkedHashMap();
public T tags(Map<String, String> tags) {
this.tags = ImmutableMap.copyOf(checkNotNull(tags, "tags"));
return self();
}
public T tag(String key, String value) {
if (key != null)
this.tags.put(key, Strings.nullToEmpty(value));
return self();
}
public T region(String region) {
this.region = region;
return self();
}
public T groupNames(Iterable<String> groupNames) {
this.groupNames = ImmutableSet.copyOf(checkNotNull(groupNames, "groupNames"));
return self();
}
public T groupName(String groupName) {
if (groupName != null)
this.groupNames.add(groupName);
return self();
}
public T amiLaunchIndex(String amiLaunchIndex) {
this.amiLaunchIndex = amiLaunchIndex;
return self();
}
public T dnsName(String dnsName) {
this.dnsName = dnsName;
return self();
}
public T imageId(String imageId) {
this.imageId = imageId;
return self();
}
public T instanceId(String instanceId) {
this.instanceId = instanceId;
return self();
}
public T instanceState(InstanceState instanceState) {
this.instanceState = instanceState;
return self();
}
public T rawState(String rawState) {
this.rawState = rawState;
return self();
}
public T instanceType(String instanceType) {
this.instanceType = instanceType;
return self();
}
public T ipAddress(String ipAddress) {
this.ipAddress = ipAddress;
return self();
}
public T kernelId(String kernelId) {
this.kernelId = kernelId;
return self();
}
public T keyName(String keyName) {
this.keyName = keyName;
return self();
}
public T launchTime(Date launchTime) {
this.launchTime = launchTime;
return self();
}
public T availabilityZone(String availabilityZone) {
this.availabilityZone = availabilityZone;
return self();
}
public T virtualizationType(String virtualizationType) {
this.virtualizationType = virtualizationType;
return self();
}
public T platform(String platform) {
this.platform = platform;
return self();
}
public T privateDnsName(String privateDnsName) {
this.privateDnsName = privateDnsName;
return self();
}
public T privateIpAddress(String privateIpAddress) {
this.privateIpAddress = privateIpAddress;
return self();
}
public T ramdiskId(String ramdiskId) {
this.ramdiskId = ramdiskId;
return self();
}
public T reason(String reason) {
this.reason = reason;
return self();
}
public T rootDeviceType(RootDeviceType rootDeviceType) {
this.rootDeviceType = rootDeviceType;
return self();
}
public T rootDeviceName(String rootDeviceName) {
this.rootDeviceName = rootDeviceName;
return self();
}
public T devices(Map<String, BlockDevice> ebsBlockDevices) {
this.ebsBlockDevices = ImmutableMap.copyOf(checkNotNull(ebsBlockDevices, "ebsBlockDevices"));
return self();
}
public T device(String key, BlockDevice value) {
if (key != null && value != null)
this.ebsBlockDevices.put(key, value);
return self();
}
public T fromRunningInstance(RunningInstance in) {
return region(in.region).groupNames(in.groupNames).amiLaunchIndex(in.amiLaunchIndex).dnsName(in.dnsName)
.imageId(in.imageId).instanceId(in.instanceId).instanceState(in.instanceState).rawState(in.rawState)
.instanceType(in.instanceType).ipAddress(in.ipAddress).kernelId(in.kernelId).keyName(in.keyName)
.launchTime(in.launchTime).availabilityZone(in.availabilityZone)
.virtualizationType(in.virtualizationType).platform(in.platform).privateDnsName(in.privateDnsName)
.privateIpAddress(in.privateIpAddress).ramdiskId(in.ramdiskId).reason(in.reason)
.rootDeviceType(in.rootDeviceType).rootDeviceName(in.rootDeviceName).devices(in.ebsBlockDevices)
.tags(in.tags);
}
public abstract RunningInstance build();
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
@Override
protected ConcreteBuilder self() {
return this;
}
@Override
public RunningInstance build() {
return new RunningInstance(region, groupNames, amiLaunchIndex, dnsName, imageId, instanceId, instanceState,
rawState, instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType,
platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName,
ebsBlockDevices, tags);
}
}
protected final String region;
protected final Set<String> groupNames;
protected final String amiLaunchIndex;
@Nullable
protected final String dnsName;
protected final String imageId;
protected final String instanceId;
protected final InstanceState instanceState;
protected final String rawState;
protected final String instanceType;
@Nullable
protected final String ipAddress;
@Nullable
protected final String kernelId;
@Nullable
protected final String keyName;
protected final Date launchTime;
protected final String availabilityZone;
protected final String virtualizationType;
@Nullable
protected final String platform;
@Nullable
protected final String privateDnsName;
@Nullable
protected final String privateIpAddress;
@Nullable
protected final String ramdiskId;
@Nullable
protected final String reason;
protected final RootDeviceType rootDeviceType;
@Nullable
protected final String rootDeviceName;
protected final Map<String, BlockDevice> ebsBlockDevices;
protected final Map<String, String> tags;
protected RunningInstance(String region, Iterable<String> groupNames, @Nullable String amiLaunchIndex,
@Nullable String dnsName, String imageId, String instanceId, InstanceState instanceState, String rawState,
String instanceType, @Nullable String ipAddress, @Nullable String kernelId, @Nullable String keyName,
Date launchTime, String availabilityZone, String virtualizationType, @Nullable String platform,
@Nullable String privateDnsName, @Nullable String privateIpAddress, @Nullable String ramdiskId,
@Nullable String reason, RootDeviceType rootDeviceType, @Nullable String rootDeviceName,
Map<String, BlockDevice> ebsBlockDevices, Map<String, String> tags) {
this.region = checkNotNull(region, "region");
this.amiLaunchIndex = amiLaunchIndex; // nullable on runinstances.
this.dnsName = dnsName; // nullable on runinstances.
this.imageId = imageId; // nullable on runinstances.
this.instanceId = checkNotNull(instanceId, "instanceId");
this.instanceState = checkNotNull(instanceState, "instanceState for %s/%s", region, instanceId);
this.rawState = checkNotNull(rawState, "rawState for %s/%s", region, instanceId);
this.instanceType = checkNotNull(instanceType, "instanceType for %s/%s", region, instanceId);
this.ipAddress = ipAddress;
this.kernelId = kernelId;
this.keyName = keyName;
this.launchTime = launchTime;// nullable on spot.
this.availabilityZone = availabilityZone;// nullable on spot.
this.virtualizationType = virtualizationType;
this.platform = platform;
this.privateDnsName = privateDnsName;// nullable on runinstances.
this.privateIpAddress = privateIpAddress;// nullable on runinstances.
this.ramdiskId = ramdiskId;
this.reason = reason;
this.rootDeviceType = checkNotNull(rootDeviceType, "rootDeviceType for %s/%s", region, instanceId);
this.rootDeviceName = rootDeviceName;
this.ebsBlockDevices = ImmutableMap.copyOf(checkNotNull(ebsBlockDevices, "ebsBlockDevices for %s/%s", region, instanceId));
this.groupNames = ImmutableSet.copyOf(checkNotNull(groupNames, "groupNames for %s/%s", region, instanceId));
this.tags = ImmutableMap.<String, String> copyOf(checkNotNull(tags, "tags"));
}
/**
* To be removed in jclouds 1.6 <h4>Warning</h4>
*
* Especially on EC2 clones that may not support regions, this value is fragile. Consider
* alternate means to determine context.
*/
@Deprecated
public String getRegion() {
return region;
}
/**
* The AMI launch index, which can be used to find this instance within the launch group. For
* more information, go to the Metadata section of the Amazon Elastic Compute Cloud Developer
* Guide.
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-06-15/DeveloperGuide/" />
*/
public String getAmiLaunchIndex() {
return amiLaunchIndex;
}
/**
* The public DNS name assigned to the instance. This DNS name is contactable from outside the
* Amazon EC2 network. This element remains empty until the instance enters a running state.
*/
public String getDnsName() {
return dnsName;
}
/**
* Image ID of the AMI used to launch the instance.
*/
public String getImageId() {
return imageId;
}
/**
* Unique ID of the instance launched.
*/
public String getId() {
return instanceId;
}
/**
* The current state of the instance.
*/
public InstanceState getInstanceState() {
return instanceState;
}
/**
* The current state of the instance, as returned literally from the input XML
*/
public String getRawState() {
return rawState;
}
/**
* The instance type.
*/
public String getInstanceType() {
return instanceType;
}
/**
* Specifies the IP address of the instance.
*/
public String getIpAddress() {
return ipAddress;
}
/**
* Optional. Kernel associated with this instance.
*/
public String getKernelId() {
return kernelId;
}
/**
* If this instance was launched with an associated key pair, this displays the key pair name.
*/
public String getKeyName() {
return keyName;
}
/**
* The time the instance launched.
*/
public Date getLaunchTime() {
return launchTime;
}
/**
* The location where the instance launched.
*/
public String getAvailabilityZone() {
return availabilityZone;
}
/**
* Specifies the instance's virtualization type. Valid values are paravirtual or hvm.
*/
public String getVirtualizationType() {
return virtualizationType;
}
/**
* Platform of the instance (e.g., Windows).
*/
public String getPlatform() {
return platform;
}
/**
* The private DNS name assigned to the instance. This DNS name can only be used inside the
* Amazon EC2 network. This element remains empty until the instance enters a running state.
*/
public String getPrivateDnsName() {
return privateDnsName;
}
/**
* Specifies the private IP address that is assigned to the instance (Amazon VPC).
*/
public String getPrivateIpAddress() {
return privateIpAddress;
}
/**
* Optional. RAM disk associated with this instance.
*/
public String getRamdiskId() {
return ramdiskId;
}
/**
* Reason for the most recent state transition. This might be an empty string.
*/
public String getReason() {
return reason;
}
public RootDeviceType getRootDeviceType() {
return rootDeviceType;
}
public String getRootDeviceName() {
return rootDeviceName;
}
/**
* EBS volumes associated with the instance.
*/
public Map<String, BlockDevice> getEbsBlockDevices() {
return ebsBlockDevices;
}
/**
* Names of the security groups.
*/
public Set<String> getGroupNames() {
return groupNames;
}
/**
* tags that are present in the instance
*/
public Map<String, String> getTags() {
return tags;
}
@Override
public int compareTo(RunningInstance other) {
return ComparisonChain.start().compare(region, other.region).compare(instanceId, other.instanceId, Ordering.natural().nullsLast()).result();
}
@Override
public int hashCode() {
return Objects.hashCode(region, instanceId);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
RunningInstance that = RunningInstance.class.cast(obj);
return Objects.equal(this.region, that.region) && Objects.equal(this.instanceId, that.instanceId);
}
protected ToStringHelper string() {
return Objects.toStringHelper(this).omitNullValues().add("region", region)
.add("availabilityZone", availabilityZone).add("id", instanceId).add("state", rawState)
.add("type", instanceType).add("virtualizationType", virtualizationType).add("imageId", imageId)
.add("ipAddress", ipAddress).add("dnsName", dnsName).add("privateIpAddress", privateIpAddress)
.add("privateDnsName", privateDnsName).add("keyName", keyName).add("groupNames", groupNames)
.add("platform", platform).add("launchTime", launchTime).add("rootDeviceName", rootDeviceName)
.add("rootDeviceType", rootDeviceType).add("ebsBlockDevices", ebsBlockDevices).add("tags", tags);
}
@Override
public String toString() {
return string().toString();
}
}