Issue 29: brought Image Services in line with 11/30/2009 release

git-svn-id: http://jclouds.googlecode.com/svn/trunk@2524 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
adrian.f.cole 2009-12-27 06:04:20 +00:00
parent d60951fcf1
commit 57aea2d47b
47 changed files with 2795 additions and 167 deletions

View File

@ -43,7 +43,7 @@ public class BindGroupNameToIndexedFormParams implements Binder {
public void bindToRequest(HttpRequest request, Object input) { public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest, checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!"); "this binder is only valid for GeneratedHttpRequests!");
EC2Utils.indexFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "GroupName", input); EC2Utils.indexStringArrayToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "GroupName", input);
} }
} }

View File

@ -52,7 +52,7 @@ public class BindInetAddressesToIndexedFormParams implements Binder {
for (int i = 0; i < addresses.length; i++) { for (int i = 0; i < addresses.length; i++) {
addressStrings[i] = addresses[i].getHostAddress(); addressStrings[i] = addresses[i].getHostAddress();
} }
EC2Utils.indexFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "PublicIp", EC2Utils.indexStringArrayToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "PublicIp",
addressStrings); addressStrings);
} }

View File

@ -43,7 +43,7 @@ public class BindInstanceIdsToIndexedFormParams implements Binder {
public void bindToRequest(HttpRequest request, Object input) { public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest, checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!"); "this binder is only valid for GeneratedHttpRequests!");
EC2Utils.indexFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "InstanceId", input); EC2Utils.indexStringArrayToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "InstanceId", input);
} }
} }

View File

@ -43,7 +43,7 @@ public class BindKeyNameToIndexedFormParams implements Binder {
public void bindToRequest(HttpRequest request, Object input) { public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest, checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!"); "this binder is only valid for GeneratedHttpRequests!");
EC2Utils.indexFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "KeyName", input); EC2Utils.indexStringArrayToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "KeyName", input);
} }
} }

View File

@ -0,0 +1,49 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.aws.ec2.util.EC2Utils;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
import org.jclouds.rest.internal.GeneratedHttpRequest;
/**
* Binds the String [] to form parameters named with ProductCode.index
*
* @author Adrian Cole
* @since 4.0
*/
public class BindProductCodesToIndexedFormParams implements Binder {
@SuppressWarnings("unchecked")
public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!");
EC2Utils.indexIterableToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "ProductCode", input);
}
}

View File

@ -0,0 +1,61 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.aws.ec2.util.EC2Utils;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import com.google.common.collect.Iterables;
/**
* Binds the Iterable to query parameters named with UserGroup.index
*
* @author Adrian Cole
*/
public class BindUserGroupsToIndexedFormParams implements Binder {
@SuppressWarnings("unchecked")
public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!");
checkArgument(checkNotNull(input, "input") instanceof Iterable<?>,
"this binder is only valid for Iterable<?>: " + input.getClass());
checkValidUserGroup(input);
EC2Utils.indexIterableToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "UserGroup",
input);
}
private void checkValidUserGroup(Object input) {
Iterable<?> values = (Iterable<?>) input;
long size = Iterables.size(values);
checkArgument(size == 0 || (size == 1 && Iterables.getOnlyElement(values).equals("all")),
"only supported UserGroup is 'all'");
}
}

View File

@ -0,0 +1,49 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.binders;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.aws.ec2.util.EC2Utils;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
import org.jclouds.rest.internal.GeneratedHttpRequest;
/**
* Binds the String [] to form parameters named with UserId.index
*
* @author Adrian Cole
*/
public class BindUserIdsToIndexedFormParams implements Binder {
@SuppressWarnings("unchecked")
public void bindToRequest(HttpRequest request, Object input) {
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
"this binder is only valid for GeneratedHttpRequests!");
EC2Utils.indexIterableToFormValuesWithPrefix((GeneratedHttpRequest<?>) request, "UserId",
input);
}
}

View File

