Issue 606:add ability to authorize ec2 ingress rules by source group constrained by port range

This commit is contained in:
Adrian Cole 2011-07-29 03:41:20 -07:00
parent fc0277523f
commit a26c568d7b
74 changed files with 3887 additions and 651 deletions

View File

@ -0,0 +1,39 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.binders;
import javax.inject.Singleton;
import org.jclouds.aws.util.AWSUtils;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
/**
* Binds the String [] to query parameters named with GroupId.index
*
* @author Adrian Cole
*/
@Singleton
public class BindGroupIdsToIndexedFormParams implements Binder {
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
return AWSUtils.indexStringArrayToFormValuesWithPrefix(request, "GroupId", input);
}
}

View File

@ -0,0 +1,42 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.util.IpPermissions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.rest.Binder;
/**
* @author Adrian Cole
*/
public class BindIpPermissionToIndexedFormParams implements Binder {
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
checkArgument(checkNotNull(input, "input") instanceof IpPermission, "this binder is only valid for IpPermission");
IpPermission perm = (IpPermission) input;
return ModifyRequest.putFormParams(request, IpPermissions.buildFormParametersForIndex(0, perm));
}
}

View File

@ -0,0 +1,50 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.util.IpPermissions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.rest.Binder;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableMultimap.Builder;
/**
* @author Adrian Cole
*/
public class BindIpPermissionsToIndexedFormParams implements Binder {
@SuppressWarnings("unchecked")
@Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
checkArgument(checkNotNull(input, "input") instanceof Iterable,
"this binder is only valid for Iterable<IpPermission>");
Builder<String, String> headers = ImmutableMultimap.<String, String> builder();
int index = 0;
for (IpPermission perm : (Iterable<IpPermission>) input)
headers.putAll(IpPermissions.buildFormParametersForIndex(index++, perm));
return ModifyRequest.putFormParams(request, headers.build());
}
}

View File

@ -71,8 +71,8 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
super.copyTo(to); super.copyTo(to);
if (to instanceof EC2TemplateOptions) { if (to instanceof EC2TemplateOptions) {
EC2TemplateOptions eTo = EC2TemplateOptions.class.cast(to); EC2TemplateOptions eTo = EC2TemplateOptions.class.cast(to);
if (getGroupIds().size() > 0) if (getGroups().size() > 0)
eTo.securityGroups(getGroupIds()); eTo.securityGroups(getGroups());
if (getKeyPair() != null) if (getKeyPair() != null)
eTo.keyPair(getKeyPair()); eTo.keyPair(getKeyPair());
if (getBlockDeviceMappings().size() > 0) if (getBlockDeviceMappings().size() > 0)
@ -84,7 +84,7 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
} }
} }
private Set<String> groupIds = ImmutableSet.of(); private Set<String> groupNames = ImmutableSet.of();
private String keyPair = null; private String keyPair = null;
private boolean noKeyPair; private boolean noKeyPair;
private byte[] userData; private byte[] userData;
@ -96,18 +96,18 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
* *
* @see EC2TemplateOptions#securityGroups(Iterable<String>) * @see EC2TemplateOptions#securityGroups(Iterable<String>)
*/ */
public EC2TemplateOptions securityGroups(String... groupIds) { public EC2TemplateOptions securityGroups(String... groupNames) {
return securityGroups(ImmutableSet.copyOf(groupIds)); return securityGroups(ImmutableSet.copyOf(groupNames));
} }
/** /**
* Specifies the security groups to be used for nodes with this template * Specifies the security groups to be used for nodes with this template
*/ */
public EC2TemplateOptions securityGroups(Iterable<String> groupIds) { public EC2TemplateOptions securityGroups(Iterable<String> groupNames) {
checkArgument(Iterables.size(groupIds) > 0, "you must specify at least one security group"); checkArgument(Iterables.size(groupNames) > 0, "you must specify at least one security group");
for (String groupId : groupIds) for (String groupId : groupNames)
Preconditions2.checkNotEmpty(groupId, "all security groups must be non-empty"); Preconditions2.checkNotEmpty(groupId, "all security groups must be non-empty");
this.groupIds = ImmutableSet.copyOf(groupIds); this.groupNames = ImmutableSet.copyOf(groupNames);
return this; return this;
} }
@ -213,17 +213,17 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
/** /**
* @see EC2TemplateOptions#securityGroups(Iterable<String>) * @see EC2TemplateOptions#securityGroups(Iterable<String>)
*/ */
public static EC2TemplateOptions securityGroups(String... groupIds) { public static EC2TemplateOptions securityGroups(String... groupNames) {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
return EC2TemplateOptions.class.cast(options.securityGroups(groupIds)); return EC2TemplateOptions.class.cast(options.securityGroups(groupNames));
} }
/** /**
* @see EC2TemplateOptions#securityGroups(Iterable<String>) * @see EC2TemplateOptions#securityGroups(Iterable<String>)
*/ */
public static EC2TemplateOptions securityGroups(Iterable<String> groupIds) { public static EC2TemplateOptions securityGroups(Iterable<String> groupNames) {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
return EC2TemplateOptions.class.cast(options.securityGroups(groupIds)); return EC2TemplateOptions.class.cast(options.securityGroups(groupNames));
} }
/** /**
@ -427,11 +427,11 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
} }
/** /**
* @return groupIds the user specified to run instances with, or zero length set to create an * @return groupNames the user specified to run instances with, or zero length set to create an
* implicit group * implicit group
*/ */
public Set<String> getGroupIds() { public Set<String> getGroups() {
return groupIds; return groupNames;
} }
/** /**
@ -468,7 +468,7 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
final int prime = 31; final int prime = 31;
int result = super.hashCode(); int result = super.hashCode();
result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode()); result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode());
result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode()); result = prime * result + ((groupNames == null) ? 0 : groupNames.hashCode());
result = prime * result + ((keyPair == null) ? 0 : keyPair.hashCode()); result = prime * result + ((keyPair == null) ? 0 : keyPair.hashCode());
result = prime * result + (noKeyPair ? 1231 : 1237); result = prime * result + (noKeyPair ? 1231 : 1237);
result = prime * result + Arrays.hashCode(userData); result = prime * result + Arrays.hashCode(userData);
@ -489,10 +489,10 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
return false; return false;
} else if (!blockDeviceMappings.equals(other.blockDeviceMappings)) } else if (!blockDeviceMappings.equals(other.blockDeviceMappings))
return false; return false;
if (groupIds == null) { if (groupNames == null) {
if (other.groupIds != null) if (other.groupNames != null)
return false; return false;
} else if (!groupIds.equals(other.groupIds)) } else if (!groupNames.equals(other.groupNames))
return false; return false;
if (keyPair == null) { if (keyPair == null) {
if (other.keyPair != null) if (other.keyPair != null)
@ -508,7 +508,7 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
@Override @Override
public String toString() { public String toString() {
return "[groupIds=" + groupIds + ", keyPair=" + keyPair + ", noKeyPair=" + noKeyPair + ", userData=" return "[groupNames=" + groupNames + ", keyPair=" + keyPair + ", noKeyPair=" + noKeyPair + ", userData="
+ Arrays.toString(userData) + ", blockDeviceMappings=" + blockDeviceMappings.build() + "]"; + Arrays.toString(userData) + ", blockDeviceMappings=" + blockDeviceMappings.build() + "]";
} }
} }

View File

@ -150,12 +150,11 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions {
groups.add(markerGroup); groups.add(markerGroup);
RegionNameAndIngressRules regionNameAndIngessRulesForMarkerGroup; RegionNameAndIngressRules regionNameAndIngessRulesForMarkerGroup;
if (options instanceof EC2TemplateOptions && EC2TemplateOptions.class.cast(options).getGroupIds().size() > 0) { if (userSpecifiedTheirOwnGroups(options)) {
regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, new int[] {}, regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, new int[] {},
false); false);
groups.addAll(EC2TemplateOptions.class.cast(options).getGroupIds()); groups.addAll(EC2TemplateOptions.class.cast(options).getGroups());
} else { } else {
regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup,
options.getInboundPorts(), true); options.getInboundPorts(), true);
@ -169,6 +168,10 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions {
return groups.build(); return groups.build();
} }
protected boolean userSpecifiedTheirOwnGroups(TemplateOptions options) {
return options instanceof EC2TemplateOptions && EC2TemplateOptions.class.cast(options).getGroups().size() > 0;
}
// allows us to mock this method // allows us to mock this method
@VisibleForTesting @VisibleForTesting
public javax.inject.Provider<RunInstancesOptions> getOptionsProvider() { public javax.inject.Provider<RunInstancesOptions> getOptionsProvider() {

View File

@ -102,4 +102,10 @@ public class BlockDevice {
return deleteOnTermination; return deleteOnTermination;
} }
@Override
public String toString() {
return "[volumeId=" + volumeId + ", attachmentStatus=" + attachmentStatus + ", attachTime="
+ attachTime + ", deleteOnTermination=" + deleteOnTermination + "]";
}
} }

View File

@ -20,119 +20,55 @@ package org.jclouds.ec2.domain;
import java.util.Set; import java.util.Set;
import com.google.common.collect.Multimap;
/** /**
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-IpPermissionType.html" * @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-IpPermissionType.html"
* /> * />
* @author Adrian Cole * @author Adrian Cole
*/ */
public class IpPermission implements Comparable<IpPermission> { public interface IpPermission extends Comparable<IpPermission> {
private final int fromPort;
private final int toPort;
private final Set<UserIdGroupPair> groups;
private final IpProtocol ipProtocol;
private final Set<String> ipRanges;
public IpPermission(int fromPort, int toPort, Set<UserIdGroupPair> groups,
IpProtocol ipProtocol, Set<String> ipRanges) {
this.fromPort = fromPort;
this.toPort = toPort;
this.groups = groups;
this.ipProtocol = ipProtocol;
this.ipRanges = ipRanges;
}
/** /**
* {@inheritDoc} * Start of port range for the TCP and UDP protocols, or an ICMP type number.
* An ICMP type number of -1 indicates a wildcard (i.e., any ICMP type
* number).
*/ */
public int compareTo(IpPermission o) { int getFromPort();
return (this == o) ? 0 : getIpProtocol().compareTo(o.getIpProtocol());
}
/** /**
* Start of port range for the TCP and UDP protocols, or an ICMP type number. An ICMP type number * End of port range for the TCP and UDP protocols, or an ICMP code. An ICMP
* of -1 indicates a wildcard (i.e., any ICMP type number). * code of -1 indicates a wildcard (i.e., any ICMP code).
*/ */
public int getFromPort() { int getToPort();
return fromPort;
}
/** /**
* End of port range for the TCP and UDP protocols, or an ICMP code. An ICMP code of -1 indicates * List of security group and user ID pairs.
* a wildcard (i.e., any ICMP code). *
* @see #getUserIdGroupPairs
*/ */
public int getToPort() { @Deprecated
return toPort; Set<UserIdGroupPair> getGroups();
}
/** /**
* List of security group and user ID pairs. * List of security group and user ID pairs.
*/ */
public Set<UserIdGroupPair> getGroups() { Multimap<String, String> getUserIdGroupPairs();
return groups;
} /**
* List of security group Ids
*/
Set<String> getGroupIds();
/** /**
* IP protocol * IP protocol
*/ */
public IpProtocol getIpProtocol() { IpProtocol getIpProtocol();
return ipProtocol;
}
/** /**
* IP ranges. * IP ranges.
*/ */
public Set<String> getIpRanges() { Set<String> getIpRanges();
return ipRanges; }
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + fromPort;
result = prime * result + ((groups == null) ? 0 : groups.hashCode());
result = prime * result + ((ipProtocol == null) ? 0 : ipProtocol.hashCode());
result = prime * result + ((ipRanges == null) ? 0 : ipRanges.hashCode());
result = prime * result + toPort;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
IpPermission other = (IpPermission) obj;
if (fromPort != other.fromPort)
return false;
if (groups == null) {
if (other.groups != null)
return false;
} else if (!groups.equals(other.groups))
return false;
if (ipProtocol == null) {
if (other.ipProtocol != null)
return false;
} else if (!ipProtocol.equals(other.ipProtocol))
return false;
if (ipRanges == null) {
if (other.ipRanges != null)
return false;
} else if (!ipRanges.equals(other.ipRanges))
return false;
if (toPort != other.toPort)
return false;
return true;
}
@Override
public String toString() {
return "IpPermission [fromPort=" + fromPort + ", groups=" + groups + ", ipProtocol="
+ ipProtocol + ", ipRanges=" + ipRanges + ", toPort=" + toPort + "]";
}
}

View File

@ -0,0 +1,239 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.Map.Entry;
import java.util.Set;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
/**
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-IpPermissionType.html"
* />
* @author Adrian Cole
*/
public class IpPermissionImpl implements IpPermission {
public static Builder builder() {
return new Builder();
}
public static class Builder {
private int fromPort;
private int toPort;
private IpProtocol ipProtocol;
private Multimap<String, String> userIdGroupPairs = LinkedHashMultimap.create();
private Set<String> groupIds = Sets.newLinkedHashSet();
private Set<String> ipRanges = Sets.newLinkedHashSet();
public Builder fromPort(int fromPort) {
this.fromPort = fromPort;
return this;
}
public Builder toPort(int toPort) {
this.fromPort = toPort;
return this;
}
public Builder ipProtocol(IpProtocol ipProtocol) {
this.ipProtocol = ipProtocol;
return this;
}
public Builder userIdGroupPair(String userId, String groupNameOrId) {
this.userIdGroupPairs.put(userId, groupNameOrId);
return this;
}
public Builder userIdGroupPairs(Multimap<String, String> userIdGroupPairs) {
this.userIdGroupPairs.putAll(userIdGroupPairs);
return this;
}
public Builder ipRange(String ipRange) {
this.ipRanges.add(ipRange);
return this;
}
public Builder ipRanges(Iterable<String> ipRanges) {
Iterables.addAll(this.ipRanges, ipRanges);
return this;
}
public Builder groupId(String groupId) {
this.groupIds.add(groupId);
return this;
}
public Builder groupIds(Iterable<String> groupIds) {
Iterables.addAll(this.groupIds, groupIds);
return this;
}
public IpPermission build() {
return new IpPermissionImpl(ipProtocol, fromPort, toPort, userIdGroupPairs, groupIds, ipRanges);
}
}
private final int fromPort;
private final int toPort;
private final Multimap<String, String> userIdGroupPairs;
private final Set<String> groupIds;
private final IpProtocol ipProtocol;
private final Set<String> ipRanges;
public IpPermissionImpl(IpProtocol ipProtocol, int fromPort, int toPort,
Multimap<String, String> userIdGroupPairs, Iterable<String> groupIds, Iterable<String> ipRanges) {
this.fromPort = fromPort;
this.toPort = toPort;
this.userIdGroupPairs = ImmutableMultimap.copyOf(checkNotNull(userIdGroupPairs, "userIdGroupPairs"));
this.ipProtocol = checkNotNull(ipProtocol, "ipProtocol");
this.groupIds = ImmutableSet.copyOf(checkNotNull(groupIds, "groupIds"));
this.ipRanges = ImmutableSet.copyOf(checkNotNull(ipRanges, "ipRanges"));
}
/**
* {@inheritDoc}
*/
public int compareTo(IpPermission o) {
return (this == o) ? 0 : getIpProtocol().compareTo(o.getIpProtocol());
}
/**
* {@inheritDoc}
*/
@Override
public int getFromPort() {
return fromPort;
}
/**
* {@inheritDoc}
*/
@Override
public int getToPort() {
return toPort;
}
/**
* {@inheritDoc}
*/
@Override
@Deprecated
public Set<UserIdGroupPair> getGroups() {
ImmutableSet.Builder<UserIdGroupPair> groups = ImmutableSet.<UserIdGroupPair> builder();
for (Entry<String, String> pair : userIdGroupPairs.entries())
groups.add(new UserIdGroupPair(pair.getKey(), pair.getValue()));
return groups.build();
}
/**
* {@inheritDoc}
*/
@Override
public Multimap<String, String> getUserIdGroupPairs() {
return userIdGroupPairs;
}
/**
* {@inheritDoc}
*/
@Override
public Set<String> getGroupIds() {
return groupIds;
}
/**
* {@inheritDoc}
*/
@Override
public IpProtocol getIpProtocol() {
return ipProtocol;
}
/**
* {@inheritDoc}
*/
@Override
public Set<String> getIpRanges() {
return ipRanges;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + fromPort;
result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode());
result = prime * result + ((ipProtocol == null) ? 0 : ipProtocol.hashCode());
result = prime * result + ((ipRanges == null) ? 0 : ipRanges.hashCode());
result = prime * result + toPort;
result = prime * result + ((userIdGroupPairs == null) ? 0 : userIdGroupPairs.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
IpPermissionImpl other = (IpPermissionImpl) obj;
if (fromPort != other.fromPort)
return false;
if (groupIds == null) {
if (other.groupIds != null)
return false;
} else if (!groupIds.equals(other.groupIds))
return false;
if (ipProtocol != other.ipProtocol)
return false;
if (ipRanges == null) {
if (other.ipRanges != null)
return false;
} else if (!ipRanges.equals(other.ipRanges))
return false;
if (toPort != other.toPort)
return false;
if (userIdGroupPairs == null) {
if (other.userIdGroupPairs != null)
return false;
} else if (!userIdGroupPairs.equals(other.userIdGroupPairs))
return false;
return true;
}
@Override
public String toString() {
return "[fromPort=" + fromPort + ", toPort=" + toPort + ", userIdGroupPairs=" + userIdGroupPairs + ", groupIds="
+ groupIds + ", ipProtocol=" + ipProtocol + ", ipRanges=" + ipRanges + "]";
}
}

View File

