blob: 18e61eee28ee832ca5c8ebb16c7a3e056c445e5e [file] [log] [blame]
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.aws.ec2.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import org.jclouds.ec2.domain.BlockDeviceMapping;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapEBSSnapshotToDevice;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapEphemeralDeviceToDevice;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapNewVolumeToDevice;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.rest.annotations.SinceApiVersion;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
/**
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RequestSpotInstances.html"
* />
* @author Adrian Cole
*/
public class LaunchSpecification {
public static Builder builder() {
return new Builder();
}
public static class Builder {
protected ImmutableMap.Builder<String, String> securityGroupIdToNames = ImmutableMap.builder();
protected String imageId;
protected String instanceType;
protected String kernelId;
protected String keyName;
protected String availabilityZone;
protected String subnetId;
protected String ramdiskId;
protected Boolean monitoringEnabled;
protected ImmutableSet.Builder<BlockDeviceMapping> blockDeviceMappings = ImmutableSet
.builder();
protected ImmutableSet.Builder<String> securityGroupIds = ImmutableSet.builder();
protected ImmutableSet.Builder<String> securityGroupNames = ImmutableSet.builder();
protected byte[] userData;
private String iamInstanceProfileArn;
private String iamInstanceProfileName;
public void clear() {
securityGroupIdToNames = ImmutableMap.builder();
imageId = null;
instanceType = null;
kernelId = null;
keyName = null;
availabilityZone = null;
subnetId = null;
ramdiskId = null;
monitoringEnabled = false;
blockDeviceMappings = ImmutableSet.builder();
securityGroupIds = ImmutableSet.builder();
securityGroupNames = ImmutableSet.builder();
userData = null;
iamInstanceProfileArn = null;
iamInstanceProfileName = null;
}
public Builder securityGroupIdToNames(Map<String, String> securityGroupIdToNames) {
this.securityGroupIdToNames.putAll(checkNotNull(securityGroupIdToNames, "securityGroupIdToNames"));
return this;
}
public Builder securityGroupIdToName(String groupId, String groupName) {
if (groupId != null && groupName != null)
this.securityGroupIdToNames.put(checkNotNull(groupId, "groupId"), checkNotNull(groupName, "groupName"));
return this;
}
public Builder imageId(String imageId) {
this.imageId = imageId;
return this;
}
public Builder monitoringEnabled(Boolean monitoringEnabled) {
this.monitoringEnabled = monitoringEnabled;
return this;
}
public Builder instanceType(String instanceType) {
this.instanceType = instanceType;
return this;
}
public Builder kernelId(String kernelId) {
this.kernelId = kernelId;
return this;
}
public Builder keyName(String keyName) {
this.keyName = keyName;
return this;
}
public Builder availabilityZone(String availabilityZone) {
this.availabilityZone = availabilityZone;
return this;
}
public Builder subnetId(String subnetId) {
this.subnetId = subnetId;
return this;
}
public Builder ramdiskId(String ramdiskId) {
this.ramdiskId = ramdiskId;
return this;
}
public Builder mapEBSSnapshotToDevice(String deviceName, String snapshotId, @Nullable Integer sizeInGib,
boolean deleteOnTermination) {
blockDeviceMappings.add(new MapEBSSnapshotToDevice(deviceName, snapshotId, sizeInGib, deleteOnTermination));
return this;
}
public Builder mapNewVolumeToDevice(String deviceName, int sizeInGib, boolean deleteOnTermination) {
blockDeviceMappings.add(new MapNewVolumeToDevice(deviceName, sizeInGib, deleteOnTermination));
return this;
}
public Builder mapEphemeralDeviceToDevice(String deviceName, String virtualName) {
blockDeviceMappings.add(new MapEphemeralDeviceToDevice(deviceName, virtualName));
return this;
}
public Builder blockDeviceMapping(BlockDeviceMapping blockDeviceMapping) {
this.blockDeviceMappings.add(checkNotNull(blockDeviceMapping, "blockDeviceMapping"));
return this;
}
public Builder blockDeviceMappings(Iterable<? extends BlockDeviceMapping> blockDeviceMappings) {
this.blockDeviceMappings.addAll(checkNotNull(blockDeviceMappings, "blockDeviceMappings"));
return this;
}
public Builder securityGroupIds(Iterable<String> securityGroupIds) {
this.securityGroupIds.addAll(checkNotNull(securityGroupIds, "securityGroupIds"));
return this;
}
public Builder securityGroupId(String securityGroupId) {
if (securityGroupId != null)
this.securityGroupIds.add(securityGroupId);
return this;
}
public Builder securityGroupNames(Iterable<String> securityGroupNames) {
this.securityGroupNames.addAll(checkNotNull(securityGroupNames, "securityGroupNames"));
return this;
}
public Builder securityGroupName(String securityGroupName) {
if (securityGroupName != null)
this.securityGroupNames.add(securityGroupName);
return this;
}
public Builder userData(byte[] userData) {
this.userData = userData;
return this;
}
/**
* @see LaunchSpecification#getIAMInstanceProfile()
*/
public Builder iamInstanceProfileArn(String iamInstanceProfileArn) {
this.iamInstanceProfileArn = iamInstanceProfileArn;
return this;
}
/**
* @see LaunchSpecification#getIAMInstanceProfile()
*/
public Builder iamInstanceProfileName(String iamInstanceProfileName) {
this.iamInstanceProfileName = iamInstanceProfileName;
return this;
}
public LaunchSpecification build() {
Optional<IAMInstanceProfileRequest> iamInstanceProfile;
if (iamInstanceProfileArn != null && iamInstanceProfileName != null) {
iamInstanceProfile = Optional.of(IAMInstanceProfileRequest.forArnAndName(iamInstanceProfileArn,
iamInstanceProfileName));
} else if (iamInstanceProfileArn != null) {
iamInstanceProfile = Optional.of(IAMInstanceProfileRequest.forArn(iamInstanceProfileArn));
} else if (iamInstanceProfileName != null) {
iamInstanceProfile = Optional.of(IAMInstanceProfileRequest.forName(iamInstanceProfileName));
} else {
iamInstanceProfile = Optional.absent();
}
return new LaunchSpecification(instanceType, imageId, kernelId, ramdiskId, availabilityZone, subnetId,
keyName, securityGroupIdToNames.build(), blockDeviceMappings.build(), monitoringEnabled,
securityGroupIds.build(), securityGroupNames.build(), userData, iamInstanceProfile);
}
public static Builder fromLaunchSpecification(LaunchSpecification in) {
Builder builder = new Builder();
builder.instanceType(in.getInstanceType()).imageId(in.getImageId()).kernelId(in.getKernelId())
.ramdiskId(in.getRamdiskId()).availabilityZone(in.getAvailabilityZone()).subnetId(in.getSubnetId())
.keyName(in.getKeyName()).securityGroupIdToNames(in.getSecurityGroupIdToNames())
.securityGroupIds(in.getSecurityGroupIds()).securityGroupNames(in.getSecurityGroupNames())
.blockDeviceMappings(in.getBlockDeviceMappings()).monitoringEnabled(in.isMonitoringEnabled())
.userData(in.getUserData());
if (in.getIAMInstanceProfile().isPresent()) {
builder.iamInstanceProfileArn(in.getIAMInstanceProfile().get().getArn().orNull());
builder.iamInstanceProfileName(in.getIAMInstanceProfile().get().getName().orNull());
}
return builder;
}
}
protected final String instanceType;
protected final String imageId;
protected final String kernelId;
protected final String ramdiskId;
protected final String availabilityZone;
protected final String subnetId;
protected final String keyName;
protected final Map<String, String> securityGroupIdToNames;
protected final Set<? extends BlockDeviceMapping> blockDeviceMappings;
protected final Set<String> securityGroupIds;
protected final Set<String> securityGroupNames;
protected final Boolean monitoringEnabled;
protected final byte[] userData;
protected final Optional<IAMInstanceProfileRequest> iamInstanceProfile;
public LaunchSpecification(String instanceType, String imageId, String kernelId, String ramdiskId,
String availabilityZone, String subnetId, String keyName, Map<String, String> securityGroupIdToNames,
Iterable<? extends BlockDeviceMapping> blockDeviceMappings, Boolean monitoringEnabled,
Set<String> securityGroupIds, Set<String> securityGroupNames, byte[] userData,
Optional<IAMInstanceProfileRequest> iamInstanceProfile) {
this.instanceType = checkNotNull(instanceType, "instanceType");
this.imageId = checkNotNull(imageId, "imageId");
this.kernelId = kernelId;
this.ramdiskId = ramdiskId;
this.availabilityZone = availabilityZone;
this.subnetId = subnetId;
this.keyName = keyName;
this.securityGroupIdToNames = ImmutableMap.copyOf(checkNotNull(securityGroupIdToNames, "securityGroupIdToNames"));
this.blockDeviceMappings = ImmutableSortedSet.copyOf(checkNotNull(blockDeviceMappings, "blockDeviceMappings"));
this.securityGroupIds = ImmutableSortedSet.copyOf(checkNotNull(securityGroupIds, "securityGroupIds"));
this.securityGroupNames = ImmutableSortedSet.copyOf(checkNotNull(securityGroupNames, "securityGroupNames"));
this.monitoringEnabled = monitoringEnabled;
this.userData = userData;
this.iamInstanceProfile = checkNotNull(iamInstanceProfile, "iamInstanceProfile");
}
public Map<String, String> getSecurityGroupIdToNames() {
return securityGroupIdToNames;
}
/**
* Image ID of the AMI used to launch the instance.
*/
public String getImageId() {
return imageId;
}
/**
* CloudWatch support
*/
public Boolean isMonitoringEnabled() {
return monitoringEnabled;
}
/**
* The instance type.
*/
public String getInstanceType() {
return instanceType;
}
/**
* 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 location where the instance launched.
*/
public String getAvailabilityZone() {
return availabilityZone;
}
/**
* The ID of the subnet in which to launch the Spot Instance.
*/
@Nullable
public String getSubnetId() {
return subnetId;
}
/**
* Optional. RAM disk associated with this instance.
*/
public String getRamdiskId() {
return ramdiskId;
}
/**
* volumes mappings associated with the instance.
*/
public Set<? extends BlockDeviceMapping> getBlockDeviceMappings() {
return blockDeviceMappings;
}
/**
* Names of the security groups.
*/
public Set<String> getSecurityGroupNames() {
return securityGroupNames;
}
/**
* Ids of the security groups.
*/
public Set<String> getSecurityGroupIds() {
return securityGroupIds;
}
/**
* User Data
*/
public byte[] getUserData() {
return userData;
}
/**
* The IAM Instance Profile (IIP) associated with the instance.
*/
@SinceApiVersion("2012-06-01")
public Optional<IAMInstanceProfileRequest> getIAMInstanceProfile() {
return iamInstanceProfile;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((availabilityZone == null) ? 0 : availabilityZone.hashCode());
result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode());
result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode());
result = prime * result + ((imageId == null) ? 0 : imageId.hashCode());
result = prime * result + ((instanceType == null) ? 0 : instanceType.hashCode());
result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode());
result = prime * result + ((keyName == null) ? 0 : keyName.hashCode());
result = prime * result + ((monitoringEnabled == null) ? 0 : monitoringEnabled.hashCode());
result = prime * result + ((ramdiskId == null) ? 0 : ramdiskId.hashCode());
result = prime * result + ((securityGroupIdToNames == null) ? 0 : securityGroupIdToNames.hashCode());
result = prime * result + ((securityGroupIds == null) ? 0 : securityGroupIds.hashCode());
result = prime * result + ((securityGroupNames == null) ? 0 : securityGroupNames.hashCode());
result = prime * result + ((!iamInstanceProfile.isPresent()) ? 0 : iamInstanceProfile.get().hashCode());
result = prime * result + Arrays.hashCode(userData);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LaunchSpecification other = (LaunchSpecification) obj;
if (availabilityZone == null) {
if (other.availabilityZone != null)
return false;
} else if (!availabilityZone.equals(other.availabilityZone))
return false;
if (subnetId == null) {
if (other.subnetId != null)
return false;
} else if (!subnetId.equals(other.subnetId))
return false;
if (blockDeviceMappings == null) {
if (other.blockDeviceMappings != null)
return false;
} else if (!blockDeviceMappings.equals(other.blockDeviceMappings))
return false;
if (imageId == null) {
if (other.imageId != null)
return false;
} else if (!imageId.equals(other.imageId))
return false;
if (instanceType == null) {
if (other.instanceType != null)
return false;
} else if (!instanceType.equals(other.instanceType))
return false;
if (kernelId == null) {
if (other.kernelId != null)
return false;
} else if (!kernelId.equals(other.kernelId))
return false;
if (keyName == null) {
if (other.keyName != null)
return false;
} else if (!keyName.equals(other.keyName))
return false;
if (monitoringEnabled == null) {
if (other.monitoringEnabled != null)
return false;
} else if (!monitoringEnabled.equals(other.monitoringEnabled))
return false;
if (ramdiskId == null) {
if (other.ramdiskId != null)
return false;
} else if (!ramdiskId.equals(other.ramdiskId))
return false;
if (securityGroupIdToNames == null) {
if (other.securityGroupIdToNames != null)
return false;
} else if (!securityGroupIdToNames.equals(other.securityGroupIdToNames))
return false;
if (securityGroupIds == null) {
if (other.securityGroupIds != null)
return false;
} else if (!securityGroupIds.equals(other.securityGroupIds))
return false;
if (securityGroupNames == null) {
if (other.securityGroupNames != null)
return false;
} else if (!securityGroupNames.equals(other.securityGroupNames))
return false;
if (!iamInstanceProfile.isPresent()) {
if (other.iamInstanceProfile.isPresent())
return false;
} else if (!iamInstanceProfile.get().equals(other.iamInstanceProfile.orNull()))
return false;
if (!Arrays.equals(userData, other.userData))
return false;
return true;
}
public Builder toBuilder() {
return Builder.fromLaunchSpecification(this);
}
@Override
public String toString() {
return "[instanceType=" + instanceType + ", imageId=" + imageId + ", kernelId=" + kernelId + ", ramdiskId="
+ ramdiskId + ", availabilityZone=" + availabilityZone + ", subnetId=" + subnetId + ", keyName=" + keyName
+ ", securityGroupIdToNames=" + securityGroupIdToNames + ", blockDeviceMappings=" + blockDeviceMappings
+ ", securityGroupIds=" + securityGroupIds + ", securityGroupNames=" + securityGroupNames
+ ", monitoringEnabled=" + monitoringEnabled + ", userData=" + Arrays.toString(userData)
+ ", iamInstanceProfile=" + iamInstanceProfile.orNull() + "]";
}
@SinceApiVersion("2012-06-01")
public static class IAMInstanceProfileRequest {
public static IAMInstanceProfileRequest forArn(String arn) {
return new IAMInstanceProfileRequest(Optional.of(checkNotNull(arn, "arn")), Optional.<String> absent());
}
public static IAMInstanceProfileRequest forName(String name) {
return new IAMInstanceProfileRequest(Optional.<String> absent(), Optional.of(checkNotNull(name, "name")));
}
public static IAMInstanceProfileRequest forArnAndName(String arn, String name) {
return new IAMInstanceProfileRequest(Optional.of(checkNotNull(arn, "arn")), Optional.of(checkNotNull(name, "name")));
}
private final Optional<String> arn;
private final Optional<String> name;
private IAMInstanceProfileRequest(Optional<String> arn, Optional<String> name) {
this.arn = checkNotNull(arn, "arn");
this.name = checkNotNull(name, "name for %s", arn);
}
/**
* The Amazon resource name (ARN) of the IAM Instance Profile (IIP) to associate with the instance.
*/
public Optional<String> getArn() {
return arn;
}
/**
* The name of the IAM Instance Profile (IIP) to associate with the instance.
*/
public Optional<String> getName() {
return name;
}
@Override
public int hashCode() {
return Objects.hashCode(arn, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
IAMInstanceProfileRequest that = IAMInstanceProfileRequest.class.cast(obj);
return equal(this.arn, that.arn) && equal(this.name, that.name);
}
@Override
public String toString() {
return toStringHelper("").omitNullValues().add("arn", arn.orNull()).add("name", name.orNull()).toString();
}
}
}