@ -25,8 +25,13 @@ 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.Map;
import java.util.Set; import java.util.Set;
import com.google.common.base.CaseFormat;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.internal.Nullable; import com.google.inject.internal.Nullable;
/** /**
@ -37,12 +42,40 @@ import com.google.inject.internal.Nullable;
*/ */
public class Image implements Comparable<Image> { public class Image implements Comparable<Image> {
public Image(Architecture architecture, String imageId, String imageLocation, private final Architecture architecture;
String imageOwnerId, ImageState imageState, ImageType imageType, boolean isPublic, @Nullable
@Nullable String kernelId, @Nullable String platform, Set<String> productCodes, private final String name;
@Nullable String ramdiskId) { @Nullable
private final String description;
private final String imageId;
private final String imageLocation;
private final String imageOwnerId;
private final ImageState imageState;
private final ImageType imageType;
private final boolean isPublic;
@Nullable
private final String kernelId;
@Nullable
private final String platform;
private final Set<String> productCodes = Sets.newHashSet();
@Nullable
private final String ramdiskId;
private final RootDeviceType rootDeviceType;
@Nullable
private final String rootDeviceName;
private final Map<String, EbsBlockDevice> ebsBlockDevices = Maps.newHashMap();
public Image(Architecture architecture, @Nullable String name, @Nullable String description,
String imageId, String imageLocation, String imageOwnerId, ImageState imageState,
ImageType imageType, boolean isPublic, Iterable<String> productCodes,
@Nullable String kernelId, @Nullable String platform, @Nullable String ramdiskId,
RootDeviceType rootDeviceType, String rootDeviceName,
Map<String, EbsBlockDevice> ebsBlockDevices) {
this.architecture = checkNotNull(architecture, "architecture"); this.architecture = checkNotNull(architecture, "architecture");
this.imageId = checkNotNull(imageId, "imageId"); this.imageId = checkNotNull(imageId, "imageId");
this.name = name;
this.description = description;
this.rootDeviceName = rootDeviceName;
this.imageLocation = checkNotNull(imageLocation, "imageLocation"); this.imageLocation = checkNotNull(imageLocation, "imageLocation");
this.imageOwnerId = checkNotNull(imageOwnerId, "imageOwnerId"); this.imageOwnerId = checkNotNull(imageOwnerId, "imageOwnerId");
this.imageState = checkNotNull(imageState, "imageState"); this.imageState = checkNotNull(imageState, "imageState");
@ -50,14 +83,16 @@ public class Image implements Comparable<Image> {
this.isPublic = isPublic; this.isPublic = isPublic;
this.kernelId = kernelId; this.kernelId = kernelId;
this.platform = platform; this.platform = platform;
this.productCodes = checkNotNull(productCodes, "productCodes"); Iterables.addAll(this.productCodes, checkNotNull(productCodes, "productCodes"));
this.ramdiskId = ramdiskId; this.ramdiskId = ramdiskId;
this.rootDeviceType = checkNotNull(rootDeviceType, "rootDeviceType");
this.ebsBlockDevices.putAll(checkNotNull(ebsBlockDevices, "ebsBlockDevices"));
} }
/** The serialVersionUID */ /** The serialVersionUID */
private static final long serialVersionUID = -6965068835316857535L; private static final long serialVersionUID = -6965068835316857535L;
public enum ImageState { public static enum ImageState {
/** /**
* the image is successfully registered and available for launching * the image is successfully registered and available for launching
*/ */
@ -75,7 +110,26 @@ public class Image implements Comparable<Image> {
} }
} }
public enum Architecture { /**
* The root device type used by the AMI. The AMI can use an Amazon EBS or instance store root
* device.
*/
public static enum RootDeviceType {
INSTANCE_STORE,
EBS;
public String value() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name());
}
public static RootDeviceType fromValue(String v) {
return valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, v));
}
}
public static enum Architecture {
I386, X86_64; I386, X86_64;
public String value() { public String value() {
return name().toLowerCase(); return name().toLowerCase();
@ -86,7 +140,7 @@ public class Image implements Comparable<Image> {
} }
} }
public enum ImageType { public static enum ImageType {
MACHINE, KERNEL, RAMDISK; MACHINE, KERNEL, RAMDISK;
public String value() { public String value() {
@ -99,19 +153,69 @@ public class Image implements Comparable<Image> {
} }
private final Architecture architecture; public static class EbsBlockDevice {
private final String imageId; @Nullable
private final String imageLocation; private final String snapshotId;
private final String imageOwnerId; private final long volumeSize;
private final ImageState imageState; private final boolean deleteOnTermination;
private final ImageType imageType;
private final boolean isPublic; public EbsBlockDevice(@Nullable String snapshotId, long volumeSize,
private final @Nullable boolean deleteOnTermination) {
String kernelId; this.snapshotId = snapshotId;
private final @Nullable String platform; this.volumeSize = volumeSize;
private final Set<String> productCodes; this.deleteOnTermination = deleteOnTermination;
private final @Nullable }
String ramdiskId;
public String getSnapshotId() {
return snapshotId;
}
public long getVolumeSize() {
return volumeSize;
}
public boolean isDeleteOnTermination() {
return deleteOnTermination;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (deleteOnTermination ? 1231 : 1237);
result = prime * result + ((snapshotId == null) ? 0 : snapshotId.hashCode());
result = prime * result + (int) (volumeSize ^ (volumeSize >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EbsBlockDevice other = (EbsBlockDevice) obj;
if (deleteOnTermination != other.deleteOnTermination)
return false;
if (snapshotId == null) {
if (other.snapshotId != null)
return false;
} else if (!snapshotId.equals(other.snapshotId))
return false;
if (volumeSize != other.volumeSize)
return false;
return true;
}
@Override
public String toString() {
return "EbsBlockDevice [deleteOnTermination=" + deleteOnTermination + ", snapshotId="
+ snapshotId + ", volumeSize=" + volumeSize + "]";
}
}
/** /**
* The architecture of the image (i386 or x86_64). * The architecture of the image (i386 or x86_64).
@ -205,6 +309,8 @@ public class Image implements Comparable<Image> {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((architecture == null) ? 0 : architecture.hashCode()); result = prime * result + ((architecture == null) ? 0 : architecture.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((ebsBlockDevices == null) ? 0 : ebsBlockDevices.hashCode());
result = prime * result + ((imageId == null) ? 0 : imageId.hashCode()); result = prime * result + ((imageId == null) ? 0 : imageId.hashCode());
result = prime * result + ((imageLocation == null) ? 0 : imageLocation.hashCode()); result = prime * result + ((imageLocation == null) ? 0 : imageLocation.hashCode());
result = prime * result + ((imageOwnerId == null) ? 0 : imageOwnerId.hashCode()); result = prime * result + ((imageOwnerId == null) ? 0 : imageOwnerId.hashCode());
@ -212,9 +318,12 @@ public class Image implements Comparable<Image> {
result = prime * result + ((imageType == null) ? 0 : imageType.hashCode()); result = prime * result + ((imageType == null) ? 0 : imageType.hashCode());
result = prime * result + (isPublic ? 1231 : 1237); result = prime * result + (isPublic ? 1231 : 1237);
result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode()); result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((platform == null) ? 0 : platform.hashCode()); result = prime * result + ((platform == null) ? 0 : platform.hashCode());
result = prime * result + ((productCodes == null) ? 0 : productCodes.hashCode()); result = prime * result + ((productCodes == null) ? 0 : productCodes.hashCode());
result = prime * result + ((ramdiskId == null) ? 0 : ramdiskId.hashCode()); result = prime * result + ((ramdiskId == null) ? 0 : ramdiskId.hashCode());
result = prime * result + ((rootDeviceName == null) ? 0 : rootDeviceName.hashCode());
result = prime * result + ((rootDeviceType == null) ? 0 : rootDeviceType.hashCode());
return result; return result;
} }
@ -232,6 +341,16 @@ public class Image implements Comparable<Image> {
return false; return false;
} else if (!architecture.equals(other.architecture)) } else if (!architecture.equals(other.architecture))
return false; return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (ebsBlockDevices == null) {
if (other.ebsBlockDevices != null)
return false;
} else if (!ebsBlockDevices.equals(other.ebsBlockDevices))
return false;
if (imageId == null) { if (imageId == null) {
if (other.imageId != null) if (other.imageId != null)
return false; return false;
@ -264,6 +383,11 @@ public class Image implements Comparable<Image> {
return false; return false;
} else if (!kernelId.equals(other.kernelId)) } else if (!kernelId.equals(other.kernelId))
return false; return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (platform == null) { if (platform == null) {
if (other.platform != null) if (other.platform != null)
return false; return false;
@ -279,7 +403,53 @@ public class Image implements Comparable<Image> {
return false; return false;
} else if (!ramdiskId.equals(other.ramdiskId)) } else if (!ramdiskId.equals(other.ramdiskId))
return false; return false;
if (rootDeviceName == null) {
if (other.rootDeviceName != null)
return false;
} else if (!rootDeviceName.equals(other.rootDeviceName))
return false;
if (rootDeviceType == null) {
if (other.rootDeviceType != null)
return false;
} else if (!rootDeviceType.equals(other.rootDeviceType))
return false;
return true; return true;
} }
/**
*
* @return The root device type used by the AMI. The AMI can use an Amazon EBS or instance store
* root device.
*/
public RootDeviceType getRootDeviceType() {
return rootDeviceType;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String getRootDeviceName() {
return rootDeviceName;
}
@Override
public String toString() {
return "Image [architecture=" + architecture + ", description=" + description
+ ", ebsBlockDevices=" + ebsBlockDevices + ", imageId=" + imageId
+ ", imageLocation=" + imageLocation + ", imageOwnerId=" + imageOwnerId
+ ", imageState=" + imageState + ", imageType=" + imageType + ", isPublic="
+ isPublic + ", kernelId=" + kernelId + ", name=" + name + ", platform=" + platform
+ ", productCodes=" + productCodes + ", ramdiskId=" + ramdiskId
+ ", rootDeviceName=" + rootDeviceName + ", rootDeviceType=" + rootDeviceType + "]";
}
public Map<String, EbsBlockDevice> getEbsBlockDevices() {
return ebsBlockDevices;
}
} }

View File

@ -0,0 +1,100 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Set;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
/**
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-LaunchPermissionItemType.html"
* />
* @author Adrian Cole
*/
public class LaunchPermission {
private final Set<String> groups = Sets.newHashSet();
private final Set<String> userIds = Sets.newHashSet();
public LaunchPermission(Iterable<String> userIds, Iterable<String> groups) {
Iterables.addAll(this.userIds, checkNotNull(userIds, "userIds"));
Iterables.addAll(this.groups, checkNotNull(groups, "groups"));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((groups == null) ? 0 : groups.hashCode());
result = prime * result + ((userIds == null) ? 0 : userIds.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;
LaunchPermission other = (LaunchPermission) obj;
if (groups == null) {
if (other.groups != null)
return false;
} else if (!groups.equals(other.groups))
return false;
if (userIds == null) {
if (other.userIds != null)
return false;
} else if (!userIds.equals(other.userIds))
return false;
return true;
}
/**
*
* @return Name of the group. Currently supports \"all.\"
*/
public Set<String> getGroups() {
return groups;
}
/**
*
* @return AWS Access Key ID.
*/
public Set<String> getUserIds() {
return userIds;
}
@Override
public String toString() {
return "LaunchPermission [groups=" + groups + ", userIds=" + userIds + "]";
}
}

View File

@ -110,7 +110,7 @@ public class RunningInstance implements Comparable<RunningInstance> {
* more information, go to the Metadata section of the Amazon Elastic Compute Cloud Developer * more information, go to the Metadata section of the Amazon Elastic Compute Cloud Developer
* Guide. * Guide.
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/2009-08-15/DeveloperGuide/" /> * @see <a href="http://docs.amazonwebservices.com/AWSEC2/2009-11-30/DeveloperGuide/" />
*/ */
public String getAmiLaunchIndex() { public String getAmiLaunchIndex() {
return amiLaunchIndex; return amiLaunchIndex;

View File

@ -0,0 +1,243 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.options;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.annotation.Nullable;
import org.jclouds.aws.ec2.domain.Image.Architecture;
/**
* Contains options supported in the Form API for the RegisterImage operation. <h2>
* Usage</h2> The recommended way to instantiate a RegisterImageBackedByEbsOptions object is to statically
* import RegisterImageBackedByEbsOptions.Builder.* and invoke a static creation method followed by an instance
* mutator (if needed):
* <p/>
* <code>
* import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* String imageId = connection.getImageServices().registerImageBackedByEbs(...addEphemeralBlockDeviceFromSnapshot("/dev/sda2","virtual-1","snapshot-id"));
* <code>
*
* @author Adrian Cole
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-form-RegisterImage.html"
* />
*/
public class RegisterImageBackedByEbsOptions extends RegisterImageOptions {
private int deviceIndex = 1;
/**
*
* adds a block device to the image from an ebs snapshot. This device is deleted on instance
* termination.
*
* @param name
* The device name (e.g., /dev/sdh).
* @param virtualName
* The virtual device name. (nullable)
* @param snapshotId
* The ID of the snapshot.
*/
public RegisterImageBackedByEbsOptions addEphemeralBlockDeviceFromSnapshot(String deviceName,
@Nullable String virtualName, String snapshotId) {
formParameters.put("BlockDeviceMapping." + deviceIndex + ".DeviceName", checkNotNull(
deviceName, "deviceName"));
if (virtualName != null)
formParameters.put("BlockDeviceMapping." + deviceIndex + ".VirtualName", checkNotNull(
virtualName, "virtualName"));
formParameters.put("BlockDeviceMapping." + deviceIndex + ".Ebs.SnapshotId", checkNotNull(
snapshotId, "snapshotId"));
deviceIndex++;
return this;
}
/**
*
* adds a new block device to the image. This device is deleted on instance termination.
*
* @param name
* The device name (e.g., /dev/sdh).
* @param virtualName
* The virtual device name.
* @param volumeSize
* The size of the volume, in GiBs.
*/
public RegisterImageBackedByEbsOptions addNewEphemeralBlockDevice(String deviceName,
@Nullable String virtualName, int volumeSize) {
checkArgument(volumeSize > 0 && volumeSize < 1025, "volumeSize must be between 1 and 1024 gb");
formParameters.put("BlockDeviceMapping." + deviceIndex + ".DeviceName", checkNotNull(
deviceName, "deviceName"));
if (virtualName != null)
formParameters.put("BlockDeviceMapping." + deviceIndex + ".VirtualName", checkNotNull(
virtualName, "virtualName"));
formParameters.put("BlockDeviceMapping." + deviceIndex + ".Ebs.VolumeSize", volumeSize + "");
deviceIndex++;
return this;
}
/**
*
* adds a block device to the image from an ebs snapshot. This device is retained on instance
* termination.
*
* @param name
* The device name (e.g., /dev/sdh).
* @param virtualName
* The virtual device name. (nullable)
* @param snapshotId
* The ID of the snapshot.
*/
public RegisterImageBackedByEbsOptions addBlockDeviceFromSnapshot(String deviceName,
@Nullable String virtualName, String snapshotId) {
formParameters.put("BlockDeviceMapping." + deviceIndex + ".Ebs.DeleteOnTermination", "false");
addEphemeralBlockDeviceFromSnapshot(deviceName, virtualName, snapshotId);
return this;
}
/**
*
* adds a new block device to the image. This device is retained on instance termination.
*
* @param name
* The device name (e.g., /dev/sdh).
* @param virtualName
* The virtual device name.
* @param volumeSize
* The size of the volume, in GiBs..
*/
public RegisterImageBackedByEbsOptions addNewBlockDevice(String deviceName,
@Nullable String virtualName, int volumeSize) {
formParameters.put("BlockDeviceMapping." + deviceIndex + ".Ebs.DeleteOnTermination", "false");
addNewEphemeralBlockDevice(deviceName, virtualName, volumeSize);
return this;
}
public static class Builder {
/**
* @see RegisterImageBackedByEbsOptions#asArchitecture(Architecture)
*/
public static RegisterImageBackedByEbsOptions asArchitecture(Architecture architecture) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.asArchitecture(architecture);
}
/**
* @see RegisterImageBackedByEbsOptions#withDescription(String)
*/
public static RegisterImageBackedByEbsOptions withDescription(String additionalInfo) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.withDescription(additionalInfo);
}
/**
* @see RegisterImageBackedByEbsOptions#withKernelId(String)
*/
public static RegisterImageBackedByEbsOptions withKernelId(String kernelId) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.withKernelId(kernelId);
}
/**
* @see RegisterImageBackedByEbsOptions#withRamdisk(String)
*/
public static RegisterImageBackedByEbsOptions withRamdisk(String ramdiskId) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.withRamdisk(ramdiskId);
}
/**
* @see RegisterImageBackedByEbsOptions#addBlockDeviceFromSnapshot(String, String, String)
*/
public static RegisterImageBackedByEbsOptions addBlockDeviceFromSnapshot(String deviceName,
@Nullable String virtualName, String snapshotId) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.addBlockDeviceFromSnapshot(deviceName, virtualName, snapshotId);
}
/**
* @see RegisterImageBackedByEbsOptions#addEphemeralBlockDeviceFromSnapshot(String, String,
* String)
*/
public static RegisterImageBackedByEbsOptions addEphemeralBlockDeviceFromSnapshot(
String deviceName, @Nullable String virtualName, String snapshotId) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.addEphemeralBlockDeviceFromSnapshot(deviceName, virtualName, snapshotId);
}
/**
* @see RegisterImageBackedByEbsOptions#addNewBlockDevice(String, String, int)
*/
public static RegisterImageBackedByEbsOptions addNewBlockDevice(String deviceName,
@Nullable String virtualName, int volumeSize) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.addNewBlockDevice(deviceName, virtualName, volumeSize);
}
/**
* @see RegisterImageBackedByEbsOptions#addNewEphemeralBlockDevice(String, String, int)
*/
public static RegisterImageBackedByEbsOptions addNewEphemeralBlockDevice(String deviceName,
@Nullable String virtualName, int volumeSize) {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
return options.addNewEphemeralBlockDevice(deviceName, virtualName, volumeSize);
}
}
/**
* {@inheritDoc}
*/
@Override
public RegisterImageBackedByEbsOptions asArchitecture(Architecture architecture) {
return (RegisterImageBackedByEbsOptions) super.asArchitecture(architecture);
}
/**
* {@inheritDoc}
*/
@Override
public RegisterImageBackedByEbsOptions withDescription(String info) {
return (RegisterImageBackedByEbsOptions) super.withDescription(info);
}
/**
* {@inheritDoc}
*/
@Override
public RegisterImageBackedByEbsOptions withKernelId(String kernelId) {
return (RegisterImageBackedByEbsOptions) super.withKernelId(kernelId);
}
/**
* {@inheritDoc}
*/
@Override
public RegisterImageBackedByEbsOptions withRamdisk(String ramDiskId) {
return (RegisterImageBackedByEbsOptions) super.withRamdisk(ramDiskId);
}
}

View File

@ -0,0 +1,135 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.options;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.aws.ec2.domain.Image.Architecture;
import org.jclouds.aws.ec2.options.internal.BaseEC2RequestOptions;
/**
* Contains options supported in the Form API for the RegisterImage operation. <h2>
* Usage</h2> The recommended way to instantiate a RegisterImageOptions object is to statically
* import RegisterImageOptions.Builder.* and invoke a static creation method followed by an instance
* mutator (if needed):
* <p/>
* <code>
* import static org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* String imageId = connection.getImageServices().registerImageFromManifest(...withArchitecture(Architecture.I386).withDescription("description"));
* <code>
*
* @author Adrian Cole
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-form-RegisterImage.html"
* />
*/
public class RegisterImageOptions extends BaseEC2RequestOptions {
/**
* The architecture of the image.
*/
public RegisterImageOptions asArchitecture(Architecture architecture) {
formParameters.put("Architecture", checkNotNull(architecture, "architecture").value());
return this;
}
String getArchitecture() {
return getFirstFormOrNull("Architecture");
}
/**
*The description of the AMI. "Up to 255 characters."
*/
public RegisterImageOptions withDescription(String info) {
formParameters.put("Description", checkNotNull(info, "info"));
return this;
}
String getDescription() {
return getFirstFormOrNull("Description");
}
/**
* The ID of the kernel to select.
*/
public RegisterImageOptions withKernelId(String kernelId) {
formParameters.put("KernelId", checkNotNull(kernelId, "kernelId"));
return this;
}
String getKernelId() {
return getFirstFormOrNull("KernelId");
}
/**
* The ID of the RAM disk to select. Some kernels require additional drivers at launch. Check the
* kernel requirements for information on whether you need to specify a RAM disk. To find kernel
* requirements, refer to the Resource Center and search for the kernel ID.
*/
public RegisterImageOptions withRamdisk(String ramDiskId) {
formParameters.put("RamdiskId", checkNotNull(ramDiskId, "ramDiskId"));
return this;
}
String getRamdiskId() {
return getFirstFormOrNull("RamdiskId");
}
public static class Builder {
/**
* @see RegisterImageOptions#asArchitecture(Architecture)
*/
public static RegisterImageOptions asArchitecture(Architecture architecture) {
RegisterImageOptions options = new RegisterImageOptions();
return options.asArchitecture(architecture);
}
/**
* @see RegisterImageOptions#withDescription(String)
*/
public static RegisterImageOptions withDescription(String additionalInfo) {
RegisterImageOptions options = new RegisterImageOptions();
return options.withDescription(additionalInfo);
}
/**
* @see RegisterImageOptions#withKernelId(String)
*/
public static RegisterImageOptions withKernelId(String kernelId) {
RegisterImageOptions options = new RegisterImageOptions();
return options.withKernelId(kernelId);
}
/**
* @see RegisterImageOptions#withRamdisk(String)
*/
public static RegisterImageOptions withRamdisk(String ramdiskId) {
RegisterImageOptions options = new RegisterImageOptions();
return options.withRamdisk(ramdiskId);
}
}
}

View File

@ -26,7 +26,8 @@ package org.jclouds.aws.ec2.services;
import static org.jclouds.aws.ec2.reference.EC2Parameters.ACTION; import static org.jclouds.aws.ec2.reference.EC2Parameters.ACTION;
import static org.jclouds.aws.ec2.reference.EC2Parameters.VERSION; import static org.jclouds.aws.ec2.reference.EC2Parameters.VERSION;
import java.util.SortedSet; import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import javax.ws.rs.FormParam; import javax.ws.rs.FormParam;
@ -34,12 +35,23 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import org.jclouds.aws.ec2.EC2; import org.jclouds.aws.ec2.EC2;
import org.jclouds.aws.ec2.binders.BindProductCodesToIndexedFormParams;
import org.jclouds.aws.ec2.binders.BindUserGroupsToIndexedFormParams;
import org.jclouds.aws.ec2.binders.BindUserIdsToIndexedFormParams;
import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.ImageAttribute; import org.jclouds.aws.ec2.domain.LaunchPermission;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.aws.ec2.filters.FormSigner; import org.jclouds.aws.ec2.filters.FormSigner;
import org.jclouds.aws.ec2.options.CreateImageOptions; import org.jclouds.aws.ec2.options.CreateImageOptions;
import org.jclouds.aws.ec2.options.DescribeImagesOptions; import org.jclouds.aws.ec2.options.DescribeImagesOptions;
import org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions;
import org.jclouds.aws.ec2.options.RegisterImageOptions;
import org.jclouds.aws.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandler; import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandler;
import org.jclouds.aws.ec2.xml.ImageIdHandler;
import org.jclouds.aws.ec2.xml.LaunchPermissionHandler;
import org.jclouds.aws.ec2.xml.ProductCodesHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.FormParams; import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.RequestFilters;
@ -65,16 +77,7 @@ public interface AMIAsyncClient {
@Path("/") @Path("/")
@FormParams(keys = ACTION, values = "DescribeImages") @FormParams(keys = ACTION, values = "DescribeImages")
@XMLResponseParser(DescribeImagesResponseHandler.class) @XMLResponseParser(DescribeImagesResponseHandler.class)
Future<? extends SortedSet<Image>> describeImages(DescribeImagesOptions... options); Future<? extends Set<Image>> describeImages(DescribeImagesOptions... options);
/**
* @see AMIClient#describeImages
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeImageAttribute")
Future<String> describeImageAttribute(@FormParam("ImageId") String imageId,
@FormParam("Attribute") ImageAttribute attribute);
/** /**
* @see AMIClient#createImage * @see AMIClient#createImage
@ -82,6 +85,121 @@ public interface AMIAsyncClient {
@POST @POST
@Path("/") @Path("/")
@FormParams(keys = ACTION, values = "CreateImage") @FormParams(keys = ACTION, values = "CreateImage")
@XMLResponseParser(ImageIdHandler.class)
Future<String> createImage(@FormParam("Name") String name, Future<String> createImage(@FormParam("Name") String name,
@FormParam("InstanceId") String instanceId, CreateImageOptions... options); @FormParam("InstanceId") String instanceId, CreateImageOptions... options);
/**
* @see AMIClient#deregisterImage
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeregisterImage")
Future<Void> deregisterImage(@FormParam("ImageId") String imageId);
/**
* @see AMIClient#registerImageFromManifest
*/
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RegisterImage")
@XMLResponseParser(ImageIdHandler.class)
Future<String> registerImageFromManifest(@FormParam("Name") String imageName,
@FormParam("ImageLocation") String pathToManifest, RegisterImageOptions... options);
/**
* @see AMIClient#registerImageBackedByEbs
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "RootDeviceName", "BlockDeviceMapping.0.DeviceName" }, values = {
"RegisterImage", "/dev/sda1", "/dev/sda1" })
@XMLResponseParser(ImageIdHandler.class)
Future<String> registerImageBackedByEbs(@FormParam("Name") String imageName,
@FormParam("BlockDeviceMapping.0.Ebs.SnapshotId") String ebsSnapshotId,
RegisterImageBackedByEbsOptions... options);
/**
* @see AMIClient#resetLaunchPermissionsOnImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetImageAttribute", "launchPermission" })
Future<Void> resetLaunchPermissionsOnImage(@FormParam("ImageId") String imageId);
/**
* @see AMIClient#addLaunchPermissionsToImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute",
"add", "launchPermission" })
Future<Void> addLaunchPermissionsToImage(
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#removeLaunchPermissionsToImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute",
"remove", "launchPermission" })
Future<Void> removeLaunchPermissionsFromImage(
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#getLaunchPermissionForImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute",
"launchPermission" })
@XMLResponseParser(LaunchPermissionHandler.class)
Future<LaunchPermission> getLaunchPermissionForImage(@FormParam("ImageId") String imageId);
/**
* @see AMIClient#getProductCodesForImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "productCodes" })
@XMLResponseParser(ProductCodesHandler.class)
Future<? extends Set<String>> getProductCodesForImage(@FormParam("ImageId") String imageId);
/**
* @see AMIClient#getBlockDeviceMappingsForImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute",
"blockDeviceMapping" })
@XMLResponseParser(BlockDeviceMappingHandler.class)
Future<? extends Map<String, EbsBlockDevice>> getBlockDeviceMappingsForImage(
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#addProductCodesToImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute",
"add", "productCodes" })
Future<Void> addProductCodesToImage(
@BinderParam(BindProductCodesToIndexedFormParams.class) Iterable<String> productCodes,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#removeProductCodesToImage
*/
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute",
"remove", "productCodes" })
Future<Void> removeProductCodesFromImage(
@BinderParam(BindProductCodesToIndexedFormParams.class) Iterable<String> productCodes,
@FormParam("ImageId") String imageId);
} }