@ -26,10 +26,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
*/ */
public enum IpProtocol { public enum IpProtocol {
TCP, UDP, ICMP, UNRECOGNIZED; TCP, UDP, ICMP, ALL, UNRECOGNIZED;
public String value() { public String value() {
return name().toLowerCase(); return this == ALL ? "-1" : name().toLowerCase();
} }
@Override @Override
@ -39,6 +39,8 @@ public enum IpProtocol {
public static IpProtocol fromValue(String protocol) { public static IpProtocol fromValue(String protocol) {
try { try {
if (protocol.equalsIgnoreCase("-1"))
return ALL;
return valueOf(checkNotNull(protocol, "protocol").toUpperCase()); return valueOf(checkNotNull(protocol, "protocol").toUpperCase());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return UNRECOGNIZED; return UNRECOGNIZED;

View File

@ -580,7 +580,7 @@ public class RunningInstance implements Comparable<RunningInstance> {
+ ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType=" + ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType="
+ virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName + virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName
+ ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName="
+ keyName + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + keyName + ", groupIds=" + groupIds + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName="
+ rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + "]"; + rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + "]";
} }

View File

@ -22,23 +22,28 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
/** /**
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-SecurityGroupItemType.html" * @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-SecurityGroupItemType.html"
* /> * />
* @author Adrian Cole * @author Adrian Cole
*/ */
public class SecurityGroup implements Comparable<SecurityGroup> { public class SecurityGroup implements Comparable<SecurityGroup> {
private final String region; private final String region;
private final String id;
private final String name; private final String name;
private final String ownerId; private final String ownerId;
private final String description; private final String description;
private final Set<IpPermission> ipPermissions; private final Set<IpPermissionImpl> ipPermissions;
public SecurityGroup(String region, String name, String ownerId, String description, public SecurityGroup(String region, String id, String name, String ownerId, String description,
Set<IpPermission> ipPermissions) { Set<IpPermissionImpl> ipPermissions) {
this.region = checkNotNull(region, "region"); this.region = checkNotNull(region, "region");
this.id = id;
this.name = name; this.name = name;
this.ownerId = ownerId; this.ownerId = ownerId;
this.description = description; this.description = description;
@ -46,9 +51,10 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
} }
/** /**
* Security groups are not copied across Regions. Instances within the Region cannot communicate * Security groups are not copied across Regions. Instances within the Region
* with instances outside the Region using group-based firewall rules. Traffic from instances in * cannot communicate with instances outside the Region using group-based
* another Region is seen as WAN bandwidth. * firewall rules. Traffic from instances in another Region is seen as WAN
* bandwidth.
*/ */
public String getRegion() { public String getRegion() {
return region; return region;
@ -61,6 +67,14 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
return (this == o) ? 0 : getName().compareTo(o.getName()); return (this == o) ? 0 : getName().compareTo(o.getName());
} }
/**
* id of the security group. Not in all EC2 impls
*/
@Nullable
public String getId() {
return id;
}
/** /**
* Name of the security group. * Name of the security group.
*/ */
@ -85,7 +99,7 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
/** /**
* Set of IP permissions associated with the security group. * Set of IP permissions associated with the security group.
*/ */
public Set<IpPermission> getIpPermissions() { public Set<IpPermissionImpl> getIpPermissions() {
return ipPermissions; return ipPermissions;
} }
@ -94,6 +108,7 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((ipPermissions == null) ? 0 : ipPermissions.hashCode()); result = prime * result + ((ipPermissions == null) ? 0 : ipPermissions.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode()); result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode());
@ -115,6 +130,11 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
return false; return false;
} else if (!description.equals(other.description)) } else if (!description.equals(other.description))
return false; return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (ipPermissions == null) { if (ipPermissions == null) {
if (other.ipPermissions != null) if (other.ipPermissions != null)
return false; return false;
@ -140,7 +160,7 @@ public class SecurityGroup implements Comparable<SecurityGroup> {
@Override @Override
public String toString() { public String toString() {
return "SecurityGroup [description=" + description + ", ipPermissions=" + ipPermissions return "[region=" + region + ", id=" + id + ", name=" + name + ", ownerId=" + ownerId + ", description="
+ ", name=" + name + ", ownerId=" + ownerId + ", region=" + region + "]"; + description + ", ipPermissions=" + ipPermissions + "]";
} }
} }

View File

@ -79,9 +79,9 @@ public class CreateImageOptions extends BaseEC2RequestOptions {
/** /**
* @see CreateImageOptions#withDescription(String ) * @see CreateImageOptions#withDescription(String )
*/ */
public static CreateImageOptions withDescription(String identityId) { public static CreateImageOptions withDescription(String description) {
CreateImageOptions options = new CreateImageOptions(); CreateImageOptions options = new CreateImageOptions();
return options.withDescription(identityId); return options.withDescription(description);
} }
/** /**

View File

@ -0,0 +1,199 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.util;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Map.Entry;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.domain.IpPermissionImpl;
import org.jclouds.ec2.domain.IpProtocol;
import org.jclouds.util.Maps2;
import com.google.common.annotations.Beta;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
/**
*
* Shortcut to create ingress rules
*
* @author Adrian Cole
*/
public class IpPermissions extends IpPermissionImpl {
protected IpPermissions(IpProtocol ipProtocol, int fromPort, int toPort,
Multimap<String, String> userIdGroupPairs, Iterable<String> groupIds, Iterable<String> ipRanges) {
super(ipProtocol, fromPort, toPort, userIdGroupPairs, groupIds, userIdGroupPairs.size() == 0 ? ipRanges
: ImmutableSet.<String> of());
}
/**
* don't rely on this being here.. it will move
*/
@Beta
public static Multimap<String, String> buildFormParametersForIndex(final int index, IpPermission permission) {
Map<String, String> headers = Maps.newLinkedHashMap();
headers.put("IpPermissions.%d.IpProtocol", permission.getIpProtocol().toString());
headers.put("IpPermissions.%d.FromPort", permission.getFromPort() + "");
headers.put("IpPermissions.%d.ToPort", permission.getToPort() + "");
String prefix = "IpPermissions.%d.IpRanges.";
int i = 0;
for (String cidrIp : checkNotNull(permission.getIpRanges(), "cidrIps")) {
headers.put(prefix + i++ + ".CidrIp", cidrIp);
}
prefix = "IpPermissions.%d.Groups.";
i = 0;
for (String groupId : checkNotNull(permission.getGroupIds(), "groupIds")) {
headers.put(prefix + i++ + ".GroupId", groupId);
}
prefix = "IpPermissions.%d.Groups.";
i = 0;
for (Entry<String, String> userIdGroupNamePair : checkNotNull(permission.getUserIdGroupPairs(),
"userIdGroupNamePairs").entries()) {
headers.put(prefix + i++ + ".UserId", userIdGroupNamePair.getKey());
headers.put(prefix + i + ".GroupName", userIdGroupNamePair.getValue());
}
prefix = "IpPermissions.%d.IpRanges.";
i = 0;
for (String cidrIp : checkNotNull(permission.getIpRanges(), "cidrIps")) {
headers.put(prefix + i++ + ".CidrIp", cidrIp);
}
return Multimaps.forMap(Maps2.transformKeys(headers, new Function<String, String>() {
@Override
public String apply(String arg0) {
return String.format(arg0, index);
}
}));
}
public static ICMPTypeSelection permitICMP() {
return new ICMPTypeSelection();
}
public static ToSourceSelection permitAnyProtocol() {
return new ToSourceSelection(IpProtocol.ALL, 1, 65535);
}
public static PortSelection permit(IpProtocol protocol) {
return new PortSelection(checkNotNull(protocol, "protocol"));
}
public static class ICMPTypeSelection extends ToSourceSelection {
ICMPTypeSelection() {
super(IpProtocol.ICMP, -1, -1);
}
/**
* @param type ex. 8 for ECHO (i.e. Ping)
* @see <a href="http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml"> ICMP Types</a>
*/
public AndCodeSelection type(int type) {
return new AndCodeSelection(type);
}
}
public static class AndCodeSelection extends ToSourceSelection {
AndCodeSelection(int type) {
super(IpProtocol.ICMP, type, -1);
}
public ToSourceSelection andCode(int code) {
return new ToSourceSelection(getIpProtocol(), getFromPort(), code);
}
}
public static class PortSelection extends ToSourceSelection {
PortSelection(IpProtocol ipProtocol) {
super(ipProtocol, ipProtocol == IpProtocol.ICMP ? -1 : 1, ipProtocol == IpProtocol.ICMP ? -1 : 65535);
}
public ToPortSelection fromPort(int port) {
return new ToPortSelection(getIpProtocol(), port);
}
public ToSourceSelection port(int port) {
return new ToSourceSelection(getIpProtocol(), port, port);
}
}
public static class ToPortSelection extends ToSourceSelection {
ToPortSelection(IpProtocol ipProtocol, int fromPort) {
super(ipProtocol, fromPort, ipProtocol == IpProtocol.ICMP ? -1 : 65535);
}
public ToSourceSelection to(int port) {
return new ToSourceSelection(getIpProtocol(), getFromPort(), port);
}
}
public static class ToVPCSourceSelection extends IpPermissions {
protected ToVPCSourceSelection(IpProtocol ipProtocol, int fromPort, int toPort) {
super(ipProtocol, fromPort, toPort, ImmutableMultimap.<String, String> of(), ImmutableSet.<String> of(),
ImmutableSet.of("0.0.0.0/0"));
}
public IpPermissions originatingFromSecurityGroupId(String groupId) {
return toVPCSecurityGroups(ImmutableSet.of(checkNotNull(groupId, "groupId")));
}
public IpPermissions toVPCSecurityGroups(Iterable<String> groupIds) {
return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), getUserIdGroupPairs(), groupIds,
ImmutableSet.<String> of());
}
}
public static class ToSourceSelection extends ToVPCSourceSelection {
ToSourceSelection(IpProtocol ipProtocol, int fromPort, int toPort) {
super(ipProtocol, fromPort, toPort);
}
public IpPermissions originatingFromCidrBlock(String cidrIp) {
return originatingFromCidrBlocks(ImmutableSet.of(checkNotNull(cidrIp, "cidrIp")));
}
public IpPermissions originatingFromCidrBlocks(Iterable<String> cidrIps) {
return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(),
ImmutableMultimap.<String, String> of(), ImmutableSet.<String> of(), cidrIps);
}
public IpPermissions originatingFromUserAndSecurityGroup(String userId, String groupName) {
return toEC2SecurityGroups(ImmutableMultimap.of(checkNotNull(userId, "userId"),
checkNotNull(groupName, "groupName")));
}
public IpPermissions toEC2SecurityGroups(Multimap<String, String> userIdGroupNamePairs) {
return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), userIdGroupNamePairs, getGroupIds(),
ImmutableSet.<String> of());
}
}
}

View File

@ -18,6 +18,9 @@
*/ */
package org.jclouds.ec2.xml; package org.jclouds.ec2.xml;
import static org.jclouds.util.SaxUtils.currentOrNull;
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
import java.util.Date; import java.util.Date;
import java.util.Set; import java.util.Set;
@ -56,7 +59,7 @@ public abstract class BaseReservationHandler<T> extends HandlerForGeneratedReque
@Inject @Inject
public BaseReservationHandler(DateService dateService, @Region String defaultRegion, public BaseReservationHandler(DateService dateService, @Region String defaultRegion,
Provider<RunningInstance.Builder> builderProvider) { Provider<RunningInstance.Builder> builderProvider) {
this.dateService = dateService; this.dateService = dateService;
this.defaultRegion = defaultRegion; this.defaultRegion = defaultRegion;
this.builderProvider = builderProvider; this.builderProvider = builderProvider;
@ -85,103 +88,98 @@ public abstract class BaseReservationHandler<T> extends HandlerForGeneratedReque
private Set<RunningInstance> instances = Sets.newLinkedHashSet(); private Set<RunningInstance> instances = Sets.newLinkedHashSet();
public void startElement(String uri, String name, String qName, Attributes attrs) { public void startElement(String uri, String name, String qName, Attributes attrs) {
if (qName.equals("item")) { if (equalsOrSuffix(qName, "item")) {
itemDepth++; itemDepth++;
} else if (qName.equals("instancesSet")) { } else if (equalsOrSuffix(qName, "instancesSet")) {
inInstancesSet = true; inInstancesSet = true;
} }
} }
protected String currentOrNull() {
String returnVal = currentText.toString().trim();
return returnVal.equals("") ? null : returnVal;
}
public void endElement(String uri, String name, String qName) { public void endElement(String uri, String name, String qName) {
if (qName.equals("item")) { if (equalsOrSuffix(qName, "item")) {
inItem(); inItem();
itemDepth--; itemDepth--;
} else if (qName.equals("instancesSet")) { } else if (equalsOrSuffix(qName, "instancesSet")) {
inInstancesSet = false; inInstancesSet = false;
} else if (qName.equals("groupId")) { } else if (equalsOrSuffix(qName, "groupId")) {
groupIds.add(currentOrNull()); groupIds.add(currentOrNull(currentText));
} else if (qName.equals("ownerId")) { } else if (equalsOrSuffix(qName, "ownerId")) {
ownerId = currentOrNull(); ownerId = currentOrNull(currentText);
} else if (qName.equals("requesterId")) { } else if (equalsOrSuffix(qName, "requesterId")) {
requesterId = currentOrNull(); requesterId = currentOrNull(currentText);
} else if (qName.equals("reservationId")) { } else if (equalsOrSuffix(qName, "reservationId")) {
reservationId = currentOrNull(); reservationId = currentOrNull(currentText);
} else if (qName.equals("amiLaunchIndex")) { } else if (equalsOrSuffix(qName, "amiLaunchIndex")) {
builder.amiLaunchIndex(currentOrNull()); builder.amiLaunchIndex(currentOrNull(currentText));
} else if (qName.equals("dnsName")) { } else if (equalsOrSuffix(qName, "dnsName")) {
String dnsName = currentOrNull(); String dnsName = currentOrNull(currentText);
// Eucalyptus // Eucalyptus
if (!"0.0.0.0".equals(dnsName)) if (!"0.0.0.0".equals(dnsName))
builder.dnsName(dnsName); builder.dnsName(dnsName);
} else if (qName.equals("imageId")) { } else if (equalsOrSuffix(qName, "imageId")) {
builder.imageId(currentOrNull()); builder.imageId(currentOrNull(currentText));
} else if (qName.equals("instanceId")) { } else if (equalsOrSuffix(qName, "instanceId")) {
builder.instanceId(currentOrNull()); builder.instanceId(currentOrNull(currentText));
} else if (qName.equals("name")) { } else if (equalsOrSuffix(qName, "name")) {
builder.instanceState(InstanceState.fromValue(currentOrNull())); builder.instanceState(InstanceState.fromValue(currentOrNull(currentText)));
} else if (qName.equals("instanceType")) { } else if (equalsOrSuffix(qName, "instanceType")) {
builder.instanceType(currentOrNull()); builder.instanceType(currentOrNull(currentText));
} else if (qName.equals("ipAddress")) { } else if (equalsOrSuffix(qName, "ipAddress")) {
builder.ipAddress(currentOrNull()); builder.ipAddress(currentOrNull(currentText));
} else if (qName.equals("kernelId")) { } else if (equalsOrSuffix(qName, "kernelId")) {
builder.kernelId(currentOrNull()); builder.kernelId(currentOrNull(currentText));
} else if (qName.equals("keyName")) { } else if (equalsOrSuffix(qName, "keyName")) {
builder.keyName(currentOrNull()); builder.keyName(currentOrNull(currentText));
} else if (qName.equals("launchTime")) { } else if (equalsOrSuffix(qName, "launchTime")) {
builder.launchTime(parseDate()); builder.launchTime(parseDate());
} else if (qName.equals("availabilityZone")) { } else if (equalsOrSuffix(qName, "availabilityZone")) {
builder.availabilityZone(currentOrNull()); builder.availabilityZone(currentOrNull(currentText));
} else if (qName.equals("virtualizationType")) { } else if (equalsOrSuffix(qName, "virtualizationType")) {
builder.virtualizationType(currentOrNull()); builder.virtualizationType(currentOrNull(currentText));
} else if (qName.equals("platform")) { } else if (equalsOrSuffix(qName, "platform")) {
builder.platform(currentOrNull()); builder.platform(currentOrNull(currentText));
} else if (qName.equals("privateDnsName")) { } else if (equalsOrSuffix(qName, "privateDnsName")) {
String privateDnsName = currentOrNull(); String privateDnsName = currentOrNull(currentText);
// Eucalyptus // Eucalyptus
if (!"0.0.0.0".equals(privateDnsName)) if (!"0.0.0.0".equals(privateDnsName))
builder.privateDnsName(privateDnsName); builder.privateDnsName(privateDnsName);
} else if (qName.equals("privateIpAddress")) { } else if (equalsOrSuffix(qName, "privateIpAddress")) {
builder.privateIpAddress(currentOrNull()); builder.privateIpAddress(currentOrNull(currentText));
} else if (qName.equals("ramdiskId")) { } else if (equalsOrSuffix(qName, "ramdiskId")) {
builder.ramdiskId(currentOrNull()); builder.ramdiskId(currentOrNull(currentText));
} else if (qName.equals("reason")) { } else if (equalsOrSuffix(qName, "reason")) {
builder.reason(currentOrNull()); builder.reason(currentOrNull(currentText));
} else if (qName.equals("rootDeviceType")) { } else if (equalsOrSuffix(qName, "rootDeviceType")) {
builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull())); builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull(currentText)));
} else if (qName.equals("rootDeviceName")) { } else if (equalsOrSuffix(qName, "rootDeviceName")) {
builder.rootDeviceName(currentOrNull()); builder.rootDeviceName(currentOrNull(currentText));
} else if (qName.equals("deviceName")) { } else if (equalsOrSuffix(qName, "deviceName")) {
deviceName = currentOrNull(); deviceName = currentOrNull(currentText);
} else if (qName.equals("volumeId")) { } else if (equalsOrSuffix(qName, "volumeId")) {
volumeId = currentOrNull(); volumeId = currentOrNull(currentText);
} else if (qName.equals("status")) { } else if (equalsOrSuffix(qName, "status")) {
attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim()); attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
} else if (qName.equals("attachTime")) { } else if (equalsOrSuffix(qName, "attachTime")) {
attachTime = dateService.iso8601DateParse(currentText.toString().trim()); attachTime = dateService.iso8601DateParse(currentText.toString().trim());
} else if (qName.equals("deleteOnTermination")) { } else if (equalsOrSuffix(qName, "deleteOnTermination")) {
deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim()); deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("ebs")) { } else if (equalsOrSuffix(qName, "ebs")) {
builder.device(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination)); builder.device(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination));
this.deviceName = null; this.deviceName = null;
this.volumeId = null; this.volumeId = null;
this.attachmentStatus = null; this.attachmentStatus = null;
this.attachTime = null; this.attachTime = null;
this.deleteOnTermination = true; this.deleteOnTermination = true;
} }
currentText = new StringBuilder(); currentText = new StringBuilder();
} }
protected Date parseDate() { protected Date parseDate() {
try { try {
return dateService.iso8601DateParse(currentOrNull()); return dateService.iso8601DateParse(currentOrNull(currentText));
} catch (RuntimeException e) { } catch (RuntimeException e) {
// Eucalyptus // Eucalyptus
return dateService.iso8601SecondsDateParse(currentOrNull()); return dateService.iso8601SecondsDateParse(currentOrNull(currentText));
} }
} }
@ -202,7 +200,7 @@ public abstract class BaseReservationHandler<T> extends HandlerForGeneratedReque
builder.dnsName(null); builder.dnsName(null);
} }
if (builder.getPrivateIpAddress() == null && builder.getPrivateDnsName() != null if (builder.getPrivateIpAddress() == null && builder.getPrivateDnsName() != null
&& builder.getPrivateDnsName().matches(".*[0-9]$")) { && builder.getPrivateDnsName().matches(".*[0-9]$")) {
builder.privateIpAddress(builder.getPrivateDnsName()); builder.privateIpAddress(builder.getPrivateDnsName());
builder.privateDnsName(null); builder.privateDnsName(null);
} }
@ -228,7 +226,7 @@ public abstract class BaseReservationHandler<T> extends HandlerForGeneratedReque
if (region == null) if (region == null)
region = defaultRegion; region = defaultRegion;
Reservation<? extends RunningInstance> info = new Reservation<RunningInstance>(region, groupIds, instances, Reservation<? extends RunningInstance> info = new Reservation<RunningInstance>(region, groupIds, instances,
ownerId, requesterId, reservationId); ownerId, requesterId, reservationId);
this.groupIds = Sets.newLinkedHashSet(); this.groupIds = Sets.newLinkedHashSet();
this.instances = Sets.newLinkedHashSet(); this.instances = Sets.newLinkedHashSet();
this.ownerId = null; this.ownerId = null;

View File