View File

@ -23,13 +23,17 @@
*/ */
package org.jclouds.aws.ec2.services; package org.jclouds.aws.ec2.services;
import java.util.SortedSet; import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.ImageAttribute; import org.jclouds.aws.ec2.domain.LaunchPermission;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.aws.ec2.options.CreateImageOptions; import org.jclouds.aws.ec2.options.CreateImageOptions;
import org.jclouds.aws.ec2.options.DescribeImagesOptions; import org.jclouds.aws.ec2.options.DescribeImagesOptions;
import org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions;
import org.jclouds.aws.ec2.options.RegisterImageOptions;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
/** /**
@ -54,16 +58,13 @@ public interface AMIClient {
* @see DescribeImagesOptions * @see DescribeImagesOptions
*/ */
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
SortedSet<Image> describeImages(DescribeImagesOptions... options); Set<Image> describeImages(DescribeImagesOptions... options);
/** /**
* Returns information about an attribute of an AMI. Only one attribute can be specified per * Returns the {@link LaunchPermission}s of an image.
* call.
* *
* @param imageId * @param imageId
* The ID of the AMI for which an attribute will be described * The ID of the AMI for which an attribute will be described
* @param attribute
* the attribute to describe
* @see #describeImages * @see #describeImages
* @see #modifyImageAttribute * @see #modifyImageAttribute
* @see #resetImageAttribute * @see #resetImageAttribute
@ -71,21 +72,218 @@ public interface AMIClient {
* /> * />
* @see DescribeImagesOptions * @see DescribeImagesOptions
*/ */
String describeImageAttribute(String imageId, ImageAttribute attribute); LaunchPermission getLaunchPermissionForImage(String imageId);
/**
* Returns the Product Codes of an image.
*
* @param imageId
* The ID of the AMI for which an attribute will be described
* @see #describeImages
* @see #modifyImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImageAttribute.html"
* />
* @see DescribeImagesOptions
*/
Set<String> getProductCodesForImage(String imageId);
/**
* Returns a map of device name to block device for the image.
*
* @param imageId
* The ID of the AMI for which an attribute will be described
* @see #describeImages
* @see #modifyImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImageAttribute.html"
* />
* @see DescribeImagesOptions
*/
Map<String, EbsBlockDevice> getBlockDeviceMappingsForImage(String imageId);
/** /**
* Creates an AMI that uses an Amazon EBS root device from a "running" or "stopped" instance. * Creates an AMI that uses an Amazon EBS root device from a "running" or "stopped" instance.
* *
* @param name The name of the AMI that was provided during image creation. 3-128 alphanumeric characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_) * @param name
* @param instanceId The ID of the instance. * The name of the AMI that was provided during image creation. 3-128 alphanumeric
* characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
* @param instanceId
* The ID of the instance.
* @return imageId
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html" * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
* /> * />
* @see CreateImageOptions * @see CreateImageOptions
* @see InstanceClient#runInstances * @see InstanceClient#runInstances
* @see InstanceClient#describeInstances * @see InstanceClient#describeInstances
* @see InstanceClient#terminateInstances * @see InstanceClient#terminateInstances
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateImage.html" * @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateImage.html"
* /> * />
*/ */
String createImage(String name, String instanceId, CreateImageOptions... options); String createImage(String name, String instanceId, CreateImageOptions... options);
/**
*
* Deregisters the specified AMI. Once deregistered, the AMI cannot be used to launch new
* instances.
*
* @param imageId
* Unique ID of the AMI which was assigned during registration. To register an AMI, use
* RegisterImage. To view the AMI IDs of AMIs that belong to your account. use
* DescribeImages.
*
* @see #describeImages
* @see #registerImage
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeregisterImage.html"
* />
*/
void deregisterImage(String imageId);
/**
* Registers an AMI with Amazon EC2. Images must be registered before they can be launched. To
* launch instances, use the {@link InstanceClient#runInstances} operation.
* <p/>
* Each AMI is associated with an unique ID which is provided by the Amazon EC2 service through
* this operation. If needed, you can deregister an AMI at any time.
* <p/>
* <h3>Note</h3> Any modifications to an AMI backed by Amazon S3 invalidates this registration.
* If you make changes to an image, deregister the previous image and register the new image.
*
* @param name
* The name of the AMI that was provided during image creation. 3-128 alphanumeric
* characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
* @param pathToManifest
* Full path to your AMI manifest in Amazon S3 storage.
* @param options
* Options to specify metadata such as architecture or secondary volumes to be
* associated with this image.
* @return imageId
*
* @see #describeImages
* @see #deregisterImage
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
* />
*/
String registerImageFromManifest(String name, String pathToManifest,
RegisterImageOptions... options);
/**
* Registers an AMI with Amazon EC2. Images must be registered before they can be launched. To
* launch instances, use the {@link InstanceClient#runInstances} operation. The root device name
* is /dev/sda1
* <p/>
* Each AMI is associated with an unique ID which is provided by the Amazon EC2 service through
* this operation. If needed, you can deregister an AMI at any time.
* <p/>
* <h3>Note</h3> AMIs backed by Amazon EBS are automatically registered when you create the
* image. However, you can use this to register a snapshot of an instance backed by Amazon EBS.
* <p/>
* Amazon EBS snapshots are not guaranteed to be bootable.
*
* @param name
* The name of the AMI that was provided during image creation. 3-128 alphanumeric
* characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
*
* @param ebsSnapshotId
* The id of the root snapshot (e.g., snap-6eba6e06).
* @param options
* Options to specify metadata such as architecture or secondary volumes to be
* associated with this image.
* @return imageId
*
* @see #describeImages
* @see #deregisterImage
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
* />
*/
String registerImageBackedByEbs(String name, String ebsSnapshotId,
RegisterImageBackedByEbsOptions... options);
/**
* Adds {@code launchPermission}s to an AMI.
*
* @param userIds
* AWS Access Key ID.
* @param userGroups
* Name of the groups. Currently supports \"all.\""
* @param imageId
* The AMI ID.
*
* @see #removeLaunchPermissionsFromImage
* @see #describeImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
* />
*/
void addLaunchPermissionsToImage(Iterable<String> userIds, Iterable<String> userGroups,
String imageId);
/**
* Resets the {@code launchPermission}s on an AMI.
*
* @param imageId
* ID of the AMI on which the attribute will be reset.
*
* @see #addLaunchPermissionsToImage
* @see #describeImageAttribute
* @see #removeProductCodesFromImage
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ResetImageAttribute.html"
* />
*/
void resetLaunchPermissionsOnImage(String imageId);
/**
* Removes {@code launchPermission}s from an AMI.
*
* @param userIds
* AWS Access Key ID.
* @param userGroups
* Name of the groups. Currently supports \"all.\""
* @param imageId
* The AMI ID.
*
* @see #addLaunchPermissionsToImage
* @see #describeImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
* />
*/
void removeLaunchPermissionsFromImage(Iterable<String> userIds, Iterable<String> userGroups,
String imageId);
/**
* Adds {@code productCode}s to an AMI.
*
* @param productCodes
* Product Codes
* @param imageId
* The AMI ID.
*
* @see #removeProductCodesFromImage
* @see #describeImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
* />
*/
void addProductCodesToImage(Iterable<String> productCodes, String imageId);
/**
* Removes {@code productCode}s from an AMI.
*
* @param productCodes
* Product Codes
* @param imageId
* The AMI ID.
*
* @see #addProductCodesToImage
* @see #describeImageAttribute
* @see #resetImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
* />
*/
void removeProductCodesFromImage(Iterable<String> productCodes, String imageId);
} }

View File

@ -33,13 +33,25 @@ import org.jclouds.rest.internal.GeneratedHttpRequest;
* @author Adrian Cole * @author Adrian Cole
*/ */
public class EC2Utils { public class EC2Utils {
public static void indexFormValuesWithPrefix(GeneratedHttpRequest<?> request, String prefix, public static void indexStringArrayToFormValuesWithPrefix(GeneratedHttpRequest<?> request,
Object input) { String prefix, Object input) {
checkArgument(checkNotNull(input, "input") instanceof String[], checkArgument(checkNotNull(input, "input") instanceof String[],
"this binder is only valid for String[] : " + input.getClass()); "this binder is only valid for String[] : " + input.getClass());
String[] values = (String[]) input; String[] values = (String[]) input;
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
request.addFormParam(prefix + "." + (i + 1), checkNotNull(values[i], prefix request.addFormParam(prefix + "." + (i + 1), checkNotNull(values[i], prefix.toLowerCase()
+ "s[" + i + "]"));
}
}
public static void indexIterableToFormValuesWithPrefix(GeneratedHttpRequest<?> request,
String prefix, Object input) {
checkArgument(checkNotNull(input, "input") instanceof Iterable<?>,
"this binder is only valid for Iterable<?>: " + input.getClass());
Iterable<?> values = (Iterable<?>) input;
int i = 0;
for (Object o : values) {
request.addFormParam(prefix + "." + (i++ + 1), checkNotNull(o.toString(), prefix
.toLowerCase() .toLowerCase()
+ "s[" + i + "]")); + "s[" + i + "]"));
} }

View File

@ -0,0 +1,74 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import java.util.Map;
import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.http.functions.ParseSax;
import com.google.common.collect.Maps;
/**
*
* @author Adrian Cole
*/
public class BlockDeviceMappingHandler extends
ParseSax.HandlerWithResult<Map<String, EbsBlockDevice>> {
private StringBuilder currentText = new StringBuilder();
private Map<String, EbsBlockDevice> ebsBlockDevices = Maps.newHashMap();
private String deviceName;
private String snapshotId;
private int volumeSize;
private boolean deleteOnTermination = true;// correct default is true.
public Map<String, EbsBlockDevice> getResult() {
return ebsBlockDevices;
}
public void endElement(String uri, String name, String qName) {
if (qName.equals("deviceName")) {
deviceName = currentText.toString().trim();
} else if (qName.equals("snapshotId")) {
snapshotId = currentText.toString().trim();
} else if (qName.equals("volumeSize")) {
volumeSize = Integer.parseInt(currentText.toString().trim());
} else if (qName.equals("deleteOnTermination")) {
deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("item")) {
ebsBlockDevices.put(deviceName, new Image.EbsBlockDevice(snapshotId, volumeSize,
deleteOnTermination));
this.snapshotId = null;
this.volumeSize = 0;
this.deleteOnTermination = true;
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -23,68 +23,87 @@
*/ */
package org.jclouds.aws.ec2.xml; package org.jclouds.aws.ec2.xml;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.SortedSet;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.Image.Architecture; import org.jclouds.aws.ec2.domain.Image.Architecture;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.aws.ec2.domain.Image.ImageState; import org.jclouds.aws.ec2.domain.Image.ImageState;
import org.jclouds.aws.ec2.domain.Image.ImageType; import org.jclouds.aws.ec2.domain.Image.ImageType;
import org.jclouds.aws.ec2.domain.Image.RootDeviceType;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.inject.internal.Nullable;
/** /**
* Parses the following XML document: * Parses the following XML document:
* <p/> * <p/>
* DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/" * DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/"
* *
* @author Adrian Cole * @author Adrian Cole
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html" * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
* /> * />
*/ */
public class DescribeImagesResponseHandler extends ParseSax.HandlerWithResult<SortedSet<Image>> { public class DescribeImagesResponseHandler extends ParseSax.HandlerWithResult<Set<Image>> {
@Resource @Resource
protected Logger logger = Logger.NULL; protected Logger logger = Logger.NULL;
private SortedSet<Image> contents = Sets.newTreeSet(); private Set<Image> contents = Sets.newHashSet();
private StringBuilder currentText = new StringBuilder(); private StringBuilder currentText = new StringBuilder();
private Architecture architecture; private Architecture architecture;
private String name;
private String description;
private String imageId; private String imageId;
private String imageLocation; private String imageLocation;
private String imageOwnerId; private String imageOwnerId;
private ImageState imageState; private ImageState imageState;
private ImageType imageType; private ImageType imageType;
private boolean isPublic; private boolean isPublic;
private @Nullable private String kernelId;
String kernelId;
private String platform; private String platform;
private Set<String> productCodes = Sets.newHashSet(); private Set<String> productCodes = Sets.newHashSet();
private @Nullable private String ramdiskId;
String ramdiskId;
private boolean inProductCodes; private boolean inProductCodes;
private boolean inBlockDeviceMapping;
private RootDeviceType rootDeviceType;
private Map<String, EbsBlockDevice> ebsBlockDevices = Maps.newHashMap();
private String deviceName;
private String snapshotId;
private int volumeSize;
private boolean deleteOnTermination = true;// correct default is true.
public SortedSet<Image> getResult() { private String rootDeviceName;
public Set<Image> getResult() {
return contents; return contents;
} }
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("productCodesSet")) { if (qName.equals("productCodes")) {
inProductCodes = true; inProductCodes = true;
} else if (qName.equals("blockDeviceMapping")) {
inBlockDeviceMapping = true;
} }
} }
public void endElement(String uri, String name, String qName) { public void endElement(String uri, String name, String qName) {
if (qName.equals("architecture")) { if (qName.equals("architecture")) {
architecture = Architecture.fromValue(currentText.toString().trim()); architecture = Architecture.fromValue(currentText.toString().trim());
} else if (qName.equals("name")) {
this.name = currentText.toString().trim();
} else if (qName.equals("description")) {
description = currentText.toString().trim();
} else if (qName.equals("imageId")) { } else if (qName.equals("imageId")) {
imageId = currentText.toString().trim(); imageId = currentText.toString().trim();
} else if (qName.equals("deviceName")) {
deviceName = currentText.toString().trim();
} else if (qName.equals("imageLocation")) { } else if (qName.equals("imageLocation")) {
imageLocation = currentText.toString().trim(); imageLocation = currentText.toString().trim();
} else if (qName.equals("imageOwnerId")) { } else if (qName.equals("imageOwnerId")) {
@ -101,19 +120,39 @@ public class DescribeImagesResponseHandler extends ParseSax.HandlerWithResult<So
platform = currentText.toString().trim(); platform = currentText.toString().trim();
} else if (qName.equals("productCode")) { } else if (qName.equals("productCode")) {
productCodes.add(currentText.toString().trim()); productCodes.add(currentText.toString().trim());
} else if (qName.equals("productCodesSet")) { } else if (qName.equals("productCodes")) {
inProductCodes = false; inProductCodes = false;
} else if (qName.equals("blockDeviceMapping")) {
inBlockDeviceMapping = false;
} else if (qName.equals("snapshotId")) {
snapshotId = currentText.toString().trim();
} else if (qName.equals("volumeSize")) {
volumeSize = Integer.parseInt(currentText.toString().trim());
} else if (qName.equals("deleteOnTermination")) {
deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
} else if (qName.equals("ramdiskId")) { } else if (qName.equals("ramdiskId")) {
ramdiskId = currentText.toString().trim(); ramdiskId = currentText.toString().trim();
} else if (qName.equals("rootDeviceType")) {
rootDeviceType = RootDeviceType.fromValue(currentText.toString().trim());
} else if (qName.equals("rootDeviceName")) {
rootDeviceName = currentText.toString().trim();
} else if (qName.equals("item")) { } else if (qName.equals("item")) {
if (!inProductCodes) { if (inBlockDeviceMapping) {
ebsBlockDevices.put(deviceName, new Image.EbsBlockDevice(snapshotId, volumeSize,
deleteOnTermination));
this.snapshotId = null;
this.volumeSize = 0;
this.deleteOnTermination = true;
} else if (!inProductCodes) {
try { try {
contents.add(new Image(architecture, imageId, imageLocation, imageOwnerId, contents.add(new Image(architecture, this.name, description, imageId, imageLocation,
imageState, imageType, isPublic, kernelId, platform, productCodes, imageOwnerId, imageState, imageType, isPublic, productCodes, kernelId,
ramdiskId)); platform, ramdiskId, rootDeviceType, rootDeviceName, ebsBlockDevices));
} catch (NullPointerException e) { } catch (NullPointerException e) {
logger.warn(e, "malformed image: %s", imageId); logger.warn(e, "malformed image: %s", imageId);
} }
this.name = null;
this.description = null;
this.architecture = null; this.architecture = null;
this.imageId = null; this.imageId = null;
this.imageLocation = null; this.imageLocation = null;
@ -125,6 +164,9 @@ public class DescribeImagesResponseHandler extends ParseSax.HandlerWithResult<So
this.platform = null; this.platform = null;
this.productCodes = Sets.newHashSet(); this.productCodes = Sets.newHashSet();
this.ramdiskId = null; this.ramdiskId = null;
this.rootDeviceType = null;
this.rootDeviceName = null;
this.ebsBlockDevices = Maps.newHashMap();
} }
} }

View File

@ -31,7 +31,7 @@ import org.jclouds.http.functions.ParseSax;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
* Parses: DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/" * Parses: DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/"
* *
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeKeyPairs.html" * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeKeyPairs.html"
* /> * />

View File

@ -35,7 +35,7 @@ import org.xml.sax.Attributes;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
* Parses: DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/" * Parses: DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/"
* *
* @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"
* /> * />

View File

@ -0,0 +1,56 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import org.jclouds.http.functions.ParseSax;
/**
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-RegisterImage.html"
* />
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-CreateImage.html"
* />
* @author Adrian Cole
*/
public class ImageIdHandler extends ParseSax.HandlerWithResult<String> {
private StringBuilder currentText = new StringBuilder();
private String imageId;
public String getResult() {
return imageId;
}
public void endElement(String uri, String name, String qName) {
if (qName.equalsIgnoreCase("ImageId")) {
this.imageId = currentText.toString().trim();
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -0,0 +1,62 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import java.util.Set;
import org.jclouds.aws.ec2.domain.LaunchPermission;
import org.jclouds.http.functions.ParseSax;
import com.google.common.collect.Sets;
/**
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeImageAttribute.html"
* />
* @author Adrian Cole
*/
public class LaunchPermissionHandler extends ParseSax.HandlerWithResult<LaunchPermission> {
private StringBuilder currentText = new StringBuilder();
private Set<String> userIds = Sets.newHashSet();
private Set<String> groups = Sets.newHashSet();
public LaunchPermission getResult() {
return new LaunchPermission(userIds, groups);
}
public void endElement(String uri, String name, String qName) {
if (qName.equalsIgnoreCase("group")) {
groups.add(currentText.toString().trim());
} else if (qName.equalsIgnoreCase("userId")) {
userIds.add(currentText.toString().trim());
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -0,0 +1,58 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import java.util.Set;
import org.jclouds.http.functions.ParseSax;
import com.google.common.collect.Sets;
/**
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeImageAttribute.html"
* />
* @author Adrian Cole
*/
public class ProductCodesHandler extends ParseSax.HandlerWithResult<Set<String>> {
private StringBuilder currentText = new StringBuilder();
private Set<String> productCodes = Sets.newHashSet();
public Set<String> getResult() {
return productCodes;
}
public void endElement(String uri, String name, String qName) {
if (qName.equalsIgnoreCase("productCode")) {
productCodes.add(currentText.toString().trim());
}
currentText = new StringBuilder();
}
public void characters(char ch[], int start, int length) {
currentText.append(ch, start, length);
}
}

View File

@ -24,7 +24,6 @@
package org.jclouds.aws.ec2; package org.jclouds.aws.ec2;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.aws.ec2.options.DescribeImagesOptions.Builder.imageIds;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotNull;
@ -33,8 +32,6 @@ import java.util.SortedSet;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.ImageAttribute;
import org.jclouds.aws.ec2.domain.IpPermission; import org.jclouds.aws.ec2.domain.IpPermission;
import org.jclouds.aws.ec2.domain.IpProtocol; import org.jclouds.aws.ec2.domain.IpProtocol;
import org.jclouds.aws.ec2.domain.KeyPair; import org.jclouds.aws.ec2.domain.KeyPair;
@ -59,7 +56,6 @@ public class EC2ClientLiveTest {
private EC2Client client; private EC2Client client;
private String user; private String user;
private String imageId = "ami-d7fe1fbe";
@BeforeGroups(groups = { "live" }) @BeforeGroups(groups = { "live" })
public void setupClient() { public void setupClient() {
@ -69,22 +65,6 @@ public class EC2ClientLiveTest {
client = EC2ContextFactory.createContext(user, password, new Log4JLoggingModule()).getApi(); client = EC2ContextFactory.createContext(user, password, new Log4JLoggingModule()).getApi();
} }
@Test
void testDescribeImages() {
SortedSet<Image> allResults = client.getAMIServices().describeImages();
assertNotNull(allResults);
assert allResults.size() >= 2 : allResults.size();
Iterator<Image> iterator = allResults.iterator();
String id1 = iterator.next().getImageId();
String id2 = iterator.next().getImageId();
SortedSet<Image> twoResults = client.getAMIServices().describeImages(imageIds(id1, id2));
assertNotNull(twoResults);
assertEquals(twoResults.size(), 2);
iterator = twoResults.iterator();
assertEquals(iterator.next().getImageId(), id1);
assertEquals(iterator.next().getImageId(), id2);
}
@Test @Test
void testDescribeAddresses() { void testDescribeAddresses() {
SortedSet<PublicIpInstanceIdPair> allResults = client.getElasticIPAddressServices() SortedSet<PublicIpInstanceIdPair> allResults = client.getElasticIPAddressServices()
@ -100,30 +80,6 @@ public class EC2ClientLiveTest {
} }
} }
@Test(dependsOnMethods = "testDescribeImages", enabled = false)
void testDescribeImageAttribute() throws InterruptedException, ExecutionException,
TimeoutException {
SortedSet<Image> oneResult = client.getAMIServices().describeImages(imageIds(imageId));
@SuppressWarnings("unused")
Image expects = oneResult.last();
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.PRODUCT_CODES));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.PRODUCT_CODES));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.RAMDISK));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.KERNEL));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.PLATFORM));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.LAUNCH_PERMISSION));
System.out.println(client.getAMIServices().describeImageAttribute(imageId,
ImageAttribute.BLOCK_DEVICE_MAPPING));
}
@Test @Test
void testDescribeInstances() { void testDescribeInstances() {
SortedSet<Reservation> allResults = client.getInstanceServices().describeInstances(); SortedSet<Reservation> allResults = client.getInstanceServices().describeInstances();

View File

@ -52,8 +52,8 @@ public class FormSignerTest {
"AWSAccessKeyId", "foo").put( "Action","DescribeImages").put( "AWSAccessKeyId", "foo").put( "Action","DescribeImages").put(
"Expires","2008-02-10T12:00:00Z").put("ImageId.1", "ami-2bb65342").put( "Expires","2008-02-10T12:00:00Z").put("ImageId.1", "ami-2bb65342").put(
"SignatureMethod", "HmacSHA256").put("SignatureVersion", "2").put("Version", "SignatureMethod", "HmacSHA256").put("SignatureVersion", "2").put("Version",
"2009-08-15").build()), "2009-11-30").build()),
"AWSAccessKeyId=foo&Action=DescribeImages&Expires=2008-02-10T12%3A00%3A00Z&ImageId.1=ami-2bb65342&SignatureMethod=HmacSHA256&SignatureVersion=2&Version=2009-08-15"); "AWSAccessKeyId=foo&Action=DescribeImages&Expires=2008-02-10T12%3A00%3A00Z&ImageId.1=ami-2bb65342&SignatureMethod=HmacSHA256&SignatureVersion=2&Version=2009-11-30");
} }
/** /**

View File

@ -0,0 +1,337 @@
/**
*
* Copyright (C) 2119 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.1 (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.1
*
* 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 org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.addBlockDeviceFromSnapshot;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.addEphemeralBlockDeviceFromSnapshot;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.addNewBlockDevice;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.addNewEphemeralBlockDevice;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.asArchitecture;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.withDescription;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.withKernelId;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.withRamdisk;
import static org.testng.Assert.assertEquals;
import java.util.Collections;
import org.jclouds.aws.ec2.domain.Image.Architecture;
import org.jclouds.http.options.HttpRequestOptions;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMultimap;
/**
* Tests possible uses of RegisterImageBackedByEbsOptions and
* RegisterImageBackedByEbsOptions.Builder.*
*
* @author Adrian Cole
*/
public class RegisterImageBackedByEbsOptionsTest {
@Test
public void testAssignability() {
assert HttpRequestOptions.class.isAssignableFrom(RegisterImageBackedByEbsOptions.class);
assert !String.class.isAssignableFrom(RegisterImageBackedByEbsOptions.class);
}
@Test
public void testWithDescription() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.withDescription("test");
assertEquals(options.buildFormParameters().get("Description"), Collections
.singletonList("test"));
}
@Test
public void testNullWithDescription() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters().get("Description"), Collections.EMPTY_LIST);
}
@Test
public void testWithDescriptionStatic() {
RegisterImageBackedByEbsOptions options = withDescription("test");
assertEquals(options.buildFormParameters().get("Description"), Collections
.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithDescriptionNPE() {
withDescription(null);
}
@Test
public void testWithArchitecture() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.asArchitecture(Architecture.I386);
assertEquals(options.buildFormParameters().get("Architecture"), Collections
.singletonList("i386"));
}
@Test
public void testNullWithArchitecture() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters().get("Architecture"), Collections.EMPTY_LIST);
}
@Test
public void testWithArchitectureStatic() {
RegisterImageBackedByEbsOptions options = asArchitecture(Architecture.I386);
assertEquals(options.buildFormParameters().get("Architecture"), Collections
.singletonList("i386"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithArchitectureNPE() {
asArchitecture(null);
}
@Test
public void testWithKernelId() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.withKernelId("test");
assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test"));
}
@Test
public void testNullWithKernelId() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters().get("KernelId"), Collections.EMPTY_LIST);
}
@Test
public void testWithKernelIdStatic() {
RegisterImageBackedByEbsOptions options = withKernelId("test");
assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithKernelIdNPE() {
withKernelId(null);
}
@Test
public void testWithRamdisk() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.withRamdisk("test");
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections
.singletonList("test"));
}
@Test
public void testNullWithRamdisk() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections.EMPTY_LIST);
}
@Test
public void testWithRamdiskStatic() {
RegisterImageBackedByEbsOptions options = withRamdisk("test");
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections
.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithRamdiskNPE() {
withRamdisk(null);
}
@Test
public void testAddBlockDeviceFromSnapshot() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addBlockDeviceFromSnapshot("deviceName", "virtualName", "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test
public void testAddBlockDeviceFromSnapshotNullVirtualName() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addBlockDeviceFromSnapshot("deviceName", null, "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName",
"BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test
public void testNullAddBlockDeviceFromSnapshot() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters(), ImmutableMultimap.<String, String> of());
}
@Test
public void testAddBlockDeviceFromSnapshotStatic() {
RegisterImageBackedByEbsOptions options = addBlockDeviceFromSnapshot("deviceName",
"virtualName", "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test(expectedExceptions = NullPointerException.class)
public void testAddBlockDeviceFromSnapshotNPE() {
addBlockDeviceFromSnapshot(null, null, null);
}
@Test
public void testAddEphemeralBlockDeviceFromSnapshot() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addEphemeralBlockDeviceFromSnapshot("deviceName", "virtualName", "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test
public void testAddEphemeralBlockDeviceFromSnapshotNullVirtualName() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addEphemeralBlockDeviceFromSnapshot("deviceName", null, "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName",
"BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test
public void testNullAddEphemeralBlockDeviceFromSnapshot() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters(), ImmutableMultimap.<String, String> of());
}
@Test
public void testAddEphemeralBlockDeviceFromSnapshotStatic() {
RegisterImageBackedByEbsOptions options = addEphemeralBlockDeviceFromSnapshot("deviceName",
"virtualName", "snapshotId");
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.SnapshotId", "snapshotId").entries());
}
@Test(expectedExceptions = NullPointerException.class)
public void testAddEphemeralBlockDeviceFromSnapshotNPE() {
addEphemeralBlockDeviceFromSnapshot(null, null, null);
}
// //////
@Test
public void testAddNewBlockDevice() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addNewBlockDevice("deviceName", "virtualName", 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test
public void testAddNewBlockDeviceNullVirtualName() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addNewBlockDevice("deviceName", null, 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName",
"BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test
public void testNullAddNewBlockDevice() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters(), ImmutableMultimap.<String, String> of());
}
@Test
public void testAddNewBlockDeviceStatic() {
RegisterImageBackedByEbsOptions options = addNewBlockDevice("deviceName", "virtualName", 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.Ebs.DeleteOnTermination", "false",
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test(expectedExceptions = NullPointerException.class)
public void testAddNewBlockDeviceNPE() {
addNewBlockDevice(null, null, 1);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testAddNewBlockDeviceTooBig() {
addNewBlockDevice("deviceName", "virtualName", 1025);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testAddNewBlockDeviceTooSmall() {
addNewBlockDevice("deviceName", "virtualName", 0);
}
@Test
public void testAddNewEphemeralBlockDevice() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addNewEphemeralBlockDevice("deviceName", "virtualName", 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test
public void testAddNewEphemeralBlockDeviceNullVirtualName() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
options.addNewEphemeralBlockDevice("deviceName", null, 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName",
"BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test
public void testNullAddNewEphemeralBlockDevice() {
RegisterImageBackedByEbsOptions options = new RegisterImageBackedByEbsOptions();
assertEquals(options.buildFormParameters(), ImmutableMultimap.<String, String> of());
}
@Test
public void testAddNewEphemeralBlockDeviceStatic() {
RegisterImageBackedByEbsOptions options = addNewEphemeralBlockDevice("deviceName",
"virtualName", 1);
assertEquals(options.buildFormParameters().entries(), ImmutableMultimap.of(
"BlockDeviceMapping.1.DeviceName", "deviceName", "BlockDeviceMapping.1.VirtualName",
"virtualName", "BlockDeviceMapping.1.Ebs.VolumeSize", "1").entries());
}
@Test(expectedExceptions = NullPointerException.class)
public void testAddNewEphemeralBlockDeviceNPE() {
addNewEphemeralBlockDevice(null, null, 1);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testAddNewEphemeralBlockDeviceTooBig() {
addNewEphemeralBlockDevice("deviceName", "virtualName", 1025);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testAddNewEphemeralBlockDeviceTooSmall() {
addNewEphemeralBlockDevice("deviceName", "virtualName", 0);
}
}

View File

@ -0,0 +1,153 @@
/**
*
* Copyright (C) 2119 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.1 (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.1
*
* 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 org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.asArchitecture;
import static org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.withDescription;
import static org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.withKernelId;
import static org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.withRamdisk;
import static org.testng.Assert.assertEquals;
import java.util.Collections;
import org.jclouds.aws.ec2.domain.Image.Architecture;
import org.jclouds.http.options.HttpRequestOptions;
import org.testng.annotations.Test;
/**
* Tests possible uses of RegisterImageOptions and RegisterImageOptions.Builder.*
*
* @author Adrian Cole
*/
public class RegisterImageOptionsTest {
@Test
public void testAssignability() {
assert HttpRequestOptions.class.isAssignableFrom(RegisterImageOptions.class);
assert !String.class.isAssignableFrom(RegisterImageOptions.class);
}
@Test
public void testWithDescription() {
RegisterImageOptions options = new RegisterImageOptions();
options.withDescription("test");
assertEquals(options.buildFormParameters().get("Description"), Collections
.singletonList("test"));
}
@Test
public void testNullWithDescription() {
RegisterImageOptions options = new RegisterImageOptions();
assertEquals(options.buildFormParameters().get("Description"), Collections.EMPTY_LIST);
}
@Test
public void testWithDescriptionStatic() {
RegisterImageOptions options = withDescription("test");
assertEquals(options.buildFormParameters().get("Description"), Collections
.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithDescriptionNPE() {
withDescription(null);
}
@Test
public void testWithArchitecture() {
RegisterImageOptions options = new RegisterImageOptions();
options.asArchitecture(Architecture.I386);
assertEquals(options.buildFormParameters().get("Architecture"), Collections
.singletonList("i386"));
}
@Test
public void testNullWithArchitecture() {
RegisterImageOptions options = new RegisterImageOptions();
assertEquals(options.buildFormParameters().get("Architecture"), Collections.EMPTY_LIST);
}
@Test
public void testWithArchitectureStatic() {
RegisterImageOptions options = asArchitecture(Architecture.I386);
assertEquals(options.buildFormParameters().get("Architecture"), Collections
.singletonList("i386"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithArchitectureNPE() {
asArchitecture(null);
}
@Test
public void testWithKernelId() {
RegisterImageOptions options = new RegisterImageOptions();
options.withKernelId("test");
assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test"));
}
@Test
public void testNullWithKernelId() {
RegisterImageOptions options = new RegisterImageOptions();
assertEquals(options.buildFormParameters().get("KernelId"), Collections.EMPTY_LIST);
}
@Test
public void testWithKernelIdStatic() {
RegisterImageOptions options = withKernelId("test");
assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithKernelIdNPE() {
withKernelId(null);
}
@Test
public void testWithRamdisk() {
RegisterImageOptions options = new RegisterImageOptions();
options.withRamdisk("test");
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections
.singletonList("test"));
}
@Test
public void testNullWithRamdisk() {
RegisterImageOptions options = new RegisterImageOptions();
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections.EMPTY_LIST);
}
@Test
public void testWithRamdiskStatic() {
RegisterImageOptions options = withRamdisk("test");
assertEquals(options.buildFormParameters().get("RamdiskId"), Collections
.singletonList("test"));
}
@Test(expectedExceptions = NullPointerException.class)
public void testWithRamdiskNPE() {
withRamdisk(null);
}
}

View File

@ -32,15 +32,20 @@ import java.lang.reflect.Method;
import java.net.URI; import java.net.URI;
import org.jclouds.aws.ec2.EC2; import org.jclouds.aws.ec2.EC2;
import org.jclouds.aws.ec2.domain.ImageAttribute;
import org.jclouds.aws.ec2.filters.FormSigner; import org.jclouds.aws.ec2.filters.FormSigner;
import org.jclouds.aws.ec2.options.CreateImageOptions; import org.jclouds.aws.ec2.options.CreateImageOptions;
import org.jclouds.aws.ec2.options.DescribeImagesOptions; import org.jclouds.aws.ec2.options.DescribeImagesOptions;
import org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions;
import org.jclouds.aws.ec2.options.RegisterImageOptions;
import org.jclouds.aws.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandler; import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandler;
import org.jclouds.aws.ec2.xml.ImageIdHandler;
import org.jclouds.aws.ec2.xml.LaunchPermissionHandler;
import org.jclouds.aws.ec2.xml.ProductCodesHandler;
import org.jclouds.aws.reference.AWSConstants; import org.jclouds.aws.reference.AWSConstants;
import org.jclouds.date.TimeStamp; import org.jclouds.date.TimeStamp;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReturnStringIf200; import org.jclouds.http.functions.ReturnVoidIf2xx;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.logging.Logger.LoggerFactory; import org.jclouds.logging.Logger.LoggerFactory;
import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestClientTest;
@ -50,6 +55,7 @@ import org.jclouds.util.Jsr330;
import org.testng.annotations.BeforeTest; import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Module; import com.google.inject.Module;
import com.google.inject.Provides; import com.google.inject.Provides;
@ -74,13 +80,8 @@ public class AMIAsyncClientTest extends RestClientTest<AMIAsyncClient> {
"Content-Length: 69\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n"); "Content-Length: 69\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod, assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=CreateImage&Name=name&InstanceId=instanceId"); "Version=2009-11-30&Action=CreateImage&Name=name&InstanceId=instanceId");
filter.filter(httpMethod); assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertPayloadEquals( assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
httpMethod,
"Action=CreateImage&InstanceId=instanceId&Name=name&Signature=DPCvwvxdNmWXHfiIB%2BRy%2F4gJDAruu6i8dQVirzkFGOU%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2009-11-30&AWSAccessKeyId=user");
assertResponseParserClassEquals(method, httpMethod, ReturnStringIf200.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null); assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod); checkFilters(httpMethod);
@ -100,10 +101,8 @@ public class AMIAsyncClientTest extends RestClientTest<AMIAsyncClient> {
httpMethod, httpMethod,
"Version=2009-11-30&Action=CreateImage&Name=name&InstanceId=instanceId&Description=description&NoReboot=true"); "Version=2009-11-30&Action=CreateImage&Name=name&InstanceId=instanceId&Description=description&NoReboot=true");
assertResponseParserClassEquals(method, httpMethod, ReturnStringIf200.class); assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
// assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
// assertSaxResponseParserClassEquals(method, CreateImageResponseHandler.class);
assertExceptionParserClassEquals(method, null); assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod); checkFilters(httpMethod);
@ -151,24 +150,265 @@ public class AMIAsyncClientTest extends RestClientTest<AMIAsyncClient> {
checkFilters(httpMethod); checkFilters(httpMethod);
} }
public void testDescribeImageAttribute() throws SecurityException, NoSuchMethodException, public void testDeregisterImage() throws SecurityException, NoSuchMethodException, IOException {
Method method = AMIAsyncClient.class.getMethod("deregisterImage", String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 57\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod, "Version=2009-11-30&Action=DeregisterImage&ImageId=imageId");
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRegisterImageFromManifest() throws SecurityException, NoSuchMethodException,
IOException { IOException {
Method method = AMIAsyncClient.class.getMethod("describeImageAttribute", String.class, Method method = AMIAsyncClient.class.getMethod("registerImageFromManifest", String.class,
ImageAttribute.class); String.class, Array.newInstance(RegisterImageOptions.class, 0).getClass());
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId", GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "name",
ImageAttribute.BLOCK_DEVICE_MAPPING); "pathToManifest");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 78\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=RegisterImage&Name=name&ImageLocation=pathToManifest");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRegisterImageFromManifestOptions() throws SecurityException,
NoSuchMethodException, IOException {
Method method = AMIAsyncClient.class.getMethod("registerImageFromManifest", String.class,
String.class, Array.newInstance(RegisterImageOptions.class, 0).getClass());
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "name",
"pathToManifest", new RegisterImageOptions().withDescription("description"));
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 102\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=RegisterImage&Name=name&ImageLocation=pathToManifest&Description=description");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRegisterImageBackedByEBS() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class
.getMethod("registerImageBackedByEbs", String.class, String.class, Array
.newInstance(RegisterImageBackedByEbsOptions.class, 0).getClass());
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
"imageName", "snapshotId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 176\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&Name=imageName&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRegisterImageBackedByEBSOptions() throws SecurityException,
NoSuchMethodException, IOException {
Method method = AMIAsyncClient.class
.getMethod("registerImageBackedByEbs", String.class, String.class, Array
.newInstance(RegisterImageBackedByEbsOptions.class, 0).getClass());
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
"imageName", "snapshotId", new RegisterImageBackedByEbsOptions().withDescription(
"description").addBlockDeviceFromSnapshot("/dev/device", null, "snapshot")
.addNewBlockDevice("/dev/newdevice", "newblock", 100));
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 528\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&Name=imageName&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&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");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, ImageIdHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testGetLaunchPermissionForImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("getLaunchPermissionForImage", String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 91\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=DescribeImageAttribute&Attribute=launchPermission&ImageId=imageId");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, LaunchPermissionHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testGetProductCodesForImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("getProductCodesForImage", String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 87\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=DescribeImageAttribute&Attribute=productCodes&ImageId=imageId");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, ProductCodesHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testGetBlockDeviceMappingsForImage() throws SecurityException,
NoSuchMethodException, IOException {
Method method = AMIAsyncClient.class
.getMethod("getBlockDeviceMappingsForImage", String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1"); assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod, assertHeadersEqual(httpMethod,
"Content-Length: 93\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n"); "Content-Length: 93\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod, assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=DescribeImageAttribute&ImageId=imageId&Attribute=blockDeviceMapping"); "Version=2009-11-30&Action=DescribeImageAttribute&Attribute=blockDeviceMapping&ImageId=imageId");
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
assertSaxResponseParserClassEquals(method, BlockDeviceMappingHandler.class);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testAddLaunchPermissionsToImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("addLaunchPermissionsToImage", Iterable.class,
Iterable.class, String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
ImmutableList.of("bob", "sue"), ImmutableList.of("all"), "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 107\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=ModifyImageAttribute&OperationType=add&Attribute=launchPermission&ImageId=imageId&UserId.1=bob&UserId.2=sue&UserGroup.1=all");
filter.filter(httpMethod); filter.filter(httpMethod);
assertPayloadEquals( assertPayloadEquals(
httpMethod, httpMethod,
"Action=DescribeImageAttribute&Attribute=blockDeviceMapping&ImageId=imageId&Signature=A1%2BcJegB6Et36%2BGC%2FEJ0puDJljBY9oeF2YYsH%2FDIxUA%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2009-11-30&AWSAccessKeyId=user"); "Action=ModifyImageAttribute&Attribute=launchPermission&ImageId=imageId&OperationType=add&Signature=pWWwIIdcLSw0vrWFpRsCnHk93X3qYWVfcl%2FaXRhoFd8%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&UserGroup.1=all&UserId.1=bob&UserId.2=sue&Version=2009-11-30&AWSAccessKeyId=user");
assertResponseParserClassEquals(method, httpMethod, ReturnStringIf200.class); assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRemoveLaunchPermissionsFromImage() throws SecurityException,
NoSuchMethodException, IOException {
Method method = AMIAsyncClient.class.getMethod("removeLaunchPermissionsFromImage",
Iterable.class, Iterable.class, String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
ImmutableList.of("bob", "sue"), ImmutableList.of("all"), "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 110\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=ModifyImageAttribute&OperationType=remove&Attribute=launchPermission&ImageId=imageId&UserId.1=bob&UserId.2=sue&UserGroup.1=all");
filter.filter(httpMethod);
assertPayloadEquals(
httpMethod,
"Action=ModifyImageAttribute&Attribute=launchPermission&ImageId=imageId&OperationType=remove&Signature=hgjXXq6PXEuHCIsp5izCTJqS%2Biv2ZdnIv0VSV1kYy%2BE%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&UserGroup.1=all&UserId.1=bob&UserId.2=sue&Version=2009-11-30&AWSAccessKeyId=user");
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testResetLaunchPermissionsOnImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("resetLaunchPermissionsOnImage", String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method, "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 88\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(httpMethod,
"Version=2009-11-30&Action=ResetImageAttribute&Attribute=launchPermission&ImageId=imageId");
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testAddProductCodesToImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("addProductCodesToImage", Iterable.class,
String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
ImmutableList.of("code1", "code2"), "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 103\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=ModifyImageAttribute&OperationType=add&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2");
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpMethod);
}
public void testRemoveProductCodesFromImage() throws SecurityException, NoSuchMethodException,
IOException {
Method method = AMIAsyncClient.class.getMethod("removeProductCodesFromImage", Iterable.class,
String.class);
GeneratedHttpRequest<AMIAsyncClient> httpMethod = processor.createRequest(method,
ImmutableList.of("code1", "code2"), "imageId");
assertRequestLineEquals(httpMethod, "POST https://ec2.amazonaws.com/ HTTP/1.1");
assertHeadersEqual(httpMethod,
"Content-Length: 106\nContent-Type: application/x-www-form-urlencoded\nHost: ec2.amazonaws.com\n");
assertPayloadEquals(
httpMethod,
"Version=2009-11-30&Action=ModifyImageAttribute&OperationType=remove&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2");
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null); assertExceptionParserClassEquals(method, null);

View File

@ -0,0 +1,198 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.services;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.aws.ec2.options.DescribeImagesOptions.Builder.imageIds;
import static org.jclouds.aws.ec2.options.RegisterImageOptions.Builder.withDescription;
import static org.jclouds.aws.ec2.options.RegisterImageBackedByEbsOptions.Builder.addNewBlockDevice;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import org.jclouds.aws.ec2.EC2AsyncClient;
import org.jclouds.aws.ec2.EC2Client;
import org.jclouds.aws.ec2.EC2ContextFactory;
import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.Image.ImageType;
import org.jclouds.aws.ec2.domain.Image.RootDeviceType;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.rest.RestContext;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.inject.internal.ImmutableMap;
/**
* Tests behavior of {@code AMIClient}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "ec2.AMIClientLiveTest")
public class AMIClientLiveTest {
private AMIClient client;
private String user;
private String imageId = "ami-cdf819a4";
private static final String DEFAULT_MANIFEST = "adrianimages/image.manifest.xml";
private static final String DEFAULT_SNAPSHOT = "TODO";
private RestContext<EC2AsyncClient, EC2Client> context;
private Set<String> imagesToDeregister = Sets.newHashSet();
@BeforeGroups(groups = { "live" })
public void setupClient() {
user = checkNotNull(System.getProperty("jclouds.test.user"), "jclouds.test.user");
String password = checkNotNull(System.getProperty("jclouds.test.key"), "jclouds.test.key");
context = EC2ContextFactory.createContext(user, password, new Log4JLoggingModule());
client = context.getApi().getAMIServices();
}
public void testDescribeImages() {
SortedSet<Image> allResults = Sets.newTreeSet(client.describeImages());
assertNotNull(allResults);
assert allResults.size() >= 2 : allResults.size();
Iterator<Image> iterator = allResults.iterator();
String id1 = iterator.next().getImageId();
String id2 = iterator.next().getImageId();
SortedSet<Image> twoResults = Sets.newTreeSet(client.describeImages(imageIds(id1, id2)));
assertNotNull(twoResults);
assertEquals(twoResults.size(), 2);
iterator = twoResults.iterator();
assertEquals(iterator.next().getImageId(), id1);
assertEquals(iterator.next().getImageId(), id2);
}
public void testRegisterImageFromManifest() {
String imageRegisteredId = client.registerImageFromManifest("jcloudstest1", DEFAULT_MANIFEST);
imagesToDeregister.add(imageRegisteredId);
Image imageRegisteredFromManifest = Iterables.getOnlyElement(client
.describeImages(imageIds(imageRegisteredId)));
assertEquals(imageRegisteredFromManifest.getName(), "jcloudstest1");
assertEquals(imageRegisteredFromManifest.getImageLocation(), DEFAULT_MANIFEST);
assertEquals(imageRegisteredFromManifest.getImageType(), ImageType.MACHINE);
assertEquals(imageRegisteredFromManifest.getRootDeviceType(), RootDeviceType.INSTANCE_STORE);
assertEquals(imageRegisteredFromManifest.getRootDeviceName(), "/dev/sda1");
}
public void testRegisterImageFromManifestOptions() {
String imageRegisteredWithOptionsId = client.registerImageFromManifest("jcloudstest2",
DEFAULT_MANIFEST, withDescription("adrian"));
imagesToDeregister.add(imageRegisteredWithOptionsId);
Image imageRegisteredFromManifestWithOptions = Iterables.getOnlyElement(client
.describeImages(imageIds(imageRegisteredWithOptionsId)));
assertEquals(imageRegisteredFromManifestWithOptions.getName(), "jcloudstest2");
assertEquals(imageRegisteredFromManifestWithOptions.getImageLocation(), DEFAULT_MANIFEST);
assertEquals(imageRegisteredFromManifestWithOptions.getImageType(), ImageType.MACHINE);
assertEquals(imageRegisteredFromManifestWithOptions.getRootDeviceType(),
RootDeviceType.INSTANCE_STORE);
assertEquals(imageRegisteredFromManifestWithOptions.getRootDeviceName(), "/dev/sda1");
assertEquals(imageRegisteredFromManifestWithOptions.getDescription(), "adrian");
}
@Test(enabled = false)
// awaiting EBS functionality to be added to jclouds
public void testRegisterImageBackedByEBS() {
String imageRegisteredId = client.registerImageBackedByEbs("jcloudstest1", DEFAULT_MANIFEST);
imagesToDeregister.add(imageRegisteredId);
Image imageRegistered = Iterables.getOnlyElement(client
.describeImages(imageIds(imageRegisteredId)));
assertEquals(imageRegistered.getName(), "jcloudstest1");
assertEquals(imageRegistered.getImageType(), ImageType.MACHINE);
assertEquals(imageRegistered.getRootDeviceType(), RootDeviceType.EBS);
assertEquals(imageRegistered.getRootDeviceName(), "/dev/sda1");
}
@Test(enabled = false)
// awaiting EBS functionality to be added to jclouds
public void testRegisterImageBackedByEBSOptions() {
String imageRegisteredWithOptionsId = client.registerImageBackedByEbs("jcloudstest2",
DEFAULT_SNAPSHOT, addNewBlockDevice("/dev/sda2", "myvirtual", 1).withDescription(
"adrian"));
imagesToDeregister.add(imageRegisteredWithOptionsId);
Image imageRegisteredWithOptions = Iterables.getOnlyElement(client
.describeImages(imageIds(imageRegisteredWithOptionsId)));
assertEquals(imageRegisteredWithOptions.getName(), "jcloudstest2");
assertEquals(imageRegisteredWithOptions.getImageType(), ImageType.MACHINE);
assertEquals(imageRegisteredWithOptions.getRootDeviceType(), RootDeviceType.EBS);
assertEquals(imageRegisteredWithOptions.getRootDeviceName(), "/dev/sda1");
assertEquals(imageRegisteredWithOptions.getDescription(), "adrian");
assertEquals(imageRegisteredWithOptions.getEbsBlockDevices().entrySet(), ImmutableMap.of(
"/dev/sda1", new Image.EbsBlockDevice("/dev/sda1", 30, true), "/dev/sda2",
new Image.EbsBlockDevice("/dev/sda2", 1, true)).entrySet());
}
@Test(enabled = false)
public void testCreateImage() {
// TODO client.createImage(name, instanceId, options);
}
@Test(enabled = false)
public void testAddLaunchPermissionsToImage() {
// TODO client.addLaunchPermissionsToImage(userIds, userGroups, imageId);
}
@Test(enabled = false)
public void testAddProductCodesToImage() {
// TODO client.addProductCodesToImage(productCodes, imageId);
}
@Test(enabled = false)
public void testRemoveLaunchPermissionsFromImage() {
// TODO client.removeLaunchPermissionsFromImage(userIds, userGroups, imageId);
}
@Test(enabled = false)
public void testResetLaunchPermissionsOnImage() {
// TODO client.resetLaunchPermissionsOnImage(imageId);
}
public void testGetLaunchPermissionForImage() {
System.out.println(client.getLaunchPermissionForImage(imageId));
}
public void testGetProductCodesForImage() {
System.out.println(client.getProductCodesForImage(imageId));
}
@Test(enabled = false)
// awaiting ebs support
public void testGetBlockDeviceMappingsForImage() {
System.out.println(client.getBlockDeviceMappingsForImage(imageId));
}
@AfterTest
public void deregisterImages() {
for (String imageId : imagesToDeregister)
client.deregisterImage(imageId);
}
}

View File

@ -0,0 +1,58 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import java.util.Map;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.http.functions.BaseHandlerTest;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
/**
* Tests behavior of {@code BlockDeviceMappingHandler}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "ec2.BlockDeviceMappingHandlerTest")
public class BlockDeviceMappingHandlerTest extends BaseHandlerTest {
public void testApplyInputStream() {
InputStream is = getClass().getResourceAsStream(
"/ec2/describe_image_attribute_blockDeviceMapping.xml");
Map<String, EbsBlockDevice> expected = ImmutableMap.<String, EbsBlockDevice> of("/dev/sda1",
new EbsBlockDevice("snap-d01272b9", 30, true), "xvdf", new EbsBlockDevice(
"snap-d31272ba", 250, false));
Map<String, EbsBlockDevice> result = factory.create(
injector.getInstance(BlockDeviceMappingHandler.class)).parse(is);
assertEquals(result, expected);
}
}

View File

@ -26,15 +26,18 @@ package org.jclouds.aws.ec2.xml;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.InputStream; import java.io.InputStream;
import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.domain.Image;
import org.jclouds.aws.ec2.domain.Image.Architecture; import org.jclouds.aws.ec2.domain.Image.Architecture;
import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.aws.ec2.domain.Image.ImageState; import org.jclouds.aws.ec2.domain.Image.ImageState;
import org.jclouds.aws.ec2.domain.Image.ImageType; import org.jclouds.aws.ec2.domain.Image.ImageType;
import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.http.functions.BaseHandlerTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
@ -45,17 +48,54 @@ import com.google.common.collect.Sets;
@Test(groups = "unit", testName = "ec2.DescribeImagesResponseHandlerTest") @Test(groups = "unit", testName = "ec2.DescribeImagesResponseHandlerTest")
public class DescribeImagesResponseHandlerTest extends BaseHandlerTest { public class DescribeImagesResponseHandlerTest extends BaseHandlerTest {
public void testApplyInputStream() { public void testUNIX() {
InputStream is = getClass().getResourceAsStream("/ec2/describe_images.xml"); InputStream is = getClass().getResourceAsStream("/ec2/describe_images.xml");
SortedSet<Image> contents = Sets.newTreeSet(); SortedSet<Image> contents = Sets.newTreeSet();
contents.add(new Image(Architecture.I386, "ami-be3adfd7", contents.add(new Image(Architecture.I386, null, null, "ami-be3adfd7",
"ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml", "206029621532", "ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml", "206029621532",
ImageState.AVAILABLE, ImageType.MACHINE, false, "aki-4438dd2d", null, Sets ImageState.AVAILABLE, ImageType.MACHINE, false,
.<String> newHashSet(), "ari-4538dd2c")); Sets.<String> newHashSet("9961934F"), "aki-4438dd2d", null, "ari-4538dd2c",
Image.RootDeviceType.INSTANCE_STORE, null, ImmutableMap
.<String, EbsBlockDevice> of()));
SortedSet<Image> result = (SortedSet<Image>) factory.create( Set<Image> result = factory.create(injector.getInstance(DescribeImagesResponseHandler.class))
injector.getInstance(DescribeImagesResponseHandler.class)).parse(is); .parse(is);
assertEquals(result, contents);
}
public void testWindows() {
InputStream is = getClass().getResourceAsStream("/ec2/describe_images_windows.xml");
SortedSet<Image> contents = Sets.newTreeSet();
contents.add(new Image(Architecture.X86_64, null, null, "ami-02eb086b",
"aws-solutions-amis/SqlSvrStd2003r2-x86_64-Win_SFWBasic5.1-v1.0.manifest.xml",
"771350841976", ImageState.AVAILABLE, ImageType.MACHINE, true, Sets
.<String> newHashSet("5771E9A6"), null, "windows", null,
Image.RootDeviceType.INSTANCE_STORE, null, ImmutableMap
.<String, EbsBlockDevice> of()));
Set<Image> result = factory.create(injector.getInstance(DescribeImagesResponseHandler.class))
.parse(is);
assertEquals(result, contents);
}
public void testEBS() {
InputStream is = getClass().getResourceAsStream("/ec2/describe_images_ebs.xml");
SortedSet<Image> contents = Sets.newTreeSet();
contents.add(new Image(Architecture.I386, "websrv_2009-12-10", "Web Server AMI",
"ami-246f8d4d", "706093390852/websrv_2009-12-10", "706093390852",
ImageState.AVAILABLE, ImageType.MACHINE, true, Sets.<String> newHashSet(), null,
"windows", null, Image.RootDeviceType.EBS, "/dev/sda1", ImmutableMap
.<String, EbsBlockDevice> of("/dev/sda1", new EbsBlockDevice(
"snap-d01272b9", 30, true), "xvdf", new EbsBlockDevice(
"snap-d31272ba", 250, false))));
Set<Image> result = factory.create(injector.getInstance(DescribeImagesResponseHandler.class))
.parse(is);
assertEquals(result, contents); assertEquals(result, contents);
} }

View File

@ -0,0 +1,56 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import org.jclouds.aws.ec2.domain.LaunchPermission;
import org.jclouds.http.functions.BaseHandlerTest;
import org.testng.annotations.Test;
import com.google.common.collect.Sets;
/**
* Tests behavior of {@code LaunchPermissionHandler}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "ec2.LaunchPermissionHandlerTest")
public class LaunchPermissionHandlerTest extends BaseHandlerTest {
public void testApplyInputStream() {
InputStream is = getClass().getResourceAsStream(
"/ec2/describe_image_attribute_launchPermission.xml");
LaunchPermission expected = new LaunchPermission(Sets.newHashSet("495219933132"), Sets
.newHashSet("all"));
LaunchPermission result = factory.create(injector.getInstance(LaunchPermissionHandler.class))
.parse(is);
assertEquals(result, expected);
}
}

View File

@ -0,0 +1,55 @@
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.ec2.xml;
import static org.testng.Assert.assertEquals;
import java.io.InputStream;
import java.util.Set;
import org.jclouds.http.functions.BaseHandlerTest;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
/**
* Tests behavior of {@code ProductCodesHandler}
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "ec2.ProductCodesHandlerTest")
public class ProductCodesHandlerTest extends BaseHandlerTest {
public void testApplyInputStream() {
InputStream is = getClass().getResourceAsStream(
"/ec2/describe_image_attribute_productCodes.xml");
Set<String> expected = ImmutableSet.of("774F4FF8");
Set<String> result = factory.create(injector.getInstance(ProductCodesHandler.class))
.parse(is);
assertEquals(result, expected);
}
}

View File

@ -1,3 +1,3 @@
<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<publicIp>67.202.55.255</publicIp> <publicIp>67.202.55.255</publicIp>
</AllocateAddressResponse> </AllocateAddressResponse>

View File

@ -1,4 +1,4 @@
<CreateKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <CreateKeyPairResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<keyName>gsg-keypair</keyName> <keyName>gsg-keypair</keyName>
<keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint> <keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>
<keyMaterial>-----BEGIN RSA PRIVATE KEY----- <keyMaterial>-----BEGIN RSA PRIVATE KEY-----

View File

@ -1,4 +1,4 @@
<DescribeAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<addressesSet> <addressesSet>
<item> <item>
<instanceId>i-f15ebb98</instanceId> <instanceId>i-f15ebb98</instanceId>

View File

@ -0,0 +1,22 @@
<DescribeImageAttributeResponse
xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<imageId>ami-61a54008</imageId>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<snapshotId>snap-d01272b9</snapshotId>
<volumeSize>30</volumeSize>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
<item>
<deviceName>xvdf</deviceName>
<ebs>
<snapshotId>snap-d31272ba</snapshotId>
<volumeSize>250</volumeSize>
<deleteOnTermination>false</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
</DescribeImageAttributeResponse>

View File

@ -0,0 +1,11 @@
<DescribeImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<imageId>ami-61a54008</imageId>
<launchPermission>
<item>
<group>all</group>
</item>
<item>
<userId>495219933132</userId>
</item>
</launchPermission>
</DescribeImageAttributeResponse>

View File

@ -0,0 +1,9 @@
<DescribeImageAttributeResponse
xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<imageId>ami-61a54008</imageId>
<productCodes>
<item>
<productCode>774F4FF8</productCode>
</item>
</productCodes>
</DescribeImageAttributeResponse>

View File

@ -1,16 +1,22 @@
<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<imagesSet> <imagesSet>
<item> <item>
<imageId>ami-be3adfd7</imageId> <imageId>ami-be3adfd7</imageId>
<imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>
</imageLocation>
<imageState>available</imageState> <imageState>available</imageState>
<imageOwnerId>206029621532</imageOwnerId> <imageOwnerId>206029621532</imageOwnerId>
<isPublic>false</isPublic> <isPublic>false</isPublic>
<productCodes>
<item>
<productCode>9961934F</productCode>
</item>
</productCodes>
<architecture>i386</architecture> <architecture>i386</architecture>
<imageType>machine</imageType> <imageType>machine</imageType>
<kernelId>aki-4438dd2d</kernelId> <kernelId>aki-4438dd2d</kernelId>
<ramdiskId>ari-4538dd2c</ramdiskId> <ramdiskId>ari-4538dd2c</ramdiskId>
<rootDeviceType>instance-store</rootDeviceType>
<blockDeviceMapping />
</item> </item>
</imagesSet> </imagesSet>
</DescribeImagesResponse> </DescribeImagesResponse>

View File

@ -0,0 +1,39 @@
<?xml version="1.0"?>
<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<requestId>c952eb86-3a28-4987-8df5-dd08e3e8e502</requestId>
<imagesSet>
<item>
<imageId>ami-246f8d4d</imageId>
<imageLocation>706093390852/websrv_2009-12-10
</imageLocation>
<imageState>available</imageState>
<imageOwnerId>706093390852</imageOwnerId>
<isPublic>true</isPublic>
<architecture>i386</architecture>
<imageType>machine</imageType>
<platform>windows</platform>
<name>websrv_2009-12-10</name>
<description>Web Server AMI</description>
<rootDeviceType>ebs</rootDeviceType>
<rootDeviceName>/dev/sda1</rootDeviceName>
<blockDeviceMapping>
<item>
<deviceName>/dev/sda1</deviceName>
<ebs>
<snapshotId>snap-d01272b9</snapshotId>
<volumeSize>30</volumeSize>
<deleteOnTermination>true</deleteOnTermination>
</ebs>
</item>
<item>
<deviceName>xvdf</deviceName>
<ebs>
<snapshotId>snap-d31272ba</snapshotId>
<volumeSize>250</volumeSize>
<deleteOnTermination>false</deleteOnTermination>
</ebs>
</item>
</blockDeviceMapping>
</item>
</imagesSet>
</DescribeImagesResponse>

View File

@ -0,0 +1,21 @@
<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<imagesSet>
<item>
<imageId>ami-02eb086b</imageId>
<imageLocation>aws-solutions-amis/SqlSvrStd2003r2-x86_64-Win_SFWBasic5.1-v1.0.manifest.xml</imageLocation>
<imageState>available</imageState>
<imageOwnerId>771350841976</imageOwnerId>
<isPublic>true</isPublic>
<productCodes>
<item>
<productCode>5771E9A6</productCode>
</item>
</productCodes>
<architecture>x86_64</architecture>
<imageType>machine</imageType>
<platform>windows</platform>
<rootDeviceType>instance-store</rootDeviceType>
<blockDeviceMapping/>
</item>
</imagesSet>
</DescribeImagesResponse>

View File

@ -1,4 +1,4 @@
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<reservationSet> <reservationSet>
<item> <item>
<reservationId>r-44a5402d</reservationId> <reservationId>r-44a5402d</reservationId>

View File

@ -1,4 +1,4 @@
<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<requestId>ae75a8cc-b707-4a20-b130-61ad6f20de61</requestId> <requestId>ae75a8cc-b707-4a20-b130-61ad6f20de61</requestId>
<reservationSet> <reservationSet>
<item> <item>

View File

@ -1,4 +1,4 @@
<DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeKeyPairsResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<keySet> <keySet>
<item> <item>
<keyName>gsg-keypair</keyName> <keyName>gsg-keypair</keyName>

View File

@ -1,4 +1,4 @@
<DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <DescribeSecurityGroupsResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<securityGroupInfo> <securityGroupInfo>
<item> <item>
<ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId> <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>

View File

@ -1,4 +1,4 @@
<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<reservationId>r-47a5402e</reservationId> <reservationId>r-47a5402e</reservationId>
<ownerId>AIDADH4IGTRXXKCD</ownerId> <ownerId>AIDADH4IGTRXXKCD</ownerId>
<groupSet> <groupSet>

View File

@ -1,4 +1,4 @@
<TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-08-15/"> <TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
<instancesSet> <instancesSet>
<item> <item>
<instanceId>i-3ea74257</instanceId> <instanceId>i-3ea74257</instanceId>