@ -18,43 +18,51 @@
*/ */
package org.jclouds.ec2.xml; package org.jclouds.ec2.xml;
import static org.jclouds.util.SaxUtils.currentOrNull;
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.jclouds.aws.util.AWSUtils; import org.jclouds.aws.util.AWSUtils;
import org.jclouds.ec2.domain.IpPermission; import org.jclouds.ec2.domain.IpPermissionImpl;
import org.jclouds.ec2.domain.IpProtocol; import org.jclouds.ec2.domain.IpProtocol;
import org.jclouds.ec2.domain.SecurityGroup; import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.location.Region; import org.jclouds.location.Region;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
* Parses: DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2010-06-15/" * Parses: DescribeSecurityGroupsResponse
* xmlns="http://ec2.amazonaws.com/doc/2010-06-15/"
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeSecurityGroups.html" * @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeSecurityGroups.html"
* /> * />
* @author Adrian Cole * @author Adrian Cole
*/ */
public class DescribeSecurityGroupsResponseHandler extends public class DescribeSecurityGroupsResponseHandler extends
ParseSax.HandlerForGeneratedRequestWithResult<Set<SecurityGroup>> { ParseSax.HandlerForGeneratedRequestWithResult<Set<SecurityGroup>> {
@Inject @Inject
@Region @Region
String defaultRegion; String defaultRegion;
private StringBuilder currentText = new StringBuilder(); private StringBuilder currentText = new StringBuilder();
private Set<SecurityGroup> securtyGroups = Sets.newLinkedHashSet(); private Set<SecurityGroup> securtyGroups = Sets.newLinkedHashSet();
private String groupId;
private String groupName; private String groupName;
private String ownerId; private String ownerId;
private String groupDescription; private String groupDescription;
private Set<IpPermission> ipPermissions = Sets.newLinkedHashSet(); private Set<IpPermissionImpl> ipPermissions = Sets.newLinkedHashSet();
private int fromPort; private int fromPort;
private int toPort; private int toPort;
private Set<UserIdGroupPair> groups = Sets.newLinkedHashSet(); private Multimap<String, String> groups = LinkedHashMultimap.create();
private String userId; private String userId;
private String userIdGroupName; private String userIdGroupName;
private IpProtocol ipProtocol; private IpProtocol ipProtocol;
@ -69,60 +77,64 @@ public class DescribeSecurityGroupsResponseHandler extends
} }
public void startElement(String uri, String name, String qName, Attributes attrs) { public void startElement(String uri, String name, String qName, Attributes attrs) {
if (qName.equals("ipPermissions")) { if (equalsOrSuffix(qName, "ipPermissions")) {
inIpPermissions = true; inIpPermissions = true;
} else if (qName.equals("ipRanges")) { } else if (equalsOrSuffix(qName, "ipRanges")) {
inIpRanges = true; inIpRanges = true;
} else if (qName.equals("groups")) { } else if (equalsOrSuffix(qName, "groups")) {
inGroups = true; inGroups = true;
} }
} }
public void endElement(String uri, String name, String qName) { public void endElement(String uri, String name, String qName) {
if (qName.equals("groupName")) { if (equalsOrSuffix(qName, "groupName")) {
if (!inGroups) if (!inGroups)
this.groupName = currentText.toString().trim(); this.groupName = currentOrNull(currentText);
else else
this.userIdGroupName = currentText.toString().trim(); this.userIdGroupName = currentOrNull(currentText);
} else if (qName.equals("ownerId")) { } else if (equalsOrSuffix(qName, "groupId")) {
this.ownerId = currentText.toString().trim(); this.groupId = currentOrNull(currentText);
} else if (qName.equals("userId")) { } else if (equalsOrSuffix(qName, "ownerId")) {
this.userId = currentText.toString().trim(); this.ownerId = currentOrNull(currentText);
} else if (qName.equals("groupDescription")) { } else if (equalsOrSuffix(qName, "userId")) {
this.groupDescription = currentText.toString().trim(); this.userId = currentOrNull(currentText);
} else if (qName.equals("ipProtocol")) { } else if (equalsOrSuffix(qName, "groupDescription")) {
this.ipProtocol = IpProtocol.fromValue(currentText.toString().trim()); this.groupDescription = currentOrNull(currentText);
} else if (qName.equals("fromPort")) { } else if (equalsOrSuffix(qName, "ipProtocol")) {
this.fromPort = Integer.parseInt(currentText.toString().trim()); this.ipProtocol = IpProtocol.fromValue(currentOrNull(currentText));
} else if (qName.equals("toPort")) { } else if (equalsOrSuffix(qName, "fromPort")) {
this.toPort = Integer.parseInt(currentText.toString().trim()); this.fromPort = Integer.parseInt(currentOrNull(currentText));
} else if (qName.equals("cidrIp")) { } else if (equalsOrSuffix(qName, "toPort")) {
this.ipRanges.add(currentText.toString().trim()); this.toPort = Integer.parseInt(currentOrNull(currentText));
} else if (qName.equals("ipPermissions")) { } else if (equalsOrSuffix(qName, "cidrIp")) {
this.ipRanges.add(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "ipPermissions")) {
inIpPermissions = false; inIpPermissions = false;
} else if (qName.equals("ipRanges")) { } else if (equalsOrSuffix(qName, "ipRanges")) {
inIpRanges = false; inIpRanges = false;
} else if (qName.equals("groups")) { } else if (equalsOrSuffix(qName, "groups")) {
inGroups = false; inGroups = false;
} else if (qName.equals("item")) { } else if (equalsOrSuffix(qName, "item")) {
if (inIpPermissions && !inIpRanges && !inGroups) { if (inIpPermissions && !inIpRanges && !inGroups) {
ipPermissions.add(new IpPermission(fromPort, toPort, groups, ipProtocol, ipRanges)); // TODO groups? we need an example of VPC stuff
ipPermissions.add(new IpPermissionImpl(ipProtocol, fromPort, toPort, groups, ImmutableSet.<String> of(),
ipRanges));
this.fromPort = -1; this.fromPort = -1;
this.toPort = -1; this.toPort = -1;
this.groups = Sets.newLinkedHashSet(); this.groups = LinkedHashMultimap.create();
this.ipProtocol = null; this.ipProtocol = null;
this.ipRanges = Sets.newLinkedHashSet(); this.ipRanges = Sets.newLinkedHashSet();
} else if (inIpPermissions && !inIpRanges && inGroups) { } else if (inIpPermissions && !inIpRanges && inGroups) {
this.groups.add(new UserIdGroupPair(userId, userIdGroupName)); this.groups.put(userId, userIdGroupName);
this.userId = null; this.userId = null;
this.userIdGroupName = null; this.userIdGroupName = null;
} else if (!inIpPermissions && !inIpRanges && !inGroups) { } else if (!inIpPermissions && !inIpRanges && !inGroups) {
String region = AWSUtils.findRegionInArgsOrNull(getRequest()); String region = AWSUtils.findRegionInArgsOrNull(getRequest());
if (region == null) if (region == null)
region = defaultRegion; region = defaultRegion;
securtyGroups.add(new SecurityGroup(region, groupName, ownerId, groupDescription, securtyGroups.add(new SecurityGroup(region, groupId, groupName, ownerId, groupDescription, ipPermissions));
ipPermissions));
this.groupName = null; this.groupName = null;
this.groupId = null;
this.ownerId = null; this.ownerId = null;
this.groupDescription = null; this.groupDescription = null;
this.ipPermissions = Sets.newLinkedHashSet(); this.ipPermissions = Sets.newLinkedHashSet();

View File

@ -62,14 +62,14 @@ public class EC2TemplateOptionsTest {
public void testsecurityGroupsIterable() { public void testsecurityGroupsIterable() {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
options.securityGroups(ImmutableSet.of("group1", "group2")); options.securityGroups(ImmutableSet.of("group1", "group2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test @Test
public void testsecurityGroupsIterableStatic() { public void testsecurityGroupsIterableStatic() {
EC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", "group2")); EC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", "group2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)
@ -82,7 +82,7 @@ public class EC2TemplateOptionsTest {
public void testsecurityGroupsVarArgs() { public void testsecurityGroupsVarArgs() {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
options.securityGroups("group1", "group2"); options.securityGroups("group1", "group2");
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@ -95,13 +95,13 @@ public class EC2TemplateOptionsTest {
@Test @Test
public void testDefaultGroupsVarArgsEmpty() { public void testDefaultGroupsVarArgsEmpty() {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
assertEquals(options.getGroupIds(), ImmutableSet.of()); assertEquals(options.getGroups(), ImmutableSet.of());
} }
@Test @Test
public void testsecurityGroupsVarArgsStatic() { public void testsecurityGroupsVarArgsStatic() {
EC2TemplateOptions options = securityGroups("group1", "group2"); EC2TemplateOptions options = securityGroups("group1", "group2");
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)

View File

@ -286,7 +286,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -322,7 +322,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -358,7 +358,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -392,7 +392,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); // note ports, shouldAuthorizeSelf); // note
// this // this

View File

@ -43,6 +43,7 @@ import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@ -57,7 +58,7 @@ import com.google.inject.Module;
@Test(groups = "live", singleThreaded = true) @Test(groups = "live", singleThreaded = true)
public class SecurityGroupClientLiveTest { public class SecurityGroupClientLiveTest {
private SecurityGroupClient client; protected SecurityGroupClient client;
private RestContext<EC2Client, EC2AsyncClient> context; private RestContext<EC2Client, EC2AsyncClient> context;
protected String provider = "ec2"; protected String provider = "ec2";
@ -69,10 +70,9 @@ public class SecurityGroupClientLiveTest {
protected void setupCredentials() { protected void setupCredentials() {
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity");
credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider
+ ".credential"); + ".credential");
endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); endpoint = System.getProperty("test." + provider + ".endpoint");
apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider apiversion = System.getProperty("test." + provider + ".apiversion");
+ ".apiversion");
} }
protected Properties setupProperties() { protected Properties setupProperties() {
@ -81,8 +81,10 @@ public class SecurityGroupClientLiveTest {
overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
overrides.setProperty(provider + ".identity", identity); overrides.setProperty(provider + ".identity", identity);
overrides.setProperty(provider + ".credential", credential); overrides.setProperty(provider + ".credential", credential);
overrides.setProperty(provider + ".endpoint", endpoint); if (endpoint != null)
overrides.setProperty(provider + ".apiversion", apiversion); overrides.setProperty(provider + ".endpoint", endpoint);
if (apiversion != null)
overrides.setProperty(provider + ".apiversion", apiversion);
return overrides; return overrides;
} }
@ -91,21 +93,21 @@ public class SecurityGroupClientLiveTest {
setupCredentials(); setupCredentials();
Properties overrides = setupProperties(); Properties overrides = setupProperties();
context = new ComputeServiceContextFactory().createContext(provider, context = new ComputeServiceContextFactory().createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides).getProviderSpecificContext();
client = context.getApi().getSecurityGroupServices(); client = context.getApi().getSecurityGroupServices();
} }
@Test @Test
void testDescribe() { void testDescribe() {
for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1,
Region.AP_SOUTHEAST_1, Region.AP_NORTHEAST_1)) { Region.AP_SOUTHEAST_1, Region.AP_NORTHEAST_1)) {
SortedSet<SecurityGroup> allResults = ImmutableSortedSet.<SecurityGroup> copyOf(client SortedSet<SecurityGroup> allResults = ImmutableSortedSet.<SecurityGroup> copyOf(client
.describeSecurityGroupsInRegion(region)); .describeSecurityGroupsInRegion(region));
assertNotNull(allResults); assertNotNull(allResults);
if (allResults.size() >= 1) { if (allResults.size() >= 1) {
SecurityGroup group = allResults.last(); SecurityGroup group = allResults.last();
SortedSet<SecurityGroup> result = ImmutableSortedSet.<SecurityGroup> copyOf(client SortedSet<SecurityGroup> result = ImmutableSortedSet.<SecurityGroup> copyOf(client
.describeSecurityGroupsInRegion(region, group.getName())); .describeSecurityGroupsInRegion(region, group.getName()));
assertNotNull(result); assertNotNull(result);
SecurityGroup compare = result.last(); SecurityGroup compare = result.last();
assertEquals(compare, group); assertEquals(compare, group);
@ -127,7 +129,7 @@ public class SecurityGroupClientLiveTest {
} }
} }
private void cleanupAndSleep(String groupName) { protected void cleanupAndSleep(String groupName) {
try { try {
client.deleteSecurityGroupInRegion(null, groupName); client.deleteSecurityGroupInRegion(null, groupName);
Thread.sleep(2000); Thread.sleep(2000);
@ -179,7 +181,7 @@ public class SecurityGroupClientLiveTest {
@Test @Test
void testAuthorizeSecurityGroupIngressSourceGroup() { void testAuthorizeSecurityGroupIngressSourceGroup() {
String group1Name = PREFIX + "ingress1"; final String group1Name = PREFIX + "ingress1";
String group2Name = PREFIX + "ingress2"; String group2Name = PREFIX + "ingress2";
cleanupAndSleep(group2Name); cleanupAndSleep(group2Name);
cleanupAndSleep(group1Name); cleanupAndSleep(group1Name);
@ -192,19 +194,19 @@ public class SecurityGroupClientLiveTest {
Set<SecurityGroup> oneResult = client.describeSecurityGroupsInRegion(null, group1Name); Set<SecurityGroup> oneResult = client.describeSecurityGroupsInRegion(null, group1Name);
assertNotNull(oneResult); assertNotNull(oneResult);
assertEquals(oneResult.size(), 1); assertEquals(oneResult.size(), 1);
SecurityGroup group = oneResult.iterator().next(); final SecurityGroup group = oneResult.iterator().next();
assertEquals(group.getName(), group1Name); assertEquals(group.getName(), group1Name);
final UserIdGroupPair to = new UserIdGroupPair(group.getOwnerId(), group1Name); final UserIdGroupPair to = new UserIdGroupPair(group.getOwnerId(), group1Name);
client.authorizeSecurityGroupIngressInRegion(null, group2Name, to); client.authorizeSecurityGroupIngressInRegion(null, group2Name, to);
assertEventually(new GroupHasPermission(client, group2Name, new Predicate<IpPermission>() { assertEventually(new GroupHasPermission(client, group2Name, new Predicate<IpPermission>() {
@Override @Override
public boolean apply(IpPermission arg0) { public boolean apply(IpPermission arg0) {
return arg0.getGroups().equals(ImmutableSet.of(to)); return arg0.getUserIdGroupPairs().equals(ImmutableMultimap.of(group.getOwnerId(), group1Name));
} }
})); }));
client.revokeSecurityGroupIngressInRegion(null, group2Name, client.revokeSecurityGroupIngressInRegion(null, group2Name,
new UserIdGroupPair(group.getOwnerId(), group1Name)); new UserIdGroupPair(group.getOwnerId(), group1Name));
assertEventually(new GroupHasNoPermissions(client, group2Name)); assertEventually(new GroupHasNoPermissions(client, group2Name));
} finally { } finally {
client.deleteSecurityGroupInRegion(null, group2Name); client.deleteSecurityGroupInRegion(null, group2Name);
@ -212,20 +214,20 @@ public class SecurityGroupClientLiveTest {
} }
} }
private final class TCPPort80AllIPs implements Predicate<IpPermission> { public final class TCPPort80AllIPs implements Predicate<IpPermission> {
@Override @Override
public boolean apply(IpPermission arg0) { public boolean apply(IpPermission arg0) {
return arg0.getIpProtocol() == IpProtocol.TCP && arg0.getFromPort() == 80 && arg0.getToPort() == 80 return arg0.getIpProtocol() == IpProtocol.TCP && arg0.getFromPort() == 80 && arg0.getToPort() == 80
&& arg0.getIpRanges().equals(ImmutableSet.of("0.0.0.0/0")); && arg0.getIpRanges().equals(ImmutableSet.of("0.0.0.0/0"));
} }
} }
private static final class GroupHasPermission implements Runnable { public static final class GroupHasPermission implements Runnable {
private final SecurityGroupClient client; private final SecurityGroupClient client;
private final String group; private final String group;
private final Predicate<IpPermission> permission; private final Predicate<IpPermission> permission;
private GroupHasPermission(SecurityGroupClient client, String group, Predicate<IpPermission> permission) { public GroupHasPermission(SecurityGroupClient client, String group, Predicate<IpPermission> permission) {
this.client = client; this.client = client;
this.group = group; this.group = group;
this.permission = permission; this.permission = permission;
@ -235,18 +237,18 @@ public class SecurityGroupClientLiveTest {
try { try {
Set<SecurityGroup> oneResult = client.describeSecurityGroupsInRegion(null, group); Set<SecurityGroup> oneResult = client.describeSecurityGroupsInRegion(null, group);
assert Iterables.all(Iterables.getOnlyElement(oneResult).getIpPermissions(), permission) : permission assert Iterables.all(Iterables.getOnlyElement(oneResult).getIpPermissions(), permission) : permission
+ ": " + oneResult; + ": " + oneResult;
} catch (Exception e) { } catch (Exception e) {
throw new AssertionError(e); throw new AssertionError(e);
} }
} }
} }
private static final class GroupHasNoPermissions implements Runnable { public static final class GroupHasNoPermissions implements Runnable {
private final SecurityGroupClient client; private final SecurityGroupClient client;
private final String group; private final String group;
private GroupHasNoPermissions(SecurityGroupClient client, String group) { public GroupHasNoPermissions(SecurityGroupClient client, String group) {
this.client = client; this.client = client;
this.group = group; this.group = group;
} }
@ -264,9 +266,9 @@ public class SecurityGroupClientLiveTest {
} }
} }
private void ensureGroupsExist(String group1Name, String group2Name) { protected void ensureGroupsExist(String group1Name, String group2Name) {
SortedSet<SecurityGroup> twoResults = ImmutableSortedSet.copyOf(client.describeSecurityGroupsInRegion(null, SortedSet<SecurityGroup> twoResults = ImmutableSortedSet.copyOf(client.describeSecurityGroupsInRegion(null,
group1Name, group2Name)); group1Name, group2Name));
assertNotNull(twoResults); assertNotNull(twoResults);
assertEquals(twoResults.size(), 2); assertEquals(twoResults.size(), 2);
Iterator<SecurityGroup> iterator = twoResults.iterator(); Iterator<SecurityGroup> iterator = twoResults.iterator();
@ -282,8 +284,9 @@ public class SecurityGroupClientLiveTest {
private static final int INCONSISTENCY_WINDOW = 5000; private static final int INCONSISTENCY_WINDOW = 5000;
/** /**
* Due to eventual consistency, container commands may not return correctly immediately. Hence, * Due to eventual consistency, container commands may not return correctly
* we will try up to the inconsistency window to see if the assertion completes. * immediately. Hence, we will try up to the inconsistency window to see if
* the assertion completes.
*/ */
protected static void assertEventually(Runnable assertion) { protected static void assertEventually(Runnable assertion) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
@ -293,7 +296,7 @@ public class SecurityGroupClientLiveTest {
assertion.run(); assertion.run();
if (i > 0) if (i > 0)
System.err.printf("%d attempts and %dms asserting %s%n", i + 1, System.currentTimeMillis() - start, System.err.printf("%d attempts and %dms asserting %s%n", i + 1, System.currentTimeMillis() - start,
assertion.getClass().getSimpleName()); assertion.getClass().getSimpleName());
return; return;
} catch (AssertionError e) { } catch (AssertionError e) {
error = e; error = e;

View File

@ -0,0 +1,108 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.util;
import static org.testng.Assert.assertEquals;
import org.jclouds.ec2.domain.IpProtocol;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
/**
* Tests possible uses of IpPermissions
*
* @author Adrian Cole
*/
@Test(testName = "IpPermissionsTest")
public class IpPermissionsTest {
public void testAllProtocol() {
IpPermissions authorization = IpPermissions.permitAnyProtocol();
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[-1], IpPermissions.0.FromPort=[1], IpPermissions.0.ToPort=[65535], IpPermissions.0.IpRanges.0.CidrIp=[0.0.0.0/0]}");
}
public void testAllProtocolCidrBound() {
IpPermissions authorization = IpPermissions.permit(IpProtocol.ALL).originatingFromCidrBlock("1.1.1.1/32");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[-1], IpPermissions.0.FromPort=[1], IpPermissions.0.ToPort=[65535], IpPermissions.0.IpRanges.0.CidrIp=[1.1.1.1/32]}");
}
public void testJustProtocolAndCidr() {
IpPermissions authorization = IpPermissions.permit(IpProtocol.TCP).originatingFromCidrBlock("1.1.1.1/32");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[tcp], IpPermissions.0.FromPort=[1], IpPermissions.0.ToPort=[65535], IpPermissions.0.IpRanges.0.CidrIp=[1.1.1.1/32]}");
}
public void testAnyProtocol() {
IpPermissions authorization = IpPermissions.permitAnyProtocol().originatingFromCidrBlock("1.1.1.1/32");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[-1], IpPermissions.0.FromPort=[1], IpPermissions.0.ToPort=[65535], IpPermissions.0.IpRanges.0.CidrIp=[1.1.1.1/32]}");
}
public void testMultipleCidrs() {
IpPermissions authorization = IpPermissions.permit(IpProtocol.TCP).originatingFromCidrBlocks(
ImmutableSet.of("1.1.1.1/32", "1.1.1.2/32"));
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[tcp], IpPermissions.0.FromPort=[1], IpPermissions.0.ToPort=[65535], IpPermissions.0.IpRanges.0.CidrIp=[1.1.1.1/32], IpPermissions.0.IpRanges.1.CidrIp=[1.1.1.2/32]}");
}
public void testProtocolFromAndToPortAndGroupIds() {
IpPermissions authorization = IpPermissions.permit(IpProtocol.UDP).fromPort(11).to(53)
.originatingFromSecurityGroupId("groupId");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[udp], IpPermissions.0.FromPort=[11], IpPermissions.0.ToPort=[53], IpPermissions.0.Groups.0.GroupId=[groupId]}");
}
public void testProtocolICMPAny() {
IpPermissions authorization = IpPermissions.permitICMP().originatingFromSecurityGroupId("groupId");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[icmp], IpPermissions.0.FromPort=[-1], IpPermissions.0.ToPort=[-1], IpPermissions.0.Groups.0.GroupId=[groupId]}");
}
public void testProtocolICMPTypeAnyCode() {
IpPermissions authorization = IpPermissions.permitICMP().type(8).originatingFromSecurityGroupId("groupId");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[icmp], IpPermissions.0.FromPort=[8], IpPermissions.0.ToPort=[-1], IpPermissions.0.Groups.0.GroupId=[groupId]}");
}
public void testProtocolICMPTypeCode() {
IpPermissions authorization = IpPermissions.permitICMP().type(8).andCode(0)
.originatingFromSecurityGroupId("groupId");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[icmp], IpPermissions.0.FromPort=[8], IpPermissions.0.ToPort=[0], IpPermissions.0.Groups.0.GroupId=[groupId]}");
}
public void testProtocolFromAndToPortAndUserGroups() {
IpPermissions authorization = IpPermissions.permit(IpProtocol.ICMP).originatingFromUserAndSecurityGroup("userId",
"groupId");
assertEquals(
IpPermissions.buildFormParametersForIndex(0, authorization).toString(),
"{IpPermissions.0.IpProtocol=[icmp], IpPermissions.0.FromPort=[-1], IpPermissions.0.ToPort=[-1], IpPermissions.0.Groups.0.UserId=[userId], IpPermissions.0.Groups.1.GroupName=[groupId]}");
}
}

View File

@ -26,15 +26,15 @@ import static org.testng.Assert.assertEquals;
import java.io.InputStream; import java.io.InputStream;
import java.util.Set; import java.util.Set;
import org.jclouds.ec2.domain.IpPermission; import org.jclouds.ec2.domain.IpPermissionImpl;
import org.jclouds.ec2.domain.IpProtocol; import org.jclouds.ec2.domain.IpProtocol;
import org.jclouds.ec2.domain.SecurityGroup; import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
/** /**
@ -42,24 +42,23 @@ import com.google.common.collect.ImmutableSet;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
//NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "DescribeSecurityGroupsResponseHandlerTest") @Test(groups = "unit", testName = "DescribeSecurityGroupsResponseHandlerTest")
public class DescribeSecurityGroupsResponseHandlerTest extends BaseEC2HandlerTest { public class DescribeSecurityGroupsResponseHandlerTest extends BaseEC2HandlerTest {
public void testApplyInputStream() { public void testApplyInputStream() {
InputStream is = getClass().getResourceAsStream("/describe_securitygroups.xml"); InputStream is = getClass().getResourceAsStream("/describe_securitygroups.xml");
Set<SecurityGroup> expected = ImmutableSet.of(new SecurityGroup(defaultRegion, Set<SecurityGroup> expected = ImmutableSet.of(
"WebServers", "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", "Web Servers", ImmutableSet new SecurityGroup(defaultRegion, null, "WebServers", "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", "Web Servers",
.of(new IpPermission(80, 80, ImmutableSet.<UserIdGroupPair> of(), ImmutableSet.of(new IpPermissionImpl(IpProtocol.TCP, 80, 80, ImmutableMultimap.<String, String> of(),
IpProtocol.TCP, ImmutableSet.of("0.0.0.0/0")))), ImmutableSet.<String> of(), ImmutableSet.of("0.0.0.0/0")))),
new SecurityGroup(defaultRegion, "RangedPortsBySource", "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", new SecurityGroup(defaultRegion, null, "RangedPortsBySource", "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", "Group A",
"Group A", ImmutableSet.of(new IpPermission(6000, 7000, ImmutableSet.of(new IpPermissionImpl(IpProtocol.TCP, 6000, 7000, ImmutableMultimap
ImmutableSet.<UserIdGroupPair> of(), IpProtocol.TCP, .<String, String> of(), ImmutableSet.<String> of(), ImmutableSet.<String> of()))));
ImmutableSet.<String> of()))));
DescribeSecurityGroupsResponseHandler handler = injector DescribeSecurityGroupsResponseHandler handler = injector.getInstance(DescribeSecurityGroupsResponseHandler.class);
.getInstance(DescribeSecurityGroupsResponseHandler.class);
addDefaultRegionToHandler(handler); addDefaultRegionToHandler(handler);
Set<SecurityGroup> result = factory.create(handler).parse(is); Set<SecurityGroup> result = factory.create(handler).parse(is);
@ -68,7 +67,7 @@ public class DescribeSecurityGroupsResponseHandlerTest extends BaseEC2HandlerTes
private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) { private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) {
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class); GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
expect(request.getArgs()).andReturn(ImmutableList.<Object>of()).atLeastOnce(); expect(request.getArgs()).andReturn(ImmutableList.<Object> of()).atLeastOnce();
replay(request); replay(request);
handler.setContext(request); handler.setContext(request);
} }

View File

@ -36,7 +36,7 @@
<properties> <properties>
<test.aws-ec2.endpoint>https://ec2.us-east-1.amazonaws.com</test.aws-ec2.endpoint> <test.aws-ec2.endpoint>https://ec2.us-east-1.amazonaws.com</test.aws-ec2.endpoint>
<test.aws-ec2.apiversion>2010-11-15</test.aws-ec2.apiversion> <test.aws-ec2.apiversion>2011-05-15</test.aws-ec2.apiversion>
<test.aws-ec2.identity>${test.aws.identity}</test.aws-ec2.identity> <test.aws-ec2.identity>${test.aws.identity}</test.aws-ec2.identity>
<test.aws-ec2.credential>${test.aws.credential}</test.aws-ec2.credential> <test.aws-ec2.credential>${test.aws.credential}</test.aws-ec2.credential>
</properties> </properties>

View File

@ -40,6 +40,7 @@ package org.jclouds.aws.ec2;
import org.jclouds.aws.ec2.services.AWSAMIAsyncClient; import org.jclouds.aws.ec2.services.AWSAMIAsyncClient;
import org.jclouds.aws.ec2.services.AWSInstanceAsyncClient; import org.jclouds.aws.ec2.services.AWSInstanceAsyncClient;
import org.jclouds.aws.ec2.services.AWSKeyPairAsyncClient; import org.jclouds.aws.ec2.services.AWSKeyPairAsyncClient;
import org.jclouds.aws.ec2.services.AWSSecurityGroupAsyncClient;
import org.jclouds.aws.ec2.services.MonitoringAsyncClient; import org.jclouds.aws.ec2.services.MonitoringAsyncClient;
import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient; import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient;
import org.jclouds.aws.ec2.services.SpotInstanceAsyncClient; import org.jclouds.aws.ec2.services.SpotInstanceAsyncClient;
@ -52,7 +53,7 @@ import org.jclouds.rest.annotations.Delegate;
* @author Adrian Cole * @author Adrian Cole
*/ */
public interface AWSEC2AsyncClient extends EC2AsyncClient { public interface AWSEC2AsyncClient extends EC2AsyncClient {
public final static String VERSION = "2010-11-15"; public final static String VERSION = "2011-05-15";
/** /**
* {@inheritDoc} * {@inheritDoc}
@ -68,6 +69,13 @@ public interface AWSEC2AsyncClient extends EC2AsyncClient {
@Override @Override
AWSAMIAsyncClient getAMIServices(); AWSAMIAsyncClient getAMIServices();
/**
* {@inheritDoc}
*/
@Delegate
@Override
AWSSecurityGroupAsyncClient getSecurityGroupServices();
/** /**
* Provides asynchronous access to PlacementGroup services. * Provides asynchronous access to PlacementGroup services.
*/ */

View File

@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.jclouds.aws.ec2.services.AWSAMIClient; import org.jclouds.aws.ec2.services.AWSAMIClient;
import org.jclouds.aws.ec2.services.AWSInstanceClient; import org.jclouds.aws.ec2.services.AWSInstanceClient;
import org.jclouds.aws.ec2.services.AWSKeyPairClient; import org.jclouds.aws.ec2.services.AWSKeyPairClient;
import org.jclouds.aws.ec2.services.AWSSecurityGroupClient;
import org.jclouds.aws.ec2.services.MonitoringClient; import org.jclouds.aws.ec2.services.MonitoringClient;
import org.jclouds.aws.ec2.services.PlacementGroupClient; import org.jclouds.aws.ec2.services.PlacementGroupClient;
import org.jclouds.aws.ec2.services.SpotInstanceClient; import org.jclouds.aws.ec2.services.SpotInstanceClient;
@ -45,6 +46,13 @@ public interface AWSEC2Client extends EC2Client {
@Override @Override
AWSInstanceClient getInstanceServices(); AWSInstanceClient getInstanceServices();
/**
* {@inheritDoc}
*/
@Delegate
@Override
AWSSecurityGroupClient getSecurityGroupServices();
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View File

@ -61,8 +61,10 @@ public class BindLaunchSpecificationToFormParams implements Binder, Function<Lau
AWSRunInstancesOptions options = new AWSRunInstancesOptions(); AWSRunInstancesOptions options = new AWSRunInstancesOptions();
if (launchSpec.getBlockDeviceMappings().size() > 0) if (launchSpec.getBlockDeviceMappings().size() > 0)
options.withBlockDeviceMappings(launchSpec.getBlockDeviceMappings()); options.withBlockDeviceMappings(launchSpec.getBlockDeviceMappings());
if (launchSpec.getGroupIds().size() > 0) if (launchSpec.getSecurityGroupNames().size() > 0)
options.withSecurityGroups(launchSpec.getGroupIds()); options.withSecurityGroups(launchSpec.getSecurityGroupNames());
if (launchSpec.getSecurityGroupIds().size() > 0)
options.withSecurityGroupIds(launchSpec.getSecurityGroupIds());
options.asType(checkNotNull(launchSpec.getInstanceType(), "instanceType")); options.asType(checkNotNull(launchSpec.getInstanceType(), "instanceType"));
if (launchSpec.getKernelId() != null) if (launchSpec.getKernelId() != null)
options.withKernelId(launchSpec.getKernelId()); options.withKernelId(launchSpec.getKernelId());

View File

@ -18,6 +18,7 @@
*/ */
package org.jclouds.aws.ec2.compute; package org.jclouds.aws.ec2.compute;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
@ -35,6 +36,9 @@ import org.jclouds.io.Payload;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.util.Preconditions2; import org.jclouds.util.Preconditions2;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
/** /**
* Contains options supported in the {@code ComputeService#runNode} operation on the "ec2" provider. * Contains options supported in the {@code ComputeService#runNode} operation on the "ec2" provider.
* <h2> * <h2>
@ -73,6 +77,8 @@ public class AWSEC2TemplateOptions extends EC2TemplateOptions implements Cloneab
eTo.noPlacementGroup(); eTo.noPlacementGroup();
if (getPlacementGroup() != null) if (getPlacementGroup() != null)
eTo.placementGroup(getPlacementGroup()); eTo.placementGroup(getPlacementGroup());
if (getGroupIds().size() > 0)
eTo.securityGroupIds(getGroupIds());
if (getSpotPrice() != null) if (getSpotPrice() != null)
eTo.spotPrice(getSpotPrice()); eTo.spotPrice(getSpotPrice());
if (getSpotOptions() != null) if (getSpotOptions() != null)
@ -86,6 +92,7 @@ public class AWSEC2TemplateOptions extends EC2TemplateOptions implements Cloneab
private String subnetId; private String subnetId;
private Float spotPrice; private Float spotPrice;
private RequestSpotInstancesOptions spotOptions = RequestSpotInstancesOptions.NONE; private RequestSpotInstancesOptions spotOptions = RequestSpotInstancesOptions.NONE;
private Set<String> groupIds = ImmutableSet.of();
public static final AWSEC2TemplateOptions NONE = new AWSEC2TemplateOptions(); public static final AWSEC2TemplateOptions NONE = new AWSEC2TemplateOptions();
@ -145,7 +152,51 @@ public class AWSEC2TemplateOptions extends EC2TemplateOptions implements Cloneab
return this; return this;
} }
/**
*
* @see AWSEC2TemplateOptions#securityGroupIds(Iterable<String>)
*/
public AWSEC2TemplateOptions securityGroupIds(String... groupIds) {
return securityGroupIds(ImmutableSet.copyOf(groupIds));
}
/**
* Specifies the security group ids to be used for nodes with this template
*/
public AWSEC2TemplateOptions securityGroupIds(Iterable<String> groupIds) {
checkArgument(Iterables.size(groupIds) > 0, "you must specify at least one security group");
for (String groupId : groupIds)
Preconditions2.checkNotEmpty(groupId, "all security groups must be non-empty");
this.groupIds = ImmutableSet.copyOf(groupIds);
return this;
}
public Set<String> getGroupIds() {
return groupIds;
}
public void setGroupIds(Set<String> groupIds) {
this.groupIds = groupIds;
}
public static class Builder { public static class Builder {
/**
* @see AWSEC2TemplateOptions#securityGroupIds(Iterable<String>)
*/
public static AWSEC2TemplateOptions securityGroupIds(String... groupNames) {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
return AWSEC2TemplateOptions.class.cast(options.securityGroupIds(groupNames));
}
/**
* @see AWSEC2TemplateOptions#securityGroupIds(Iterable<String>)
*/
public static AWSEC2TemplateOptions securityGroupIds(Iterable<String> groupNames) {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
return AWSEC2TemplateOptions.class.cast(options.securityGroupIds(groupNames));
}
/** /**
* @see EC2TemplateOptions#blockDeviceMappings * @see EC2TemplateOptions#blockDeviceMappings
*/ */
@ -629,7 +680,7 @@ public class AWSEC2TemplateOptions extends EC2TemplateOptions implements Cloneab
@Override @Override
public String toString() { public String toString() {
return "[groupIds=" + getGroupIds() + ", keyPair=" + getKeyPair() + ", noKeyPair=" return "[groupIds=" + getGroups() + ", keyPair=" + getKeyPair() + ", noKeyPair="
+ !shouldAutomaticallyCreateKeyPair() + ", monitoringEnabled=" + monitoringEnabled + ", placementGroup=" + !shouldAutomaticallyCreateKeyPair() + ", monitoringEnabled=" + monitoringEnabled + ", placementGroup="
+ placementGroup + ", noPlacementGroup=" + noPlacementGroup + ", subnetId=" + subnetId + ", userData=" + placementGroup + ", noPlacementGroup=" + noPlacementGroup + ", subnetId=" + subnetId + ", userData="
+ Arrays.toString(getUserData()) + ", blockDeviceMappings=" + getBlockDeviceMappings() + ", spotPrice=" + Arrays.toString(getUserData()) + ", blockDeviceMappings=" + getBlockDeviceMappings() + ", spotPrice="

View File

@ -75,7 +75,6 @@ public class AWSEC2CreateNodesInGroupThenAddToSet extends EC2CreateNodesInGroupT
Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata, Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata,
Function<RunningInstance, Credentials> instanceToCredentials, Map<String, Credentials> credentialStore, Function<RunningInstance, Credentials> instanceToCredentials, Map<String, Credentials> credentialStore,
ComputeUtils utils, SpotInstanceRequestToAWSRunningInstance spotConverter) { ComputeUtils utils, SpotInstanceRequestToAWSRunningInstance spotConverter) {
super(client, templateBuilderProvider, createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, instancePresent, super(client, templateBuilderProvider, createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, instancePresent,
runningInstanceToNodeMetadata, instanceToCredentials, credentialStore, utils); runningInstanceToNodeMetadata, instanceToCredentials, credentialStore, utils);
this.client = checkNotNull(client, "client"); this.client = checkNotNull(client, "client");

View File

@ -164,10 +164,21 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions
} }
}; };
@Override
protected boolean userSpecifiedTheirOwnGroups(TemplateOptions options) {
return options instanceof AWSEC2TemplateOptions
&& AWSEC2TemplateOptions.class.cast(options).getGroupIds().size() > 0
|| super.userSpecifiedTheirOwnGroups(options);
}
@Override @Override
protected void addSecurityGroups(String region, String group, Template template, RunInstancesOptions instanceOptions) { protected void addSecurityGroups(String region, String group, Template template, RunInstancesOptions instanceOptions) {
String subnetId = AWSEC2TemplateOptions.class.cast(template.getOptions()).getSubnetId(); AWSEC2TemplateOptions awsTemplateOptions = AWSEC2TemplateOptions.class.cast(template.getOptions());
AWSRunInstancesOptions awsInstanceOptions = AWSRunInstancesOptions.class.cast(instanceOptions);
if (awsTemplateOptions.getGroupIds().size() > 0)
awsInstanceOptions.withSecurityGroupIds(awsTemplateOptions.getGroupIds());
String subnetId = awsTemplateOptions.getSubnetId();
if (subnetId != null) { if (subnetId != null) {
AWSRunInstancesOptions.class.cast(instanceOptions).withSubnetId(subnetId); AWSRunInstancesOptions.class.cast(instanceOptions).withSubnetId(subnetId);
} else { } else {

View File

@ -32,6 +32,8 @@ import org.jclouds.aws.ec2.services.AWSInstanceAsyncClient;
import org.jclouds.aws.ec2.services.AWSInstanceClient; import org.jclouds.aws.ec2.services.AWSInstanceClient;
import org.jclouds.aws.ec2.services.AWSKeyPairAsyncClient; import org.jclouds.aws.ec2.services.AWSKeyPairAsyncClient;
import org.jclouds.aws.ec2.services.AWSKeyPairClient; import org.jclouds.aws.ec2.services.AWSKeyPairClient;
import org.jclouds.aws.ec2.services.AWSSecurityGroupAsyncClient;
import org.jclouds.aws.ec2.services.AWSSecurityGroupClient;
import org.jclouds.aws.ec2.services.MonitoringAsyncClient; import org.jclouds.aws.ec2.services.MonitoringAsyncClient;
import org.jclouds.aws.ec2.services.MonitoringClient; import org.jclouds.aws.ec2.services.MonitoringClient;
import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient; import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient;
@ -73,18 +75,18 @@ import com.google.inject.Provides;
public class AWSEC2RestClientModule extends EC2RestClientModule<AWSEC2Client, AWSEC2AsyncClient> { public class AWSEC2RestClientModule extends EC2RestClientModule<AWSEC2Client, AWSEC2AsyncClient> {
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()// public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
.put(AWSAMIClient.class, AWSAMIAsyncClient.class)// .put(AWSAMIClient.class, AWSAMIAsyncClient.class)//
.put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)// .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)//
.put(AWSInstanceClient.class, AWSInstanceAsyncClient.class)// .put(AWSInstanceClient.class, AWSInstanceAsyncClient.class)//
.put(AWSKeyPairClient.class, AWSKeyPairAsyncClient.class)// .put(AWSKeyPairClient.class, AWSKeyPairAsyncClient.class)//
.put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)// .put(AWSSecurityGroupClient.class, AWSSecurityGroupAsyncClient.class)//
.put(PlacementGroupClient.class, PlacementGroupAsyncClient.class)// .put(PlacementGroupClient.class, PlacementGroupAsyncClient.class)//
.put(MonitoringClient.class, MonitoringAsyncClient.class)// .put(MonitoringClient.class, MonitoringAsyncClient.class)//
.put(WindowsClient.class, WindowsAsyncClient.class)// .put(WindowsClient.class, WindowsAsyncClient.class)//
.put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)// .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)//
.put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)// .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)//
.put(SpotInstanceClient.class, SpotInstanceAsyncClient.class)// .put(SpotInstanceClient.class, SpotInstanceAsyncClient.class)//
.build(); .build();
public AWSEC2RestClientModule() { public AWSEC2RestClientModule() {
super(AWSEC2Client.class, AWSEC2AsyncClient.class, DELEGATE_MAP); super(AWSEC2Client.class, AWSEC2AsyncClient.class, DELEGATE_MAP);
@ -114,6 +116,18 @@ public class AWSEC2RestClientModule extends EC2RestClientModule<AWSEC2Client, AW
return in.getInstanceServices(); return in.getInstanceServices();
} }
@Singleton
@Provides
SecurityGroupClient getSecurityGroupServices(AWSEC2Client in) {
return in.getSecurityGroupServices();
}
@Singleton
@Provides
SecurityGroupAsyncClient getSecurityGroupServices(AWSEC2AsyncClient in) {
return in.getSecurityGroupServices();
}
@Singleton @Singleton
@Provides @Provides
AMIClient getAMIServices(AWSEC2Client in) { AMIClient getAMIServices(AWSEC2Client in) {

View File

@ -31,12 +31,15 @@ import org.jclouds.ec2.domain.InstanceState;
import org.jclouds.ec2.domain.RootDeviceType; import org.jclouds.ec2.domain.RootDeviceType;
import org.jclouds.ec2.domain.RunningInstance; import org.jclouds.ec2.domain.RunningInstance;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html" * @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html"
* /> * />
* @author Adrian Cole * @author Adrian Cole
*/ */
@ -52,6 +55,19 @@ public class AWSRunningInstance extends RunningInstance {
private String subnetId; private String subnetId;
private String spotInstanceRequestId; private String spotInstanceRequestId;
private String vpcId; private String vpcId;
private Map<String, String> securityGroupIdToNames = Maps.newLinkedHashMap();
public Builder securityGroupIdToNames(Map<String, String> securityGroupIdToNames) {
this.securityGroupIdToNames = ImmutableMap.copyOf(checkNotNull(securityGroupIdToNames,
"securityGroupIdToNames"));
return this;
}
public Builder securityGroupIdToName(String key, String value) {
if (key != null && value != null)
this.securityGroupIdToNames.put(key, value);
return this;
}
public Builder monitoringState(MonitoringState monitoringState) { public Builder monitoringState(MonitoringState monitoringState) {
this.monitoringState = monitoringState; this.monitoringState = monitoringState;
@ -211,11 +227,11 @@ public class AWSRunningInstance extends RunningInstance {
@Override @Override
public AWSRunningInstance build() { public AWSRunningInstance build() {
return new AWSRunningInstance(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, instanceState, return new AWSRunningInstance(region, securityGroupIdToNames, amiLaunchIndex, dnsName, imageId, instanceId,
instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType, instanceState, instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone,
platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, virtualizationType, platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType,
ebsBlockDevices, monitoringState, placementGroup, productCodes, subnetId, spotInstanceRequestId, rootDeviceName, ebsBlockDevices, monitoringState, placementGroup, productCodes, subnetId,
vpcId); spotInstanceRequestId, vpcId);
} }
} }
@ -230,23 +246,30 @@ public class AWSRunningInstance extends RunningInstance {
private final String spotInstanceRequestId; private final String spotInstanceRequestId;
@Nullable @Nullable
private final String vpcId; private final String vpcId;
private final Map<String, String> securityGroupIdToNames;
protected AWSRunningInstance(String region, Iterable<String> groupIds, String amiLaunchIndex, String dnsName, protected AWSRunningInstance(String region, Map<String, String> securityGroupIdToNames, String amiLaunchIndex,
String imageId, String instanceId, InstanceState instanceState, String instanceType, String ipAddress, String dnsName, String imageId, String instanceId, InstanceState instanceState, String instanceType,
String kernelId, String keyName, Date launchTime, String availabilityZone, String virtualizationType, String ipAddress, String kernelId, String keyName, Date launchTime, String availabilityZone,
String platform, String privateDnsName, String privateIpAddress, String ramdiskId, String reason, String virtualizationType, String platform, String privateDnsName, String privateIpAddress, String ramdiskId,
RootDeviceType rootDeviceType, String rootDeviceName, Map<String, BlockDevice> ebsBlockDevices, String reason, RootDeviceType rootDeviceType, String rootDeviceName, Map<String, BlockDevice> ebsBlockDevices,
MonitoringState monitoringState, String placementGroup, Iterable<String> productCodes, String subnetId, MonitoringState monitoringState, String placementGroup, Iterable<String> productCodes, String subnetId,
String spotInstanceRequestId, String vpcId) { String spotInstanceRequestId, String vpcId) {
super(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, instanceState, instanceType, ipAddress, super(region, securityGroupIdToNames.values(), amiLaunchIndex, dnsName, imageId, instanceId, instanceState,
kernelId, keyName, launchTime, availabilityZone, virtualizationType, platform, privateDnsName, instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType, platform,
privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, ebsBlockDevices); privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, ebsBlockDevices);
this.monitoringState = checkNotNull(monitoringState, "monitoringState"); this.monitoringState = checkNotNull(monitoringState, "monitoringState");
this.placementGroup = placementGroup; this.placementGroup = placementGroup;
this.productCodes = ImmutableSet.copyOf(checkNotNull(groupIds, "groupIds")); this.productCodes = ImmutableSet.copyOf(checkNotNull(productCodes, "productCodes"));
this.subnetId = subnetId; this.subnetId = subnetId;
this.spotInstanceRequestId = spotInstanceRequestId; this.spotInstanceRequestId = spotInstanceRequestId;
this.vpcId = vpcId; this.vpcId = vpcId;
this.securityGroupIdToNames = ImmutableMap.<String, String> copyOf(checkNotNull(securityGroupIdToNames,
"securityGroupIdToNames"));
}
public Map<String, String> getSecurityGroupIdToNames() {
return securityGroupIdToNames;
} }
/** /**
@ -257,7 +280,8 @@ public class AWSRunningInstance extends RunningInstance {
} }
/** /**
* The name of the placement group the instance is in (for cluster compute instances). * The name of the placement group the instance is in (for cluster compute
* instances).
*/ */
public String getPlacementGroup() { public String getPlacementGroup() {
return placementGroup; return placementGroup;
@ -278,14 +302,16 @@ public class AWSRunningInstance extends RunningInstance {
} }
/** /**
* Specifies the VPC in which the instance is running (Amazon Virtual Private Cloud). * Specifies the VPC in which the instance is running (Amazon Virtual Private
* Cloud).
*/ */
public String getVpcId() { public String getVpcId() {
return vpcId; return vpcId;
} }
/** /**
* Specifies the subnet ID in which the instance is running (Amazon Virtual Private Cloud). * Specifies the subnet ID in which the instance is running (Amazon Virtual
* Private Cloud).
*/ */
public String getSubnetId() { public String getSubnetId() {
return subnetId; return subnetId;
@ -343,14 +369,13 @@ public class AWSRunningInstance extends RunningInstance {
@Override @Override
public String toString() { public String toString() {
return "[region=" + region + ", availabilityZone=" + availabilityZone + ", instanceId=" + instanceId return "[region=" + region + ", availabilityZone=" + availabilityZone + ", instanceId=" + instanceId
+ ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType=" + ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType="
+ virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName + virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName
+ ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + keyName
+ keyName + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + rootDeviceName
+ rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + ", monitoringState="
+ ", monitoringState=" + monitoringState + ", placementGroup=" + placementGroup + ", productCodes=" + monitoringState + ", placementGroup=" + placementGroup + ", productCodes=" + productCodes
+ productCodes + ", spotInstanceRequestId=" + spotInstanceRequestId + ", subnetId=" + subnetId + ", spotInstanceRequestId=" + spotInstanceRequestId + ", subnetId=" + subnetId + ", vpcId=" + vpcId + "]";
+ ", vpcId=" + vpcId + "]";
} }
} }

View File

@ -21,6 +21,7 @@ package org.jclouds.aws.ec2.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -30,6 +31,7 @@ import org.jclouds.ec2.domain.BlockDeviceMapping.MapEBSSnapshotToDevice;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapEphemeralDeviceToDevice; import org.jclouds.ec2.domain.BlockDeviceMapping.MapEphemeralDeviceToDevice;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapNewVolumeToDevice; import org.jclouds.ec2.domain.BlockDeviceMapping.MapNewVolumeToDevice;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ImmutableSortedSet;
@ -47,7 +49,7 @@ public class LaunchSpecification {
} }
public static class Builder { public static class Builder {
protected ImmutableSet.Builder<String> groupIds = ImmutableSet.<String> builder(); protected ImmutableMap.Builder<String, String> securityGroupIdToNames = ImmutableMap.<String, String> builder();
protected String imageId; protected String imageId;
protected String instanceType; protected String instanceType;
protected String kernelId; protected String kernelId;
@ -57,10 +59,12 @@ public class LaunchSpecification {
protected Boolean monitoringEnabled; protected Boolean monitoringEnabled;
protected ImmutableSet.Builder<BlockDeviceMapping> blockDeviceMappings = ImmutableSet protected ImmutableSet.Builder<BlockDeviceMapping> blockDeviceMappings = ImmutableSet
.<BlockDeviceMapping> builder(); .<BlockDeviceMapping> builder();
protected ImmutableSet.Builder<String> securityGroupIds = ImmutableSet.<String> builder();
protected ImmutableSet.Builder<String> securityGroupNames = ImmutableSet.<String> builder();
protected byte[] userData; protected byte[] userData;
public void clear() { public void clear() {
groupIds = ImmutableSet.<String> builder(); securityGroupIdToNames = ImmutableMap.<String, String> builder();
imageId = null; imageId = null;
instanceType = null; instanceType = null;
kernelId = null; kernelId = null;
@ -69,17 +73,19 @@ public class LaunchSpecification {
ramdiskId = null; ramdiskId = null;
monitoringEnabled = false; monitoringEnabled = false;
blockDeviceMappings = ImmutableSet.<BlockDeviceMapping> builder(); blockDeviceMappings = ImmutableSet.<BlockDeviceMapping> builder();
securityGroupIds = ImmutableSet.<String> builder();
securityGroupNames = ImmutableSet.<String> builder();
userData = null; userData = null;
} }
public Builder groupIds(Iterable<String> groupIds) { public Builder securityGroupIdToNames(Map<String, String> securityGroupIdToNames) {
this.groupIds.addAll(checkNotNull(groupIds, "groupIds")); this.securityGroupIdToNames.putAll(checkNotNull(securityGroupIdToNames, "securityGroupIdToNames"));
return this; return this;
} }
public Builder groupId(String groupId) { public Builder securityGroupIdToName(String groupId, String groupName) {
if (groupId != null) if (groupId != null && groupName != null)
this.groupIds.add(groupId); this.securityGroupIdToNames.put(checkNotNull(groupId, "groupId"), checkNotNull(groupName, "groupName"));
return this; return this;
} }
@ -144,6 +150,28 @@ public class LaunchSpecification {
return this; 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) { public Builder userData(byte[] userData) {
this.userData = userData; this.userData = userData;
return this; return this;
@ -151,13 +179,15 @@ public class LaunchSpecification {
public LaunchSpecification build() { public LaunchSpecification build() {
return new LaunchSpecification(instanceType, imageId, kernelId, ramdiskId, availabilityZone, keyName, return new LaunchSpecification(instanceType, imageId, kernelId, ramdiskId, availabilityZone, keyName,
groupIds.build(), blockDeviceMappings.build(), monitoringEnabled, userData); securityGroupIdToNames.build(), blockDeviceMappings.build(), monitoringEnabled,
securityGroupIds.build(), securityGroupNames.build(), userData);
} }
public static Builder fromLaunchSpecification(LaunchSpecification in) { public static Builder fromLaunchSpecification(LaunchSpecification in) {
return new Builder().instanceType(in.getInstanceType()).imageId(in.getImageId()).kernelId(in.getKernelId()) return new Builder().instanceType(in.getInstanceType()).imageId(in.getImageId()).kernelId(in.getKernelId())
.ramdiskId(in.getRamdiskId()).availabilityZone(in.getAvailabilityZone()).keyName(in.getKeyName()) .ramdiskId(in.getRamdiskId()).availabilityZone(in.getAvailabilityZone()).keyName(in.getKeyName())
.groupIds(in.getGroupIds()).blockDeviceMappings(in.getBlockDeviceMappings()) .securityGroupIdToNames(in.getSecurityGroupIdToNames()).securityGroupIds(in.getSecurityGroupIds())
.securityGroupNames(in.getSecurityGroupNames()).blockDeviceMappings(in.getBlockDeviceMappings())
.monitoringEnabled(in.isMonitoringEnabled()).userData(in.getUserData()); .monitoringEnabled(in.isMonitoringEnabled()).userData(in.getUserData());
} }
} }
@ -168,26 +198,35 @@ public class LaunchSpecification {
protected final String ramdiskId; protected final String ramdiskId;
protected final String availabilityZone; protected final String availabilityZone;
protected final String keyName; protected final String keyName;
protected final Set<String> groupIds; protected final Map<String, String> securityGroupIdToNames;
protected final Set<? extends BlockDeviceMapping> blockDeviceMappings; protected final Set<? extends BlockDeviceMapping> blockDeviceMappings;
protected final Set<String> securityGroupIds;
protected final Set<String> securityGroupNames;
protected final Boolean monitoringEnabled; protected final Boolean monitoringEnabled;
protected final byte[] userData; protected final byte[] userData;
public LaunchSpecification(String instanceType, String imageId, String kernelId, String ramdiskId, public LaunchSpecification(String instanceType, String imageId, String kernelId, String ramdiskId,
String availabilityZone, String keyName, Iterable<String> groupIds, String availabilityZone, String keyName, Map<String, String> securityGroupIdToNames,
Iterable<? extends BlockDeviceMapping> blockDeviceMappings, Boolean monitoringEnabled, byte[] userData) { Iterable<? extends BlockDeviceMapping> blockDeviceMappings, Boolean monitoringEnabled,
Set<String> securityGroupIds, Set<String> securityGroupNames, byte[] userData) {
this.instanceType = checkNotNull(instanceType, "instanceType"); this.instanceType = checkNotNull(instanceType, "instanceType");
this.imageId = checkNotNull(imageId, "imageId"); this.imageId = checkNotNull(imageId, "imageId");
this.kernelId = kernelId; this.kernelId = kernelId;
this.ramdiskId = ramdiskId; this.ramdiskId = ramdiskId;
this.availabilityZone = availabilityZone; this.availabilityZone = availabilityZone;
this.keyName = keyName; this.keyName = keyName;
this.groupIds = ImmutableSortedSet.copyOf(checkNotNull(groupIds, "groupIds")); this.securityGroupIdToNames = ImmutableMap.copyOf(checkNotNull(securityGroupIdToNames, "securityGroupIdToNames"));
this.blockDeviceMappings = ImmutableSortedSet.copyOf(checkNotNull(blockDeviceMappings, "blockDeviceMappings")); 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.monitoringEnabled = monitoringEnabled;
this.userData = userData; this.userData = userData;
} }
public Map<String, String> getSecurityGroupIdToNames() {
return securityGroupIdToNames;
}
/** /**
* Image ID of the AMI used to launch the instance. * Image ID of the AMI used to launch the instance.
*/ */
@ -217,7 +256,8 @@ public class LaunchSpecification {
} }
/** /**
* If this instance was launched with an associated key pair, this displays the key pair name. * If this instance was launched with an associated key pair, this displays
* the key pair name.
*/ */
public String getKeyName() { public String getKeyName() {
return keyName; return keyName;
@ -247,8 +287,15 @@ public class LaunchSpecification {
/** /**
* Names of the security groups. * Names of the security groups.
*/ */
public Set<String> getGroupIds() { public Set<String> getSecurityGroupNames() {
return groupIds; return securityGroupNames;
}
/**
* Ids of the security groups.
*/
public Set<String> getSecurityGroupIds() {
return securityGroupIds;
} }
/** /**
@ -264,13 +311,15 @@ public class LaunchSpecification {
int result = 1; int result = 1;
result = prime * result + ((availabilityZone == null) ? 0 : availabilityZone.hashCode()); result = prime * result + ((availabilityZone == null) ? 0 : availabilityZone.hashCode());
result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode()); result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode());
result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode());
result = prime * result + ((imageId == null) ? 0 : imageId.hashCode()); result = prime * result + ((imageId == null) ? 0 : imageId.hashCode());
result = prime * result + ((instanceType == null) ? 0 : instanceType.hashCode()); result = prime * result + ((instanceType == null) ? 0 : instanceType.hashCode());
result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode()); result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode());
result = prime * result + ((keyName == null) ? 0 : keyName.hashCode()); result = prime * result + ((keyName == null) ? 0 : keyName.hashCode());
result = prime * result + ((monitoringEnabled == null) ? 0 : monitoringEnabled.hashCode()); result = prime * result + ((monitoringEnabled == null) ? 0 : monitoringEnabled.hashCode());
result = prime * result + ((ramdiskId == null) ? 0 : ramdiskId.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 + Arrays.hashCode(userData); result = prime * result + Arrays.hashCode(userData);
return result; return result;
} }
@ -294,11 +343,6 @@ public class LaunchSpecification {
return false; return false;
} else if (!blockDeviceMappings.equals(other.blockDeviceMappings)) } else if (!blockDeviceMappings.equals(other.blockDeviceMappings))
return false; return false;
if (groupIds == null) {
if (other.groupIds != null)
return false;
} else if (!groupIds.equals(other.groupIds))
return false;
if (imageId == null) { if (imageId == null) {
if (other.imageId != null) if (other.imageId != null)
return false; return false;
@ -329,6 +373,21 @@ public class LaunchSpecification {
return false; return false;
} else if (!ramdiskId.equals(other.ramdiskId)) } else if (!ramdiskId.equals(other.ramdiskId))
return false; 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 (!Arrays.equals(userData, other.userData)) if (!Arrays.equals(userData, other.userData))
return false; return false;
return true; return true;
@ -341,9 +400,10 @@ public class LaunchSpecification {
@Override @Override
public String toString() { public String toString() {
return "[instanceType=" + instanceType + ", imageId=" + imageId + ", kernelId=" + kernelId + ", ramdiskId=" return "[instanceType=" + instanceType + ", imageId=" + imageId + ", kernelId=" + kernelId + ", ramdiskId="
+ ramdiskId + ", availabilityZone=" + availabilityZone + ", keyName=" + keyName + ", groupIds=" + groupIds + ramdiskId + ", availabilityZone=" + availabilityZone + ", keyName=" + keyName
+ ", blockDeviceMappings=" + blockDeviceMappings + ", monitoringEnabled=" + monitoringEnabled + ", securityGroupIdToNames=" + securityGroupIdToNames + ", blockDeviceMappings=" + blockDeviceMappings
+ ", userData=" + (userData != null) + "]"; + ", securityGroupIds=" + securityGroupIds + ", securityGroupNames=" + securityGroupNames
+ ", monitoringEnabled=" + monitoringEnabled + ", userData=" + Arrays.toString(userData) + "]";
} }
} }

View File

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Date; import java.util.Date;
import javax.annotation.Nullable;
import com.google.common.base.CaseFormat; import com.google.common.base.CaseFormat;
/** /**
@ -36,6 +38,7 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
public static class Builder { public static class Builder {
private String region; private String region;
private String availabilityZoneGroup; private String availabilityZoneGroup;
private String launchedAvailabilityZone;
private Date createTime; private Date createTime;
private String faultCode; private String faultCode;
private String faultMessage; private String faultMessage;
@ -53,6 +56,7 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
public Builder clear() { public Builder clear() {
this.region = null; this.region = null;
this.availabilityZoneGroup = null; this.availabilityZoneGroup = null;
this.launchedAvailabilityZone = null;
this.createTime = null; this.createTime = null;
this.faultCode = null; this.faultCode = null;
this.faultMessage = null; this.faultMessage = null;
@ -79,6 +83,11 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
return this; return this;
} }
public Builder launchedAvailabilityZone(String launchedAvailabilityZone) {
this.launchedAvailabilityZone = launchedAvailabilityZone;
return this;
}
public Builder createTime(Date createTime) { public Builder createTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
return this; return this;
@ -145,8 +154,9 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
} }
public SpotInstanceRequest build() { public SpotInstanceRequest build() {
return new SpotInstanceRequest(region, availabilityZoneGroup, createTime, faultCode, faultMessage, instanceId, return new SpotInstanceRequest(region, availabilityZoneGroup, launchedAvailabilityZone, createTime, faultCode,
launchGroup, launchSpecification, productDescription, id, spotPrice, state, type, validFrom, validUntil); faultMessage, instanceId, launchGroup, launchSpecification, productDescription, id, spotPrice, state,
type, validFrom, validUntil);
} }
} }
@ -194,6 +204,7 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
private final String region; private final String region;
private final String availabilityZoneGroup; private final String availabilityZoneGroup;
private final String launchedAvailabilityZone;
private final Date createTime; private final Date createTime;
private final String faultCode; private final String faultCode;
private final String faultMessage; private final String faultMessage;
@ -208,11 +219,13 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
private final Date validFrom; private final Date validFrom;
private final Date validUntil; private final Date validUntil;
public SpotInstanceRequest(String region, String availabilityZoneGroup, Date createTime, String faultCode, public SpotInstanceRequest(String region, String availabilityZoneGroup, @Nullable String launchedAvailabilityZone,
String faultMessage, String instanceId, String launchGroup, LaunchSpecification launchSpecification, Date createTime, String faultCode, String faultMessage, String instanceId, String launchGroup,
String productDescription, String id, float spotPrice, State state, Type type, Date validFrom, Date validUntil) { LaunchSpecification launchSpecification, String productDescription, String id, float spotPrice, State state,
Type type, Date validFrom, Date validUntil) {
this.region = checkNotNull(region, "region"); this.region = checkNotNull(region, "region");
this.availabilityZoneGroup = availabilityZoneGroup; this.availabilityZoneGroup = availabilityZoneGroup;
this.launchedAvailabilityZone = launchedAvailabilityZone;
this.createTime = createTime; this.createTime = createTime;
this.faultCode = faultCode; this.faultCode = faultCode;
this.faultMessage = faultMessage; this.faultMessage = faultMessage;
@ -239,6 +252,10 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
return availabilityZoneGroup; return availabilityZoneGroup;
} }
public String getLaunchedAvailabilityZone() {
return launchedAvailabilityZone;
}
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
@ -303,9 +320,11 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode()); result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode());
result = prime * result + ((launchGroup == null) ? 0 : launchGroup.hashCode()); result = prime * result + ((launchGroup == null) ? 0 : launchGroup.hashCode());
result = prime * result + ((launchSpecification == null) ? 0 : launchSpecification.hashCode()); result = prime * result + ((launchSpecification == null) ? 0 : launchSpecification.hashCode());
result = prime * result + ((launchedAvailabilityZone == null) ? 0 : launchedAvailabilityZone.hashCode());
result = prime * result + ((productDescription == null) ? 0 : productDescription.hashCode()); result = prime * result + ((productDescription == null) ? 0 : productDescription.hashCode());
result = prime * result + ((region == null) ? 0 : region.hashCode()); result = prime * result + ((region == null) ? 0 : region.hashCode());
result = prime * result + Float.floatToIntBits(spotPrice); result = prime * result + Float.floatToIntBits(spotPrice);
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((validFrom == null) ? 0 : validFrom.hashCode()); result = prime * result + ((validFrom == null) ? 0 : validFrom.hashCode());
result = prime * result + ((validUntil == null) ? 0 : validUntil.hashCode()); result = prime * result + ((validUntil == null) ? 0 : validUntil.hashCode());
@ -361,6 +380,11 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
return false; return false;
} else if (!launchSpecification.equals(other.launchSpecification)) } else if (!launchSpecification.equals(other.launchSpecification))
return false; return false;
if (launchedAvailabilityZone == null) {
if (other.launchedAvailabilityZone != null)
return false;
} else if (!launchedAvailabilityZone.equals(other.launchedAvailabilityZone))
return false;
if (productDescription == null) { if (productDescription == null) {
if (other.productDescription != null) if (other.productDescription != null)
return false; return false;
@ -373,6 +397,8 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
return false; return false;
if (Float.floatToIntBits(spotPrice) != Float.floatToIntBits(other.spotPrice)) if (Float.floatToIntBits(spotPrice) != Float.floatToIntBits(other.spotPrice))
return false; return false;
if (state != other.state)
return false;
if (type != other.type) if (type != other.type)
return false; return false;
if (validFrom == null) { if (validFrom == null) {
@ -390,11 +416,12 @@ public class SpotInstanceRequest implements Comparable<SpotInstanceRequest> {
@Override @Override
public String toString() { public String toString() {
return "[region=" + region + ", id=" + id + ", spotPrice=" + spotPrice + ", state=" + state return "[region=" + region + ", availabilityZoneGroup=" + availabilityZoneGroup + ", launchedAvailabilityZone="
+ ", availabilityZoneGroup=" + availabilityZoneGroup + ", createTime=" + createTime + ", faultCode=" + launchedAvailabilityZone + ", createTime=" + createTime + ", faultCode=" + faultCode + ", faultMessage="
+ faultCode + ", type=" + type + ", instanceId=" + instanceId + ", launchGroup=" + launchGroup + faultMessage + ", instanceId=" + instanceId + ", launchGroup=" + launchGroup + ", launchSpecification="
+ ", launchSpecification=" + launchSpecification + ", productDescription=" + productDescription + launchSpecification + ", productDescription=" + productDescription + ", id=" + id + ", spotPrice="
+ ", validFrom=" + validFrom + ", validUntil=" + validUntil + "]"; + spotPrice + ", state=" + state + ", type=" + type + ", validFrom=" + validFrom + ", validUntil="
+ validUntil + "]";
} }
@Override @Override

View File

@ -49,7 +49,7 @@ public class SpotInstanceRequestToAWSRunningInstance implements Function<SpotIns
builder.availabilityZone(spec.getAvailabilityZone()); builder.availabilityZone(spec.getAvailabilityZone());
// TODO convert // TODO convert
// builder.devices(spec.getBlockDeviceMappings()); // builder.devices(spec.getBlockDeviceMappings());
builder.groupIds(spec.getGroupIds()); builder.groupIds(spec.getSecurityGroupNames());
builder.imageId(spec.getImageId()); builder.imageId(spec.getImageId());
builder.instanceType(spec.getInstanceType()); builder.instanceType(spec.getInstanceType());
builder.kernelId(spec.getKernelId()); builder.kernelId(spec.getKernelId());

View File

@ -81,8 +81,30 @@ public class AWSRunInstancesOptions extends RunInstancesOptions {
return this; return this;
} }
public AWSRunInstancesOptions withSecurityGroupId(String securityGroup) {
return withSecurityGroupIds(securityGroup);
}
public AWSRunInstancesOptions withSecurityGroupIds(Iterable<String> securityGroupIds) {
launchSpecificationBuilder.securityGroupIds(securityGroupIds);
indexFormValuesWithPrefix("SecurityGroupId", securityGroupIds);
return this;
}
public AWSRunInstancesOptions withSecurityGroupIds(String... securityGroupIds) {
return withSecurityGroupIds(ImmutableSet.copyOf(securityGroupIds));
}
public static class Builder extends RunInstancesOptions.Builder { public static class Builder extends RunInstancesOptions.Builder {
/**
* @see AWSRunInstancesOptions#withSecurityGroupId(String)
*/
public static AWSRunInstancesOptions withSecurityGroupId(String securityGroup) {
AWSRunInstancesOptions options = new AWSRunInstancesOptions();
return options.withSecurityGroupId(securityGroup);
}
/** /**
* @see AWSRunInstancesOptions#inPlacementGroup(String) * @see AWSRunInstancesOptions#inPlacementGroup(String)
*/ */
@ -191,19 +213,19 @@ public class AWSRunInstancesOptions extends RunInstancesOptions {
@Override @Override
public AWSRunInstancesOptions withSecurityGroup(String securityGroup) { public AWSRunInstancesOptions withSecurityGroup(String securityGroup) {
launchSpecificationBuilder.groupId(securityGroup); launchSpecificationBuilder.securityGroupName(securityGroup);
return AWSRunInstancesOptions.class.cast(super.withSecurityGroup(securityGroup)); return AWSRunInstancesOptions.class.cast(super.withSecurityGroup(securityGroup));
} }
@Override @Override
public AWSRunInstancesOptions withSecurityGroups(Iterable<String> securityGroups) { public AWSRunInstancesOptions withSecurityGroups(Iterable<String> securityGroups) {
launchSpecificationBuilder.groupIds(securityGroups); launchSpecificationBuilder.securityGroupNames(securityGroups);
return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups)); return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups));
} }
@Override @Override
public AWSRunInstancesOptions withSecurityGroups(String... securityGroups) { public AWSRunInstancesOptions withSecurityGroups(String... securityGroups) {
launchSpecificationBuilder.groupIds(ImmutableSet.copyOf(securityGroups)); launchSpecificationBuilder.securityGroupNames(ImmutableSet.copyOf(securityGroups));
return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups)); return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups));
} }

View File

@ -0,0 +1,65 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.options;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
/**
* Contains options supported in the Form API for the CreateSecurityGroup
* operation. <h2>
* Usage</h2> The recommended way to instantiate a CreateSecurityGroupOptions
* object is to statically import CreateSecurityGroupOptions.Builder.* and
* invoke a static creation method followed by an instance mutator (if needed):
* <p/>
* <code>
* import static org.jclouds.aws.ec2.options.CreateSecurityGroupOptions.Builder.*
* <p/>
* AWSEC2Client connection = // get connection
* group = connection.getAMIServices().createSecurityGroup(vpcId("123125").noReboot());
* <code>
*
* @author Adrian Cole
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-form-CreateSecurityGroup.html"
* />
*/
public class CreateSecurityGroupOptions extends BaseEC2RequestOptions {
/**
* ID of the VPC.
*/
public CreateSecurityGroupOptions vpcId(String vpcId) {
formParameters.put("VpcId", checkNotNull(vpcId, "vpcId"));
return this;
}
public static class Builder {
/**
* @see CreateSecurityGroupOptions#vpcId(String )
*/
public static CreateSecurityGroupOptions vpcId(String vpcId) {
CreateSecurityGroupOptions options = new CreateSecurityGroupOptions();
return options.vpcId(vpcId);
}
}
}

View File

@ -0,0 +1,147 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import static org.jclouds.aws.reference.FormParameters.VERSION;
import java.util.Set;
import javax.annotation.Nullable;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.aws.ec2.AWSEC2AsyncClient;
import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
import org.jclouds.aws.ec2.xml.CreateSecurityGroupResponseHandler;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindGroupIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindIpPermissionToIndexedFormParams;
import org.jclouds.ec2.binders.BindIpPermissionsToIndexedFormParams;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.services.SecurityGroupAsyncClient;
import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
import com.google.common.annotations.Beta;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 SecurityGroup Services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@FormParams(keys = VERSION, values = AWSEC2AsyncClient.VERSION)
@VirtualHost
@Beta
public interface AWSSecurityGroupAsyncClient extends SecurityGroupAsyncClient {
/**
* @see AWSSecurityGroupClient#createSecurityGroupInRegion
*/
@POST
@Path("/")
@XMLResponseParser(CreateSecurityGroupResponseHandler.class)
@FormParams(keys = ACTION, values = "CreateSecurityGroup")
ListenableFuture<String> createSecurityGroupInRegionAndReturnId(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String name, @FormParam("GroupDescription") String description,
CreateSecurityGroupOptions... options);
/**
* @see AWSSecurityGroupClient#authorizeSecurityGroupIngressInRegion(String,
* String,IpPermission)
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
/**
* @see AWSSecurityGroupClient#authorizeSecurityGroupIngressInRegion(String,
* String,Iterable)
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupId") String groupId,
@BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
/**
* @see AWSSecurityGroupClient#revokeSecurityGroupIngressInRegion(@Nullable
* Region, String,IpPermission)
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
/**
* @see AWSSecurityGroupClient#revokeSecurityGroupIngressInRegion(@Nullable
* Region, String,Iterable)
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupId") String groupId,
@BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
/**
* @see AWSSecurityGroupClient#deleteSecurityGroupInRegionById
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteSecurityGroup")
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteSecurityGroupInRegionById(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupId") String name);
/**
* @see AWSSecurityGroupClient#describeSecurityGroupsInRegionById
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSecurityGroups")
@XMLResponseParser(DescribeSecurityGroupsResponseHandler.class)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<SecurityGroup>> describeSecurityGroupsInRegionById(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindGroupIdsToIndexedFormParams.class) String... securityGroupNames);
}

View File

@ -0,0 +1,58 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.services;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
import org.jclouds.concurrent.Timeout;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.services.SecurityGroupClient;
import com.google.common.annotations.Beta;
/**
* Provides access to EC2 via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@Beta
@Timeout(duration = 90, timeUnit = TimeUnit.SECONDS)
public interface AWSSecurityGroupClient extends SecurityGroupClient {
String createSecurityGroupInRegionAndReturnId(@Nullable String region, String name, String desc,
CreateSecurityGroupOptions... options);
void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupId, IpPermission perm);
void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupId, Iterable<IpPermission> perm);
void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupId, IpPermission perm);
void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupId, Iterable<IpPermission> perm);
Set<SecurityGroup> describeSecurityGroupsInRegionById(@Nullable String region, String... securityGroupIds);
void deleteSecurityGroupInRegionById(@Nullable String region, String name);
}

View File

@ -22,10 +22,10 @@ import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.jclouds.aws.ec2.domain.AWSRunningInstance;
import org.jclouds.date.DateService; import org.jclouds.date.DateService;
import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance; import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.domain.RunningInstance.Builder;
import org.jclouds.location.Region; import org.jclouds.location.Region;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
@ -40,12 +40,12 @@ import com.google.inject.Provider;
* @see <a href="http: /> * @see <a href="http: />
*/ */
public class AWSDescribeInstancesResponseHandler extends public class AWSDescribeInstancesResponseHandler extends
BaseAWSReservationHandler<Set<Reservation<? extends RunningInstance>>> { BaseAWSReservationHandler<Set<Reservation<? extends RunningInstance>>> {
private Set<Reservation<? extends RunningInstance>> reservations = Sets.newLinkedHashSet(); private Set<Reservation<? extends RunningInstance>> reservations = Sets.newLinkedHashSet();
@Inject @Inject
AWSDescribeInstancesResponseHandler(DateService dateService, @Region String defaultRegion, AWSDescribeInstancesResponseHandler(DateService dateService, @Region String defaultRegion,
Provider<Builder> builderProvider) { Provider<AWSRunningInstance.Builder> builderProvider) {
super(dateService, defaultRegion, builderProvider); super(dateService, defaultRegion, builderProvider);
} }
@ -66,5 +66,8 @@ public class AWSDescribeInstancesResponseHandler extends
super.inItem(); super.inItem();
} }
} }
protected boolean endOfInstanceItem() {
return itemDepth == 2 && inInstancesSet;
}
} }

View File

@ -20,10 +20,10 @@ package org.jclouds.aws.ec2.xml;
import javax.inject.Inject; import javax.inject.Inject;
import org.jclouds.aws.ec2.domain.AWSRunningInstance;
import org.jclouds.date.DateService; import org.jclouds.date.DateService;
import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance; import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.domain.RunningInstance.Builder;
import org.jclouds.location.Region; import org.jclouds.location.Region;
import com.google.inject.Provider; import com.google.inject.Provider;
@ -39,7 +39,8 @@ import com.google.inject.Provider;
public class AWSRunInstancesResponseHandler extends BaseAWSReservationHandler<Reservation<? extends RunningInstance>> { public class AWSRunInstancesResponseHandler extends BaseAWSReservationHandler<Reservation<? extends RunningInstance>> {
@Inject @Inject
AWSRunInstancesResponseHandler(DateService dateService, @Region String defaultRegion, Provider<Builder> builderProvider) { AWSRunInstancesResponseHandler(DateService dateService, @Region String defaultRegion,
Provider<AWSRunningInstance.Builder> builderProvider) {
super(dateService, defaultRegion, builderProvider); super(dateService, defaultRegion, builderProvider);
} }
@ -48,4 +49,7 @@ public class AWSRunInstancesResponseHandler extends BaseAWSReservationHandler<Re
return newReservation(); return newReservation();
} }
protected boolean endOfInstanceItem() {
return itemDepth == 1 && inInstancesSet;
}
} }

View File

@ -18,53 +18,227 @@
*/ */
package org.jclouds.aws.ec2.xml; package org.jclouds.aws.ec2.xml;
import static org.jclouds.util.SaxUtils.currentOrNull;
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.jclouds.aws.ec2.domain.AWSRunningInstance; import org.jclouds.aws.ec2.domain.AWSRunningInstance;
import org.jclouds.aws.ec2.domain.MonitoringState; import org.jclouds.aws.ec2.domain.MonitoringState;
import org.jclouds.aws.util.AWSUtils;
import org.jclouds.date.DateService; import org.jclouds.date.DateService;
import org.jclouds.ec2.domain.RunningInstance.Builder; import org.jclouds.ec2.domain.Attachment;
import org.jclouds.ec2.xml.BaseReservationHandler; import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.InstanceState;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RootDeviceType;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
import org.jclouds.location.Region;
import org.jclouds.logging.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.Provider; import com.google.inject.Provider;
/** /**
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
public abstract class BaseAWSReservationHandler<T> extends BaseReservationHandler<T> { public abstract class BaseAWSReservationHandler<T> extends HandlerForGeneratedRequestWithResult<T> {
public BaseAWSReservationHandler(DateService dateService, String defaultRegion, Provider<Builder> builderProvider) { @Resource
super(dateService, defaultRegion, builderProvider); protected Logger logger = Logger.NULL;
protected final DateService dateService;
protected final String defaultRegion;
protected final Provider<AWSRunningInstance.Builder> builderProvider;
@Inject
public BaseAWSReservationHandler(DateService dateService, @Region String defaultRegion,
Provider<AWSRunningInstance.Builder> builderProvider) {
this.dateService = dateService;
this.defaultRegion = defaultRegion;
this.builderProvider = builderProvider;
this.builder = builderProvider.get();
} }
protected String currentOrNull() { protected StringBuilder currentText = new StringBuilder();
String returnVal = currentText.toString().trim();
return returnVal.equals("") ? null : returnVal; protected AWSRunningInstance.Builder builder;
protected int itemDepth;
boolean inInstancesSet;
// attachments
private String volumeId;
private Attachment.Status attachmentStatus;
private Date attachTime;
private boolean deleteOnTermination;
private String deviceName;
// reservation stuff
private String groupId;
private Map<String, String> reservationGroupIdToNames = Maps.newLinkedHashMap();
private String ownerId;
private String requesterId;
private String reservationId;
private Set<RunningInstance> instances = Sets.newLinkedHashSet();
protected int depth = 0;
private boolean inPlacement;
@Override
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
if (equalsOrSuffix(qName, "item")) {
itemDepth++;
} else if (equalsOrSuffix(qName, "instancesSet")) {
inInstancesSet = true;
} else if (equalsOrSuffix(qName, "placement")) {
inPlacement = true;
}
} }
public void endElement(String uri, String name, String qName) { public void endElement(String uri, String name, String qName) {
if (qName.equals("state")) { if (equalsOrSuffix(qName, "item")) {
builder().monitoringState(MonitoringState.fromValue(currentOrNull())); inItem();
} else if (qName.equals("groupName")) { itemDepth--;
builder().placementGroup(currentOrNull()); } else if (equalsOrSuffix(qName, "state")) {
} else if (qName.equals("subnetId")) { builder.monitoringState(MonitoringState.fromValue(currentOrNull(currentText)));
builder().subnetId(currentOrNull()); } else if (equalsOrSuffix(qName, "groupId")) {
} else if (qName.equals("spotInstanceRequestId")) { groupId = currentOrNull(currentText);
builder().spotInstanceRequestId(currentOrNull()); } else if (equalsOrSuffix(qName, "groupName") && inPlacement) {
} else if (qName.equals("vpcId")) { builder.placementGroup(currentOrNull(currentText));
builder().vpcId(currentOrNull()); } else if (equalsOrSuffix(qName, "groupName")) {
} else if (qName.equals("productCode")) { switch (itemDepth) {
builder().productCode(currentOrNull()); case 2:
builder.securityGroupIdToName(groupId, currentOrNull(currentText));
break;
case 3:
reservationGroupIdToNames.put(groupId, currentOrNull(currentText));
break;
}
groupId = null;
} else if (equalsOrSuffix(qName, "subnetId")) {
builder.subnetId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "spotInstanceRequestId")) {
builder.spotInstanceRequestId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "vpcId")) {
builder.vpcId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "productCode")) {
builder.productCode(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "instancesSet")) {
inInstancesSet = false;
} else if (equalsOrSuffix(qName, "placement")) {
inPlacement = false;
} else if (equalsOrSuffix(qName, "ownerId")) {
ownerId = currentOrNull(currentText);
} else if (equalsOrSuffix(qName, "requesterId")) {
requesterId = currentOrNull(currentText);
} else if (equalsOrSuffix(qName, "reservationId")) {
reservationId = currentOrNull(currentText);
} else if (equalsOrSuffix(qName, "amiLaunchIndex")) {
builder.amiLaunchIndex(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "dnsName")) {
builder.dnsName(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "imageId")) {
builder.imageId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "instanceId")) {
builder.instanceId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "name")) {
builder.instanceState(InstanceState.fromValue(currentOrNull(currentText)));
} else if (equalsOrSuffix(qName, "instanceType")) {
builder.instanceType(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "ipAddress")) {
builder.ipAddress(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "kernelId")) {
builder.kernelId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "keyName")) {
builder.keyName(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "launchTime")) {
builder.launchTime(parseDate());
} else if (equalsOrSuffix(qName, "availabilityZone")) {
builder.availabilityZone(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "virtualizationType")) {
builder.virtualizationType(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "platform")) {
builder.platform(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "privateDnsName")) {
builder.privateDnsName(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "privateIpAddress")) {
builder.privateIpAddress(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "ramdiskId")) {
builder.ramdiskId(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "reason")) {
builder.reason(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "rootDeviceType")) {
builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull(currentText)));
} else if (equalsOrSuffix(qName, "rootDeviceName")) {
builder.rootDeviceName(currentOrNull(currentText));
} else if (equalsOrSuffix(qName, "deviceName")) {
deviceName = currentOrNull(currentText);
} else if (equalsOrSuffix(qName, "volumeId")) {
volumeId = currentOrNull(currentText);
} else if (equalsOrSuffix(qName, "status")) {
attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
} else if (equalsOrSuffix(qName, "attachTime")) {
attachTime = dateService.iso8601DateParse(currentText.toString().trim());
} else if (equalsOrSuffix(qName, "deleteOnTermination")) {
deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
} else if (equalsOrSuffix(qName, "ebs")) {
builder.device(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination));
this.deviceName = null;
this.volumeId = null;
this.attachmentStatus = null;
this.attachTime = null;
this.deleteOnTermination = true;
} }
super.endElement(uri, name, qName); currentText = new StringBuilder();
} }
@Override protected Date parseDate() {
protected AWSRunningInstance.Builder builder() { return dateService.iso8601DateParse(currentOrNull(currentText));
return AWSRunningInstance.Builder.class.cast(builder);
} }
protected void inItem() {
if (endOfInstanceItem()) {
refineBuilderBeforeAddingInstance();
instances.add(builder.build());
builder = builderProvider.get();
}
}
protected void refineBuilderBeforeAddingInstance() {
String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
builder.region((region == null) ? defaultRegion : region);
}
protected abstract boolean endOfInstanceItem();
public void characters(char ch[], int start, int length) { public void characters(char ch[], int start, int length) {
super.characters(ch, start, length); currentText.append(ch, start, length);
}
protected Reservation<? extends RunningInstance> newReservation() {
String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
if (region == null)
region = defaultRegion;
Reservation<? extends RunningInstance> info = new Reservation<RunningInstance>(region,
reservationGroupIdToNames.values(), instances, ownerId, requesterId, reservationId);
this.reservationGroupIdToNames = Maps.newLinkedHashMap();
this.instances = Sets.newLinkedHashSet();
this.ownerId = null;
this.requesterId = null;
this.reservationId = null;
return info;
} }
} }

View File

@ -0,0 +1,46 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.xml;
import org.jclouds.http.functions.ParseSax;
/**
*
* @author Adrian Cole
*/
public class CreateSecurityGroupResponseHandler extends ParseSax.HandlerWithResult<String> {
private StringBuilder currentText = new StringBuilder();
String id;
public String getResult() {
return id;
}
public void endElement(String uri, String name, String qName) {
if (qName.equals("groupId")) {
id = currentText.toString().trim();
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -62,6 +62,8 @@ public class LaunchSpecificationHandler extends HandlerForGeneratedRequestWithRe
private boolean inBlockDeviceMapping; private boolean inBlockDeviceMapping;
private String groupId;
public void startElement(String uri, String name, String qName, Attributes attrs) { public void startElement(String uri, String name, String qName, Attributes attrs) {
if (qName.equals("blockDeviceMapping")) { if (qName.equals("blockDeviceMapping")) {
inBlockDeviceMapping = true; inBlockDeviceMapping = true;
@ -96,7 +98,10 @@ public class LaunchSpecificationHandler extends HandlerForGeneratedRequestWithRe
if (deleteOnTermination != null) if (deleteOnTermination != null)
blockDeviceMappingBuilder.deleteOnTermination(Boolean.parseBoolean(deleteOnTermination)); blockDeviceMappingBuilder.deleteOnTermination(Boolean.parseBoolean(deleteOnTermination));
} else if (qName.equals("groupId")) { } else if (qName.equals("groupId")) {
builder.groupId(currentOrNull()); groupId = currentOrNull();
} else if (qName.equals("groupName")) {
builder.securityGroupIdToName(groupId, currentOrNull());
groupId = null;
} else if (qName.equals("imageId")) { } else if (qName.equals("imageId")) {
builder.imageId(currentOrNull()); builder.imageId(currentOrNull());
} else if (qName.equals("instanceType")) { } else if (qName.equals("instanceType")) {

View File

@ -85,6 +85,8 @@ public class SpotInstanceHandler extends ParseSax.HandlerForGeneratedRequestWith
builder.id(currentOrNull()); builder.id(currentOrNull());
} else if (qName.equals("instanceId")) { } else if (qName.equals("instanceId")) {
builder.instanceId(currentOrNull()); builder.instanceId(currentOrNull());
} else if (qName.equals("launchedAvailabilityZone")) {
builder.launchedAvailabilityZone(currentOrNull());
} else if (qName.equals("availabilityZoneGroup")) { } else if (qName.equals("availabilityZoneGroup")) {
builder.availabilityZoneGroup(currentOrNull()); builder.availabilityZoneGroup(currentOrNull());
} else if (qName.equals("launchGroup")) { } else if (qName.equals("launchGroup")) {

View File

@ -56,4 +56,13 @@ public class BindLaunchSpecificationToFormParamsTest {
"LaunchSpecification.ImageId", "ami-123", "LaunchSpecification.UserData", "LaunchSpecification.ImageId", "ami-123", "LaunchSpecification.UserData",
Base64.encodeBytes("hello".getBytes()))); Base64.encodeBytes("hello".getBytes())));
} }
@Test
public void testApplyWithSecurityId() throws UnknownHostException {
LaunchSpecification spec = LaunchSpecification.builder().instanceType(InstanceType.T1_MICRO).imageId("ami-123")
.securityGroupId("sid-foo").build();
assertEquals(binder.apply(spec), ImmutableMap.of("LaunchSpecification.InstanceType", "t1.micro",
"LaunchSpecification.ImageId", "ami-123", "LaunchSpecification.SecurityGroupId.1", "sid-foo"));
}
} }

View File

@ -22,8 +22,10 @@ import static org.testng.Assert.assertEquals;
import java.util.Set; import java.util.Set;
import org.jclouds.aws.ec2.AWSEC2Client;
import org.jclouds.aws.ec2.domain.AWSRunningInstance; import org.jclouds.aws.ec2.domain.AWSRunningInstance;
import org.jclouds.aws.ec2.domain.MonitoringState; import org.jclouds.aws.ec2.domain.MonitoringState;
import org.jclouds.aws.ec2.services.AWSSecurityGroupClient;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.predicates.NodePredicates;
@ -35,7 +37,7 @@ import org.jclouds.ec2.domain.KeyPair;
import org.jclouds.ec2.domain.SecurityGroup; import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.services.InstanceClient; import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.services.KeyPairClient; import org.jclouds.ec2.services.KeyPairClient;
import org.jclouds.ec2.services.SecurityGroupClient; import org.jclouds.ec2.util.IpPermissions;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ImmutableSortedSet;
@ -57,7 +59,7 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest {
@Override @Override
@Test(enabled = true, dependsOnMethods = "testCompareSizes") @Test(enabled = true, dependsOnMethods = "testCompareSizes")
public void testExtendedOptionsAndLogin() throws Exception { public void testExtendedOptionsAndLogin() throws Exception {
SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) AWSSecurityGroupClient securityGroupClient = AWSEC2Client.class.cast(context.getProviderSpecificContext().getApi())
.getSecurityGroupServices(); .getSecurityGroupServices();
KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi())
@ -72,7 +74,6 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest {
// Date before = new Date(); // Date before = new Date();
options.as(AWSEC2TemplateOptions.class).securityGroups(group);
options.as(AWSEC2TemplateOptions.class).keyPair(group); options.as(AWSEC2TemplateOptions.class).keyPair(group);
options.as(AWSEC2TemplateOptions.class).enableMonitoring(); options.as(AWSEC2TemplateOptions.class).enableMonitoring();
options.as(AWSEC2TemplateOptions.class).spotPrice(0.3f); options.as(AWSEC2TemplateOptions.class).spotPrice(0.3f);
@ -83,8 +84,12 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest {
// create a security group that allows ssh in so that our scripts later // create a security group that allows ssh in so that our scripts later
// will work // will work
securityGroupClient.createSecurityGroupInRegion(null, group, group); String groupId = securityGroupClient.createSecurityGroupInRegionAndReturnId(null, group, group);
securityGroupClient.authorizeSecurityGroupIngressInRegion(null, group, IpProtocol.TCP, 22, 22, "0.0.0.0/0");
securityGroupClient.authorizeSecurityGroupIngressInRegion(null, groupId,
IpPermissions.permit(IpProtocol.TCP).port(22));
options.as(AWSEC2TemplateOptions.class).securityGroupIds(groupId);
// create a keypair to pass in as well // create a keypair to pass in as well
KeyPair result = keyPairClient.createKeyPairInRegion(null, group); KeyPair result = keyPairClient.createKeyPairInRegion(null, group);

View File

@ -85,7 +85,7 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
.build(); .build();
assert (template.getImage().getProviderId().startsWith("ami-")) : template; assert (template.getImage().getProviderId().startsWith("ami-")) : template;
assertEquals(template.getImage().getOperatingSystem().getVersion(), "11.04"); assertEquals(template.getImage().getOperatingSystem().getVersion(), "11.10");
assertEquals(template.getImage().getOperatingSystem().is64Bit(), false); assertEquals(template.getImage().getOperatingSystem().is64Bit(), false);
assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
@ -146,7 +146,7 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
fastestTemplate = context.getComputeService().templateBuilder().fastest().build(); fastestTemplate = context.getComputeService().templateBuilder().fastest().build();
assert (fastestTemplate.getImage().getProviderId().startsWith("ami-")) : fastestTemplate; assert (fastestTemplate.getImage().getProviderId().startsWith("ami-")) : fastestTemplate;
assertEquals(fastestTemplate.getHardware().getProviderId(), InstanceType.CC1_4XLARGE); assertEquals(fastestTemplate.getHardware().getProviderId(), InstanceType.CC1_4XLARGE);
assertEquals(fastestTemplate.getImage().getOperatingSystem().getVersion(), "11.04"); assertEquals(fastestTemplate.getImage().getOperatingSystem().getVersion(), "11.10");
assertEquals(fastestTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(fastestTemplate.getImage().getOperatingSystem().is64Bit(), true);
assertEquals(fastestTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(fastestTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
assertEquals(fastestTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); assertEquals(fastestTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs");

View File

@ -25,6 +25,7 @@ import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.inboundP
import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.installPrivateKey; import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.installPrivateKey;
import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.keyPair; import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.keyPair;
import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.noKeyPair; import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.noKeyPair;
import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroupIds;
import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroups; import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroups;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
@ -37,7 +38,8 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
/** /**
* Tests possible uses of AWSEC2TemplateOptions and AWSEC2TemplateOptions.Builder.* * Tests possible uses of AWSEC2TemplateOptions and
* AWSEC2TemplateOptions.Builder.*
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@ -48,6 +50,63 @@ public class AWSEC2TemplateOptionsTest {
assertEquals(options.as(AWSEC2TemplateOptions.class), options); assertEquals(options.as(AWSEC2TemplateOptions.class), options);
} }
@Test(expectedExceptions = IllegalArgumentException.class)
public void testsecurityGroupIdsIterableBadFormat() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds(ImmutableSet.of("groupId1", ""));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testsecurityGroupIdsIterableEmptyNotOk() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds(ImmutableSet.<String> of());
}
@Test
public void testsecurityGroupIdsIterable() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds(ImmutableSet.of("groupId1", "groupId2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("groupId1", "groupId2"));
}
@Test
public void testsecurityGroupIdsIterableStatic() {
AWSEC2TemplateOptions options = securityGroupIds(ImmutableSet.of("groupId1", "groupId2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("groupId1", "groupId2"));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testsecurityGroupIdsVarArgsBadFormat() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds("mygroupId", "");
}
@Test
public void testsecurityGroupIdsVarArgs() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds("groupId1", "groupId2");
assertEquals(options.getGroupIds(), ImmutableSet.of("groupId1", "groupId2"));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testsecurityGroupIdsVarArgsEmptyNotOk() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroupIds();
}
@Test
public void testDefaultGroupIdsVarArgsEmpty() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
assertEquals(options.getGroupIds(), ImmutableSet.of());
}
@Test
public void testsecurityGroupIdsVarArgsStatic() {
AWSEC2TemplateOptions options = securityGroupIds("groupId1", "groupId2");
assertEquals(options.getGroupIds(), ImmutableSet.of("groupId1", "groupId2"));
}
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)
public void testsecurityGroupsIterableBadFormat() { public void testsecurityGroupsIterableBadFormat() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
@ -64,14 +123,14 @@ public class AWSEC2TemplateOptionsTest {
public void testsecurityGroupsIterable() { public void testsecurityGroupsIterable() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroups(ImmutableSet.of("group1", "group2")); options.securityGroups(ImmutableSet.of("group1", "group2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test @Test
public void testsecurityGroupsIterableStatic() { public void testsecurityGroupsIterableStatic() {
AWSEC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", "group2")); AWSEC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", "group2"));
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)
@ -84,8 +143,7 @@ public class AWSEC2TemplateOptionsTest {
public void testsecurityGroupsVarArgs() { public void testsecurityGroupsVarArgs() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
options.securityGroups("group1", "group2"); options.securityGroups("group1", "group2");
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)
@ -97,13 +155,13 @@ public class AWSEC2TemplateOptionsTest {
@Test @Test
public void testDefaultGroupsVarArgsEmpty() { public void testDefaultGroupsVarArgsEmpty() {
AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
assertEquals(options.getGroupIds(), ImmutableSet.of()); assertEquals(options.getGroups(), ImmutableSet.of());
} }
@Test @Test
public void testsecurityGroupsVarArgsStatic() { public void testsecurityGroupsVarArgsStatic() {
AWSEC2TemplateOptions options = securityGroups("group1", "group2"); AWSEC2TemplateOptions options = securityGroups("group1", "group2");
assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
} }
@Test(expectedExceptions = IllegalArgumentException.class) @Test(expectedExceptions = IllegalArgumentException.class)

View File

@ -104,6 +104,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getSubnetId()).andReturn(null); expect(options.getSubnetId()).andReturn(null);
expect(options.getUserData()).andReturn(null); expect(options.getUserData()).andReturn(null);
expect(options.isMonitoringEnabled()).andReturn(false); expect(options.isMonitoringEnabled()).andReturn(false);
@ -167,6 +168,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
generatedGroup); generatedGroup);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getSubnetId()).andReturn(null); expect(options.getSubnetId()).andReturn(null);
expect(options.getUserData()).andReturn(null); expect(options.getUserData()).andReturn(null);
expect(options.isMonitoringEnabled()).andReturn(false); expect(options.isMonitoringEnabled()).andReturn(false);
@ -231,6 +233,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
generatedGroup); generatedGroup);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getSubnetId()).andReturn(null); expect(options.getSubnetId()).andReturn(null);
expect(options.getUserData()).andReturn(null); expect(options.getUserData()).andReturn(null);
expect(options.isMonitoringEnabled()).andReturn(false); expect(options.isMonitoringEnabled()).andReturn(false);
@ -290,6 +293,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce();
expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getSubnetId()).andReturn("1"); expect(options.getSubnetId()).andReturn("1");
expect(options.getUserData()).andReturn(null); expect(options.getUserData()).andReturn(null);
expect(options.isMonitoringEnabled()).andReturn(false); expect(options.isMonitoringEnabled()).andReturn(false);
@ -351,6 +355,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getSubnetId()).andReturn(null); expect(options.getSubnetId()).andReturn(null);
expect(options.getUserData()).andReturn("hello".getBytes()); expect(options.getUserData()).andReturn("hello".getBytes());
expect(options.isMonitoringEnabled()).andReturn(false); expect(options.isMonitoringEnabled()).andReturn(false);
@ -588,7 +593,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1; String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1;
Set<String> groupIds = ImmutableSet.<String> of(); Set<String> groupNames = ImmutableSet.<String> of();
int[] ports = new int[] {}; int[] ports = new int[] {};
boolean shouldAuthorizeSelf = true; boolean shouldAuthorizeSelf = true;
boolean groupExisted = false; boolean groupExisted = false;
@ -599,7 +604,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getGroups()).andReturn(groupNames).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -624,7 +630,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1; String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1;
Set<String> groupIds = ImmutableSet.<String> of(); Set<String> groupNames = ImmutableSet.<String> of();
int[] ports = new int[] { 22, 80 }; int[] ports = new int[] { 22, 80 };
boolean shouldAuthorizeSelf = true; boolean shouldAuthorizeSelf = true;
boolean groupExisted = false; boolean groupExisted = false;
@ -635,7 +641,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getGroups()).andReturn(groupNames).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -660,7 +667,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1; String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1;
Set<String> groupIds = ImmutableSet.<String> of(); Set<String> groupNames = ImmutableSet.<String> of();
int[] ports = new int[] {}; int[] ports = new int[] {};
boolean shouldAuthorizeSelf = true; boolean shouldAuthorizeSelf = true;
boolean groupExisted = true; boolean groupExisted = true;
@ -671,7 +678,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getGroups()).andReturn(groupNames).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
@ -694,7 +702,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1; String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1;
Set<String> groupIds = ImmutableSet.<String> of("group1", "group2"); Set<String> groupNames = ImmutableSet.<String> of("group1", "group2");
int[] ports = new int[] {}; int[] ports = new int[] {};
boolean shouldAuthorizeSelf = true; boolean shouldAuthorizeSelf = true;
boolean groupExisted = true; boolean groupExisted = true;
@ -705,7 +713,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class);
// setup expectations // setup expectations
expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of());
expect(options.getGroups()).andReturn(groupNames).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); // note ports, shouldAuthorizeSelf); // note
// this // this
@ -727,6 +736,44 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT
verifyStrategy(strategy); verifyStrategy(strategy);
} }
public void testGetSecurityGroupsForTagAndOptions_reusesGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesExistAndAcceptsUserSuppliedGroupIds() {
// setup constants
String region = Region.AP_SOUTHEAST_1;
String group = "group";
String generatedMarkerGroup = "jclouds#group#" + Region.AP_SOUTHEAST_1;
Set<String> groupNames = ImmutableSet.<String> of();
int[] ports = new int[] {};
boolean shouldAuthorizeSelf = true;
boolean groupExisted = true;
Set<String> returnVal = ImmutableSet.<String> of(generatedMarkerGroup);
// create mocks
CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy();
AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class);
// setup expectations
expect(options.getGroupIds()).andReturn(ImmutableSet.<String>of("group1", "group2"));
expect(options.getGroups()).andReturn(groupNames).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); // note
// this
// works
// since
// there's
// no equals on portsq
expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted);
// replay mocks
replay(options);
replayStrategy(strategy);
// run
assertEquals(strategy.getSecurityGroupsForTagAndOptions(region, group, options), returnVal);
// verify mocks
verify(options);
verifyStrategy(strategy);
}
public void testCreateNewPlacementGroupUnlessUserSpecifiedOtherwise_reusesKeyWhenToldTo() { public void testCreateNewPlacementGroupUnlessUserSpecifiedOtherwise_reusesKeyWhenToldTo() {
// setup constants // setup constants
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;

View File

@ -43,7 +43,7 @@ public class SpotInstanceRequestToAWSRunningInstanceTest {
SpotInstanceRequest input = SpotInstanceRequest.builder().region("us-east-1").id("sir-228e6406") SpotInstanceRequest input = SpotInstanceRequest.builder().region("us-east-1").id("sir-228e6406")
.spotPrice(0.001f).type(SpotInstanceRequest.Type.ONE_TIME).state(SpotInstanceRequest.State.OPEN) .spotPrice(0.001f).type(SpotInstanceRequest.Type.ONE_TIME).state(SpotInstanceRequest.State.OPEN)
.launchSpecification( .launchSpecification(
LaunchSpecification.builder().imageId("ami-595a0a1c").groupId("default").instanceType( LaunchSpecification.builder().imageId("ami-595a0a1c").securityGroupName("default").instanceType(
"m1.large").mapNewVolumeToDevice("/dev/sda1", 1, true).mapEBSSnapshotToDevice( "m1.large").mapNewVolumeToDevice("/dev/sda1", 1, true).mapEBSSnapshotToDevice(
"/dev/sda2", "snap-1ea27576", 1, true).mapEphemeralDeviceToDevice("/dev/sda3", "vre1") "/dev/sda2", "snap-1ea27576", 1, true).mapEphemeralDeviceToDevice("/dev/sda3", "vre1")
.monitoringEnabled(false).build()).createTime( .monitoringEnabled(false).build()).createTime(

View File

@ -25,6 +25,7 @@ import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKer
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKeyName; import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKeyName;
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withRamdisk; import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withRamdisk;
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroup; import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroup;
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroupId;
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSubnetId; import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSubnetId;
import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withUserData; import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withUserData;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
@ -98,6 +99,31 @@ public class AWSRunInstancesOptionsTest {
public void testWithSecurityGroupNPE() { public void testWithSecurityGroupNPE() {
withSecurityGroup(null); withSecurityGroup(null);
} }
@Test
public void testWithSecurityGroupId() {
AWSRunInstancesOptions options = new AWSRunInstancesOptions();
options.withSecurityGroupId("test");
assertEquals(options.buildFormParameters().get("SecurityGroupId.1"), Collections.singletonList("test"));
}
@Test
public void testNullWithSecurityGroupId() {
AWSRunInstancesOptions options = new AWSRunInstancesOptions();
assertEquals(options.buildFormParameters().get("SecurityGroupId"), Collections.EMPTY_LIST);
}
@Test
public void testWithSecurityGroupIdStatic() {
AWSRunInstancesOptions options = withSecurityGroupId("test");
assertEquals(options.buildFormParameters().get("SecurityGroupId.1"), Collections.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithSecurityGroupIdNPE() {
withSecurityGroupId(null);
}
@Test @Test
public void testNullWithAdditionalInfo() { public void testNullWithAdditionalInfo() {

View File

@ -144,7 +144,7 @@ public class AMIClientLiveTest {
.put("root-device-type", "ebs")// .put("root-device-type", "ebs")//
.build()).ownedBy("137112412989", "099720109477")); .build()).ownedBy("137112412989", "099720109477"));
assertNotNull(twoResults); assertNotNull(twoResults);
assertEquals(twoResults.size(), 28); assertEquals(twoResults.size(), 26);
} }
@Test(enabled = false) @Test(enabled = false)

View File

@ -63,7 +63,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=CreateImage&InstanceId=instanceId&Name=name", assertPayloadEquals(request, "Version=2011-05-15&Action=CreateImage&InstanceId=instanceId&Name=name",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class); assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
@ -82,7 +82,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=CreateImage&InstanceId=instanceId&Name=name&Description=description&NoReboot=true", "Version=2011-05-15&Action=CreateImage&InstanceId=instanceId&Name=name&Description=description&NoReboot=true",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -99,14 +99,9 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeImages", "application/x-www-form-urlencoded", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeImages", "application/x-www-form-urlencoded",
false); false);
filter.filter(request);
assertPayloadEquals(
request,
"Action=DescribeImages&Signature=1gIaOJ%2F0Wc8ZFl8GeinQzYAfD%2FOQCKLH32VLcOippGY%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2010-11-15&AWSAccessKeyId=identity",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, DescribeImagesResponseHandler.class); assertSaxResponseParserClassEquals(method, DescribeImagesResponseHandler.class);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class); assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
@ -126,7 +121,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=DescribeImages&Filter.1.Name=state&Filter.1.Value.1=available&Filter.2.Name=image-type&Filter.2.Value.1=machine&ExecutableBy=me&Owner.1=fred&Owner.2=nancy&ImageId.1=1&ImageId.2=2", "Version=2011-05-15&Action=DescribeImages&Filter.1.Name=state&Filter.1.Value.1=available&Filter.2.Name=image-type&Filter.2.Value.1=machine&ExecutableBy=me&Owner.1=fred&Owner.2=nancy&ImageId.1=1&ImageId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -142,7 +137,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DeregisterImage&ImageId=imageId", assertPayloadEquals(request, "Version=2011-05-15&Action=DeregisterImage&ImageId=imageId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -159,7 +154,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name", assertPayloadEquals(request, "Version=2011-05-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class); assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
@ -177,7 +172,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name&Description=description", "Version=2011-05-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name&Description=description",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -196,7 +191,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName", "Version=2011-05-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class); assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
@ -221,7 +216,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName&Description=description&BlockDeviceMapping.1.Ebs.DeleteOnTermination=false&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fdevice&BlockDeviceMapping.1.Ebs.SnapshotId=snapshot&BlockDeviceMapping.2.Ebs.DeleteOnTermination=false&BlockDeviceMapping.2.DeviceName=%2Fdev%2Fnewdevice&BlockDeviceMapping.2.VirtualName=newblock&BlockDeviceMapping.2.Ebs.VolumeSize=100", "Version=2011-05-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName&Description=description&BlockDeviceMapping.1.Ebs.DeleteOnTermination=false&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fdevice&BlockDeviceMapping.1.Ebs.SnapshotId=snapshot&BlockDeviceMapping.2.Ebs.DeleteOnTermination=false&BlockDeviceMapping.2.DeviceName=%2Fdev%2Fnewdevice&BlockDeviceMapping.2.VirtualName=newblock&BlockDeviceMapping.2.Ebs.VolumeSize=100",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -238,7 +233,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeImageAttribute&Attribute=productCodes&ImageId=imageId", "Version=2011-05-15&Action=DescribeImageAttribute&Attribute=productCodes&ImageId=imageId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -256,7 +251,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeImageAttribute&Attribute=blockDeviceMapping&ImageId=imageId", "Version=2011-05-15&Action=DescribeImageAttribute&Attribute=blockDeviceMapping&ImageId=imageId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -274,7 +269,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeImageAttribute&Attribute=launchPermission&ImageId=imageId", "Version=2011-05-15&Action=DescribeImageAttribute&Attribute=launchPermission&ImageId=imageId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -294,14 +289,9 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyImageAttribute&OperationType=add&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue", "Version=2011-05-15&Action=ModifyImageAttribute&OperationType=add&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
filter.filter(request);
assertPayloadEquals(
request,
"Action=ModifyImageAttribute&Attribute=launchPermission&ImageId=imageId&OperationType=add&Signature=UvMbUlLld2h7MpNmuc9JSuOjDw4DS6PSNQVlBdBc%2FBQ%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&UserGroup.1=all&UserId.1=bob&UserId.2=sue&Version=2010-11-15&AWSAccessKeyId=identity",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null); assertExceptionParserClassEquals(method, null);
@ -319,7 +309,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue", "Version=2011-05-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
@ -336,7 +326,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=ResetImageAttribute&Attribute=launchPermission&ImageId=imageId", "Version=2011-05-15&Action=ResetImageAttribute&Attribute=launchPermission&ImageId=imageId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
@ -354,7 +344,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyImageAttribute&OperationType=add&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", "Version=2011-05-15&Action=ModifyImageAttribute&OperationType=add&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -373,7 +363,7 @@ public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSAMIAsync
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", "Version=2011-05-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);

View File

@ -52,7 +52,8 @@ import com.google.inject.TypeLiteral;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "AWSInstanceAsyncClientTest") @Test(groups = "unit", testName = "AWSInstanceAsyncClientTest")
public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSInstanceAsyncClient> { public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSInstanceAsyncClient> {
public void testDescribeInstances() throws SecurityException, NoSuchMethodException, IOException { public void testDescribeInstances() throws SecurityException, NoSuchMethodException, IOException {
@ -61,7 +62,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeInstances", "application/x-www-form-urlencoded", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeInstances", "application/x-www-form-urlencoded",
false); false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -77,7 +78,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeInstances&InstanceId.1=1&InstanceId.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeInstances&InstanceId.1=1&InstanceId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -94,7 +95,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=TerminateInstances&InstanceId.1=1&InstanceId.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=TerminateInstances&InstanceId.1=1&InstanceId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -112,11 +113,11 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
try { try {
assertPayloadEquals(request, "Version=2010-11-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=1", assertPayloadEquals(request, "Version=2011-05-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
} catch (AssertionError e) { } catch (AssertionError e) {
// mvn 3.0 osx 10.6.5 somehow sorts differently // mvn 3.0 osx 10.6.5 somehow sorts differently
assertPayloadEquals(request, "Version=2010-11-15&Action=RunInstances&ImageId=ami-voo&MaxCount=1&MinCount=1", assertPayloadEquals(request, "Version=2011-05-15&Action=RunInstances&ImageId=ami-voo&MaxCount=1&MinCount=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
} }
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -144,13 +145,13 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
try { try {
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=us-east-1a", "Version=2011-05-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=us-east-1a",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
} catch (AssertionError e) { } catch (AssertionError e) {
// mvn 3.0 osx 10.6.5 somehow sorts differently // mvn 3.0 osx 10.6.5 somehow sorts differently
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RunInstances&ImageId=ami-voo&MaxCount=5&MinCount=1&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=us-east-1a", "Version=2011-05-15&Action=RunInstances&ImageId=ami-voo&MaxCount=5&MinCount=1&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=us-east-1a",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
} }
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -167,7 +168,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=StopInstances&Force=true&InstanceId.1=1&InstanceId.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=StopInstances&Force=true&InstanceId.1=1&InstanceId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -184,7 +185,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=RebootInstances&InstanceId.1=1&InstanceId.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=RebootInstances&InstanceId.1=1&InstanceId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -201,7 +202,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=StartInstances&InstanceId.1=1&InstanceId.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=StartInstances&InstanceId.1=1&InstanceId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -219,7 +220,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=userData&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=userData&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -237,7 +238,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=rootDeviceName&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=rootDeviceName&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -255,7 +256,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=ramdisk&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=ramdisk&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -274,7 +275,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=disableApiTermination&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=disableApiTermination&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -291,7 +292,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=kernel&InstanceId=1", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=kernel&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -309,7 +310,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=instanceType&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=instanceType&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -329,7 +330,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -348,7 +349,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=DescribeInstanceAttribute&Attribute=blockDeviceMapping&InstanceId=1", "Version=2011-05-15&Action=DescribeInstanceAttribute&Attribute=blockDeviceMapping&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -366,12 +367,12 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=userData&Value=dGVzdA%3D%3D&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=userData&Value=dGVzdA%3D%3D&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
filter.filter(request);// ensure encoding worked properly filter.filter(request);// ensure encoding worked properly
assertPayloadEquals( assertPayloadEquals(
request, request,
"Action=ModifyInstanceAttribute&Attribute=userData&InstanceId=1&Signature=B15Bj0yiAMTwpHE%2B9LNNscM4fzFwv0t0adnYbFjgNDk%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Value=dGVzdA%3D%3D&Version=2010-11-15&AWSAccessKeyId=identity", "Action=ModifyInstanceAttribute&Attribute=userData&InstanceId=1&Signature=nArJlrtyAfgqDnXxv%2B2y0r9O%2BIfUcitpQMjfQR0oeRM%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Value=dGVzdA%3D%3D&Version=2011-05-15&AWSAccessKeyId=identity",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
@ -388,7 +389,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=ramdisk&Value=test&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=ramdisk&Value=test&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
@ -405,7 +406,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=kernel&Value=test&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=kernel&Value=test&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
@ -424,7 +425,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=disableApiTermination&Value=true&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=disableApiTermination&Value=true&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -442,7 +443,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=instanceType&Value=c1.medium&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=instanceType&Value=c1.medium&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -462,7 +463,7 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&Value=terminate&InstanceId=1", "Version=2011-05-15&Action=ModifyInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&Value=terminate&InstanceId=1",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -485,12 +486,12 @@ public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSIns
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=ModifyInstanceAttribute&InstanceId=1&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true", "Version=2011-05-15&Action=ModifyInstanceAttribute&InstanceId=1&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
filter.filter(request);// ensure encoding worked properly filter.filter(request);// ensure encoding worked properly
assertPayloadEquals( assertPayloadEquals(
request, request,
"Action=ModifyInstanceAttribute&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&InstanceId=1&Signature=Cf8vx1IzPe%2FFYd7SRJBjztSOB3FQTW9yYtPxQ3OUHF0%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2010-11-15&AWSAccessKeyId=identity", "Action=ModifyInstanceAttribute&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&InstanceId=1&Signature=qqJpPk8UmhPY9Jica0JSADEZiY3eHf9WETm%2B5tLT0NE%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2011-05-15&AWSAccessKeyId=identity",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);

View File

@ -59,10 +59,9 @@ public class AWSInstanceClientLiveTest {
protected void setupCredentials() { protected void setupCredentials() {
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity");
credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider
+ ".credential"); + ".credential");
endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); endpoint = System.getProperty("test." + provider + ".endpoint");
apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider apiversion = System.getProperty("test." + provider + ".apiversion");
+ ".apiversion");
} }
protected Properties setupProperties() { protected Properties setupProperties() {
@ -71,8 +70,10 @@ public class AWSInstanceClientLiveTest {
overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
overrides.setProperty(provider + ".identity", identity); overrides.setProperty(provider + ".identity", identity);
overrides.setProperty(provider + ".credential", credential); overrides.setProperty(provider + ".credential", credential);
overrides.setProperty(provider + ".endpoint", endpoint); if (endpoint != null)
overrides.setProperty(provider + ".apiversion", apiversion); overrides.setProperty(provider + ".endpoint", endpoint);
if (apiversion != null)
overrides.setProperty(provider + ".apiversion", apiversion);
return overrides; return overrides;
} }
@ -81,7 +82,7 @@ public class AWSInstanceClientLiveTest {
setupCredentials(); setupCredentials();
Properties overrides = setupProperties(); Properties overrides = setupProperties();
context = new ComputeServiceContextFactory().createContext(provider, context = new ComputeServiceContextFactory().createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides).getProviderSpecificContext();
client = context.getApi().getInstanceServices(); client = context.getApi().getInstanceServices();
} }

View File

@ -48,7 +48,7 @@ public class AWSKeyPairAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSKeyP
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=CreateKeyPair&KeyName=mykey", assertPayloadEquals(request, "Version=2011-05-15&Action=CreateKeyPair&KeyName=mykey",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -65,7 +65,7 @@ public class AWSKeyPairAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSKeyP
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=ImportKeyPair&PublicKeyMaterial=c3NoLXJzYSBBQQ%3D%3D&KeyName=mykey", assertPayloadEquals(request, "Version=2011-05-15&Action=ImportKeyPair&PublicKeyMaterial=c3NoLXJzYSBBQQ%3D%3D&KeyName=mykey",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -81,7 +81,7 @@ public class AWSKeyPairAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSKeyP
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DeleteKeyPair&KeyName=mykey", assertPayloadEquals(request, "Version=2011-05-15&Action=DeleteKeyPair&KeyName=mykey",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -98,7 +98,7 @@ public class AWSKeyPairAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSKeyP
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeKeyPairs", "application/x-www-form-urlencoded", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeKeyPairs", "application/x-www-form-urlencoded",
false); false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -115,7 +115,7 @@ public class AWSKeyPairAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSKeyP
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeKeyPairs&KeyName.1=1&KeyName.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeKeyPairs&KeyName.1=1&KeyName.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);

View File

@ -0,0 +1,209 @@
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.services;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
import org.jclouds.aws.ec2.xml.CreateSecurityGroupResponseHandler;
import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.domain.IpProtocol;
import org.jclouds.ec2.util.IpPermissions;
import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AWSSecurityGroupAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "AWSSecurityGroupAsyncClientTest")
public class AWSSecurityGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<AWSSecurityGroupAsyncClient> {
public AWSSecurityGroupAsyncClientTest() {
provider = "aws-ec2";
}
public void testDeleteSecurityGroup() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("deleteSecurityGroupInRegionById", String.class,
String.class);
HttpRequest request = processor.createRequest(method, null, "id");
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2011-05-15&Action=DeleteSecurityGroup&GroupId=id",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
checkFilters(request);
}
public void testDescribeSecurityGroups() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("describeSecurityGroupsInRegionById", String.class,
String[].class);
HttpRequest request = processor.createRequest(method, (String) null);
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeSecurityGroups",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, DescribeSecurityGroupsResponseHandler.class);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(request);
}
public void testDescribeSecurityGroupsArgs() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("describeSecurityGroupsInRegionById", String.class,
String[].class);
HttpRequest request = processor.createRequest(method, null, "1", "2");
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeSecurityGroups&GroupId.1=1&GroupId.2=2",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, DescribeSecurityGroupsResponseHandler.class);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(request);
}
public void testCreateSecurityGroup() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("createSecurityGroupInRegionAndReturnId",
String.class, String.class, String.class, CreateSecurityGroupOptions[].class);
HttpRequest request = processor.createRequest(method, null, "name", "description");
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request,
"Version=2011-05-15&Action=CreateSecurityGroup&GroupDescription=description&GroupName=name",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, CreateSecurityGroupResponseHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testAuthorizeSecurityGroupIpPermission() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("authorizeSecurityGroupIngressInRegion",
String.class, String.class, IpPermission.class);
HttpRequest request = processor.createRequest(method, null, "group", IpPermissions.permitAnyProtocol());
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(
request,
"Version=2011-05-15&Action=AuthorizeSecurityGroupIngress&GroupId=group&IpPermissions.0.IpProtocol=-1&IpPermissions.0.FromPort=1&IpPermissions.0.ToPort=65535&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0%2F0",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testAuthorizeSecurityGroupIpPermissions() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("authorizeSecurityGroupIngressInRegion",
String.class, String.class, Iterable.class);
HttpRequest request = processor.createRequest(method, null, "group", ImmutableSet.<IpPermission> of(IpPermissions
.permit(IpProtocol.TCP).originatingFromCidrBlock("1.1.1.1/32"), IpPermissions.permitICMP().type(8).andCode(0)
.originatingFromSecurityGroupId("groupId")));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(
request,
"Version=2011-05-15&Action=AuthorizeSecurityGroupIngress&GroupId=group&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=1&IpPermissions.0.ToPort=65535&IpPermissions.0.IpRanges.0.CidrIp=1.1.1.1%2F32&IpPermissions.1.IpProtocol=icmp&IpPermissions.1.FromPort=8&IpPermissions.1.ToPort=0&IpPermissions.1.Groups.0.GroupId=groupId",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testRevokeSecurityGroupIpPermission() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("revokeSecurityGroupIngressInRegion", String.class,
String.class, IpPermission.class);
HttpRequest request = processor.createRequest(method, null, "group", IpPermissions.permitAnyProtocol());
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(
request,
"Version=2011-05-15&Action=RevokeSecurityGroupIngress&GroupId=group&IpPermissions.0.IpProtocol=-1&IpPermissions.0.FromPort=1&IpPermissions.0.ToPort=65535&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0%2F0",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
public void testRevokeSecurityGroupIpPermissions() throws SecurityException, NoSuchMethodException, IOException {
Method method = AWSSecurityGroupAsyncClient.class.getMethod("revokeSecurityGroupIngressInRegion", String.class,
String.class, Iterable.class);
HttpRequest request = processor.createRequest(method, null, "group", ImmutableSet.<IpPermission> of(IpPermissions
.permit(IpProtocol.TCP).originatingFromCidrBlock("1.1.1.1/32"), IpPermissions.permitICMP().type(8).andCode(0)
.originatingFromSecurityGroupId("groupId")));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(
request,
"Version=2011-05-15&Action=RevokeSecurityGroupIngress&GroupId=group&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=1&IpPermissions.0.ToPort=65535&IpPermissions.0.IpRanges.0.CidrIp=1.1.1.1%2F32&IpPermissions.1.IpProtocol=icmp&IpPermissions.1.FromPort=8&IpPermissions.1.ToPort=0&IpPermissions.1.Groups.0.GroupId=groupId",
"application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AWSSecurityGroupAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AWSSecurityGroupAsyncClient>>() {
};
}
}

View File

@ -18,14 +18,21 @@
*/ */
package org.jclouds.aws.ec2.services; package org.jclouds.aws.ec2.services;
import static com.google.common.base.Preconditions.checkNotNull; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.util.Properties; import java.util.Set;
import org.jclouds.Constants; import org.jclouds.ec2.domain.IpPermission;
import org.jclouds.ec2.domain.IpProtocol;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.services.SecurityGroupClientLiveTest; import org.jclouds.ec2.services.SecurityGroupClientLiveTest;
import org.jclouds.ec2.util.IpPermissions;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMultimap;
/** /**
* *
* @author Adrian Cole * @author Adrian Cole
@ -36,27 +43,45 @@ public class AWSSecurityGroupClientLiveTest extends SecurityGroupClientLiveTest
provider = "aws-ec2"; provider = "aws-ec2";
} }
@Override @Test
protected void setupCredentials() { void testAuthorizeSecurityGroupIngressIpPermission() throws InterruptedException {
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); final String group1Name = PREFIX + "ingress11";
credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider String group2Name = PREFIX + "ingress12";
+ ".credential"); cleanupAndSleep(group2Name);
endpoint = System.getProperty("test." + provider + ".endpoint", null); cleanupAndSleep(group1Name);
apiversion = System.getProperty("test." + provider + ".apiversion", null); try {
} String group1Id = AWSSecurityGroupClient.class.cast(client).createSecurityGroupInRegionAndReturnId(null,
group1Name, group1Name);
String group2Id = AWSSecurityGroupClient.class.cast(client).createSecurityGroupInRegionAndReturnId(null,
group2Name, group2Name);
Thread.sleep(100);// eventual consistent
ensureGroupsExist(group1Name, group2Name);
AWSSecurityGroupClient.class.cast(client).authorizeSecurityGroupIngressInRegion(null, group1Id,
IpPermissions.permit(IpProtocol.TCP).port(80));
assertEventually(new GroupHasPermission(client, group1Name, new TCPPort80AllIPs()));
Set<SecurityGroup> oneResult = client.describeSecurityGroupsInRegion(null, group1Name);
assertNotNull(oneResult);
assertEquals(oneResult.size(), 1);
final SecurityGroup group = oneResult.iterator().next();
assertEquals(group.getName(), group1Name);
IpPermissions group2CanHttpGroup1 = IpPermissions.permit(IpProtocol.TCP).fromPort(80)
.originatingFromSecurityGroupId(group1Id);
AWSSecurityGroupClient.class.cast(client).authorizeSecurityGroupIngressInRegion(null, group2Id,
group2CanHttpGroup1);
assertEventually(new GroupHasPermission(client, group2Name, new Predicate<IpPermission>() {
@Override
public boolean apply(IpPermission arg0) {
return arg0.getUserIdGroupPairs().equals(ImmutableMultimap.of(group.getOwnerId(), group1Name))
&& arg0.getFromPort() == 80 && arg0.getToPort() == 80 && arg0.getIpProtocol() == IpProtocol.TCP;
}
}));
@Override AWSSecurityGroupClient.class.cast(client).revokeSecurityGroupIngressInRegion(null, group2Id,
protected Properties setupProperties() { group2CanHttpGroup1);
Properties overrides = new Properties(); assertEventually(new GroupHasNoPermissions(client, group2Name));
overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); } finally {
overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); client.deleteSecurityGroupInRegion(null, group2Name);
overrides.setProperty(provider + ".identity", identity); client.deleteSecurityGroupInRegion(null, group1Name);
overrides.setProperty(provider + ".credential", credential); }
if (endpoint != null)
overrides.setProperty(provider + ".endpoint", endpoint);
if (apiversion != null)
overrides.setProperty(provider + ".apiversion", apiversion);
return overrides;
} }
} }

View File

@ -45,7 +45,7 @@ public class MonitoringAsyncClientTest extends BaseAWSEC2AsyncClientTest<Monitor
HttpRequest request = processor.createRequest(method, null, "instance1", "instance2"); HttpRequest request = processor.createRequest(method, null, "instance1", "instance2");
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
String payload = "Version=2010-11-15&Action=UnmonitorInstances&InstanceId.0=instance1&InstanceId.1=instance2"; String payload = "Version=2011-05-15&Action=UnmonitorInstances&InstanceId.0=instance1&InstanceId.1=instance2";
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, payload, "application/x-www-form-urlencoded", false); assertPayloadEquals(request, payload, "application/x-www-form-urlencoded", false);
@ -64,7 +64,7 @@ public class MonitoringAsyncClientTest extends BaseAWSEC2AsyncClientTest<Monitor
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, assertPayloadEquals(request,
"Version=2010-11-15&Action=MonitorInstances&InstanceId.0=instance1&InstanceId.1=instance2", "Version=2011-05-15&Action=MonitorInstances&InstanceId.0=instance1&InstanceId.1=instance2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);

View File

@ -48,7 +48,7 @@ public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<Pla
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DeletePlacementGroup&GroupName=name", assertPayloadEquals(request, "Version=2011-05-15&Action=DeletePlacementGroup&GroupName=name",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -65,7 +65,7 @@ public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<Pla
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=CreatePlacementGroup&Strategy=cluster&GroupName=name", assertPayloadEquals(request, "Version=2011-05-15&Action=CreatePlacementGroup&Strategy=cluster&GroupName=name",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -82,7 +82,7 @@ public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<Pla
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=CreatePlacementGroup&Strategy=cluster&GroupName=name", assertPayloadEquals(request, "Version=2011-05-15&Action=CreatePlacementGroup&Strategy=cluster&GroupName=name",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -99,7 +99,7 @@ public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<Pla
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribePlacementGroups", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribePlacementGroups",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -116,7 +116,7 @@ public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest<Pla
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribePlacementGroups&GroupName.1=1&GroupName.2=2", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribePlacementGroups&GroupName.1=1&GroupName.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);

View File

@ -55,7 +55,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RequestSpotInstances&LaunchSpecification.ImageId=m1.small&SpotPrice=0.01&LaunchSpecification.InstanceType=ami-voo", "Version=2011-05-15&Action=RequestSpotInstances&LaunchSpecification.ImageId=m1.small&SpotPrice=0.01&LaunchSpecification.InstanceType=ami-voo",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -70,14 +70,14 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
float.class, int.class, LaunchSpecification.class, RequestSpotInstancesOptions[].class); float.class, int.class, LaunchSpecification.class, RequestSpotInstancesOptions[].class);
HttpRequest request = processor.createRequest(method, "eu-west-1", 0.01, 3, HttpRequest request = processor.createRequest(method, "eu-west-1", 0.01, 3,
LaunchSpecification.builder().instanceType("m1.small").imageId("ami-voo").availabilityZone("eu-west-1a") LaunchSpecification.builder().instanceType("m1.small").imageId("ami-voo").availabilityZone("eu-west-1a")
.kernelId("kernelId").groupId("group1").build(), new RequestSpotInstancesOptions().validFrom(from) .kernelId("kernelId").securityGroupName("group1").build(), new RequestSpotInstancesOptions().validFrom(from)
.validUntil(to).availabilityZoneGroup("availabilityZoneGroup").launchGroup("launchGroup")); .validUntil(to).availabilityZoneGroup("availabilityZoneGroup").launchGroup("launchGroup"));
assertRequestLineEquals(request, "POST https://ec2.eu-west-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.eu-west-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.eu-west-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.eu-west-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=RequestSpotInstances&InstanceCount=3&SpotPrice=0.01&ValidFrom=1970-05-23T21%3A21%3A18Z&ValidUntil=2009-02-13T23%3A31%3A31Z&AvailabilityZoneGroup=availabilityZoneGroup&LaunchGroup=launchGroup&LaunchSpecification.ImageId=ami-voo&LaunchSpecification.Placement.AvailabilityZone=eu-west-1a&LaunchSpecification.SecurityGroup.1=group1&LaunchSpecification.InstanceType=m1.small&LaunchSpecification.KernelId=kernelId", "Version=2011-05-15&Action=RequestSpotInstances&InstanceCount=3&SpotPrice=0.01&ValidFrom=1970-05-23T21%3A21%3A18Z&ValidUntil=2009-02-13T23%3A31%3A31Z&AvailabilityZoneGroup=availabilityZoneGroup&LaunchGroup=launchGroup&LaunchSpecification.ImageId=ami-voo&LaunchSpecification.Placement.AvailabilityZone=eu-west-1a&LaunchSpecification.SecurityGroup.1=group1&LaunchSpecification.InstanceType=m1.small&LaunchSpecification.KernelId=kernelId",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -94,7 +94,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=CancelSpotInstanceRequests&SpotInstanceRequestId.1=id", assertPayloadEquals(request, "Version=2011-05-15&Action=CancelSpotInstanceRequests&SpotInstanceRequestId.1=id",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
@ -111,7 +111,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeSpotInstanceRequests", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeSpotInstanceRequests",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -130,7 +130,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=DescribeSpotInstanceRequests&SpotInstanceRequestId.1=1&SpotInstanceRequestId.2=2", "Version=2011-05-15&Action=DescribeSpotInstanceRequests&SpotInstanceRequestId.1=1&SpotInstanceRequestId.2=2",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -147,7 +147,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals(request, "Version=2010-11-15&Action=DescribeSpotPriceHistory", assertPayloadEquals(request, "Version=2011-05-15&Action=DescribeSpotPriceHistory",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);
@ -170,7 +170,7 @@ public class SpotInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest<SpotI
assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n");
assertPayloadEquals( assertPayloadEquals(
request, request,
"Version=2010-11-15&Action=DescribeSpotPriceHistory&StartTime=1970-05-23T21%3A21%3A18.910Z&EndTime=2009-02-13T23%3A31%3A31.011Z&ProductDescription=description&InstanceType.1=m1.small", "Version=2011-05-15&Action=DescribeSpotPriceHistory&StartTime=1970-05-23T21%3A21%3A18.910Z&EndTime=2009-02-13T23%3A31%3A31.011Z&ProductDescription=description&InstanceType.1=m1.small",
"application/x-www-form-urlencoded", false); "application/x-www-form-urlencoded", false);
assertResponseParserClassEquals(method, request, ParseSax.class); assertResponseParserClassEquals(method, request, ParseSax.class);

View File

@ -51,7 +51,8 @@ import com.google.inject.Injector;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "AWSDescribeInstancesResponseHandlerTest") @Test(groups = "unit", testName = "AWSDescribeInstancesResponseHandlerTest")
public class AWSDescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { public class AWSDescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest {
@ -68,72 +69,91 @@ public class AWSDescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest
public void testWhenRunning() throws UnknownHostException { public void testWhenRunning() throws UnknownHostException {
Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>( Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>(
defaultRegion, ImmutableSet.of("adriancole.ec2ingress"), ImmutableSet defaultRegion, ImmutableSet.of("adriancole.ec2ingress"), ImmutableSet.of(new AWSRunningInstance.Builder()
.of(new AWSRunningInstance.Builder().region(defaultRegion).groupId("adriancole.ec2ingress") .region(defaultRegion).groupId("adriancole.ec2ingress").amiLaunchIndex("0")
.amiLaunchIndex("0").dnsName("ec2-174-129-81-68.compute-1.amazonaws.com").imageId( .dnsName("ec2-174-129-81-68.compute-1.amazonaws.com").imageId("ami-82e4b5c7")
"ami-82e4b5c7").instanceId("i-0799056f").instanceState(InstanceState.RUNNING) .instanceId("i-0799056f").instanceState(InstanceState.RUNNING).instanceType(InstanceType.M1_SMALL)
.instanceType(InstanceType.M1_SMALL).ipAddress("174.129.81.68").kernelId( .ipAddress("174.129.81.68").kernelId("aki-a71cf9ce").keyName("adriancole.ec21")
"aki-a71cf9ce").keyName("adriancole.ec21").launchTime( .launchTime(dateService.iso8601DateParse("2009-11-09T03:00:34.000Z"))
dateService.iso8601DateParse("2009-11-09T03:00:34.000Z")).monitoringState( .monitoringState(MonitoringState.DISABLED).availabilityZone("us-east-1c")
MonitoringState.DISABLED).availabilityZone("us-east-1c") .virtualizationType("paravirtual").privateDnsName("ip-10-243-42-70.ec2.internal")
.virtualizationType("paravirtual").privateDnsName("ip-10-243-42-70.ec2.internal") .privateIpAddress("10.243.42.70").ramdiskId("ari-a51cf9cc")
.privateIpAddress("10.243.42.70").ramdiskId("ari-a51cf9cc").rootDeviceType( .rootDeviceType(RootDeviceType.INSTANCE_STORE).build()), "993194456877", null, "r-a3c508cb"));
RootDeviceType.INSTANCE_STORE).build()), "993194456877", null, "r-a3c508cb"));
Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances_running.xml"); Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances_running.xml");
assertEquals(result, contents); assertEquals(result.toString(), contents.toString());
}
public void testParseNoNPE() {
parseAWSRunningInstances("/describe_instances_1.xml");
parseAWSRunningInstances("/describe_instances_2.xml");
parseAWSRunningInstances("/describe_instances_3.xml");
} }
public void testApplyInputStream() { public void testApplyInputStream() {
Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>( Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>(
defaultRegion, ImmutableSet.of("default"), ImmutableSet.of(new AWSRunningInstance.Builder().region( defaultRegion, ImmutableSet.of("default"), ImmutableSet.of(
defaultRegion).groupId("default").amiLaunchIndex("23").dnsName( new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("23")
"ec2-72-44-33-4.compute-1.amazonaws.com").imageId("ami-6ea54007").instanceId("i-28a64341") .dnsName("ec2-72-44-33-4.compute-1.amazonaws.com").imageId("ami-6ea54007")
.instanceState(InstanceState.RUNNING).instanceType(InstanceType.M1_LARGE).kernelId( .instanceId("i-28a64341").instanceState(InstanceState.RUNNING)
"aki-ba3adfd3").keyName("example-key-name").launchTime( .instanceType(InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name")
dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")).monitoringState( .launchTime(dateService.iso8601DateParse("2007-08-07T11:54:42.000Z"))
MonitoringState.DISABLED).availabilityZone("us-east-1b") .monitoringState(MonitoringState.DISABLED).availabilityZone("us-east-1b")
.virtualizationType("paravirtual").privateDnsName("10-251-50-132.ec2.internal").productCode( .virtualizationType("paravirtual").privateDnsName("10-251-50-132.ec2.internal")
"774F4FF8").ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE) .productCode("774F4FF8").ramdiskId("ari-badbad00")
.build(), new AWSRunningInstance.Builder().region(defaultRegion).groupId("default") .rootDeviceType(RootDeviceType.INSTANCE_STORE).build(),
.amiLaunchIndex("23").dnsName("ec2-72-44-33-6.compute-1.amazonaws.com").imageId("ami-6ea54007") new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("23")
.instanceId("i-28a64435").instanceState(InstanceState.RUNNING).instanceType( .dnsName("ec2-72-44-33-6.compute-1.amazonaws.com").imageId("ami-6ea54007")
InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name") .instanceId("i-28a64435").instanceState(InstanceState.RUNNING)
.launchTime(dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")).monitoringState( .instanceType(InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name")
MonitoringState.DISABLED).availabilityZone("us-east-1b") .launchTime(dateService.iso8601DateParse("2007-08-07T11:54:42.000Z"))
.virtualizationType("paravirtual").privateDnsName("10-251-50-134.ec2.internal").productCode( .monitoringState(MonitoringState.DISABLED).availabilityZone("us-east-1b")
"774F4FF8").ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE) .virtualizationType("paravirtual").privateDnsName("10-251-50-134.ec2.internal")
.build()), "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", null, "r-44a5402d")); .productCode("774F4FF8").ramdiskId("ari-badbad00")
.rootDeviceType(RootDeviceType.INSTANCE_STORE).build()), "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM",
null, "r-44a5402d"));
Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances.xml"); Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances.xml");
assertEquals(result, contents); assertEquals(result.toString(), contents.toString());
} }
public void testEBS() throws UnknownHostException { public void testEBS() throws UnknownHostException {
Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>( Set<Reservation<AWSRunningInstance>> contents = ImmutableSet.of(new Reservation<AWSRunningInstance>(
defaultRegion, ImmutableSet.of("adriancole.ec2ebsingress"), ImmutableSet defaultRegion, ImmutableSet.of("adriancole.ec2ebsingress"), ImmutableSet
.of(new AWSRunningInstance.Builder().region(defaultRegion).groupId("adriancole.ec2ebsingress") .of(new AWSRunningInstance.Builder()
.amiLaunchIndex("0").dnsName("ec2-75-101-203-146.compute-1.amazonaws.com").imageId( .region(defaultRegion)
"ami-849875ed").instanceId("i-e564438d").instanceState(InstanceState.RUNNING) .groupId("adriancole.ec2ebsingress")
.instanceType(InstanceType.M1_SMALL).ipAddress("75.101.203.146").kernelId( .amiLaunchIndex("0")
"aki-a71cf9ce").keyName("adriancole.ec2ebs1").launchTime( .dnsName("ec2-75-101-203-146.compute-1.amazonaws.com")
dateService.iso8601DateParse("2009-12-30T04:06:23.000Z")).monitoringState( .imageId("ami-849875ed")
MonitoringState.DISABLED).availabilityZone("us-east-1b") .instanceId("i-e564438d")
.placementGroup("placement").virtualizationType("hvm").privateDnsName( .instanceState(InstanceState.RUNNING)
"domU-12-31-39-09-CE-53.compute-1.internal").privateIpAddress( .instanceType(InstanceType.M1_SMALL)
"10.210.209.157").ramdiskId("ari-a51cf9cc") .ipAddress("75.101.203.146")
.rootDeviceType(RootDeviceType.EBS).rootDeviceName("/dev/sda1").device( .kernelId("aki-a71cf9ce")
"/dev/sda1", .keyName("adriancole.ec2ebs1")
new BlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService .launchTime(dateService.iso8601DateParse("2009-12-30T04:06:23.000Z"))
.iso8601DateParse("2009-12-30T04:06:29.000Z"), true)).build()), .monitoringState(MonitoringState.DISABLED)
"993194456877", null, "r-596dd731")); .availabilityZone("us-east-1b")
.placementGroup("placement")
.virtualizationType("hvm")
.privateDnsName("domU-12-31-39-09-CE-53.compute-1.internal")
.privateIpAddress("10.210.209.157")
.ramdiskId("ari-a51cf9cc")
.rootDeviceType(RootDeviceType.EBS)
.rootDeviceName("/dev/sda1")
.device(
"/dev/sda1",
new BlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService
.iso8601DateParse("2009-12-30T04:06:29.000Z"), true)).build()), "993194456877",
null, "r-596dd731"));
Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances_ebs.xml"); Set<Reservation<? extends RunningInstance>> result = parseAWSRunningInstances("/describe_instances_ebs.xml");
assertEquals(result, contents); assertEquals(result.toString(), contents.toString());
} }
static ParseSax<Set<Reservation<? extends RunningInstance>>> createParser() { static ParseSax<Set<Reservation<? extends RunningInstance>>> createParser() {
@ -147,8 +167,8 @@ public class AWSDescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest
}); });
ParseSax<Set<Reservation<? extends RunningInstance>>> parser = (ParseSax<Set<Reservation<? extends RunningInstance>>>) injector ParseSax<Set<Reservation<? extends RunningInstance>>> parser = (ParseSax<Set<Reservation<? extends RunningInstance>>>) injector
.getInstance(ParseSax.Factory.class).create( .getInstance(ParseSax.Factory.class)
injector.getInstance(AWSDescribeInstancesResponseHandler.class)); .create(injector.getInstance(AWSDescribeInstancesResponseHandler.class));
return parser; return parser;
} }

View File

@ -50,7 +50,8 @@ import com.google.inject.Guice;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "RunInstancesResponseHandlerTest") @Test(groups = "unit", testName = "RunInstancesResponseHandlerTest")
public class AWSRunInstancesResponseHandlerTest extends BaseEC2HandlerTest { public class AWSRunInstancesResponseHandlerTest extends BaseEC2HandlerTest {
@ -78,32 +79,40 @@ public class AWSRunInstancesResponseHandlerTest extends BaseEC2HandlerTest {
InputStream is = getClass().getResourceAsStream("/run_instances.xml"); InputStream is = getClass().getResourceAsStream("/run_instances.xml");
Reservation<? extends AWSRunningInstance> expected = new Reservation<AWSRunningInstance>(defaultRegion, Reservation<? extends AWSRunningInstance> expected = new Reservation<AWSRunningInstance>(defaultRegion,
ImmutableSet.of("default"), ImmutableSet.of( ImmutableSet.of("default"), ImmutableSet.of(
new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("0").imageId( new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("0")
"ami-60a54009").instanceId("i-2ba64342").instanceState(InstanceState.PENDING).instanceType( .imageId("ami-60a54009").instanceId("i-2ba64342").instanceState(InstanceState.PENDING)
InstanceType.M1_SMALL).keyName("example-key-name").launchTime( .instanceType(InstanceType.M1_SMALL).keyName("example-key-name")
dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( .launchTime(dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))
MonitoringState.ENABLED).availabilityZone("us-east-1b").build(), .monitoringState(MonitoringState.ENABLED).availabilityZone("us-east-1b").build(),
new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("1").imageId( new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("1")
"ami-60a54009").instanceId("i-2bc64242").instanceState(InstanceState.PENDING).instanceType( .imageId("ami-60a54009").instanceId("i-2bc64242").instanceState(InstanceState.PENDING)
InstanceType.M1_SMALL).keyName("example-key-name").launchTime( .instanceType(InstanceType.M1_SMALL).keyName("example-key-name")
dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( .launchTime(dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))
MonitoringState.ENABLED).availabilityZone("us-east-1b").build(), .monitoringState(MonitoringState.ENABLED).availabilityZone("us-east-1b").build(),
new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("2").imageId( new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("2")
"ami-60a54009").instanceId("i-2be64332").instanceState(InstanceState.PENDING).instanceType( .imageId("ami-60a54009").instanceId("i-2be64332").instanceState(InstanceState.PENDING)
InstanceType.M1_SMALL).keyName("example-key-name").launchTime( .instanceType(InstanceType.M1_SMALL).keyName("example-key-name")
dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( .launchTime(dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))
MonitoringState.ENABLED).availabilityZone("us-east-1b").build()) .monitoringState(MonitoringState.ENABLED).availabilityZone("us-east-1b").build())
, "AIDADH4IGTRXXKCD", null, "r-47a5402e"); , "AIDADH4IGTRXXKCD", null, "r-47a5402e");
AWSRunInstancesResponseHandler handler = injector.getInstance(AWSRunInstancesResponseHandler.class); AWSRunInstancesResponseHandler handler = injector.getInstance(AWSRunInstancesResponseHandler.class);
addDefaultRegionToHandler(handler); addDefaultRegionToHandler(handler);
Reservation<? extends RunningInstance> result = factory.create(handler).parse(is); Reservation<? extends RunningInstance> result = factory.create(handler).parse(is);
assertEquals(result, expected); assertEquals(result.toString(), expected.toString());
}
public void testApplyInputStreamDoesntNPE() {
InputStream is = getClass().getResourceAsStream("/run_instances_1.xml");
AWSRunInstancesResponseHandler handler = injector.getInstance(AWSRunInstancesResponseHandler.class);
addDefaultRegionToHandler(handler);
factory.create(handler).parse(is);
} }
private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) { private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) {

View File

@ -46,7 +46,8 @@ import com.google.inject.Guice;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "SpotInstanceHandlerTest") @Test(groups = "unit", testName = "SpotInstanceHandlerTest")
public class SpotInstanceHandlerTest extends BaseEC2HandlerTest { public class SpotInstanceHandlerTest extends BaseEC2HandlerTest {
@ -80,8 +81,8 @@ public class SpotInstanceHandlerTest extends BaseEC2HandlerTest {
.type(SpotInstanceRequest.Type.ONE_TIME) .type(SpotInstanceRequest.Type.ONE_TIME)
.state(SpotInstanceRequest.State.OPEN) .state(SpotInstanceRequest.State.OPEN)
.launchSpecification( .launchSpecification(
LaunchSpecification.builder().imageId("ami-595a0a1c").groupId("default").instanceType("m1.large") LaunchSpecification.builder().imageId("ami-595a0a1c").securityGroupIdToName("sg-83e1c4ea", "default")
.mapNewVolumeToDevice("/dev/sda1", 1, true) .instanceType("m1.large").mapNewVolumeToDevice("/dev/sda1", 1, true)
.mapEBSSnapshotToDevice("/dev/sda2", "snap-1ea27576", 1, true) .mapEBSSnapshotToDevice("/dev/sda2", "snap-1ea27576", 1, true)
.mapEphemeralDeviceToDevice("/dev/sda3", "vre1").monitoringEnabled(false).build()) .mapEphemeralDeviceToDevice("/dev/sda3", "vre1").monitoringEnabled(false).build())
.createTime(new SimpleDateFormatDateService().iso8601DateParse("2011-03-08T03:30:36.000Z")) .createTime(new SimpleDateFormatDateService().iso8601DateParse("2011-03-08T03:30:36.000Z"))
@ -89,6 +90,31 @@ public class SpotInstanceHandlerTest extends BaseEC2HandlerTest {
SpotInstanceHandler handler = injector.getInstance(SpotInstanceHandler.class); SpotInstanceHandler handler = injector.getInstance(SpotInstanceHandler.class);
addDefaultRegionToHandler(handler); addDefaultRegionToHandler(handler);
SpotInstanceRequest result = factory.create(handler).parse(is); SpotInstanceRequest result = factory.create(handler).parse(is);
assertEquals(result.toString(), expected.toString());
}
public void testApplyInputStream1() {
InputStream is = getClass().getResourceAsStream("/describe_spot_instance.xml");
SpotInstanceRequest expected = SpotInstanceRequest
.builder()
.region("us-east-1")
.id("sir-1ede0012")
.instanceId("i-ef308e8e")
.spotPrice(0.300000f)
.type(SpotInstanceRequest.Type.ONE_TIME)
.state(SpotInstanceRequest.State.ACTIVE)
.launchedAvailabilityZone("us-east-1b")
.launchSpecification(
LaunchSpecification.builder().imageId("ami-8e1fece7")
.securityGroupIdToName("sg-83e1c4eb", "jclouds#adriancole-ec2unssh#us-east-1").instanceType("t1.micro")
.monitoringEnabled(false).keyName("jclouds#adriancole-ec2unssh").build())
.createTime(new SimpleDateFormatDateService().iso8601DateParse("2011-07-29T05:27:39.000Z"))
.productDescription("Linux/UNIX").build();
SpotInstanceHandler handler = injector.getInstance(SpotInstanceHandler.class);
addDefaultRegionToHandler(handler);
SpotInstanceRequest result = factory.create(handler).parse(is);
assertEquals(result, expected); assertEquals(result, expected);
} }

View File

@ -45,7 +45,8 @@ import com.google.inject.Guice;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire // NOTE:without testName, this will not call @Before* and fail w/NPE during
// surefire
@Test(groups = "unit", testName = "SpotInstancesHandlerTest") @Test(groups = "unit", testName = "SpotInstancesHandlerTest")
public class SpotInstancesHandlerTest extends BaseEC2HandlerTest { public class SpotInstancesHandlerTest extends BaseEC2HandlerTest {
@ -66,25 +67,29 @@ public class SpotInstancesHandlerTest extends BaseEC2HandlerTest {
dateService = injector.getInstance(DateService.class); dateService = injector.getInstance(DateService.class);
assert dateService != null; assert dateService != null;
} }
public void testDescribe() { public void testDescribe() {
InputStream is = getClass().getResourceAsStream("/describe_spot_instance_requests.xml"); InputStream is = getClass().getResourceAsStream("/describe_spot_instance_requests.xml");
SpotInstancesHandler handler = injector SpotInstancesHandler handler = injector.getInstance(SpotInstancesHandler.class);
.getInstance(SpotInstancesHandler.class);
addDefaultRegionToHandler(handler); addDefaultRegionToHandler(handler);
Set<SpotInstanceRequest> result = factory.create(handler).parse(is); Set<SpotInstanceRequest> result = factory.create(handler).parse(is);
assertEquals(result.size(), 18); assertEquals(result.size(), 18);
} }
public void testRequest() {
public void testRequest() {
InputStream is = getClass().getResourceAsStream("/request_spot_instances.xml"); InputStream is = getClass().getResourceAsStream("/request_spot_instances.xml");
SpotInstancesHandler handler = injector SpotInstancesHandler handler = injector.getInstance(SpotInstancesHandler.class);
.getInstance(SpotInstancesHandler.class);
addDefaultRegionToHandler(handler); addDefaultRegionToHandler(handler);
Set<SpotInstanceRequest> result = factory.create(handler).parse(is); Set<SpotInstanceRequest> result = factory.create(handler).parse(is);
assertEquals(result.size(), 3); assertEquals(result.size(), 3);
} }
public void testParseNoNPE() {
factory.create(injector.getInstance(SpotInstancesHandler.class)).parse(
getClass().getResourceAsStream("/describe_spot_instances_1.xml"));
}
private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) { private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) {
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class); GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
expect(request.getArgs()).andReturn(ImmutableList.<Object> of()).atLeastOnce(); expect(request.getArgs()).andReturn(ImmutableList.<Object> of()).atLeastOnce();

View File

@ -0,0 +1,55 @@
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>b3e1c7ee-1f34-4582-9493-695c9425c679</requestId>
<reservationSet>
<item>
<reservationId>r-51cb663e</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-059c2564</instanceId>
<imageId>ami-eb71b682</imageId>
<instanceState>
<code>0</code>
<name>pending</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason/>
<keyName>jclouds#ec2-e#us-east-1#85</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>m1.small</instanceType>
<launchTime>2011-07-29T08:29:49.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-407d9529</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<architecture>i386</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
</reservationSet>
</DescribeInstancesResponse>

View File

@ -0,0 +1,986 @@
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>b2238f71-750f-4eed-8f5c-eb4e6f66b687</requestId>
<reservationSet>
<item>
<reservationId>r-7f54f610</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-8f348aee</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:04:49 GMT)</reason>
<keyName>jclouds#ec2-#us-east-1#95</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T05:35:18.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
<item>
<instanceId>i-91348af0</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:14:38 GMT)</reason>
<keyName>jclouds#ec2-#us-east-1#95</keyName>
<amiLaunchIndex>1</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T05:35:18.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-7be24f14</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-dbf5d0b2</groupId>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupId>sg-d9f5d0b0</groupId>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-43b00922</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:03:24 GMT)</reason>
<keyName>ec2-o</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T07:57:49.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>enabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-dbf5d0b2</groupId>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupId>sg-d9f5d0b0</groupId>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<instanceLifecycle>spot</instanceLifecycle>
<spotInstanceRequestId>sir-cc233214</spotInstanceRequestId>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
<requesterId>854251627541</requesterId>
</item>
<item>
<reservationId>r-7bfe5314</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-25f4d14c</groupId>
<groupName>jclouds#ec2-r#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-ddb70ebc</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:04:22 GMT)</reason>
<keyName>jclouds#ec2-r#us-east-1#3</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:04:18.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-25f4d14c</groupId>
<groupName>jclouds#ec2-r#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-7bf95414</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-e9a91088</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:14:38 GMT)</reason>
<keyName>jclouds#ec2-#us-east-1#73</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:05:48.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
<item>
<instanceId>i-eba9108a</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:14:38 GMT)</reason>
<keyName>jclouds#ec2-#us-east-1#73</keyName>
<amiLaunchIndex>1</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:05:48.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-5df95432</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-c9a910a8</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:06:01 GMT)</reason>
<keyName>jclouds#ec2-block#us-east-1#61</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:05:58.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-f3f9549c</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-77a81116</instanceId>
<imageId>ami-eb71b682</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:06:19 GMT)</reason>
<keyName>jclouds#ec2-e#us-east-1#6</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>m1.small</instanceType>
<launchTime>2011-07-29T08:06:15.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-407d9529</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>i386</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-2df85542</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-43eacf2a</groupId>
<groupName>jclouds#ec2-s#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-a5a811c4</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:06:59 GMT)</reason>
<keyName>jclouds#ec2-s#us-east-1#40</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:06:55.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-43eacf2a</groupId>
<groupName>jclouds#ec2-s#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-bffb56d0</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-65eacf0c</groupId>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-1faa137e</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:10:04 GMT)</reason>
<keyName>jclouds#adriancole-ec2unssh</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:09:14.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-65eacf0c</groupId>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<instanceLifecycle>spot</instanceLifecycle>
<spotInstanceRequestId>sir-cf9dd211</spotInstanceRequestId>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
<requesterId>854251627541</requesterId>
</item>
<item>
<reservationId>r-c3cf62ac</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-dbf5d0b2</groupId>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupId>sg-d9f5d0b0</groupId>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-15982174</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
:
<reason>User initiated (2011-07-29 08:27:01 GMT)</reason>
<keyName>ec2-o</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:25:33.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>enabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-dbf5d0b2</groupId>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupId>sg-d9f5d0b0</groupId>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<instanceLifecycle>spot</instanceLifecycle>
<spotInstanceRequestId>sir-6bba1e14</spotInstanceRequestId>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
<requesterId>854251627541</requesterId>
</item>
<item>
<reservationId>r-b1c964de</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-25f4d14c</groupId>
<groupName>jclouds#ec2-r#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-b19a23d0</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:28:17 GMT)</reason>
<keyName>jclouds#ec2-r#us-east-1#63</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:28:06.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-25f4d14c</groupId>
<groupName>jclouds#ec2-r#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-87c865e8</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-679c2506</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>16</code>
<name>running</name>
</instanceState>
<privateDnsName>domU-12-31-39-09-F9-1C.compute-1.internal</privateDnsName>
<dnsName>ec2-50-19-39-139.compute-1.amazonaws.com</dnsName>
<reason/>
<keyName>jclouds#ec2-#us-east-1#99</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:29:21.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<privateIpAddress>10.210.254.234</privateIpAddress>
<ipAddress>50.19.39.139</ipAddress>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<volumeId>vol-6d7b6306</volumeId>
<status>attached</status>
<attachTime>2011-07-29T08:29:39.000Z</attachTime>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
<item>
<instanceId>i-699c2508</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>16</code>
<name>running</name>
</instanceState>
<privateDnsName>domU-12-31-39-09-86-A9.compute-1.internal</privateDnsName>
<dnsName>ec2-184-72-215-58.compute-1.amazonaws.com</dnsName>
<reason/>
<keyName>jclouds#ec2-#us-east-1#99</keyName>
<amiLaunchIndex>1</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:29:21.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<privateIpAddress>10.210.137.83</privateIpAddress>
<ipAddress>184.72.215.58</ipAddress>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<volumeId>vol-617b630a</volumeId>
<status>attached</status>
<attachTime>2011-07-29T08:29:42.000Z</attachTime>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-61cb660e</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-539c2532</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:29:36 GMT)</reason>
<keyName>jclouds#ec2-block#us-east-1#48</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:29:32.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-51cb663e</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-059c2564</instanceId>
<imageId>ami-eb71b682</imageId>
<instanceState>
<code>0</code>
<name>pending</name>
</instanceState>
<dnsName>ec2-184-72-215-58.compute-1.amazonaws.com</dnsName>
<reason/>
<keyName>jclouds#ec2-#us-east-1#99</keyName>
<amiLaunchIndex>1</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:29:21.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<privateIpAddress>10.210.137.83</privateIpAddress>
<ipAddress>184.72.215.58</ipAddress>
<groupSet>
<item>
<groupId>sg-1df4d174</groupId>
<groupName>jclouds#ec2-#us-east-1</groupName>
</item>
</groupSet>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<volumeId>vol-617b630a</volumeId>
<status>attached</status>
<attachTime>2011-07-29T08:29:42.000Z</attachTime>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-61cb660e</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-539c2532</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>48</code>
<name>terminated</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason>User initiated (2011-07-29 08:29:36 GMT)</reason>
<keyName>jclouds#ec2-block#us-east-1#48</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T08:29:32.000Z</launchTime>
<placement>
<availabilityZone>us-east-1b</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-1ff4d176</groupId>
<groupName>jclouds#ec2-block#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>Client.UserInitiatedShutdown</code>
<message>Client.UserInitiatedShutdown: User initiated shutdown</message>
</stateReason>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
<item>
<reservationId>r-51cb663e</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-059c2564</instanceId>
<imageId>ami-eb71b682</imageId>
<instanceState>
<code>0</code>
<name>pending</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason/>
<keyName>jclouds#ec2-e#us-east-1#85</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>m1.small</instanceType>
<launchTime>2011-07-29T08:29:49.000Z</launchTime>
<placement>
<availabilityZone>us-east-1c</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-407d9529</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-15f4d17c</groupId>
<groupName>jclouds#ec2-e#us-east-1</groupName>
</item>
</groupSet>
<architecture>i386</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
</reservationSet>
</DescribeInstancesResponse>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>440faed2-0331-488d-a04d-d8c9aba85307</requestId>
<reservationSet/>
</DescribeInstancesResponse>

View File

@ -0,0 +1,67 @@
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>e32bb361-415e-484b-8651-5fd0c0a85fab</requestId>
<reservationSet>
<item>
<reservationId>r-6d62c002</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-1f1c3976</groupId>
<groupName>jclouds#ec2-s#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-5f833d3e</instanceId>
<imageId>ami-8e1fece7</imageId>
<instanceState>
<code>16</code>
<name>running</name>
</instanceState>
<privateDnsName>domU-12-31-38-04-25-D8.compute-1.internal</privateDnsName>
<dnsName>ec2-50-16-149-221.compute-1.amazonaws.com</dnsName>
<reason/>
<keyName>jclouds#ec2-s#us-east-1#38</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>t1.micro</instanceType>
<launchTime>2011-07-29T04:08:19.000Z</launchTime>
<placement>
<availabilityZone>us-east-1d</availabilityZone>
<groupName/>
<tenancy>default</tenancy>
</placement>
<kernelId>aki-427d952b</kernelId>
<monitoring>
<state>disabled</state>
</monitoring>
<privateIpAddress>10.220.38.38</privateIpAddress>
<ipAddress>50.16.149.221</ipAddress>
<groupSet>
<item>
<groupId>sg-1f1c3976</groupId>
<groupName>jclouds#ec2-s#us-east-1</groupName>
</item>
</groupSet>
<architecture>x86_64</architecture>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<volumeId>vol-4bc3da20</volumeId>
<status>attached</status>
<attachTime>2011-07-29T04:08:40.000Z</attachTime>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
<virtualizationType>paravirtual</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</item>
</reservationSet>
</DescribeInstancesResponse>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>d9da716a-5cd4-492e-83b9-6777ac16d6cf</requestId>
<spotInstanceRequestSet>
<item>
<spotInstanceRequestId>sir-1ede0012</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>active</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>jclouds#adriancole-ec2unssh</keyName>
<groupSet>
<item>
<groupId>sg-83e1c4eb</groupId>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>false</enabled>
</monitoring>
</launchSpecification>
<instanceId>i-ef308e8e</instanceId>
<createTime>2011-07-29T05:27:39.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1b</launchedAvailabilityZone>
</item>
</spotInstanceRequestSet>
</DescribeSpotInstanceRequestsResponse>

View File

@ -1,4 +1,4 @@
<DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"> <DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>7c4dd2bd-106d-4cd3-987c-35ee819180a6</requestId> <requestId>7c4dd2bd-106d-4cd3-987c-35ee819180a6</requestId>
<spotInstanceRequestSet> <spotInstanceRequestSet>
<item> <item>
@ -10,7 +10,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -31,7 +32,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -52,7 +54,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -77,7 +80,8 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
<groupName>quick-start-1</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -102,9 +106,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -123,7 +127,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -144,7 +149,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -165,7 +171,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -190,9 +197,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -215,9 +222,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -236,7 +243,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -257,7 +265,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -282,9 +291,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -307,9 +316,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -332,9 +341,10 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
<groupName>quick-start-1</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -353,7 +363,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
@ -376,9 +387,9 @@
<keyName>default</keyName> <keyName>default</keyName>
<groupSet> <groupSet>
<item> <item>
<groupId>quick-start-1</groupId> <groupId>sg-83e1c4eb</groupId>
</item> <groupName>quick-start-1</groupName>
</groupSet> </item> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>
<blockDeviceMapping/> <blockDeviceMapping/>
<monitoring> <monitoring>
@ -397,7 +408,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>t1.micro</instanceType> <instanceType>t1.micro</instanceType>

View File

@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8"?>
<DescribeSpotInstanceRequestsResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>f2247378-7df0-4725-b55f-8ef58b557dcd</requestId>
<spotInstanceRequestSet>
<item>
<spotInstanceRequestId>sir-f4d44212</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>cancelled</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>ec2-o</keyName>
<groupSet>
<item>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>true</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T04:01:12.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1b</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-43408412</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>cancelled</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>jclouds#adriancole-ec2unssh</keyName>
<groupSet>
<item>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>false</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T04:02:53.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1b</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-e4c3fa14</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>closed</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>ec2-o</keyName>
<groupSet>
<item>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>true</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T05:25:49.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1c</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-1ede0012</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>closed</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>jclouds#adriancole-ec2unssh</keyName>
<groupSet>
<item>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>false</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T05:27:39.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1b</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-596fa211</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>closed</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>ec2-o</keyName>
<groupSet>
<item>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>true</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T06:22:37.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1b</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-cc233214</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>closed</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>ec2-o</keyName>
<groupSet>
<item>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>true</enabled>
</monitoring>
</launchSpecification>
<createTime>2011-07-29T07:48:03.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1c</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-cf9dd211</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>active</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>jclouds#adriancole-ec2unssh</keyName>
<groupSet>
<item>
<groupName>jclouds#adriancole-ec2unssh#us-east-1</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>false</enabled>
</monitoring>
</launchSpecification>
<instanceId>i-1faa137e</instanceId>
<createTime>2011-07-29T08:05:45.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1c</launchedAvailabilityZone>
</item>
<item>
<spotInstanceRequestId>sir-6bba1e14</spotInstanceRequestId>
<spotPrice>0.300000</spotPrice>
<type>one-time</type>
<state>active</state>
<launchSpecification>
<imageId>ami-8e1fece7</imageId>
<keyName>ec2-o</keyName>
<groupSet>
<item>
<groupName>jclouds#ec2-o#us-east-1</groupName>
</item>
<item>
<groupName>ec2-o</groupName>
</item>
</groupSet>
<instanceType>t1.micro</instanceType>
<blockDeviceMapping/>
<monitoring>
<enabled>true</enabled>
</monitoring>
</launchSpecification>
<instanceId>i-15982174</instanceId>
<createTime>2011-07-29T08:20:27.000Z</createTime>
<productDescription>Linux/UNIX</productDescription>
<launchedAvailabilityZone>us-east-1c</launchedAvailabilityZone>
</item>
</spotInstanceRequestSet>
</DescribeSpotInstanceRequestsResponse>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<DescribeSpotPriceHistoryResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"> <DescribeSpotPriceHistoryResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>99777a75-2a2b-4296-a305-650c442d2d63</requestId> <requestId>99777a75-2a2b-4296-a305-650c442d2d63</requestId>
<spotPriceHistorySet> <spotPriceHistorySet>
<item> <item>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"> <RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>02401e8e-a4f5-4285-8ea8-6d742fbaadd8</requestId> <requestId>02401e8e-a4f5-4285-8ea8-6d742fbaadd8</requestId>
<spotInstanceRequestSet> <spotInstanceRequestSet>
<item> <item>
@ -11,7 +11,8 @@
<imageId>ami-595a0a1c</imageId> <imageId>ami-595a0a1c</imageId>
<groupSet> <groupSet>
<item> <item>
<groupId>default</groupId> <groupId>sg-83e1c4ea</groupId>
<groupName>default</groupName>
</item> </item>
</groupSet> </groupSet>
<instanceType>m1.large</instanceType> <instanceType>m1.large</instanceType>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2010-11-15/"> <RequestSpotInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>2ffc645f-6835-4d23-bd18-f6f53c253067</requestId> <requestId>2ffc645f-6835-4d23-bd18-f6f53c253067</requestId>
<spotInstanceRequestSet> <spotInstanceRequestSet>
<item> <item>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2011-05-15/">
<requestId>7faf9500-67ef-484b-9fa5-73b6df638bc8</requestId>
<reservationId>r-d3b815bc</reservationId>
<ownerId>993194456877</ownerId>
<groupSet>
<item>
<groupId>sg-3ffcd956</groupId>
<groupName>jclouds#adriancoleec2cccluster#us-east-1</groupName>
</item>
</groupSet>
<instancesSet>
<item>
<instanceId>i-8949f0e8</instanceId>
<imageId>ami-ab5b9cc2</imageId>
<instanceState>
<code>0</code>
<name>pending</name>
</instanceState>
<privateDnsName/>
<dnsName/>
<reason/>
<keyName>jclouds#adriancoleec2cccluster</keyName>
<amiLaunchIndex>0</amiLaunchIndex>
<productCodes/>
<instanceType>cc1.4xlarge</instanceType>
<launchTime>2011-07-29T09:46:48.000Z</launchTime>
<placement>
<availabilityZone>us-east-1d</availabilityZone>
<groupName>jclouds#adriancoleec2cccluster#us-east-1</groupName>
<tenancy>default</tenancy>
</placement>
<monitoring>
<state>disabled</state>
</monitoring>
<groupSet>
<item>
<groupId>sg-3ffcd956</groupId>
<groupName>jclouds#adriancoleec2cccluster#us-east-1</groupName>
</item>
</groupSet>
<stateReason>
<code>pending</code>
<message>pending</message>
</stateReason>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping/>
<virtualizationType>hvm</virtualizationType>
<clientToken/>
<hypervisor>xen</hypervisor>
</item>
</instancesSet>
</RunInstancesResponse>