JCLOUDS-150 - Removal of async from AWS - specifically EC2

...and EC2-related elsewhere. Also moved *Client -> *Api, and moved
everything from .../services to .../features, and threw in a bunch of
Optionals to fit the EC2Api approach.

And a very big tip of the hat to nacx for figuring out the generics
stuff my brain just could not handle. =)
This commit is contained in:
Andrew Bayer 2013-07-01 12:12:26 -07:00
parent 5f524ee6c9
commit 5f3b8d3fa7
191 changed files with 2946 additions and 4836 deletions

View File

@ -21,12 +21,12 @@
org.jclouds.ec2.ami2
(:use org.jclouds.compute2)
(:import org.jclouds.aws.domain.Region
org.jclouds.ec2.services.AMIClient
org.jclouds.ec2.features.AMIApi
org.jclouds.ec2.options.CreateImageOptions
org.jclouds.compute.domain.NodeMetadata
(org.jclouds.ec2.domain Volume Volume$Status Snapshot Snapshot$Status AvailabilityZoneInfo)))
(defn ^org.jclouds.ec2.services.AMIClient
(defn ^org.jclouds.ec2.features.AMIApi
ami-service
""
[compute]
@ -34,7 +34,7 @@
.getContext
.getProviderSpecificContext
.getApi
.getAMIServices))
.getAMIApi().get))
(defn get-region
"Coerces the first parameter into a Region string; strings, keywords, and

View File

@ -24,12 +24,12 @@
(:import org.jclouds.compute.domain.NodeMetadata
(org.jclouds.ec2.domain PublicIpInstanceIdPair)))
(defn ^org.jclouds.ec2.services.ElasticIPAddressClient
(defn ^org.jclouds.ec2.features.ElasticIPAddressApi
eip-service
"Returns an ElasticIPAddressClient for the given ComputeService"
"Returns an ElasticIPAddressApi for the given ComputeService"
[compute]
(-> compute
.getContext .getProviderSpecificContext .getApi .getElasticIPAddressServices))
.getContext .getProviderSpecificContext .getApi .getElasticIPAddressApi().get))
(defn allocate
"Claims a new elastic IP address within the (optionally) specified region for your account.

View File

@ -22,14 +22,14 @@
(:require (org.jclouds [compute2 :as compute])
[org.jclouds.ec2.ebs2 :as ebs])
(:import org.jclouds.ec2.domain.SecurityGroup
org.jclouds.ec2.services.SecurityGroupClient
org.jclouds.ec2.features.SecurityGroupApi
org.jclouds.net.domain.IpProtocol))
(defn #^SecurityGroupClient
(defn #^SecurityGroupApi
sg-service
"Returns the SecurityGroup Client associated with the specified compute service."
"Returns the SecurityGroup Api associated with the specified compute service."
[compute]
(-> compute .getContext .getProviderSpecificContext .getApi .getSecurityGroupServices))
(-> compute .getContext .getProviderSpecificContext .getApi .getSecurityGroupApi().get))
(defn create-group
"Creates a new security group.

View File

@ -21,6 +21,13 @@ import java.util.Set;
import org.jclouds.ec2.features.SubnetApi;
import org.jclouds.ec2.features.TagApi;
import org.jclouds.ec2.features.WindowsApi;
import org.jclouds.ec2.features.AMIApi;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.ec2.features.KeyPairApi;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.Region;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
@ -42,12 +49,11 @@ import com.google.inject.Provides;
* Example
*
* <pre>
* Optional&lt;? extends WindowsApi&gt; windowsOption = ec2Client.getWindowsApi();
* Optional&lt;? extends WindowsApi&gt; windowsOption = ec2Api.getWindowsApi();
* checkState(windowsOption.isPresent(), &quot;windows feature required, but not present&quot;);
* </pre>
*
* @author Adrian Cole
* @see EC2AsyncApi
*/
public interface EC2Api extends Closeable {
/**
@ -87,4 +93,75 @@ public interface EC2Api extends Closeable {
@Delegate
Optional<? extends SubnetApi> getSubnetApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to AMI services.
*/
@Delegate
Optional<? extends AMIApi> getAMIApi();
@Delegate
Optional<? extends AMIApi> getAMIApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to Elastic IP Address services.
*/
@Delegate
Optional<? extends ElasticIPAddressApi> getElasticIPAddressApi();
@Delegate
Optional<? extends ElasticIPAddressApi> getElasticIPAddressApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to Instance services.
*/
@Delegate
Optional<? extends InstanceApi> getInstanceApi();
@Delegate
Optional<? extends InstanceApi> getInstanceApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to KeyPair services.
*/
@Delegate
Optional<? extends KeyPairApi> getKeyPairApi();
@Delegate
Optional<? extends KeyPairApi> getKeyPairApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to SecurityGroup services.
*/
@Delegate
Optional<? extends SecurityGroupApi> getSecurityGroupApi();
@Delegate
Optional<? extends SecurityGroupApi> getSecurityGroupApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to Availability Zones and Regions services.
*/
@Delegate
Optional<? extends AvailabilityZoneAndRegionApi> getAvailabilityZoneAndRegionApi();
@Delegate
Optional<? extends AvailabilityZoneAndRegionApi> getAvailabilityZoneAndRegionApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides synchronous access to Elastic Block Store services.
*/
@Delegate
Optional<? extends ElasticBlockStoreApi> getElasticBlockStoreApi();
@Delegate
Optional<? extends ElasticBlockStoreApi> getElasticBlockStoreApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
}

View File

@ -31,8 +31,8 @@ import org.jclouds.apis.ApiMetadata;
import org.jclouds.ec2.compute.EC2ComputeServiceContext;
import org.jclouds.ec2.compute.config.EC2ComputeServiceContextModule;
import org.jclouds.ec2.compute.config.EC2ResolveImagesModule;
import org.jclouds.ec2.config.EC2RestClientModule;
import org.jclouds.rest.internal.BaseRestApiMetadata;
import org.jclouds.ec2.config.EC2HttpApiModule;
import org.jclouds.rest.internal.BaseHttpApiMetadata;
import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.TypeToken;
@ -55,16 +55,8 @@ import com.google.inject.Module;
*
* @author Adrian Cole
*/
public class EC2ApiMetadata extends BaseRestApiMetadata {
public class EC2ApiMetadata extends BaseHttpApiMetadata<EC2Api> {
/**
* @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(EC2Client.class)} as
* {@link EC2AsyncClient} interface will be removed in jclouds 1.7.
*/
@Deprecated
public static final TypeToken<org.jclouds.rest.RestContext<? extends EC2Client, ? extends EC2AsyncClient>> CONTEXT_TOKEN = new TypeToken<org.jclouds.rest.RestContext<? extends EC2Client, ? extends EC2AsyncClient>>() {
private static final long serialVersionUID = 1L;
};
@Override
public Builder<?> toBuilder() {
@ -80,7 +72,7 @@ public class EC2ApiMetadata extends BaseRestApiMetadata {
}
public static Properties defaultProperties() {
Properties properties = BaseRestApiMetadata.defaultProperties();
Properties properties = BaseHttpApiMetadata.defaultProperties();
properties.setProperty(PROPERTY_AUTH_TAG, "AWS");
properties.setProperty(PROPERTY_HEADER_TAG, "amz");
properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "*");
@ -91,14 +83,8 @@ public class EC2ApiMetadata extends BaseRestApiMetadata {
return properties;
}
public abstract static class Builder<T extends Builder<T>> extends BaseRestApiMetadata.Builder<T> {
@SuppressWarnings("deprecation")
public abstract static class Builder<T extends Builder<T>> extends BaseHttpApiMetadata.Builder<EC2Api, T> {
protected Builder() {
this(EC2Client.class, EC2AsyncClient.class);
}
protected Builder(Class<?> syncClient, Class<?> asyncClient) {
super(syncClient, asyncClient);
id("ec2")
.name("Amazon Elastic Compute Cloud (EC2) API")
.identityName("Access Key ID")
@ -107,9 +93,8 @@ public class EC2ApiMetadata extends BaseRestApiMetadata {
.documentation(URI.create("http://docs.amazonwebservices.com/AWSEC2/latest/APIReference"))
.version("2010-06-15")
.defaultProperties(EC2ApiMetadata.defaultProperties())
.context(CONTEXT_TOKEN)
.view(EC2ComputeServiceContext.class)
.defaultModules(ImmutableSet.<Class<? extends Module>>of(EC2RestClientModule.class, EC2ResolveImagesModule.class, EC2ComputeServiceContextModule.class));
.defaultModules(ImmutableSet.<Class<? extends Module>>of(EC2HttpApiModule.class, EC2ResolveImagesModule.class, EC2ComputeServiceContextModule.class));
}
@Override

View File

@ -1,78 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2;
import java.io.Closeable;
import java.util.Set;
import org.jclouds.ec2.features.SubnetAsyncApi;
import org.jclouds.ec2.features.TagAsyncApi;
import org.jclouds.ec2.features.WindowsAsyncApi;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.Region;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.rest.annotations.EndpointParam;
import com.google.common.base.Optional;
import com.google.inject.Provides;
/**
* Refer to javadoc for {@link EC2Api}, as this interface is the same, except
* features provide asynchronous return values.
*
* @author Adrian Cole
*/
public interface EC2AsyncApi extends Closeable {
/**
*
* @return the Region codes configured
*/
@Provides
@Region
Set<String> getConfiguredRegions();
/**
* Provides asynchronous access to Windows features.
*/
@Delegate
Optional<? extends WindowsAsyncApi> getWindowsApi();
@Delegate
Optional<? extends WindowsAsyncApi> getWindowsApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides asynchronous access to Tag features.
*/
@Delegate
Optional<? extends TagAsyncApi> getTagApi();
@Delegate
Optional<? extends TagAsyncApi> getTagApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Provides asynchronous access to Subnet features.
*/
@Delegate
Optional<? extends SubnetAsyncApi> getSubnetApi();
@Delegate
Optional<? extends SubnetAsyncApi> getSubnetApiForRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
}

View File

@ -1,87 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2;
import org.jclouds.ec2.services.AMIAsyncClient;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionAsyncClient;
import org.jclouds.ec2.services.ElasticBlockStoreAsyncClient;
import org.jclouds.ec2.services.ElasticIPAddressAsyncClient;
import org.jclouds.ec2.services.InstanceAsyncClient;
import org.jclouds.ec2.services.KeyPairAsyncClient;
import org.jclouds.ec2.services.SecurityGroupAsyncClient;
import org.jclouds.ec2.services.WindowsAsyncClient;
import org.jclouds.rest.annotations.Delegate;
/**
* Provides asynchronous access to EC2 services.
*
* @author Adrian Cole
* @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(EC2Client.class)} as
* {@link EC2AsyncClient} interface will be removed in jclouds 1.7.
*/
@Deprecated
public interface EC2AsyncClient extends EC2AsyncApi {
/**
* Provides asynchronous access to AMI services.
*/
@Delegate
AMIAsyncClient getAMIServices();
/**
* Provides asynchronous access to Elastic IP Address services.
*/
@Delegate
ElasticIPAddressAsyncClient getElasticIPAddressServices();
/**
* Provides asynchronous access to Instance services.
*/
@Delegate
InstanceAsyncClient getInstanceServices();
/**
* Provides asynchronous access to KeyPair services.
*/
@Delegate
KeyPairAsyncClient getKeyPairServices();
/**
* Provides asynchronous access to SecurityGroup services.
*/
@Delegate
SecurityGroupAsyncClient getSecurityGroupServices();
/**
* Provides asynchronous access to Windows services.
*/
@Delegate
WindowsAsyncClient getWindowsServices();
/**
* Provides asynchronous access to Availability Zones and Regions services.
*/
@Delegate
AvailabilityZoneAndRegionAsyncClient getAvailabilityZoneAndRegionServices();
/**
* Provides asynchronous access to Elastic Block Store services.
*/
@Delegate
ElasticBlockStoreAsyncClient getElasticBlockStoreServices();
}

View File

@ -1,84 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2;
import org.jclouds.ec2.services.AMIClient;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.services.ElasticIPAddressClient;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.services.KeyPairClient;
import org.jclouds.ec2.services.SecurityGroupClient;
import org.jclouds.ec2.services.WindowsClient;
import org.jclouds.rest.annotations.Delegate;
/**
* Provides synchronous access to EC2 services.
*
* @author Adrian Cole
*/
public interface EC2Client extends EC2Api {
/**
* Provides synchronous access to AMI services.
*/
@Delegate
AMIClient getAMIServices();
/**
* Provides synchronous access to Elastic IP Address services.
*/
@Delegate
ElasticIPAddressClient getElasticIPAddressServices();
/**
* Provides synchronous access to Instance services.
*/
@Delegate
InstanceClient getInstanceServices();
/**
* Provides synchronous access to KeyPair services.
*/
@Delegate
KeyPairClient getKeyPairServices();
/**
* Provides synchronous access to SecurityGroup services.
*/
@Delegate
SecurityGroupClient getSecurityGroupServices();
/**
* Provides asynchronous access to Windows services.
*/
@Delegate
WindowsClient getWindowsServices();
/**
* Provides synchronous access to Availability Zones and Regions services.
*/
@Delegate
AvailabilityZoneAndRegionClient getAvailabilityZoneAndRegionServices();
/**
* Provides synchronous access to Elastic Block Store services.
*/
@Delegate
ElasticBlockStoreClient getElasticBlockStoreServices();
}

View File

@ -73,7 +73,7 @@ import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
import org.jclouds.ec2.compute.options.EC2TemplateOptions;
@ -104,7 +104,7 @@ import com.google.inject.Inject;
*/
@Singleton
public class EC2ComputeService extends BaseComputeService {
private final EC2Client client;
private final EC2Api client;
private final ConcurrentMap<RegionAndName, KeyPair> credentialsMap;
private final LoadingCache<RegionAndName, String> securityGroupMap;
private final Factory namingConvention;
@ -125,7 +125,7 @@ public class EC2ComputeService extends BaseComputeService {
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory,
RunScriptOnNode.Factory runScriptOnNodeFactory, InitAdminAccess initAdminAccess,
PersistNodeCredentials persistNodeCredentials, Timeouts timeouts,
@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, EC2Client client,
@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, EC2Api client,
ConcurrentMap<RegionAndName, KeyPair> credentialsMap,
@Named("SECURITY") LoadingCache<RegionAndName, String> securityGroupMap,
Optional<ImageExtension> imageExtension, GroupNamingConvention.Factory namingConvention,
@ -212,9 +212,9 @@ public class EC2ComputeService extends BaseComputeService {
checkNotNull(emptyToNull(group), "group must be defined");
String groupName = namingConvention.create().sharedNameForGroup(group);
if (client.getSecurityGroupServices().describeSecurityGroupsInRegion(region, groupName).size() > 0) {
if (client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(region, groupName).size() > 0) {
logger.debug(">> deleting securityGroup(%s)", groupName);
client.getSecurityGroupServices().deleteSecurityGroupInRegion(region, groupName);
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(region, groupName);
// TODO: test this clear happens
securityGroupMap.invalidate(new RegionNameAndIngressRules(region, groupName, null, false));
logger.debug("<< deleted securityGroup(%s)", groupName);
@ -223,20 +223,20 @@ public class EC2ComputeService extends BaseComputeService {
@VisibleForTesting
void deleteKeyPair(String region, String group) {
for (KeyPair keyPair : client.getKeyPairServices().describeKeyPairsInRegion(region)) {
for (KeyPair keyPair : client.getKeyPairApi().get().describeKeyPairsInRegion(region)) {
String keyName = keyPair.getKeyName();
Predicate<String> keyNameMatcher = namingConvention.create().containsGroup(group);
String oldKeyNameRegex = String.format("jclouds#%s#%s#%s", group, region, "[0-9a-f]+").replace('#', delimiter);
// old keypair pattern too verbose as it has an unnecessary region qualifier
if (keyNameMatcher.apply(keyName) || keyName.matches(oldKeyNameRegex)) {
Set<String> instancesUsingKeyPair = extractIdsFromInstances(filter(concat(client.getInstanceServices()
Set<String> instancesUsingKeyPair = extractIdsFromInstances(filter(concat(client.getInstanceApi().get()
.describeInstancesInRegion(region)), usingKeyPairAndNotDead(keyPair)));
if (instancesUsingKeyPair.size() > 0) {
logger.debug("<< inUse keyPair(%s), by (%s)", keyPair.getKeyName(), instancesUsingKeyPair);
} else {
logger.debug(">> deleting keyPair(%s)", keyPair.getKeyName());
client.getKeyPairServices().deleteKeyPairInRegion(region, keyPair.getKeyName());
client.getKeyPairApi().get().deleteKeyPairInRegion(region, keyPair.getKeyName());
// TODO: test this clear happens
credentialsMap.remove(new RegionAndName(region, keyPair.getKeyName()));
credentialsMap.remove(new RegionAndName(region, group));

View File

@ -44,7 +44,7 @@ import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.extensions.ImageExtension;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Location;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.options.CreateImageOptions;
@ -69,16 +69,16 @@ public class EC2ImageExtension implements ImageExtension {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
private final EC2Client ec2Client;
private final EC2Api ec2Api;
private final ListeningExecutorService userExecutor;
private final Supplier<Set<? extends Location>> locations;
private final Predicate<AtomicReference<Image>> imageAvailablePredicate;
@Inject
public EC2ImageExtension(EC2Client ec2Client, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
public EC2ImageExtension(EC2Api ec2Api, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
@Memoized Supplier<Set<? extends Location>> locations,
@Named(TIMEOUT_IMAGE_AVAILABLE) Predicate<AtomicReference<Image>> imageAvailablePredicate) {
this.ec2Client = checkNotNull(ec2Client, "ec2Client");
this.ec2Api = checkNotNull(ec2Api, "ec2Api");
this.userExecutor = checkNotNull(userExecutor, "userExecutor");
this.locations = checkNotNull(locations, "locations");
this.imageAvailablePredicate = checkNotNull(imageAvailablePredicate, "imageAvailablePredicate");
@ -89,7 +89,7 @@ public class EC2ImageExtension implements ImageExtension {
String[] parts = AWSUtils.parseHandle(id);
String region = parts[0];
String instanceId = parts[1];
Reservation<? extends RunningInstance> instance = getOnlyElement(ec2Client.getInstanceServices()
Reservation<? extends RunningInstance> instance = getOnlyElement(ec2Api.getInstanceApi().get()
.describeInstancesInRegion(region, instanceId));
if (instance == null)
throw new NoSuchElementException("Cannot find server with id: " + id);
@ -105,7 +105,7 @@ public class EC2ImageExtension implements ImageExtension {
String region = parts[0];
String instanceId = parts[1];
String imageId = ec2Client.getAMIServices().createImageInRegion(region, cloneTemplate.getName(), instanceId,
String imageId = ec2Api.getAMIApi().get().createImageInRegion(region, cloneTemplate.getName(), instanceId,
CreateImageOptions.NONE);
final AtomicReference<Image> image = Atomics.newReference(new ImageBuilder()
@ -133,7 +133,7 @@ public class EC2ImageExtension implements ImageExtension {
String region = parts[0];
String instanceId = parts[1];
try {
ec2Client.getAMIServices().deregisterImageInRegion(region, instanceId);
ec2Api.getAMIApi().get().deregisterImageInRegion(region, instanceId);
return true;
} catch (Exception e) {
return false;

View File

@ -43,7 +43,7 @@ import org.jclouds.compute.extensions.SecurityGroupExtension;
import org.jclouds.compute.functions.GroupNamingConvention;
import org.jclouds.compute.functions.GroupNamingConvention.Factory;
import org.jclouds.domain.Location;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
import org.jclouds.ec2.domain.RunningInstance;
@ -72,7 +72,7 @@ import com.google.common.util.concurrent.UncheckedTimeoutException;
*/
public class EC2SecurityGroupExtension implements SecurityGroupExtension {
protected final EC2Client client;
protected final EC2Api client;
protected final ListeningExecutorService userExecutor;
protected final Supplier<Set<String>> regions;
protected final Function<org.jclouds.ec2.domain.SecurityGroup, SecurityGroup> groupConverter;
@ -81,7 +81,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
protected final Factory namingConvention;
@Inject
public EC2SecurityGroupExtension(EC2Client client,
public EC2SecurityGroupExtension(EC2Api client,
@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
@Region Supplier<Set<String>> regions,
Function<org.jclouds.ec2.domain.SecurityGroup, SecurityGroup> groupConverter,
@ -130,7 +130,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
String region = parts[0];
String instanceId = parts[1];
RunningInstance instance = getOnlyElement(Iterables.concat(client.getInstanceServices().describeInstancesInRegion(region, instanceId)));
RunningInstance instance = getOnlyElement(Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, instanceId)));
if (instance == null) {
return ImmutableSet.of();
@ -138,7 +138,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
Set<String> groupNames = instance.getGroupNames();
Set<? extends org.jclouds.ec2.domain.SecurityGroup> rawGroups =
client.getSecurityGroupServices().describeSecurityGroupsInRegion(region, Iterables.toArray(groupNames, String.class));
client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(region, Iterables.toArray(groupNames, String.class));
return ImmutableSet.copyOf(transform(filter(rawGroups, notNull()), groupConverter));
}
@ -151,7 +151,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
String groupId = parts[1];
Set<? extends org.jclouds.ec2.domain.SecurityGroup> rawGroups =
client.getSecurityGroupServices().describeSecurityGroupsInRegion(region, groupId);
client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(region, groupId);
return getOnlyElement(transform(filter(rawGroups, notNull()), groupConverter));
}
@ -183,8 +183,8 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
String region = parts[0];
String groupName = parts[1];
if (client.getSecurityGroupServices().describeSecurityGroupsInRegion(region, groupName).size() > 0) {
client.getSecurityGroupServices().deleteSecurityGroupInRegion(region, groupName);
if (client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(region, groupName).size() > 0) {
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(region, groupName);
// TODO: test this clear happens
groupCreator.invalidate(new RegionNameAndIngressRules(region, groupName, null, false));
return true;
@ -201,7 +201,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (ipPermission.getCidrBlocks().size() > 0) {
for (String cidr : ipPermission.getCidrBlocks()) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
authorizeSecurityGroupIngressInRegion(region,
name,
ipPermission.getIpProtocol(),
@ -214,7 +214,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (ipPermission.getTenantIdGroupNamePairs().size() > 0) {
for (String userId : ipPermission.getTenantIdGroupNamePairs().keySet()) {
for (String groupName : ipPermission.getTenantIdGroupNamePairs().get(userId)) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
authorizeSecurityGroupIngressInRegion(region,
name,
new UserIdGroupPair(userId, groupName));
@ -235,7 +235,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (Iterables.size(ipRanges) > 0) {
for (String cidr : ipRanges) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
authorizeSecurityGroupIngressInRegion(region,
name,
protocol,
@ -248,7 +248,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (tenantIdGroupNamePairs.size() > 0) {
for (String userId : tenantIdGroupNamePairs.keySet()) {
for (String groupName : tenantIdGroupNamePairs.get(userId)) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
authorizeSecurityGroupIngressInRegion(region,
name,
new UserIdGroupPair(userId, groupName));
@ -266,7 +266,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (ipPermission.getCidrBlocks().size() > 0) {
for (String cidr : ipPermission.getCidrBlocks()) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
revokeSecurityGroupIngressInRegion(region,
name,
ipPermission.getIpProtocol(),
@ -279,7 +279,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (ipPermission.getTenantIdGroupNamePairs().size() > 0) {
for (String userId : ipPermission.getTenantIdGroupNamePairs().keySet()) {
for (String groupName : ipPermission.getTenantIdGroupNamePairs().get(userId)) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
revokeSecurityGroupIngressInRegion(region,
name,
new UserIdGroupPair(userId, groupName));
@ -300,7 +300,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (Iterables.size(ipRanges) > 0) {
for (String cidr : ipRanges) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
revokeSecurityGroupIngressInRegion(region,
name,
protocol,
@ -313,7 +313,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
if (tenantIdGroupNamePairs.size() > 0) {
for (String userId : tenantIdGroupNamePairs.keySet()) {
for (String groupName : tenantIdGroupNamePairs.get(userId)) {
client.getSecurityGroupServices().
client.getSecurityGroupApi().get().
revokeSecurityGroupIngressInRegion(region,
name,
new UserIdGroupPair(userId, groupName));
@ -356,7 +356,7 @@ public class EC2SecurityGroupExtension implements SecurityGroupExtension {
@Override
public Set<? extends org.jclouds.ec2.domain.SecurityGroup> apply(String from) {
return client.getSecurityGroupServices().describeSecurityGroupsInRegion(from);
return client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(from);
}
};

View File

@ -24,7 +24,7 @@ import javax.inject.Singleton;
import org.jclouds.compute.functions.GroupNamingConvention;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.KeyPair;
import org.jclouds.logging.Logger;
@ -42,12 +42,12 @@ public class CreateUniqueKeyPair implements Function<RegionAndName, KeyPair> {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
protected final EC2Client ec2Client;
protected final EC2Api ec2Api;
protected final GroupNamingConvention.Factory namingConvention;
@Inject
public CreateUniqueKeyPair(EC2Client ec2Client, GroupNamingConvention.Factory namingConvention) {
this.ec2Client = ec2Client;
public CreateUniqueKeyPair(EC2Api ec2Api, GroupNamingConvention.Factory namingConvention) {
this.ec2Api = ec2Api;
this.namingConvention = checkNotNull(namingConvention, "namingConvention");
}
@ -67,7 +67,7 @@ public class CreateUniqueKeyPair implements Function<RegionAndName, KeyPair> {
while (keyPair == null) {
String keyName = namingConvention.create().uniqueNameForGroup(prefix);
try {
keyPair = ec2Client.getKeyPairServices().createKeyPairInRegion(region, keyName);
keyPair = ec2Api.getKeyPairApi().get().createKeyPairInRegion(region, keyName);
} catch (IllegalStateException e) {
logger.trace(" invalid keyname (%s in %s); retrying", keyName, region);
}

View File

@ -31,7 +31,7 @@ import javax.inject.Singleton;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.PasswordDataAndPrivateKey;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.KeyPair;
@ -59,20 +59,20 @@ public class PasswordCredentialsFromWindowsInstance implements Function<RunningI
protected Logger logger = Logger.NULL;
private final ConcurrentMap<RegionAndName, KeyPair> credentialsMap;
private final EC2Client ec2Client;
private final EC2Api ec2Api;
private final Function<PasswordDataAndPrivateKey, LoginCredentials> pwDataToLoginCredentials;
@Inject
protected PasswordCredentialsFromWindowsInstance(ConcurrentMap<RegionAndName, KeyPair> credentialsMap,
EC2Client ec2Client, Function<PasswordDataAndPrivateKey, LoginCredentials> pwDataToLoginCredentials) {
EC2Api ec2Api, Function<PasswordDataAndPrivateKey, LoginCredentials> pwDataToLoginCredentials) {
this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap");
this.ec2Client = checkNotNull(ec2Client, "ec2Client");
this.ec2Api = checkNotNull(ec2Api, "ec2Api");
this.pwDataToLoginCredentials = checkNotNull(pwDataToLoginCredentials, "pwDataToLoginCredentials");
}
@Override
public LoginCredentials apply(final RunningInstance instance) {
Optional<? extends WindowsApi> windowsOption = ec2Client.getWindowsApiForRegion(instance.getRegion());
Optional<? extends WindowsApi> windowsOption = ec2Api.getWindowsApiForRegion(instance.getRegion());
checkState(windowsOption.isPresent(), "windows feature not present in region %s", instance.getRegion());
final WindowsApi windowsApi = windowsOption.get();

View File

@ -31,7 +31,7 @@ import java.util.Set;
import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.logging.Logger;
@ -53,10 +53,10 @@ public class PresentInstances implements Function<Set<RegionAndName>, Set<Runnin
@Resource
protected Logger logger = Logger.NULL;
private final EC2Client client;
private final EC2Api client;
@Inject
public PresentInstances(EC2Client client) {
public PresentInstances(EC2Api client) {
this.client = checkNotNull(client, "client");
}
@ -71,7 +71,7 @@ public class PresentInstances implements Function<Set<RegionAndName>, Set<Runnin
String region = entry.getKey();
Collection<String> instanceIds = entry.getValue();
logger.trace("looking for instances %s in region %s", instanceIds, region);
builder.addAll(concat(client.getInstanceServices().describeInstancesInRegion(region,
builder.addAll(concat(client.getInstanceApi().get().describeInstancesInRegion(region,
toArray(instanceIds, String.class))));
}
return builder.build();

View File

@ -24,11 +24,11 @@ import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.ec2.services.SecurityGroupClient;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.logging.Logger;
import org.jclouds.net.domain.IpProtocol;
@ -45,16 +45,16 @@ public class CreateSecurityGroupIfNeeded extends CacheLoader<RegionAndName, Stri
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
protected final SecurityGroupClient securityClient;
protected final SecurityGroupApi securityClient;
protected final Predicate<RegionAndName> securityGroupEventualConsistencyDelay;
@Inject
public CreateSecurityGroupIfNeeded(EC2Client ec2Client,
public CreateSecurityGroupIfNeeded(EC2Api ec2Api,
@Named("SECURITY") Predicate<RegionAndName> securityGroupEventualConsistencyDelay) {
this(checkNotNull(ec2Client, "ec2Client").getSecurityGroupServices(), securityGroupEventualConsistencyDelay);
this(checkNotNull(ec2Api, "ec2Api").getSecurityGroupApi().get(), securityGroupEventualConsistencyDelay);
}
public CreateSecurityGroupIfNeeded(SecurityGroupClient securityClient,
public CreateSecurityGroupIfNeeded(SecurityGroupApi securityClient,
@Named("SECURITY") Predicate<RegionAndName> securityGroupEventualConsistencyDelay) {
this.securityClient = checkNotNull(securityClient, "securityClient");
this.securityGroupEventualConsistencyDelay = checkNotNull(securityGroupEventualConsistencyDelay,

View File

@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
@ -34,17 +34,17 @@ import com.google.common.collect.Iterables;
*/
@Singleton
public class LoadPublicIpForInstanceOrNull extends CacheLoader<RegionAndName, String> {
private final EC2Client client;
private final EC2Api client;
@Inject
public LoadPublicIpForInstanceOrNull(EC2Client client) {
public LoadPublicIpForInstanceOrNull(EC2Api client) {
this.client = client;
}
@Override
public String load(final RegionAndName key) throws Exception {
try {
return Iterables.find(client.getElasticIPAddressServices().describeAddressesInRegion(key.getRegion()),
return Iterables.find(client.getElasticIPAddressApi().get().describeAddressesInRegion(key.getRegion()),
new Predicate<PublicIpInstanceIdPair>() {
@Override

View File

@ -25,7 +25,7 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Image;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.functions.EC2ImageParser;
import org.jclouds.logging.Logger;
@ -43,10 +43,10 @@ public class RegionAndIdToImage extends CacheLoader<RegionAndName, Image> {
protected Logger logger = Logger.NULL;
private final EC2ImageParser parser;
private final EC2Client sync;
private final EC2Api sync;
@Inject
public RegionAndIdToImage(EC2ImageParser parser, EC2Client sync) {
public RegionAndIdToImage(EC2ImageParser parser, EC2Api sync) {
this.parser = parser;
this.sync = sync;
}
@ -54,7 +54,7 @@ public class RegionAndIdToImage extends CacheLoader<RegionAndName, Image> {
@Override
public Image load(RegionAndName key) throws ExecutionException{
try {
org.jclouds.ec2.domain.Image image = Iterables.getOnlyElement(sync.getAMIServices()
org.jclouds.ec2.domain.Image image = Iterables.getOnlyElement(sync.getAMIApi().get()
.describeImagesInRegion(key.getRegion(), imageIds(key.getName())));
return parser.apply(image);
} catch (Exception e) {

View File

@ -23,7 +23,7 @@ import java.util.NoSuchElementException;
import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.logging.Logger;
@ -40,13 +40,13 @@ import com.google.inject.Inject;
@Singleton
public class SecurityGroupPresent implements Predicate<RegionAndName> {
private final EC2Client client;
private final EC2Api client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public SecurityGroupPresent(EC2Client client) {
public SecurityGroupPresent(EC2Api client) {
this.client = checkNotNull(client, "client");
}
@ -62,7 +62,7 @@ public class SecurityGroupPresent implements Predicate<RegionAndName> {
}
protected SecurityGroup refresh(RegionAndName securityGroup) {
return Iterables.getOnlyElement(client.getSecurityGroupServices().describeSecurityGroupsInRegion(
return Iterables.getOnlyElement(client.getSecurityGroupApi().get().describeSecurityGroupsInRegion(
securityGroup.getRegion(), securityGroup.getName()));
}
}

View File

@ -17,10 +17,14 @@
package org.jclouds.ec2.compute.strategy;
import static com.google.common.collect.Iterables.concat;
import static org.jclouds.concurrent.FutureIterables.transformParallel;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.util.concurrent.Futures.allAsList;
import static com.google.common.util.concurrent.Futures.getUnchecked;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.Callable;
import javax.annotation.Resource;
import javax.inject.Inject;
@ -29,7 +33,7 @@ import javax.inject.Singleton;
import org.jclouds.Constants;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.ec2.EC2AsyncClient;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.options.DescribeImagesOptions;
import org.jclouds.logging.Logger;
@ -48,25 +52,35 @@ public class DescribeImagesParallel implements
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
protected final EC2AsyncClient async;
protected final EC2Api api;
final ListeningExecutorService userExecutor;
@Inject
public DescribeImagesParallel(EC2AsyncClient async, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
this.async = async;
public DescribeImagesParallel(EC2Api api, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
this.api = api;
this.userExecutor = userExecutor;
}
@Override
public Iterable<? extends org.jclouds.ec2.domain.Image> apply(
Iterable<Entry<String, DescribeImagesOptions>> queries) {
return concat(transformParallel(
final Iterable<Entry<String, DescribeImagesOptions>> queries) {
ListenableFuture<List<Set<? extends org.jclouds.ec2.domain.Image>>> futures
= allAsList(transform(
queries,
new Function<Entry<String, DescribeImagesOptions>, ListenableFuture<? extends Set<? extends org.jclouds.ec2.domain.Image>>>() {
new Function<Entry<String, DescribeImagesOptions>,
ListenableFuture<? extends Set<? extends org.jclouds.ec2.domain.Image>>>() {
public ListenableFuture<Set<? extends org.jclouds.ec2.domain.Image>> apply(
Entry<String, DescribeImagesOptions> from) {
return async.getAMIServices().describeImagesInRegion(from.getKey(), from.getValue());
final Entry<String, DescribeImagesOptions> from) {
return userExecutor.submit(new Callable<Set<? extends org.jclouds.ec2.domain.Image>>() {
@Override
public Set<? extends org.jclouds.ec2.domain.Image> call() throws Exception {
return api.getAMIApi().get().describeImagesInRegion(from.getKey(), from.getValue());
}
}, userExecutor, null, logger, "amis"));
});
}
}));
logger.trace("amis");
return concat(getUnchecked(futures));
}
}

View File

@ -45,7 +45,7 @@ import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
import org.jclouds.compute.util.ComputeUtils;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.functions.PresentInstances;
import org.jclouds.ec2.domain.RunningInstance;
@ -82,7 +82,7 @@ public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThen
boolean autoAllocateElasticIps = false;
@VisibleForTesting
final EC2Client client;
final EC2Api client;
@VisibleForTesting
final Predicate<AtomicReference<NodeMetadata>> nodeRunning;
@VisibleForTesting
@ -99,7 +99,7 @@ public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThen
@Inject
protected EC2CreateNodesInGroupThenAddToSet(
EC2Client client,
EC2Api client,
@Named("ELASTICIP") LoadingCache<RegionAndName, String> elasticIpCache,
@Named(TIMEOUT_NODE_RUNNING) Predicate<AtomicReference<NodeMetadata>> nodeRunning,
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize,
@ -191,7 +191,7 @@ public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThen
RunningInstance instance = entry.getValue();
try {
logger.debug("<< allocating elastic IP instance(%s)", id);
String ip = client.getElasticIPAddressServices().allocateAddressInRegion(id.getRegion());
String ip = client.getElasticIPAddressApi().get().allocateAddressInRegion(id.getRegion());
// block until instance is running
logger.debug(">> awaiting status running instance(%s)", id);
AtomicReference<NodeMetadata> node = newReference(runningInstanceToNodeMetadata
@ -199,7 +199,7 @@ public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThen
nodeRunning.apply(node);
logger.trace("<< running instance(%s)", id);
logger.debug(">> associating elastic IP %s to instance %s", ip, id);
client.getElasticIPAddressServices().associateAddressInRegion(id.getRegion(), ip, id.getName());
client.getElasticIPAddressApi().get().associateAddressInRegion(id.getRegion(), ip, id.getName());
logger.trace("<< associated elastic IP %s to instance %s", ip, id);
// add mapping of instance to ip into the cache
elasticIpCache.put(id, ip);
@ -231,7 +231,7 @@ public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThen
started = ImmutableSet.copyOf(concat(
started,
client.getInstanceServices().runInstancesInRegion(region, zone, template.getImage().getProviderId(), 1,
client.getInstanceApi().get().runInstancesInRegion(region, zone, template.getImage().getProviderId(), 1,
count - countStarted, instanceOptions)));
countStarted = size(started);

View File

@ -30,7 +30,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.DestroyNodeStrategy;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.reference.EC2Constants;
import org.jclouds.logging.Logger;
@ -48,7 +48,7 @@ public class EC2DestroyNodeStrategy implements DestroyNodeStrategy {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
protected final EC2Client client;
protected final EC2Api client;
protected final GetNodeMetadataStrategy getNode;
protected final LoadingCache<RegionAndName, String> elasticIpCache;
@ -58,7 +58,7 @@ public class EC2DestroyNodeStrategy implements DestroyNodeStrategy {
boolean autoAllocateElasticIps = false;
@Inject
protected EC2DestroyNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode,
protected EC2DestroyNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode,
@Named("ELASTICIP") LoadingCache<RegionAndName, String> elasticIpCache) {
this.client = checkNotNull(client, "client");
this.getNode = checkNotNull(getNode, "getNode");
@ -83,11 +83,11 @@ public class EC2DestroyNodeStrategy implements DestroyNodeStrategy {
try {
String ip = elasticIpCache.get(new RegionAndName(region, instanceId));
logger.debug(">> disassociating elastic IP %s", ip);
client.getElasticIPAddressServices().disassociateAddressInRegion(region, ip);
client.getElasticIPAddressApi().get().disassociateAddressInRegion(region, ip);
logger.trace("<< disassociated elastic IP %s", ip);
elasticIpCache.invalidate(new RegionAndName(region, instanceId));
logger.debug(">> releasing elastic IP %s", ip);
client.getElasticIPAddressServices().releaseAddressInRegion(region, ip);
client.getElasticIPAddressApi().get().releaseAddressInRegion(region, ip);
logger.trace("<< released elastic IP %s", ip);
} catch (CacheLoader.InvalidCacheLoadException e) {
// no ip was found
@ -100,6 +100,6 @@ public class EC2DestroyNodeStrategy implements DestroyNodeStrategy {
}
protected void destroyInstanceInRegion(String instanceId, String region) {
client.getInstanceServices().terminateInstancesInRegion(region, instanceId);
client.getInstanceApi().get().terminateInstancesInRegion(region, instanceId);
}
}

View File

@ -26,7 +26,7 @@ import javax.inject.Singleton;
import org.jclouds.aws.util.AWSUtils;
import org.jclouds.compute.strategy.GetImageStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.Image;
import org.jclouds.ec2.options.DescribeImagesOptions;
@ -39,11 +39,11 @@ import com.google.common.base.Function;
@Singleton
public class EC2GetImageStrategy implements GetImageStrategy {
private final EC2Client client;
private final EC2Api client;
private final Function<Image, org.jclouds.compute.domain.Image> imageToImage;
@Inject
protected EC2GetImageStrategy(EC2Client client, Function<Image, org.jclouds.compute.domain.Image> imageToImage) {
protected EC2GetImageStrategy(EC2Api client, Function<Image, org.jclouds.compute.domain.Image> imageToImage) {
this.client = checkNotNull(client, "client");
this.imageToImage = checkNotNull(imageToImage, "imageToImage");
}
@ -63,7 +63,7 @@ public class EC2GetImageStrategy implements GetImageStrategy {
}
public Image getImageInRegion(String region, String id) {
return getOnlyElement(client.getAMIServices().describeImagesInRegion(region,
return getOnlyElement(client.getAMIApi().get().describeImagesInRegion(region,
DescribeImagesOptions.Builder.imageIds(id)));
}

View File

@ -27,7 +27,7 @@ import javax.inject.Singleton;
import org.jclouds.aws.util.AWSUtils;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.RunningInstance;
import com.google.common.base.Function;
@ -40,11 +40,11 @@ import com.google.common.collect.Iterables;
@Singleton
public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy {
private final EC2Client client;
private final EC2Api client;
private final Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata;
@Inject
protected EC2GetNodeMetadataStrategy(EC2Client client,
protected EC2GetNodeMetadataStrategy(EC2Api client,
Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata) {
this.client = checkNotNull(client, "client");
this.runningInstanceToNodeMetadata = checkNotNull(runningInstanceToNodeMetadata, "runningInstanceToNodeMetadata");
@ -65,7 +65,7 @@ public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy {
}
public RunningInstance getRunningInstanceInRegion(String region, String id) {
return getOnlyElement(Iterables.concat(client.getInstanceServices().describeInstancesInRegion(region, id)));
return getOnlyElement(Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, id)));
}
}

View File

@ -42,7 +42,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.predicates.NodePredicates;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.ListNodesStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.location.Region;
@ -73,13 +73,13 @@ public class EC2ListNodesStrategy implements ListNodesStrategy {
@Named(Constants.PROPERTY_REQUEST_TIMEOUT)
protected static Long maxTime;
protected final EC2Client client;
protected final EC2Api client;
protected final Supplier<Set<String>> regions;
protected final Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata;
protected final ListeningExecutorService userExecutor;
@Inject
protected EC2ListNodesStrategy(EC2Client client, @Region Supplier<Set<String>> regions,
protected EC2ListNodesStrategy(EC2Api client, @Region Supplier<Set<String>> regions,
Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata,
@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
this.client = checkNotNull(client, "client");
@ -146,7 +146,7 @@ public class EC2ListNodesStrategy implements ListNodesStrategy {
@Override
public Set<? extends Reservation<? extends RunningInstance>> apply(String from) {
return client.getInstanceServices().describeInstancesInRegion(from);
return client.getInstanceApi().get().describeInstancesInRegion(from);
}
};
@ -158,7 +158,7 @@ public class EC2ListNodesStrategy implements ListNodesStrategy {
@Override
public Set<? extends Reservation<? extends RunningInstance>> apply(String from) {
return client.getInstanceServices()
return client.getInstanceApi().get()
.describeInstancesInRegion(from, toArray(idsByRegions.get(from), String.class));
}

View File

@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.InstanceApi;
/**
*
@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
*/
@Singleton
public class EC2RebootNodeStrategy implements RebootNodeStrategy {
private final InstanceClient client;
private final InstanceApi client;
private final GetNodeMetadataStrategy getNode;
@Inject
protected EC2RebootNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceServices();
protected EC2RebootNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceApi().get();
this.getNode = getNode;
}

View File

@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.InstanceApi;
/**
*
@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
*/
@Singleton
public class EC2ResumeNodeStrategy implements ResumeNodeStrategy {
private final InstanceClient client;
private final InstanceApi client;
private final GetNodeMetadataStrategy getNode;
@Inject
protected EC2ResumeNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceServices();
protected EC2ResumeNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceApi().get();
this.getNode = getNode;
}

View File

@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.InstanceApi;
/**
*
@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
*/
@Singleton
public class EC2SuspendNodeStrategy implements SuspendNodeStrategy {
private final InstanceClient client;
private final InstanceApi client;
private final GetNodeMetadataStrategy getNode;
@Inject
protected EC2SuspendNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceServices();
protected EC2SuspendNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
this.client = client.getInstanceApi().get();
this.getNode = getNode;
}

View File

@ -0,0 +1,78 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.config;
import static org.jclouds.reflect.Reflection2.typeToken;
import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
import java.util.Map;
import javax.inject.Singleton;
import org.jclouds.aws.config.FormSigningHttpApiModule;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.SubnetApi;
import org.jclouds.ec2.features.TagApi;
import org.jclouds.ec2.features.WindowsApi;
import org.jclouds.ec2.features.AMIApi;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.ec2.features.KeyPairApi;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
import org.jclouds.location.config.LocationModule;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
import org.jclouds.location.suppliers.RegionIdsSupplier;
import org.jclouds.location.suppliers.ZoneIdToURISupplier;
import org.jclouds.location.suppliers.ZoneIdsSupplier;
import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
import org.jclouds.rest.ConfiguresHttpApi;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.google.inject.Provides;
import com.google.inject.Scopes;
/**
* Configures the EC2 connection.
*
* @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
*/
@ConfiguresHttpApi
public abstract class BaseEC2HttpApiModule<A extends EC2Api> extends
FormSigningHttpApiModule<A> {
protected BaseEC2HttpApiModule(Class<A> api) {
super(api);
}
@Override
protected void installLocations() {
install(new LocationModule());
bind(RegionIdToZoneIdsSupplier.class).to(DescribeAvailabilityZonesInRegion.class).in(Scopes.SINGLETON);
bind(RegionIdToURISupplier.class).to(DescribeRegionsForRegionURIs.class).in(Scopes.SINGLETON);
bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON);
bind(RegionIdsSupplier.class).to(RegionIdsFromRegionIdToURIKeySet.class).in(Scopes.SINGLETON);
bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON);
}
}

View File

@ -0,0 +1,67 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.config;
import static org.jclouds.reflect.Reflection2.typeToken;
import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
import java.util.Map;
import javax.inject.Singleton;
import org.jclouds.aws.config.FormSigningHttpApiModule;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.SubnetApi;
import org.jclouds.ec2.features.TagApi;
import org.jclouds.ec2.features.WindowsApi;
import org.jclouds.ec2.features.AMIApi;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.ec2.features.KeyPairApi;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
import org.jclouds.location.config.LocationModule;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
import org.jclouds.location.suppliers.RegionIdsSupplier;
import org.jclouds.location.suppliers.ZoneIdToURISupplier;
import org.jclouds.location.suppliers.ZoneIdsSupplier;
import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
import org.jclouds.rest.ConfiguresHttpApi;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.google.inject.Provides;
import com.google.inject.Scopes;
/**
* Configures the EC2 connection.
*
* @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
*/
@ConfiguresHttpApi
public class EC2HttpApiModule extends BaseEC2HttpApiModule<EC2Api> {
public EC2HttpApiModule() {
super(EC2Api.class);
}
}

View File

@ -1,134 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.config;
import static org.jclouds.reflect.Reflection2.typeToken;
import java.util.Map;
import javax.inject.Singleton;
import org.jclouds.aws.config.WithZonesFormSigningRestClientModule;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2AsyncApi;
import org.jclouds.ec2.EC2AsyncClient;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.features.SubnetApi;
import org.jclouds.ec2.features.SubnetAsyncApi;
import org.jclouds.ec2.features.TagApi;
import org.jclouds.ec2.features.TagAsyncApi;
import org.jclouds.ec2.features.WindowsApi;
import org.jclouds.ec2.features.WindowsAsyncApi;
import org.jclouds.ec2.services.AMIAsyncClient;
import org.jclouds.ec2.services.AMIClient;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionAsyncClient;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient;
import org.jclouds.ec2.services.ElasticBlockStoreAsyncClient;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.services.ElasticIPAddressAsyncClient;
import org.jclouds.ec2.services.ElasticIPAddressClient;
import org.jclouds.ec2.services.InstanceAsyncClient;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.services.KeyPairAsyncClient;
import org.jclouds.ec2.services.KeyPairClient;
import org.jclouds.ec2.services.SecurityGroupAsyncClient;
import org.jclouds.ec2.services.SecurityGroupClient;
import org.jclouds.ec2.services.WindowsAsyncClient;
import org.jclouds.ec2.services.WindowsClient;
import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
import org.jclouds.location.config.LocationModule;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
import org.jclouds.location.suppliers.RegionIdsSupplier;
import org.jclouds.location.suppliers.ZoneIdToURISupplier;
import org.jclouds.location.suppliers.ZoneIdsSupplier;
import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
import org.jclouds.rest.ConfiguresRestClient;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.google.inject.Provides;
import com.google.inject.Scopes;
/**
* Configures the EC2 connection.
*
* @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
*/
@ConfiguresRestClient
// EC2Api not EC2Client so that this can be used for new apps that only depend on EC2Api
public class EC2RestClientModule<S extends EC2Api, A extends EC2AsyncApi> extends
WithZonesFormSigningRestClientModule<S, A> {
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
.put(AMIClient.class, AMIAsyncClient.class)//
.put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)//
.put(InstanceClient.class, InstanceAsyncClient.class)//
.put(KeyPairClient.class, KeyPairAsyncClient.class)//
.put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)//
.put(WindowsClient.class, WindowsAsyncClient.class)//
.put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)//
.put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)//
.put(WindowsApi.class, WindowsAsyncApi.class)//
.put(TagApi.class, TagAsyncApi.class)//
.put(SubnetApi.class, SubnetAsyncApi.class)//
.build();
@SuppressWarnings("unchecked")
public EC2RestClientModule() {
// retaining top-level type of EC2Client vs EC2Api until we migrate all functionality up
super(TypeToken.class.cast(typeToken(EC2Client.class)), TypeToken.class.cast(typeToken(EC2AsyncClient.class)), DELEGATE_MAP);
}
protected EC2RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
Map<Class<?>, Class<?>> sync2Async) {
super(syncClientType, asyncClientType, sync2Async);
}
/**
* so that we can make bindings to {@link EC2Api directly} until we switch
* off {@link @EC2Client}
*/
@Singleton
@Provides
EC2Api provideEC2Api(EC2Client in) {
return in;
}
/**
* so that we can make bindings to {@link EC2AsyncApi directly} until we switch
* off {@link @EC2AsyncClient}
*/
@Singleton
@Provides
EC2AsyncApi provideEC2Api(EC2AsyncClient in) {
return in;
}
@Override
protected void installLocations() {
install(new LocationModule());
bind(RegionIdToZoneIdsSupplier.class).to(DescribeAvailabilityZonesInRegion.class).in(Scopes.SINGLETON);
bind(RegionIdToURISupplier.class).to(DescribeRegionsForRegionURIs.class).in(Scopes.SINGLETON);
bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON);
bind(RegionIdsSupplier.class).to(RegionIdsFromRegionIdToURIKeySet.class).in(Scopes.SINGLETON);
bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON);
}
}

View File

@ -14,10 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
import org.jclouds.ec2.domain.Image;
import org.jclouds.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.ec2.domain.Permission;
@ -25,15 +37,29 @@ import org.jclouds.ec2.options.CreateImageOptions;
import org.jclouds.ec2.options.DescribeImagesOptions;
import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions;
import org.jclouds.ec2.options.RegisterImageOptions;
import org.jclouds.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.ec2.xml.DescribeImagesResponseHandler;
import org.jclouds.ec2.xml.ImageIdHandler;
import org.jclouds.ec2.xml.PermissionHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 via their REST API.
* Provides access to AMI Services.
* <p/>
*
* @author Adrian Cole
*/
public interface AMIClient {
@RequestFilters(FormSigner.class)
@VirtualHost
public interface AMIApi {
/**
* Returns information about AMIs, AKIs, and ARIs. This includes image type, product codes,
@ -43,29 +69,21 @@ public interface AMIClient {
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @see InstanceClient#describeInstances
* @see InstanceApi#describeInstances
* @see #describeImageAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
* />
* @see DescribeImagesOptions
*/
Set<? extends Image> describeImagesInRegion(@Nullable String region, DescribeImagesOptions... options);
/**
* Returns a map of device name to block device for the image.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @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> getBlockDeviceMappingsForImageInRegion(@Nullable String region, String imageId);
@Named("DescribeImages")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeImages")
@XMLResponseParser(DescribeImagesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<? extends Image> describeImagesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
DescribeImagesOptions... options);
/**
* Creates an AMI that uses an Amazon EBS root device from a "running" or "stopped" instance.
@ -82,14 +100,21 @@ public interface AMIClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
* />
* @see CreateImageOptions
* @see InstanceClient#runInstances
* @see InstanceClient#describeInstances
* @see InstanceClient#terminateInstances
* @see InstanceApi#runInstances
* @see InstanceApi#describeInstances
* @see InstanceApi#terminateInstances
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateImage.html"
* />
*/
String createImageInRegion(@Nullable String region, String name, String instanceId, CreateImageOptions... options);
@Named("CreateImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateImage")
@XMLResponseParser(ImageIdHandler.class)
String createImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String name, @FormParam("InstanceId") String instanceId, CreateImageOptions... options);
/**
*
@ -108,11 +133,17 @@ public interface AMIClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeregisterImage.html"
* />
*/
void deregisterImageInRegion(@Nullable String region, String imageId);
@Named("DeregisterImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeregisterImage")
void deregisterImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") 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.
* launch instances, use the {@link InstanceApi#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.
@ -138,12 +169,19 @@ public interface AMIClient {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
* />
*/
String registerImageFromManifestInRegion(@Nullable String region, String name, String pathToManifest,
@Named("RegisterImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RegisterImage")
@XMLResponseParser(ImageIdHandler.class)
String registerImageFromManifestInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String imageName, @FormParam("ImageLocation") 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
* launch instances, use the {@link InstanceApi#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
@ -173,24 +211,39 @@ public interface AMIClient {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
* />
*/
String registerUnixImageBackedByEbsInRegion(@Nullable String region, String name, String ebsSnapshotId,
@Named("RegisterImage")
@POST
@Path("/")
@FormParams(keys = { ACTION, "RootDeviceName", "BlockDeviceMapping.0.DeviceName" }, values = { "RegisterImage",
"/dev/sda1", "/dev/sda1" })
@XMLResponseParser(ImageIdHandler.class)
String registerUnixImageBackedByEbsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String imageName,
@FormParam("BlockDeviceMapping.0.Ebs.SnapshotId") String ebsSnapshotId,
RegisterImageBackedByEbsOptions... options);
/**
* Returns the {@link Permission}s of an image.
* Resets the {@code launchPermission}s on an AMI.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @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"
* 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"
* />
* @see DescribeImagesOptions
*/
Permission getLaunchPermissionForImageInRegion(@Nullable String region, String imageId);
@Named("ResetImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetImageAttribute", "launchPermission" })
void resetLaunchPermissionsOnImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
/**
* Adds {@code launchPermission}s to an AMI.
@ -210,44 +263,74 @@ public interface AMIClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
* />
*/
void addLaunchPermissionsToImageInRegion(@Nullable String region, Iterable<String> userIds,
Iterable<String> userGroups, String imageId);
@Named("ModifyImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add",
"launchPermission" })
void addLaunchPermissionsToImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* Resets the {@code launchPermission}s on an AMI.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @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"
* />
* @see AMIApi#removeLaunchPermissionsToImageInRegion
*/
void resetLaunchPermissionsOnImageInRegion(@Nullable String region, String imageId);
@Named("ModifyImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove",
"launchPermission" })
void removeLaunchPermissionsFromImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* Removes {@code launchPermission}s from an AMI.
* Returns the {@link Permission}s of an image.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @param userIds
* AWS Access Key ID.
* @param userGroups
* Name of the groups. Currently supports \"all.\""
* @param imageId
* The AMI ID.
*
* @see #addLaunchPermissionsToImage
* @see #describeImageAttribute
* 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-ModifyImageAttribute.html"
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImageAttribute.html"
* />
* @see DescribeImagesOptions
*/
void removeLaunchPermissionsFromImageInRegion(@Nullable String region, Iterable<String> userIds,
Iterable<String> userGroups, String imageId);
@Named("DescribeImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "launchPermission" })
@XMLResponseParser(PermissionHandler.class)
Permission getLaunchPermissionForImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
/**
* Returns a map of device name to block device for the image.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @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
*/
@Named("DescribeImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "blockDeviceMapping" })
@XMLResponseParser(BlockDeviceMappingHandler.class)
Map<String, EbsBlockDevice> getBlockDeviceMappingsForImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
@ -42,8 +42,6 @@ import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Availability Zones and Regions via their REST API.
* <p/>
@ -52,10 +50,16 @@ import com.google.common.util.concurrent.ListenableFuture;
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface AvailabilityZoneAndRegionAsyncClient {
public interface AvailabilityZoneAndRegionApi {
/**
* @see AvailabilityZoneAndRegionClient#describeAvailabilityZonesInRegion
* Displays Availability Zones that are currently available to the identity and their states.
*
* @see InstanceApi#runInstances
* @see #describeRegions
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeAvailabilityZones.html"
* />
*/
@Named("DescribeAvailabilityZones")
@POST
@ -63,18 +67,24 @@ public interface AvailabilityZoneAndRegionAsyncClient {
@FormParams(keys = ACTION, values = "DescribeAvailabilityZones")
@XMLResponseParser(DescribeAvailabilityZonesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<AvailabilityZoneInfo>> describeAvailabilityZonesInRegion(
Set<AvailabilityZoneInfo> describeAvailabilityZonesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
DescribeAvailabilityZonesOptions... options);
/**
* @see AvailabilityZoneAndRegionClient#describeRegions
* Describes Regions that are currently available to the identity.
*
* @see InstanceApi#runInstances
* @see #describeAvailabilityZones
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeRegions.html"
* />
*/
@Named("DescribeRegions")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeRegions")
@XMLResponseParser(DescribeRegionsResponseHandler.class)
ListenableFuture<? extends Map<String, URI>> describeRegions(DescribeRegionsOptions... options);
Map<String, URI> describeRegions(DescribeRegionsOptions... options);
}

View File

@ -14,9 +14,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.EC2Fallbacks.VoidOnVolumeAvailable;
import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindVolumeIdsToIndexedFormParams;
import org.jclouds.ec2.domain.Attachment;
import org.jclouds.ec2.domain.Permission;
import org.jclouds.ec2.domain.Snapshot;
@ -24,15 +38,32 @@ import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.options.CreateSnapshotOptions;
import org.jclouds.ec2.options.DescribeSnapshotsOptions;
import org.jclouds.ec2.options.DetachVolumeOptions;
import org.jclouds.ec2.xml.AttachmentHandler;
import org.jclouds.ec2.xml.CreateVolumeResponseHandler;
import org.jclouds.ec2.xml.DescribeSnapshotsResponseHandler;
import org.jclouds.ec2.xml.DescribeVolumesResponseHandler;
import org.jclouds.ec2.xml.PermissionHandler;
import org.jclouds.ec2.xml.SnapshotHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.location.functions.ZoneToEndpoint;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 Elastic Block Store services.
* Provides access to EC2 Elastic Block Store services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
public interface ElasticBlockStoreClient {
@RequestFilters(FormSigner.class)
@VirtualHost
public interface ElasticBlockStoreApi {
/**
* Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
@ -49,15 +80,21 @@ public interface ElasticBlockStoreClient {
* @see #deleteVolumeInRegion
* @see #attachVolumeInRegion
* @see #detachVolumeInRegion
* @see AvailabilityZoneAndRegionClient#describeAvailabilityZonesInRegion
* @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
*
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
* />
*/
Volume createVolumeFromSnapshotInAvailabilityZone(String availabilityZone,
String snapshotId);
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
Volume createVolumeFromSnapshotInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("SnapshotId") String snapshotId);
/**
* Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
@ -79,15 +116,21 @@ public interface ElasticBlockStoreClient {
* @see #deleteVolumeInRegion
* @see #attachVolumeInRegion
* @see #detachVolumeInRegion
* @see AvailabilityZoneAndRegionClient#describeAvailabilityZonesInRegion
* @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
*
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
* />
*/
Volume createVolumeFromSnapshotInAvailabilityZone(String availabilityZone,
int size, String snapshotId);
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
Volume createVolumeFromSnapshotInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("Size") int size, @FormParam("SnapshotId") String snapshotId);
/**
* Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
@ -106,12 +149,19 @@ public interface ElasticBlockStoreClient {
* @see #deleteVolumeInRegion
* @see #attachVolumeInRegion
* @see #detachVolumeInRegion
* @see AvailabilityZoneAndRegionClient#describeAvailabilityZonesInRegion
* @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
* />
*/
Volume createVolumeInAvailabilityZone(String availabilityZone, int size);
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
Volume createVolumeInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("Size") int size);
/**
* Describes the specified Amazon EBS volumes that you own. If you do not specify one or more
@ -129,7 +179,14 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeVolumes.html"
* />
*/
Set<Volume> describeVolumesInRegion(@Nullable String region, String... volumeIds);
@POST
@Named("DescribeVolumes")
@Path("/")
@FormParams(keys = ACTION, values = "DescribeVolumes")
@XMLResponseParser(DescribeVolumesResponseHandler.class)
Set<Volume> describeVolumesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindVolumeIdsToIndexedFormParams.class) String... volumeIds);
/**
* Deletes an Amazon EBS volume that you own. For more information about Amazon EBS, go to the
@ -150,7 +207,12 @@ public interface ElasticBlockStoreClient {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteVolume.html"
* />
*/
void deleteVolumeInRegion(@Nullable String region, String volumeId);
@Named("DeleteVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteVolume")
void deleteVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId);
/**
* Attaches an Amazon EBS volume to a running instance and exposes it as the specified device.
@ -190,8 +252,13 @@ public interface ElasticBlockStoreClient {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DetachVolume.html"
* />
*/
void detachVolumeInRegion(@Nullable String region, String volumeId, boolean force,
DetachVolumeOptions... options);
@Named("DetachVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DetachVolume")
@Fallback(VoidOnVolumeAvailable.class)
void detachVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, @FormParam("Force") boolean force, DetachVolumeOptions... options);
/**
* Attaches an Amazon EBS volume to a running instance and exposes it as the specified device.
@ -223,7 +290,15 @@ public interface ElasticBlockStoreClient {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AttachVolume.html"
* />
*/
Attachment attachVolumeInRegion(@Nullable String region, String volumeId, String instanceId, String device);
@Named("AttachVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AttachVolume")
@XMLResponseParser(AttachmentHandler.class)
Attachment attachVolumeInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, @FormParam("InstanceId") String instanceId,
@FormParam("Device") String device);
/**
* Creates a snapshot of an Amazon EBS volume and stores it in Amazon S3. You can use snapshots
@ -260,7 +335,14 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateSnapshot.html"
* />
*/
Snapshot createSnapshotInRegion(@Nullable String region, String volumeId, CreateSnapshotOptions... options);
@Named("CreateSnapshot")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateSnapshot")
@XMLResponseParser(SnapshotHandler.class)
Snapshot createSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, CreateSnapshotOptions... options);
/**
* Returns information about Amazon EBS snapshots available to the user. Information returned
@ -321,7 +403,15 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshots.html"
* />
*/
Set<Snapshot> describeSnapshotsInRegion(@Nullable String region, DescribeSnapshotsOptions... options);
@Named("DescribeSnapshots")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSnapshots")
@XMLResponseParser(DescribeSnapshotsResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<Snapshot> describeSnapshotsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
DescribeSnapshotsOptions... options);
/**
* Deletes a snapshot of an Amazon EBS volume that you own. For more information, go to the
@ -338,23 +428,13 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteSnapshot.html"
* />
*/
void deleteSnapshotInRegion(@Nullable String region, String snapshotId);
/**
* Returns the {@link Permission}s of an snapshot.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @param snapshotId
* The ID of the AMI for which an attribute will be described
* @see #describeSnapshots
* @see #modifySnapshotAttribute
* @see #resetSnapshotAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshotAttribute.html"
* />
* @see DescribeSnapshotsOptions
*/
Permission getCreateVolumePermissionForSnapshotInRegion(@Nullable String region, String snapshotId);
@Named("DeleteSnapshot")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteSnapshot")
void deleteSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
/**
* Adds {@code createVolumePermission}s to an EBS snapshot.
@ -375,25 +455,16 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySnapshotAttribute.html"
* />
*/
void addCreateVolumePermissionsToSnapshotInRegion(@Nullable String region, Iterable<String> userIds,
Iterable<String> userGroups, String snapshotId);
/**
* Resets the {@code createVolumePermission}s on an EBS snapshot.
*
* @param region
* Snapshots are tied to Regions and can only be used for volumes within the same
* Region.
* @param snapshotId
* The ID of the Amazon EBS snapshot.
*
* @see #addCreateVolumePermissionsToSnapshot
* @see #describeSnapshotAttribute
* @see #removeProductCodesFromSnapshot
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ResetSnapshotAttribute.html"
* />
*/
void resetCreateVolumePermissionsOnSnapshotInRegion(@Nullable String region, String snapshotId);
@Named("ModifySnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "add",
"createVolumePermission" })
void addCreateVolumePermissionsToSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("SnapshotId") String snapshotId);
/**
* Removes {@code createVolumePermission}s from an EBS snapshot.
@ -414,6 +485,61 @@ public interface ElasticBlockStoreClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySnapshotAttribute.html"
* />
*/
void removeCreateVolumePermissionsFromSnapshotInRegion(@Nullable String region, Iterable<String> userIds,
Iterable<String> userGroups, String snapshotId);
@Named("ModifySnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "remove",
"createVolumePermission" })
void removeCreateVolumePermissionsFromSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("SnapshotId") String snapshotId);
/**
* Returns the {@link Permission}s of an snapshot.
*
* @param region
* AMIs are tied to the Region where its files are located within Amazon S3.
* @param snapshotId
* The ID of the AMI for which an attribute will be described
* @see #describeSnapshots
* @see #modifySnapshotAttribute
* @see #resetSnapshotAttribute
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshotAttribute.html"
* />
* @see DescribeSnapshotsOptions
*/
@Named("DescribeSnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeSnapshotAttribute", "createVolumePermission" })
@XMLResponseParser(PermissionHandler.class)
Permission getCreateVolumePermissionForSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
/**
* Resets the {@code createVolumePermission}s on an EBS snapshot.
*
* @param region
* Snapshots are tied to Regions and can only be used for volumes within the same
* Region.
* @param snapshotId
* The ID of the Amazon EBS snapshot.
*
* @see #addCreateVolumePermissionsToSnapshot
* @see #describeSnapshotAttribute
* @see #removeProductCodesFromSnapshot
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ResetSnapshotAttribute.html"
* />
*/
@Named("ResetSnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetSnapshotAttribute", "createVolumePermission" })
void resetCreateVolumePermissionsOnSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
}

View File

@ -14,19 +14,42 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindPublicIpsToIndexedFormParams;
import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
import org.jclouds.ec2.xml.AllocateAddressResponseHandler;
import org.jclouds.ec2.xml.DescribeAddressesResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 via their REST API.
* Provides access to EC2 Elastic IP Addresses via REST API.
* <p/>
*
* @author Adrian Cole
*/
public interface ElasticIPAddressClient {
@RequestFilters(FormSigner.class)
@VirtualHost
public interface ElasticIPAddressApi {
/**
* Acquires an elastic IP address for use with your identity.
@ -39,7 +62,13 @@ public interface ElasticIPAddressClient {
* @see #disassociateAddress
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AllocateAddress.html"
*/
String allocateAddressInRegion(@Nullable String region);
@Named("AllocateAddress")
@POST
@Path("/")
@XMLResponseParser(AllocateAddressResponseHandler.class)
@FormParams(keys = ACTION, values = "AllocateAddress")
String allocateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* Associates an elastic IP address with an instance. If the IP address is currently assigned to
@ -59,7 +88,13 @@ public interface ElasticIPAddressClient {
* @see #disassociateAddress
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-AssociateAddress.html"
*/
void associateAddressInRegion(@Nullable String region, String publicIp, String instanceId);
@Named("AssociateAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AssociateAddress")
void associateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp, @FormParam("InstanceId") String instanceId);
/**
* Disassociates the specified elastic IP address from the instance to which it is assigned. This
@ -77,7 +112,13 @@ public interface ElasticIPAddressClient {
* @see #associateAddress
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DisassociateAddress.html"
*/
void disassociateAddressInRegion(@Nullable String region, String publicIp);
@Named("DisassociateAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DisassociateAddress")
void disassociateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp);
/**
* Releases an elastic IP address associated with your identity.
@ -93,7 +134,13 @@ public interface ElasticIPAddressClient {
* @see #disassociateAddress
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-ReleaseAddress.html"
*/
void releaseAddressInRegion(@Nullable String region, String publicIp);
@Named("ReleaseAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "ReleaseAddress")
void releaseAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp);
/**
* Lists elastic IP addresses assigned to your identity or provides information about a specific
@ -111,7 +158,14 @@ public interface ElasticIPAddressClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeAddresses.html"
* />
*/
Set<PublicIpInstanceIdPair> describeAddressesInRegion(@Nullable String region,
String... publicIps);
@Named("DescribeAddresses")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeAddresses")
@XMLResponseParser(DescribeAddressesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<PublicIpInstanceIdPair> describeAddressesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindPublicIpsToIndexedFormParams.class) String... publicIps);
}

View File

@ -14,25 +14,60 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindBlockDeviceMappingToIndexedFormParams;
import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams;
import org.jclouds.ec2.binders.IfNotNullBindAvailabilityZoneToFormParam;
import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.InstanceStateChange;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.domain.Volume.InstanceInitiatedShutdownBehavior;
import org.jclouds.ec2.functions.ConvertUnencodedBytesToBase64EncodedString;
import org.jclouds.ec2.options.RunInstancesOptions;
import org.jclouds.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.ec2.xml.BooleanValueHandler;
import org.jclouds.ec2.xml.DescribeInstancesResponseHandler;
import org.jclouds.ec2.xml.GetConsoleOutputResponseHandler;
import org.jclouds.ec2.xml.InstanceInitiatedShutdownBehaviorHandler;
import org.jclouds.ec2.xml.InstanceStateChangeHandler;
import org.jclouds.ec2.xml.InstanceTypeHandler;
import org.jclouds.ec2.xml.RunInstancesResponseHandler;
import org.jclouds.ec2.xml.StringValueHandler;
import org.jclouds.ec2.xml.UnencodeStringValueHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.ParamParser;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 via their REST API.
* Provides access to EC2 Instance Services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
public interface InstanceClient {
@RequestFilters(FormSigner.class)
@VirtualHost
public interface InstanceApi {
/**
* Returns information about instances that you own.
@ -56,8 +91,15 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html"
* />
*/
Set<? extends Reservation<? extends RunningInstance>> describeInstancesInRegion(@Nullable String region,
String... instanceIds);
@Named("DescribeInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeInstances")
@XMLResponseParser(DescribeInstancesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<? extends Reservation<? extends RunningInstance>> describeInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* Launches a specified number of instances of an AMI for which you have
@ -136,9 +178,46 @@ public interface InstanceClient {
* />
* @see RunInstancesOptions
*/
Reservation<? extends RunningInstance> runInstancesInRegion(@Nullable String region,
@Nullable String nullableAvailabilityZone, String imageId,
int minCount, int maxCount, RunInstancesOptions... options);
@Named("RunInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RunInstances")
@XMLResponseParser(RunInstancesResponseHandler.class)
Reservation<? extends RunningInstance> runInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@Nullable @BinderParam(IfNotNullBindAvailabilityZoneToFormParam.class) String nullableAvailabilityZone,
@FormParam("ImageId") String imageId, @FormParam("MinCount") int minCount,
@FormParam("MaxCount") int maxCount, RunInstancesOptions... options);
/**
* Requests a reboot of one or more instances. This operation is
* asynchronous; it only queues a request to reboot the specified
* instance(s). The operation will succeed if the instances are valid and
* belong to you. Requests to reboot terminated instances are ignored. <h3>
* Note</h3> If a Linux/UNIX instance does not cleanly shut down within four
* minutes, Amazon EC2 will perform a hard reboot.
*
* @param region
* Instances are tied to Availability Zones. However, the instance
* ID is tied to the Region.
*
* @param instanceIds
* Instance ID to reboot.
*
* @see #startInstancesInRegion
* @see #runInstancesInRegion
* @see #describeInstancesInRegion
* @see #terminateInstancesInRegion
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-StopInstances.html"
* />
*/
@Named("RebootInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RebootInstances")
void rebootInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* Shuts down one or more instances. This operation is idempotent; if you
@ -156,8 +235,15 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-TerminateInstances.html"
* />
*/
Set<? extends InstanceStateChange> terminateInstancesInRegion(@Nullable String region,
String... instanceIds);
@Named("TerminateInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "TerminateInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<? extends InstanceStateChange> terminateInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* Stops an instance that uses an Amazon EBS volume as its root device.
@ -194,32 +280,15 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-StopInstances.html"
* />
*/
Set<? extends InstanceStateChange> stopInstancesInRegion(@Nullable String region,
boolean force, String... instanceIds);
/**
* Requests a reboot of one or more instances. This operation is
* asynchronous; it only queues a request to reboot the specified
* instance(s). The operation will succeed if the instances are valid and
* belong to you. Requests to reboot terminated instances are ignored. <h3>
* Note</h3> If a Linux/UNIX instance does not cleanly shut down within four
* minutes, Amazon EC2 will perform a hard reboot.
*
* @param region
* Instances are tied to Availability Zones. However, the instance
* ID is tied to the Region.
*
* @param instanceIds
* Instance ID to reboot.
*
* @see #startInstancesInRegion
* @see #runInstancesInRegion
* @see #describeInstancesInRegion
* @see #terminateInstancesInRegion
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-StopInstances.html"
* />
*/
void rebootInstancesInRegion(@Nullable String region, String... instanceIds);
@Named("StopInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "StopInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
Set<? extends InstanceStateChange> stopInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Force") boolean force,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* Starts an instance that uses an Amazon EBS volume as its root device.
@ -250,8 +319,14 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-StartInstances.html"
* />
*/
Set<? extends InstanceStateChange> startInstancesInRegion(@Nullable String region,
String... instanceIds);
@Named("StartInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "StartInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
Set<? extends InstanceStateChange> startInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
*
@ -262,8 +337,14 @@ public interface InstanceClient {
* which instance to describe the attribute of
* @return unencoded user data
*/
String getUserDataForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "userData" })
@XMLResponseParser(UnencodeStringValueHandler.class)
String getUserDataForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -274,8 +355,14 @@ public interface InstanceClient {
* which instance to describe the attribute of
* @return The root device name (e.g., /dev/sda1).
*/
String getRootDeviceNameForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "rootDeviceName" })
@XMLResponseParser(StringValueHandler.class)
String getRootDeviceNameForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -286,8 +373,14 @@ public interface InstanceClient {
* which instance to describe the attribute of
* @return the ID of the RAM disk associated with the AMI.
*/
String getRamdiskForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "ramdisk" })
@XMLResponseParser(StringValueHandler.class)
String getRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -298,8 +391,14 @@ public interface InstanceClient {
* which instance to describe the attribute of
* @return the ID of the kernel associated with the AMI.
*/
String getKernelForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "kernel" })
@XMLResponseParser(StringValueHandler.class)
String getKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -312,8 +411,14 @@ public interface InstanceClient {
* You must modify this attribute before you can terminate any
* "locked" instances from the APIs.
*/
boolean isApiTerminationDisabledForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "disableApiTermination" })
@XMLResponseParser(BooleanValueHandler.class)
boolean isApiTerminationDisabledForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -324,8 +429,14 @@ public interface InstanceClient {
* which instance to describe the attribute of
* @return The instance type of the instance.
*/
String getInstanceTypeForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "instanceType" })
@XMLResponseParser(InstanceTypeHandler.class)
String getInstanceTypeForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -337,8 +448,15 @@ public interface InstanceClient {
* @return whether the instance's Amazon EBS volumes are stopped or
* terminated when the instance is shut down.
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute",
"instanceInitiatedShutdownBehavior" })
@XMLResponseParser(InstanceInitiatedShutdownBehaviorHandler.class)
InstanceInitiatedShutdownBehavior getInstanceInitiatedShutdownBehaviorForInstanceInRegion(
String region, String instanceId);
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
@ -350,8 +468,14 @@ public interface InstanceClient {
* @return Describes the mapping that defines native device names to use when
* exposing virtual devices.
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "blockDeviceMapping" })
@XMLResponseParser(BlockDeviceMappingHandler.class)
Map<String, BlockDevice> getBlockDeviceMappingForInstanceInRegion(
@Nullable String region, String instanceId);
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* Resets an attribute of an instance to its default value.
@ -363,8 +487,13 @@ public interface InstanceClient {
* which instance to reset the attribute of
* @return the ID of the RAM disk associated with the AMI.
*/
String resetRamdiskForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("ResetInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetInstanceAttribute", "ramdisk" })
void resetRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* Resets an attribute of an instance to its default value.
@ -376,8 +505,13 @@ public interface InstanceClient {
* which instance to reset the attribute of
* @return the ID of the kernel associated with the AMI.
*/
String resetKernelForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("ResetInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetInstanceAttribute", "kernel" })
void resetKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* Sets the userData used for starting the instance.
@ -400,8 +534,14 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setUserDataForInstanceInRegion(@Nullable String region,
String instanceId, byte[] unencodedData);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "userData" })
void setUserDataForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@FormParam("Value") @ParamParser(ConvertUnencodedBytesToBase64EncodedString.class) byte[] unencodedData);
/**
* Sets the ramdisk used for starting the instance.
@ -424,8 +564,13 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setRamdiskForInstanceInRegion(@Nullable String region,
String instanceId, String ramdisk);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "ramdisk" })
void setRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String ramdisk);
/**
* Sets the kernelId used for starting the instance.
@ -448,8 +593,13 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setKernelForInstanceInRegion(@Nullable String region,
String instanceId, String kernel);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "kernel" })
void setKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String kernel);
/**
* This command works while the instance is running and controls whether or
@ -465,8 +615,13 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setApiTerminationDisabledForInstanceInRegion(@Nullable String region,
String instanceId, boolean apiTerminationDisabled);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "disableApiTermination" })
void setApiTerminationDisabledForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") boolean apiTerminationDisabled);
/**
* Sets the instanceType used for starting the instance.
@ -489,8 +644,13 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setInstanceTypeForInstanceInRegion(@Nullable String region,
String instanceId, String instanceType);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "instanceType" })
void setInstanceTypeForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String instanceType);
/**
* Specifies whether the instance's Amazon EBS volumes are stopped or
@ -515,9 +675,15 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute",
"instanceInitiatedShutdownBehavior" })
void setInstanceInitiatedShutdownBehaviorForInstanceInRegion(
@Nullable String region, String instanceId,
InstanceInitiatedShutdownBehavior instanceInitiatedShutdownBehavior);
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@FormParam("Value") InstanceInitiatedShutdownBehavior instanceInitiatedShutdownBehavior);
/**
* Sets the blockDeviceMapping used for an instance.
@ -564,8 +730,14 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyInstanceAttribute.html"
* />
*/
void setBlockDeviceMappingForInstanceInRegion(@Nullable String region,
String instanceId, Map<String, BlockDevice> blockDeviceMapping);
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION }, values = { "ModifyInstanceAttribute" })
void setBlockDeviceMappingForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@BinderParam(BindBlockDeviceMappingToIndexedFormParams.class) Map<String, BlockDevice> blockDeviceMapping);
/**
* Retrieves console output for the specified instance.
@ -582,6 +754,12 @@ public interface InstanceClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-GetConsoleOutput.html">
* ApiReference query GetConsoleOutput</a>
*/
String getConsoleOutputForInstanceInRegion(@Nullable String region,
String instanceId);
@Named("GetConsoleOutput")
@POST
@Path("/")
@FormParams(keys = { ACTION }, values = { "GetConsoleOutput" })
@XMLResponseParser(GetConsoleOutputResponseHandler.class)
String getConsoleOutputForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
@ -41,8 +41,6 @@ import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 via their REST API.
* <p/>
@ -51,22 +49,50 @@ import com.google.common.util.concurrent.ListenableFuture;
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface KeyPairAsyncClient {
public interface KeyPairApi {
/**
* @see KeyPairClient#createKeyPairInRegion
* Creates a new 2048-bit RSA key pair with the specified name. The public key is stored by
* Amazon EC2 and the private key is displayed on the console. The private key is returned as an
* unencrypted PEM encoded PKCS#8 private key. If a key with the specified name already exists,
* Amazon EC2 returns an error.
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyName
* A unique name for the key pair.
*
* @see #runInstances
* @see #describeKeyPairs
* @see #deleteKeyPair
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateKeyPair.html"
* />
*/
@Named("CreateKeyPair")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateKeyPair")
@XMLResponseParser(KeyPairResponseHandler.class)
ListenableFuture<KeyPair> createKeyPairInRegion(
KeyPair createKeyPairInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("KeyName") String keyName);
/**
* @see KeyPairClient#describeKeyPairsInRegion
* Returns information about key pairs available to you. If you specify key pairs, information
* about those key pairs is returned. Otherwise, information for all registered key pairs is
* returned.
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyPairNames
* Key pairs to describe.
*
* @see #runInstances
* @see #describeAvailabilityZones
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeKeyPairs.html"
* />
*/
@Named("DescribeKeyPairs")
@POST
@ -74,18 +100,31 @@ public interface KeyPairAsyncClient {
@FormParams(keys = ACTION, values = "DescribeKeyPairs")
@XMLResponseParser(DescribeKeyPairsResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<KeyPair>> describeKeyPairsInRegion(
Set<KeyPair> describeKeyPairsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindKeyNamesToIndexedFormParams.class) String... keyPairNames);
/**
* @see KeyPairClient#deleteKeyPairInRegion
* Deletes the specified key pair, by removing the public key from Amazon EC2. You must own the
* key pair
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyName
* Name of the key pair to delete
*
* @see #describeKeyPairs
* @see #createKeyPair
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteKeyPair.html"
* />
*/
@Named("DeleteKeyPair")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteKeyPair")
ListenableFuture<Void> deleteKeyPairInRegion(
void deleteKeyPairInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("KeyName") String keyName);

View File

@ -14,13 +14,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindGroupNamesToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdGroupPairToSourceSecurityGroupFormParams;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.net.domain.IpProtocol;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 via their REST API.
@ -28,7 +50,9 @@ import org.jclouds.net.domain.IpProtocol;
*
* @author Adrian Cole
*/
public interface SecurityGroupClient {
@RequestFilters(FormSigner.class)
@VirtualHost
public interface SecurityGroupApi {
/**
* Creates a new security group. Group names must be unique per identity.
@ -53,7 +77,13 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateSecurityGroup.html"
* />
*/
void createSecurityGroupInRegion(@Nullable String region, String name, String description);
@Named("CreateSecurityGroup")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateSecurityGroup")
void createSecurityGroupInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String name, @FormParam("GroupDescription") String description);
/**
* Deletes a security group that you own.
@ -73,7 +103,13 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteSecurityGroup.html"
* />
*/
void deleteSecurityGroupInRegion(@Nullable String region, String name);
@Named("DeleteSecurityGroup")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteSecurityGroup")
@Fallback(VoidOnNotFoundOr404.class)
void deleteSecurityGroupInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
/**
* Returns information about security groups that you own.
@ -93,8 +129,15 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSecurityGroups.html"
* />
*/
Set<SecurityGroup> describeSecurityGroupsInRegion(@Nullable String region,
String... securityGroupNames);
@Named("DescribeSecurityGroups")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSecurityGroups")
@XMLResponseParser(DescribeSecurityGroupsResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<SecurityGroup> describeSecurityGroupsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindGroupNamesToIndexedFormParams.class) String... securityGroupNames);
/**
*
@ -117,8 +160,14 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AuthorizeSecurityGroupIngress.html"
*
*/
void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupName,
UserIdGroupPair sourceSecurityGroup);
@Named("AuthorizeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
void authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName,
@BinderParam(BindUserIdGroupPairToSourceSecurityGroupFormParams.class) UserIdGroupPair sourceSecurityGroup);
/**
*
@ -156,8 +205,14 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AuthorizeSecurityGroupIngress.html"
*
*/
void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupName,
IpProtocol ipProtocol, int fromPort, int toPort, String cidrIp);
@Named("AuthorizeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
void authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName, @FormParam("IpProtocol") IpProtocol ipProtocol,
@FormParam("FromPort") int fromPort, @FormParam("ToPort") int toPort, @FormParam("CidrIp") String cidrIp);
/**
*
@ -181,8 +236,14 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RevokeSecurityGroupIngress.html"
*
*/
void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupName,
UserIdGroupPair sourceSecurityGroup);
@Named("RevokeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
void revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName,
@BinderParam(BindUserIdGroupPairToSourceSecurityGroupFormParams.class) UserIdGroupPair sourceSecurityGroup);
/**
*
@ -221,6 +282,12 @@ public interface SecurityGroupClient {
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RevokeSecurityGroupIngress.html"
*
*/
void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupName, IpProtocol ipProtocol,
int fromPort, int toPort, String cidrIp);
@Named("RevokeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
void revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName, @FormParam("IpProtocol") IpProtocol ipProtocol,
@FormParam("FromPort") int fromPort, @FormParam("ToPort") int toPort, @FormParam("CidrIp") String cidrIp);
}

View File

@ -16,25 +16,40 @@
*/
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import javax.inject.Named;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindFiltersToIndexedFormParams;
import org.jclouds.ec2.domain.Subnet;
import org.jclouds.ec2.util.SubnetFilterBuilder;
import org.jclouds.ec2.xml.DescribeSubnetsResponseHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
/**
* To help you manage your Amazon EC2 instances, images, and other Amazon EC2 resources, you can assign your own
* metadata to each resource in the form of tags.
* Provides access to Amazon EC2 via the Query API
* <p/>
*
* @see <a href="http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html" >doc</a>
* @see SubnetAsyncApi
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html"
* >doc</a>
* @author Adrian Cole
* @author Andrew Bayer
*/
@SinceApiVersion("2011-01-01")
@RequestFilters(FormSigner.class)
@VirtualHost
public interface SubnetApi {
/**
* Describes all of your subnets for your EC2 resources.
*
@ -43,6 +58,12 @@ public interface SubnetApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html"
* >docs</href>
*/
@Named("DescribeSubnets")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSubnets")
@XMLResponseParser(DescribeSubnetsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
FluentIterable<Subnet> list();
/**
@ -61,6 +82,13 @@ public interface SubnetApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html"
* >docs</href>
*/
FluentIterable<Subnet> filter(Multimap<String, String> filter);
@Named("DescribeSubnets")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSubnets")
@XMLResponseParser(DescribeSubnetsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
FluentIterable<Subnet> filter(
@BinderParam(BindFiltersToIndexedFormParams.class) Multimap<String, String> filter);
}

View File

@ -1,83 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import javax.inject.Named;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindFiltersToIndexedFormParams;
import org.jclouds.ec2.domain.Subnet;
import org.jclouds.ec2.xml.DescribeSubnetsResponseHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to Amazon EC2 via the Query API
* <p/>
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html"
* >doc</a>
* @see SubnetApi
* @author Adrian Cole
* @author Andrew Bayer
*/
@SinceApiVersion("2011-01-01")
@RequestFilters(FormSigner.class)
@VirtualHost
public interface SubnetAsyncApi {
/**
* @see SubnetApi#list()
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html">docs</a>
*/
@Named("DescribeSubnets")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSubnets")
@XMLResponseParser(DescribeSubnetsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
ListenableFuture<FluentIterable<Subnet>> list();
/**
* @see SubnetApi#filter
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html">docs</a>
*/
@Named("DescribeSubnets")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSubnets")
@XMLResponseParser(DescribeSubnetsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
ListenableFuture<FluentIterable<Subnet>> filter(
@BinderParam(BindFiltersToIndexedFormParams.class) Multimap<String, String> filter);
}

View File

@ -16,28 +16,45 @@
*/
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import javax.inject.Named;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindFiltersToIndexedFormParams;
import org.jclouds.ec2.binders.BindResourceIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindTagKeysToIndexedFormParams;
import org.jclouds.ec2.binders.BindTagsToIndexedFormParams;
import org.jclouds.ec2.domain.Tag;
import org.jclouds.ec2.util.TagFilterBuilder;
import org.jclouds.ec2.xml.DescribeTagsResponseHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
/**
* To help you manage your Amazon EC2 instances, images, and other Amazon EC2
* resources, you can assign your own metadata to each resource in the form of
* tags.
* Provides access to Amazon EC2 via the Query API
* <p/>
*
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/Using_Tags.html"
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html"
* >doc</a>
* @see TagAsyncApi
* @author Adrian Cole
*/
@SinceApiVersion("2010-08-31")
@RequestFilters(FormSigner.class)
@VirtualHost
public interface TagApi {
/**
* Adds or overwrites one or more tags for the specified resource or
* resources. Each resource can have a maximum of 10 tags. Each tag consists
@ -58,7 +75,12 @@ public interface TagApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateTags.html"
* >docs</href>
*/
void applyToResources(Map<String, String> tags, Iterable<String> resourceIds);
@Named("CreateTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateTags")
void applyToResources(@BinderParam(BindTagsToIndexedFormParams.class) Iterable<String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* like {@link #applyToResources(Map, Iterable)} except that the tags have no
@ -72,7 +94,12 @@ public interface TagApi {
*
* @see #applyToResources(Map, Iterable)
*/
void applyToResources(Iterable<String> tags, Iterable<String> resourceIds);
@Named("CreateTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateTags")
void applyToResources(@BinderParam(BindTagsToIndexedFormParams.class) Map<String, String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* Describes all of your tags for your EC2 resources.
@ -82,6 +109,12 @@ public interface TagApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html"
* >docs</href>
*/
@Named("DescribeTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeTags")
@XMLResponseParser(DescribeTagsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
FluentIterable<Tag> list();
/**
@ -100,7 +133,14 @@ public interface TagApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html"
* >docs</href>
*/
FluentIterable<Tag> filter(Multimap<String, String> filter);
@Named("DescribeTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeTags")
@XMLResponseParser(DescribeTagsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
FluentIterable<Tag> filter(
@BinderParam(BindFiltersToIndexedFormParams.class) Multimap<String, String> filter);
/**
* Deletes a specific set of tags from a specific set of resources. This call
@ -124,7 +164,13 @@ public interface TagApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteTags.html"
* >docs</href>
*/
void deleteFromResources(Iterable<String> tags, Iterable<String> resourceIds);
@Named("DeleteTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteTags")
void deleteFromResources(
@BinderParam(BindTagKeysToIndexedFormParams.class) Iterable<String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* like {@link #deleteFromResources(Iterable, Iterable)}, except that the
@ -144,6 +190,12 @@ public interface TagApi {
* {@code ami-1a2b3c4d}
* @see #deleteFromResources(Iterable, Iterable)
*/
void conditionallyDeleteFromResources(Map<String, String> conditionalTagValues, Iterable<String> resourceIds);
@Named("DeleteTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteTags")
void conditionallyDeleteFromResources(
@BinderParam(BindTagsToIndexedFormParams.class) Map<String, String> conditionalTagValues,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
}

View File

@ -1,138 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import javax.inject.Named;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindFiltersToIndexedFormParams;
import org.jclouds.ec2.binders.BindResourceIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindTagKeysToIndexedFormParams;
import org.jclouds.ec2.binders.BindTagsToIndexedFormParams;
import org.jclouds.ec2.domain.Tag;
import org.jclouds.ec2.xml.DescribeTagsResponseHandler;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to Amazon EC2 via the Query API
* <p/>
*
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html"
* >doc</a>
* @see TagApi
* @author Adrian Cole
*/
@SinceApiVersion("2010-08-31")
@RequestFilters(FormSigner.class)
@VirtualHost
public interface TagAsyncApi {
/**
* @see TagApi#applyToResources(Iterable, Iterable)
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateTags.html">docs</a>
*/
@Named("CreateTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateTags")
ListenableFuture<Void> applyToResources(@BinderParam(BindTagsToIndexedFormParams.class) Iterable<String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* @see TagApi#applyToResources(Map, Iterable)
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateTags.html">docs</a>
*/
@Named("CreateTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateTags")
ListenableFuture<Void> applyToResources(@BinderParam(BindTagsToIndexedFormParams.class) Map<String, String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* @see TagApi#list()
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html">docs</a>
*/
@Named("DescribeTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeTags")
@XMLResponseParser(DescribeTagsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
ListenableFuture<FluentIterable<Tag>> list();
/**
* @see TagApi#filter
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html">docs</a>
*/
@Named("DescribeTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeTags")
@XMLResponseParser(DescribeTagsResponseHandler.class)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
ListenableFuture<FluentIterable<Tag>> filter(
@BinderParam(BindFiltersToIndexedFormParams.class) Multimap<String, String> filter);
/**
* @see TagApi#deleteFromResources
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteTags.html">docs</a>
*/
@Named("DeleteTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteTags")
ListenableFuture<Void> deleteFromResources(
@BinderParam(BindTagKeysToIndexedFormParams.class) Iterable<String> tags,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
/**
* @see TagApi#conditionallyDeleteFromResources
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteTags.html">docs</a>
*/
@Named("DeleteTags")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteTags")
ListenableFuture<Void> conditionallyDeleteFromResources(
@BinderParam(BindTagsToIndexedFormParams.class) Map<String, String> conditionalTagValues,
@BinderParam(BindResourceIdsToIndexedFormParams.class) Iterable<String> resourceIds);
}

View File

@ -16,23 +16,165 @@
*/
package org.jclouds.ec2.features;
import org.jclouds.ec2.domain.PasswordData;
import org.jclouds.rest.annotations.SinceApiVersion;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import com.google.common.annotations.Beta;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindBundleIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindS3UploadPolicyAndSignature;
import org.jclouds.ec2.domain.BundleTask;
import org.jclouds.ec2.domain.PasswordData;
import org.jclouds.ec2.options.BundleInstanceS3StorageOptions;
import org.jclouds.ec2.xml.BundleTaskHandler;
import org.jclouds.ec2.xml.DescribeBundleTasksResponseHandler;
import org.jclouds.ec2.xml.GetPasswordDataResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
/**
* Provides access to EC2 Windows Features via the Query API
* <p/>
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference" >doc</a>
* @see WindowsAsyncApi
* @author Adrian Cole
*/
@Beta
@RequestFilters(FormSigner.class)
@VirtualHost
@SinceApiVersion("2008-08-08")
public interface WindowsApi {
/**
* Bundles the Windows instance. This procedure is not applicable for Linux
* and UNIX instances. For more information, go to the Amazon Elastic Compute
* Cloud Developer Guide or Amazon Elastic Compute Cloud Getting Started
* Guide.
*
* @param region
* Bundles are tied to the Region where its files are located
* within Amazon S3.
*
* @param instanceId
* The ID of the instance to bundle.
* @param prefix
* Specifies the beginning of the file name of the AMI.
* @param bucket
* The bucket in which to store the AMI. You can specify a bucket
* that you already own or a new bucket that Amazon EC2 creates on
* your behalf. If you specify a bucket that belongs to someone
* else, Amazon EC2 returns an error.
* @param uploadPolicy
* An Amazon S3 upload policy that gives Amazon EC2 permission to
* upload items into Amazon S3 on the user's behalf.
* <p/>
* ex.
*
* <pre>
* {"expiration": "2008-08-30T08:49:09Z","conditions": ["bucket": "my-bucket"},["starts-with", "$key", "my-new-image"]]}
* </pre>
*
* @param options
* if the bucket isn't owned by you, use this to set the bucket's
* accesskeyid
* @return status of the work
*
* @see #cancelBundleTaskInRegion
* @see #describeBundleTasksInRegion
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-BundleInstance.html"
* />
*/
@Named("BundleInstance")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "BundleInstance")
@XMLResponseParser(BundleTaskHandler.class)
BundleTask bundleInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Storage.S3.Prefix") String prefix,
@FormParam("Storage.S3.Bucket") String bucket,
@BinderParam(BindS3UploadPolicyAndSignature.class) String uploadPolicy,
BundleInstanceS3StorageOptions... options);
/**
* Cancels an Amazon EC2 bundling operation.
*
* @param region
* The bundleTask ID is tied to the Region.
* @param bundleId
* The ID of the bundle task to cancel.
* @return task for the cancel.
*
* @see #bundleInstanceInRegion
* @see #describeBundleTasksInRegion
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CancelBundleTask.html"
* />
*/
@Named("CancelBundleTask")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CancelBundleTask")
@XMLResponseParser(BundleTaskHandler.class)
BundleTask cancelBundleTaskInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("BundleId") String bundleId);
/**
*
* Describes current bundling tasks.
*
* @param region
* The bundleTask ID is tied to the Region.
*
* @see #cancelBundleTaskInRegion
* @see #bundleInstanceInRegion
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeBundleTasks.html"
* />
*/
@Named("DescribeBundleTasks")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeBundleTasks")
@XMLResponseParser(DescribeBundleTasksResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
Set<BundleTask> describeBundleTasksInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindBundleIdsToIndexedFormParams.class) String... bundleTaskIds);
/**
*
* Retrieves the encrypted administrator password for the instances running Windows.
*
* @param region The region where the instance is based
* @param instanceId The ID of the instance to query
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-GetPasswordData.html" />
*/
@Named("GetPasswordData")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "GetPasswordData")
@XMLResponseParser(GetPasswordDataResponseHandler.class)
PasswordData getPasswordDataInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
*
* Retrieves the encrypted administrator password for the instances running Windows. <h4>Note</h4>
@ -49,5 +191,12 @@ public interface WindowsApi {
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-GetPasswordData.html"
* />
*/
PasswordData getPasswordDataForInstance(String instanceId);
@Named("GetPasswordData")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "GetPasswordData")
@XMLResponseParser(GetPasswordDataResponseHandler.class)
@Fallback(NullOnNotFoundOr404.class)
PasswordData getPasswordDataForInstance(@FormParam("InstanceId") String instanceId);
}

View File

@ -1,65 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.features;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.domain.PasswordData;
import org.jclouds.ec2.xml.GetPasswordDataResponseHandler;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.annotations.Beta;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Windows Features via the Query API
* <p/>
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference" >doc</a>
* @see WindowsAsyncApi
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
@Beta
@SinceApiVersion("2008-08-08")
public interface WindowsAsyncApi {
/**
* @see WindowsApi#getPasswordDataForInstance
*/
@Named("GetPasswordData")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "GetPasswordData")
@XMLResponseParser(GetPasswordDataResponseHandler.class)
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<PasswordData> getPasswordDataForInstance(@FormParam("InstanceId") String instanceId);
}

View File

@ -39,7 +39,7 @@ import com.google.inject.Inject;
* <code>
* import static org.jclouds.ec2.options.BundleInstanceS3StorageOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* EC2Api connection = // get connection
* String imageId = connection.getWindowsServices().bundleInstanceInRegion(...bucketOwnedBy(anotherAccessKey));
* <code>
*

View File

@ -29,8 +29,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.CreateImageOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAMIServices().createImage(withDescription("123125").noReboot());
* EC2Api connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAMIApi().get().createImage(withDescription("123125").noReboot());
* <code>
*
* @author Adrian Cole

View File

@ -29,8 +29,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.CreateSnapshotOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* Snapshot snapshot = connection.getElasticBlockStoreServices().createSnapshotInRegion(volumeId, withDescription("123125"));
* EC2Api connection = // get connection
* Snapshot snapshot = connection.getElasticBlockStoreApi().get().createSnapshotInRegion(volumeId, withDescription("123125"));
* <code>
*
* @author Adrian Cole

View File

@ -30,8 +30,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.DescribeAvailabilityZonesOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAvailabilityZoneAndRegionServices().describeAvailabilityZones(zones("us-east-1a", "us-east-1b"));
* EC2Api connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAvailabilityZoneAndRegionApi().get().describeAvailabilityZones(zones("us-east-1a", "us-east-1b"));
* <code>
*
* @author Adrian Cole

View File

@ -31,8 +31,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAMIServices().describeImages(executableBy("123125").imageIds(1000, 1004));
* EC2Api connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getAMIApi().get().describeImages(executableBy("123125").imageIds(1000, 1004));
* <code>
*
* @author Adrian Cole

View File

@ -30,7 +30,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.DescribeRegionsOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* EC2Api connection = // get connection
* Future<Set<ImageMetadata>> images = connection.getRegionsAndRegionsServices().describeRegions(regions("us-east-1a", "us-east-1b"));
* <code>
*

View File

@ -29,8 +29,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.DescribeSnapshotsOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* Set<Snapshot> snapshots = connection.getElasticBlockStoreServices().describeSnapshots(restorableBy("123125").snapshotIds(1000, 1004));
* EC2Api connection = // get connection
* Set<Snapshot> snapshots = connection.getElasticBlockStoreApi().get().describeSnapshots(restorableBy("123125").snapshotIds(1000, 1004));
* <code>
*
* @author Adrian Cole

View File

@ -29,8 +29,8 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.DetachVolumeOptions.Builder.*
* <p/>
* EC2Client client = // get connection
* client.getElasticBlockStoreServices().detachVolumeInRegion(null, id, fromDevice("123125").force());
* EC2Api client = // get connection
* client.getElasticBlockStoreApi().get().detachVolumeInRegion(null, id, fromDevice("123125").force());
* <code>
*
* @author Adrian Cole

View File

@ -31,7 +31,7 @@ import org.jclouds.javax.annotation.Nullable;
* <code>
* import static org.jclouds.ec2.options.RegisterImageBackedByEbsOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* EC2Api connection = // get connection
* String imageId = connection.getImageServices().registerImageBackedByEbs(...addEphemeralBlockDeviceFromSnapshot("/dev/sda2","virtual-1","snapshot-id"));
* <code>
*

View File

@ -30,7 +30,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.ec2.options.RegisterImageOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* EC2Api connection = // get connection
* String imageId = connection.getImageServices().registerImageFromManifest(...withArchitecture(Architecture.I386).withDescription("description"));
* <code>
*

View File

@ -35,7 +35,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
* <code>
* import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.*
* <p/>
* EC2Client connection = // get connection
* EC2Api connection = // get connection
* Future<ReservationInfo> instances = connection.runInstances(executableBy("123125").imageIds(1000, 1004));
* <code>
*

View File

@ -20,7 +20,7 @@ import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.aws.AWSResponseException;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.logging.Logger;
@ -37,13 +37,13 @@ import com.google.inject.Inject;
@Singleton
public class InstanceHasIpAddress implements Predicate<RunningInstance> {
private final EC2Client client;
private final EC2Api client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public InstanceHasIpAddress(EC2Client client) {
public InstanceHasIpAddress(EC2Api client) {
this.client = client;
}
@ -60,7 +60,7 @@ public class InstanceHasIpAddress implements Predicate<RunningInstance> {
}
private RunningInstance refresh(RunningInstance instance) {
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceServices()
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceApi().get()
.describeInstancesInRegion(instance.getRegion(), instance.getId())));
}
}

View File

@ -19,7 +19,7 @@ package org.jclouds.ec2.predicates;
import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.InstanceState;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.logging.Logger;
@ -38,13 +38,13 @@ import com.google.inject.Inject;
@Singleton
public class InstanceStateRunning implements Predicate<RunningInstance> {
private final EC2Client client;
private final EC2Api client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public InstanceStateRunning(EC2Client client) {
public InstanceStateRunning(EC2Api client) {
this.client = client;
}
@ -63,7 +63,7 @@ public class InstanceStateRunning implements Predicate<RunningInstance> {
private RunningInstance refresh(RunningInstance instance) {
return Iterables.getOnlyElement(Iterables.getOnlyElement(client
.getInstanceServices().describeInstancesInRegion(
.getInstanceApi().get().describeInstancesInRegion(
instance.getRegion(), instance.getId())));
}
}

View File

@ -21,7 +21,7 @@ import javax.inject.Singleton;
import org.jclouds.ec2.domain.InstanceState;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.logging.Logger;
import com.google.common.base.Predicate;
@ -37,13 +37,13 @@ import com.google.inject.Inject;
@Singleton
public class InstanceStateStopped implements Predicate<RunningInstance> {
private final InstanceClient client;
private final InstanceApi client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public InstanceStateStopped(InstanceClient client) {
public InstanceStateStopped(InstanceApi client) {
this.client = client;
}

View File

@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.InstanceState;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.logging.Logger;
@ -39,13 +39,13 @@ import com.google.inject.Inject;
@Singleton
public class InstanceStateTerminated implements Predicate<RunningInstance> {
private final EC2Client client;
private final EC2Api client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public InstanceStateTerminated(EC2Client client) {
public InstanceStateTerminated(EC2Api client) {
this.client = client;
}
@ -62,7 +62,7 @@ public class InstanceStateTerminated implements Predicate<RunningInstance> {
}
private RunningInstance refresh(RunningInstance instance) {
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceServices()
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceApi().get()
.describeInstancesInRegion(instance.getRegion(), instance.getId())));
}
}

View File

@ -22,7 +22,7 @@ import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.domain.Snapshot;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.logging.Logger;
import com.google.common.base.Predicate;
@ -38,12 +38,12 @@ import com.google.inject.Inject;
@Singleton
public class SnapshotCompleted implements Predicate<Snapshot> {
private final ElasticBlockStoreClient client;
private final ElasticBlockStoreApi client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public SnapshotCompleted(ElasticBlockStoreClient client) {
public SnapshotCompleted(ElasticBlockStoreApi client) {
this.client = client;
}

View File

@ -21,7 +21,7 @@ import javax.inject.Singleton;
import org.jclouds.ec2.domain.Attachment;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.logging.Logger;
import com.google.common.base.Predicate;
@ -38,12 +38,12 @@ import com.google.inject.Inject;
@Singleton
public class VolumeAttached implements Predicate<Attachment> {
private final ElasticBlockStoreClient client;
private final ElasticBlockStoreApi client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public VolumeAttached(ElasticBlockStoreClient client) {
public VolumeAttached(ElasticBlockStoreApi client) {
this.client = client;
}

View File

@ -20,7 +20,7 @@ import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.logging.Logger;
import com.google.common.base.Predicate;
@ -36,12 +36,12 @@ import com.google.inject.Inject;
@Singleton
public class VolumeAvailable implements Predicate<Volume> {
private final ElasticBlockStoreClient client;
private final ElasticBlockStoreApi client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public VolumeAvailable(ElasticBlockStoreClient client) {
public VolumeAvailable(ElasticBlockStoreApi client) {
this.client = client;
}

View File

@ -22,7 +22,7 @@ import javax.annotation.Resource;
import org.jclouds.ec2.domain.Attachment;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.logging.Logger;
import com.google.common.base.Predicate;
@ -38,12 +38,12 @@ import com.google.inject.Singleton;
@Singleton
public class VolumeDetached implements Predicate<Attachment> {
private final ElasticBlockStoreClient client;
private final ElasticBlockStoreApi client;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public VolumeDetached(ElasticBlockStoreClient client) {
public VolumeDetached(ElasticBlockStoreApi client) {
this.client = client;
}

View File

@ -1,192 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
import org.jclouds.ec2.domain.Image;
import org.jclouds.ec2.domain.Image.EbsBlockDevice;
import org.jclouds.ec2.domain.Permission;
import org.jclouds.ec2.options.CreateImageOptions;
import org.jclouds.ec2.options.DescribeImagesOptions;
import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions;
import org.jclouds.ec2.options.RegisterImageOptions;
import org.jclouds.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.ec2.xml.DescribeImagesResponseHandler;
import org.jclouds.ec2.xml.ImageIdHandler;
import org.jclouds.ec2.xml.PermissionHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to AMI Services.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface AMIAsyncClient {
/**
* @see AMIClient#describeImagesInRegion
*/
@Named("DescribeImages")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeImages")
@XMLResponseParser(DescribeImagesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<? extends Image>> describeImagesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
DescribeImagesOptions... options);
/**
* @see AMIClient#createImageInRegion
*/
@Named("CreateImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateImage")
@XMLResponseParser(ImageIdHandler.class)
ListenableFuture<String> createImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String name, @FormParam("InstanceId") String instanceId, CreateImageOptions... options);
/**
* @see AMIClient#deregisterImageInRegion
*/
@Named("DeregisterImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeregisterImage")
ListenableFuture<Void> deregisterImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#registerImageFromManifestInRegion
*/
@Named("RegisterImage")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RegisterImage")
@XMLResponseParser(ImageIdHandler.class)
ListenableFuture<String> registerImageFromManifestInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String imageName, @FormParam("ImageLocation") String pathToManifest,
RegisterImageOptions... options);
/**
* @see AMIClient#registerUnixImageBackedByEbsInRegion
*/
@Named("RegisterImage")
@POST
@Path("/")
@FormParams(keys = { ACTION, "RootDeviceName", "BlockDeviceMapping.0.DeviceName" }, values = { "RegisterImage",
"/dev/sda1", "/dev/sda1" })
@XMLResponseParser(ImageIdHandler.class)
ListenableFuture<String> registerUnixImageBackedByEbsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Name") String imageName,
@FormParam("BlockDeviceMapping.0.Ebs.SnapshotId") String ebsSnapshotId,
RegisterImageBackedByEbsOptions... options);
/**
* @see AMIClient#resetLaunchPermissionsOnImageInRegion
*/
@Named("ResetImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetImageAttribute", "launchPermission" })
ListenableFuture<Void> resetLaunchPermissionsOnImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#addLaunchPermissionsToImageInRegion
*/
@Named("ModifyImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add",
"launchPermission" })
ListenableFuture<Void> addLaunchPermissionsToImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#removeLaunchPermissionsToImageInRegion
*/
@Named("ModifyImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove",
"launchPermission" })
ListenableFuture<Void> removeLaunchPermissionsFromImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#getLaunchPermissionForImageInRegion
*/
@Named("DescribeImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "launchPermission" })
@XMLResponseParser(PermissionHandler.class)
ListenableFuture<Permission> getLaunchPermissionForImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
/**
* @see AMIClient#getBlockDeviceMappingsForImageInRegion
*/
@Named("DescribeImageAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "blockDeviceMapping" })
@XMLResponseParser(BlockDeviceMappingHandler.class)
ListenableFuture<Map<String, EbsBlockDevice>> getBlockDeviceMappingsForImageInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("ImageId") String imageId);
}

View File

@ -1,57 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import java.net.URI;
import java.util.Map;
import java.util.Set;
import org.jclouds.ec2.domain.AvailabilityZoneInfo;
import org.jclouds.ec2.options.DescribeAvailabilityZonesOptions;
import org.jclouds.ec2.options.DescribeRegionsOptions;
import org.jclouds.javax.annotation.Nullable;
/**
* Provides EC2 Availability Zones and Regions services for EC2.
* <p/>
*
* @author Adrian Cole
*/
public interface AvailabilityZoneAndRegionClient {
/**
* Displays Availability Zones that are currently available to the identity and their states.
*
* @see InstanceClient#runInstances
* @see #describeRegions
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeAvailabilityZones.html"
* />
*/
Set<AvailabilityZoneInfo> describeAvailabilityZonesInRegion(@Nullable String region,
DescribeAvailabilityZonesOptions... options);
/**
* Describes Regions that are currently available to the identity.
*
* @see InstanceClient#runInstances
* @see #describeAvailabilityZones
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeRegions.html"
* />
*/
Map<String, URI> describeRegions(DescribeRegionsOptions... options);
}

View File

@ -1,239 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.EC2Fallbacks.VoidOnVolumeAvailable;
import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindVolumeIdsToIndexedFormParams;
import org.jclouds.ec2.domain.Attachment;
import org.jclouds.ec2.domain.Permission;
import org.jclouds.ec2.domain.Snapshot;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.options.CreateSnapshotOptions;
import org.jclouds.ec2.options.DescribeSnapshotsOptions;
import org.jclouds.ec2.options.DetachVolumeOptions;
import org.jclouds.ec2.xml.AttachmentHandler;
import org.jclouds.ec2.xml.CreateVolumeResponseHandler;
import org.jclouds.ec2.xml.DescribeSnapshotsResponseHandler;
import org.jclouds.ec2.xml.DescribeVolumesResponseHandler;
import org.jclouds.ec2.xml.PermissionHandler;
import org.jclouds.ec2.xml.SnapshotHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.location.functions.ZoneToEndpoint;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Elastic Block Store services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface ElasticBlockStoreAsyncClient {
/**
* @see ElasticBlockStoreClient#createVolumeFromSnapshotInAvailabilityZone
*/
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
ListenableFuture<Volume> createVolumeFromSnapshotInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#createVolumeFromSnapshotInAvailabilityZone
*/
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
ListenableFuture<Volume> createVolumeFromSnapshotInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("Size") int size, @FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#createVolumeInAvailabilityZone
*/
@Named("CreateVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateVolume")
@XMLResponseParser(CreateVolumeResponseHandler.class)
ListenableFuture<Volume> createVolumeInAvailabilityZone(
@EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
@FormParam("Size") int size);
/**
* @see ElasticBlockStoreClient#describeVolumesInRegion
*/
@POST
@Named("DescribeVolumes")
@Path("/")
@FormParams(keys = ACTION, values = "DescribeVolumes")
@XMLResponseParser(DescribeVolumesResponseHandler.class)
ListenableFuture<? extends Set<Volume>> describeVolumesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindVolumeIdsToIndexedFormParams.class) String... volumeIds);
/**
* @see ElasticBlockStoreClient#deleteVolumeInRegion
*/
@Named("DeleteVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteVolume")
ListenableFuture<Void> deleteVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId);
/**
* @see ElasticBlockStoreClient#detachVolumeInRegion
*/
@Named("DetachVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DetachVolume")
@Fallback(VoidOnVolumeAvailable.class)
ListenableFuture<Void> detachVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, @FormParam("Force") boolean force, DetachVolumeOptions... options);
/**
* @see ElasticBlockStoreClient#attachVolumeInRegion
*/
@Named("AttachVolume")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AttachVolume")
@XMLResponseParser(AttachmentHandler.class)
ListenableFuture<Attachment> attachVolumeInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, @FormParam("InstanceId") String instanceId,
@FormParam("Device") String device);
/**
* @see ElasticBlockStoreClient#createSnapshotInRegion
*/
@Named("CreateSnapshot")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateSnapshot")
@XMLResponseParser(SnapshotHandler.class)
ListenableFuture<Snapshot> createSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("VolumeId") String volumeId, CreateSnapshotOptions... options);
/**
* @see ElasticBlockStoreClient#describeSnapshotsInRegion
*/
@Named("DescribeSnapshots")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSnapshots")
@XMLResponseParser(DescribeSnapshotsResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<Snapshot>> describeSnapshotsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
DescribeSnapshotsOptions... options);
/**
* @see ElasticBlockStoreClient#deleteSnapshotInRegion
*/
@Named("DeleteSnapshot")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteSnapshot")
ListenableFuture<Void> deleteSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#addCreateVolumePermissionsToSnapshotInRegion
*/
@Named("ModifySnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "add",
"createVolumePermission" })
ListenableFuture<Void> addCreateVolumePermissionsToSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#removeCreateVolumePermissionsFromSnapshotInRegion
*/
@Named("ModifySnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "remove",
"createVolumePermission" })
ListenableFuture<Void> removeCreateVolumePermissionsFromSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
@BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
@FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#getCreateVolumePermissionForSnapshotInRegion
*/
@Named("DescribeSnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeSnapshotAttribute", "createVolumePermission" })
@XMLResponseParser(PermissionHandler.class)
ListenableFuture<Permission> getCreateVolumePermissionForSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
/**
* @see ElasticBlockStoreClient#resetCreateVolumePermissionsOnSnapshotInRegion
*/
@Named("ResetSnapshotAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetSnapshotAttribute", "createVolumePermission" })
ListenableFuture<Void> resetCreateVolumePermissionsOnSnapshotInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("SnapshotId") String snapshotId);
}

View File

@ -1,113 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindPublicIpsToIndexedFormParams;
import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
import org.jclouds.ec2.xml.AllocateAddressResponseHandler;
import org.jclouds.ec2.xml.DescribeAddressesResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Elastic IP Addresses via REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface ElasticIPAddressAsyncClient {
/**
* @see BaseEC2Client#allocateAddressInRegion
*/
@Named("AllocateAddress")
@POST
@Path("/")
@XMLResponseParser(AllocateAddressResponseHandler.class)
@FormParams(keys = ACTION, values = "AllocateAddress")
ListenableFuture<String> allocateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
/**
* @see BaseEC2Client#associateAddressInRegion
*/
@Named("AssociateAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AssociateAddress")
ListenableFuture<Void> associateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp, @FormParam("InstanceId") String instanceId);
/**
* @see BaseEC2Client#disassociateAddressInRegion
*/
@Named("DisassociateAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DisassociateAddress")
ListenableFuture<Void> disassociateAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp);
/**
* @see BaseEC2Client#releaseAddressInRegion
*/
@Named("ReleaseAddress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "ReleaseAddress")
ListenableFuture<Void> releaseAddressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("PublicIp") String publicIp);
/**
* @see BaseEC2Client#describeAddressesInRegion
*/
@Named("DescribeAddresses")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeAddresses")
@XMLResponseParser(DescribeAddressesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<PublicIpInstanceIdPair>> describeAddressesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindPublicIpsToIndexedFormParams.class) String... publicIps);
}

View File

@ -1,361 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Map;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindBlockDeviceMappingToIndexedFormParams;
import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams;
import org.jclouds.ec2.binders.IfNotNullBindAvailabilityZoneToFormParam;
import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.InstanceStateChange;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.domain.Volume.InstanceInitiatedShutdownBehavior;
import org.jclouds.ec2.functions.ConvertUnencodedBytesToBase64EncodedString;
import org.jclouds.ec2.options.RunInstancesOptions;
import org.jclouds.ec2.xml.BlockDeviceMappingHandler;
import org.jclouds.ec2.xml.BooleanValueHandler;
import org.jclouds.ec2.xml.DescribeInstancesResponseHandler;
import org.jclouds.ec2.xml.GetConsoleOutputResponseHandler;
import org.jclouds.ec2.xml.InstanceInitiatedShutdownBehaviorHandler;
import org.jclouds.ec2.xml.InstanceStateChangeHandler;
import org.jclouds.ec2.xml.InstanceTypeHandler;
import org.jclouds.ec2.xml.RunInstancesResponseHandler;
import org.jclouds.ec2.xml.StringValueHandler;
import org.jclouds.ec2.xml.UnencodeStringValueHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.ParamParser;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Instance Services via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface InstanceAsyncClient {
/**
* @see InstanceClient#describeInstancesInRegion
*/
@Named("DescribeInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeInstances")
@XMLResponseParser(DescribeInstancesResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<? extends Reservation<? extends RunningInstance>>> describeInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* @see InstanceClient#runInstancesInRegion
*/
@Named("RunInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RunInstances")
@XMLResponseParser(RunInstancesResponseHandler.class)
ListenableFuture<? extends Reservation<? extends RunningInstance>> runInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@Nullable @BinderParam(IfNotNullBindAvailabilityZoneToFormParam.class) String nullableAvailabilityZone,
@FormParam("ImageId") String imageId, @FormParam("MinCount") int minCount,
@FormParam("MaxCount") int maxCount, RunInstancesOptions... options);
/**
* @see InstanceClient#rebootInstancesInRegion
*/
@Named("RebootInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RebootInstances")
ListenableFuture<Void> rebootInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* @see InstanceClient#terminateInstancesInRegion
*/
@Named("TerminateInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "TerminateInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<? extends InstanceStateChange>> terminateInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* @see InstanceClient#stopInstancesInRegion
*/
@Named("StopInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "StopInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
ListenableFuture<Set<? extends InstanceStateChange>> stopInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("Force") boolean force,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* @see InstanceClient#startInstancesInRegion
*/
@Named("StartInstances")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "StartInstances")
@XMLResponseParser(InstanceStateChangeHandler.class)
ListenableFuture<Set<? extends InstanceStateChange>> startInstancesInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
/**
* @see AMIClient#getUserDataForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "userData" })
@XMLResponseParser(UnencodeStringValueHandler.class)
ListenableFuture<String> getUserDataForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#getRootDeviceNameForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "rootDeviceName" })
@XMLResponseParser(StringValueHandler.class)
ListenableFuture<String> getRootDeviceNameForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#getRamdiskForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "ramdisk" })
@XMLResponseParser(StringValueHandler.class)
ListenableFuture<String> getRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#getKernelForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "kernel" })
@XMLResponseParser(StringValueHandler.class)
ListenableFuture<String> getKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#isApiTerminationDisabledForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "disableApiTermination" })
@XMLResponseParser(BooleanValueHandler.class)
ListenableFuture<Boolean> isApiTerminationDisabledForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#getInstanceTypeForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "instanceType" })
@XMLResponseParser(InstanceTypeHandler.class)
ListenableFuture<String> getInstanceTypeForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#getInstanceInitiatedShutdownBehaviorForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute",
"instanceInitiatedShutdownBehavior" })
@XMLResponseParser(InstanceInitiatedShutdownBehaviorHandler.class)
ListenableFuture<InstanceInitiatedShutdownBehavior> getInstanceInitiatedShutdownBehaviorForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see InstanceClient#getBlockDeviceMappingForInstanceInRegion
*/
@Named("DescribeInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeInstanceAttribute", "blockDeviceMapping" })
@XMLResponseParser(BlockDeviceMappingHandler.class)
ListenableFuture<? extends Map<String, BlockDevice>> getBlockDeviceMappingForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#resetRamdiskForInstanceInRegion
*/
@Named("ResetInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetInstanceAttribute", "ramdisk" })
ListenableFuture<Void> resetRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#resetKernelForInstanceInRegion
*/
@Named("ResetInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ResetInstanceAttribute", "kernel" })
ListenableFuture<Void> resetKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
/**
* @see AMIClient#setUserDataForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "userData" })
ListenableFuture<Void> setUserDataForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@FormParam("Value") @ParamParser(ConvertUnencodedBytesToBase64EncodedString.class) byte[] unencodedData);
/**
* @see AMIClient#setRamdiskForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "ramdisk" })
ListenableFuture<Void> setRamdiskForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String ramdisk);
/**
* @see AMIClient#setKernelForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "kernel" })
ListenableFuture<Void> setKernelForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String kernel);
/**
* @see AMIClient#setApiTerminationDisabledForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "disableApiTermination" })
ListenableFuture<Void> setApiTerminationDisabledForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") boolean apiTerminationDisabled);
/**
* @see AMIClient#setInstanceTypeForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute", "instanceType" })
ListenableFuture<Void> setInstanceTypeForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Value") String instanceType);
/**
* @see AMIClient#setInstanceInitiatedShutdownBehaviorForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION, "Attribute" }, values = { "ModifyInstanceAttribute",
"instanceInitiatedShutdownBehavior" })
ListenableFuture<Void> setInstanceInitiatedShutdownBehaviorForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@FormParam("Value") InstanceInitiatedShutdownBehavior instanceInitiatedShutdownBehavior);
/**
* @see InstanceClient#setBlockDeviceMappingForInstanceInRegion
*/
@Named("ModifyInstanceAttribute")
@POST
@Path("/")
@FormParams(keys = { ACTION }, values = { "ModifyInstanceAttribute" })
ListenableFuture<Void> setBlockDeviceMappingForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId,
@BinderParam(BindBlockDeviceMappingToIndexedFormParams.class) Map<String, BlockDevice> blockDeviceMapping);
/**
* @see InstanceClient#getConsoleOutputForInstanceInRegion(String, String)
*/
@Named("GetConsoleOutput")
@POST
@Path("/")
@FormParams(keys = { ACTION }, values = { "GetConsoleOutput" })
@XMLResponseParser(GetConsoleOutputResponseHandler.class)
ListenableFuture<String> getConsoleOutputForInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
}

View File

@ -1,87 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import java.util.Set;
import org.jclouds.ec2.domain.KeyPair;
import org.jclouds.javax.annotation.Nullable;
/**
* Provides access to EC2 via their REST API.
* <p/>
*
* @author Adrian Cole
*/
public interface KeyPairClient {
/**
* Creates a new 2048-bit RSA key pair with the specified name. The public key is stored by
* Amazon EC2 and the private key is displayed on the console. The private key is returned as an
* unencrypted PEM encoded PKCS#8 private key. If a key with the specified name already exists,
* Amazon EC2 returns an error.
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyName
* A unique name for the key pair.
*
* @see #runInstances
* @see #describeKeyPairs
* @see #deleteKeyPair
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateKeyPair.html"
* />
*/
KeyPair createKeyPairInRegion(@Nullable String region, String keyName);
/**
* Returns information about key pairs available to you. If you specify key pairs, information
* about those key pairs is returned. Otherwise, information for all registered key pairs is
* returned.
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyPairNames
* Key pairs to describe.
*
* @see #runInstances
* @see #describeAvailabilityZones
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeKeyPairs.html"
* />
*/
Set<KeyPair> describeKeyPairsInRegion(@Nullable String region, String... keyPairNames);
/**
* Deletes the specified key pair, by removing the public key from Amazon EC2. You must own the
* key pair
*
* @param region
* Key pairs (to connect to instances) are Region-specific.
* @param keyName
* Name of the key pair to delete
*
* @see #describeKeyPairs
* @see #createKeyPair
*
* @see <a href=
* "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteKeyPair.html"
* />
*/
void deleteKeyPairInRegion(@Nullable String region, String keyName);
}

View File

@ -1,145 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindGroupNamesToIndexedFormParams;
import org.jclouds.ec2.binders.BindUserIdGroupPairToSourceSecurityGroupFormParams;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.net.domain.IpProtocol;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface SecurityGroupAsyncClient {
/**
* @see SecurityGroupClient#createSecurityGroupInRegion
*/
@Named("CreateSecurityGroup")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CreateSecurityGroup")
ListenableFuture<Void> createSecurityGroupInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String name, @FormParam("GroupDescription") String description);
/**
* @see SecurityGroupClient#deleteSecurityGroupInRegion
*/
@Named("DeleteSecurityGroup")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DeleteSecurityGroup")
@Fallback(VoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteSecurityGroupInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
/**
* @see SecurityGroupClient#describeSecurityGroupsInRegion
*/
@Named("DescribeSecurityGroups")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeSecurityGroups")
@XMLResponseParser(DescribeSecurityGroupsResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<SecurityGroup>> describeSecurityGroupsInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindGroupNamesToIndexedFormParams.class) String... securityGroupNames);
/**
* @see SecurityGroupClient#authorizeSecurityGroupIngressInRegion(@ org.jclouds.javax.annotation.Nullable Region,
* String,UserIdGroupPair)
*/
@Named("AuthorizeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName,
@BinderParam(BindUserIdGroupPairToSourceSecurityGroupFormParams.class) UserIdGroupPair sourceSecurityGroup);
/**
* @see SecurityGroupClient#authorizeSecurityGroupIngressInRegion(@ org.jclouds.javax.annotation.Nullable Region,
* String,IpProtocol,int,int,String)
*/
@Named("AuthorizeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName, @FormParam("IpProtocol") IpProtocol ipProtocol,
@FormParam("FromPort") int fromPort, @FormParam("ToPort") int toPort, @FormParam("CidrIp") String cidrIp);
/**
* @see SecurityGroupClient#revokeSecurityGroupIngressInRegion(@Nullable Region,
* String,UserIdGroupPair)
*/
@Named("RevokeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName,
@BinderParam(BindUserIdGroupPairToSourceSecurityGroupFormParams.class) UserIdGroupPair sourceSecurityGroup);
/**
* @see SecurityGroupClient#revokeSecurityGroupIngressInRegion(@ org.jclouds.javax.annotation.Nullable Region,
* String,IpProtocol,int,int,String)
*/
@Named("RevokeSecurityGroupIngress")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("GroupName") String groupName, @FormParam("IpProtocol") IpProtocol ipProtocol,
@FormParam("FromPort") int fromPort, @FormParam("ToPort") int toPort, @FormParam("CidrIp") String cidrIp);
}

View File

@ -1,112 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import static org.jclouds.aws.reference.FormParameters.ACTION;
import java.util.Set;
import javax.inject.Named;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.aws.filters.FormSigner;
import org.jclouds.ec2.binders.BindBundleIdsToIndexedFormParams;
import org.jclouds.ec2.binders.BindS3UploadPolicyAndSignature;
import org.jclouds.ec2.domain.BundleTask;
import org.jclouds.ec2.domain.PasswordData;
import org.jclouds.ec2.options.BundleInstanceS3StorageOptions;
import org.jclouds.ec2.xml.BundleTaskHandler;
import org.jclouds.ec2.xml.DescribeBundleTasksResponseHandler;
import org.jclouds.ec2.xml.GetPasswordDataResponseHandler;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.FormParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.VirtualHost;
import org.jclouds.rest.annotations.XMLResponseParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides access to EC2 Windows via their REST API.
* <p/>
*
* @author Adrian Cole
*/
@RequestFilters(FormSigner.class)
@VirtualHost
public interface WindowsAsyncClient {
/**
* @see WindowsClient#bundleInstanceInRegion
*/
@Named("BundleInstance")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "BundleInstance")
@XMLResponseParser(BundleTaskHandler.class)
ListenableFuture<BundleTask> bundleInstanceInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId, @FormParam("Storage.S3.Prefix") String prefix,
@FormParam("Storage.S3.Bucket") String bucket,
@BinderParam(BindS3UploadPolicyAndSignature.class) String uploadPolicy,
BundleInstanceS3StorageOptions... options);
/**
* @see WindowsClient#cancelBundleTaskInRegion
*/
@Named("CancelBundleTask")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "CancelBundleTask")
@XMLResponseParser(BundleTaskHandler.class)
ListenableFuture<BundleTask> cancelBundleTaskInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("BundleId") String bundleId);
/**
* @see BundleTaskClient#describeBundleTasksInRegion
*/
@Named("DescribeBundleTasks")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "DescribeBundleTasks")
@XMLResponseParser(DescribeBundleTasksResponseHandler.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<? extends Set<BundleTask>> describeBundleTasksInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@BinderParam(BindBundleIdsToIndexedFormParams.class) String... bundleTaskIds);
/**
* @see WindowsClient#getPasswordDataInRegion
*/
@Named("GetPasswordData")
@POST
@Path("/")
@FormParams(keys = ACTION, values = "GetPasswordData")
@XMLResponseParser(GetPasswordDataResponseHandler.class)
ListenableFuture<PasswordData> getPasswordDataInRegion(
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
@FormParam("InstanceId") String instanceId);
}

View File

@ -1,116 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
import java.util.Set;
import org.jclouds.ec2.domain.BundleTask;
import org.jclouds.ec2.domain.PasswordData;
import org.jclouds.ec2.options.BundleInstanceS3StorageOptions;
import org.jclouds.javax.annotation.Nullable;
/**
* Provides windows services for EC2. For more information, refer to the Amazon
* EC2 Developer Guide.
* <p/>
*
* @author Adrian Cole
*/
public interface WindowsClient {
/**
* Bundles the Windows instance. This procedure is not applicable for Linux
* and UNIX instances. For more information, go to the Amazon Elastic Compute
* Cloud Developer Guide or Amazon Elastic Compute Cloud Getting Started
* Guide.
*
* @param region
* Bundles are tied to the Region where its files are located
* within Amazon S3.
*
* @param instanceId
* The ID of the instance to bundle.
* @param prefix
* Specifies the beginning of the file name of the AMI.
* @param bucket
* The bucket in which to store the AMI. You can specify a bucket
* that you already own or a new bucket that Amazon EC2 creates on
* your behalf. If you specify a bucket that belongs to someone
* else, Amazon EC2 returns an error.
* @param uploadPolicy
* An Amazon S3 upload policy that gives Amazon EC2 permission to
* upload items into Amazon S3 on the user's behalf.
* <p/>
* ex.
*
* <pre>
* {"expiration": "2008-08-30T08:49:09Z","conditions": ["bucket": "my-bucket"},["starts-with", "$key", "my-new-image"]]}
* </pre>
*
* @param options
* if the bucket isn't owned by you, use this to set the bucket's
* accesskeyid
* @return status of the work
*
* @see #cancelBundleTaskInRegion
* @see #describeBundleTasksInRegion
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-BundleInstance.html"
* />
*/
BundleTask bundleInstanceInRegion(@Nullable String region, String instanceId, String prefix, String bucket,
String uploadPolicy, BundleInstanceS3StorageOptions... options);
/**
* Cancels an Amazon EC2 bundling operation.
*
* @param region
* The bundleTask ID is tied to the Region.
* @param bundleId
* The ID of the bundle task to cancel.
* @return task for the cancel.
*
* @see #bundleInstanceInRegion
* @see #describeBundleTasksInRegion
*
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CancelBundleTask.html"
* />
*/
BundleTask cancelBundleTaskInRegion(@Nullable String region, String bundleId);
/**
*
* Describes current bundling tasks.
*
* @param region
* The bundleTask ID is tied to the Region.
*
* @see #cancelBundleTaskInRegion
* @see #bundleInstanceInRegion
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeBundleTasks.html"
* />
*/
Set<BundleTask> describeBundleTasksInRegion(@Nullable String region, String... bundleTaskIds);
/**
*
* Retrieves the encrypted administrator password for the instances running Windows.
*
* @param region The region where the instance is based
* @param instanceId The ID of the instance to query
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-GetPasswordData.html" />
*/
PasswordData getPasswordDataInRegion(@Nullable String region, String instanceId);
}

View File

@ -23,9 +23,9 @@ import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.AvailabilityZoneInfo;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.http.HttpResponseException;
import org.jclouds.location.Region;
import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
@ -45,12 +45,12 @@ public class DescribeAvailabilityZonesInRegion implements RegionIdToZoneIdsSuppl
@Resource
protected Logger logger = Logger.NULL;
private final AvailabilityZoneAndRegionClient client;
private final AvailabilityZoneAndRegionApi client;
private final Supplier<Set<String>> regions;
@Inject
public DescribeAvailabilityZonesInRegion(EC2Client client, @Region Supplier<Set<String>> regions) {
this.client = client.getAvailabilityZoneAndRegionServices();
public DescribeAvailabilityZonesInRegion(EC2Api client, @Region Supplier<Set<String>> regions) {
this.client = client.getAvailabilityZoneAndRegionApi().get();
this.regions = regions;
}

View File

@ -22,8 +22,8 @@ import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.location.Region;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.util.Suppliers2;
@ -33,11 +33,11 @@ import com.google.common.collect.Maps;
@Singleton
public class DescribeRegionsForRegionURIs implements RegionIdToURISupplier {
private final AvailabilityZoneAndRegionClient client;
private final AvailabilityZoneAndRegionApi client;
@Inject
public DescribeRegionsForRegionURIs(EC2Client client) {
this.client = client.getAvailabilityZoneAndRegionServices();
public DescribeRegionsForRegionURIs(EC2Api client) {
this.client = client.getAvailabilityZoneAndRegionApi().get();
}
@Singleton

View File

@ -74,13 +74,13 @@ import com.google.inject.Injector;
*
* @author Adrian Cole
*/
@Test(groups = "live", enabled = false, singleThreaded = true, testName = "CloudApplicationArchitecturesEC2ClientLiveTest")
public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeServiceContextLiveTest {
public CloudApplicationArchitecturesEC2ClientLiveTest() {
@Test(groups = "live", enabled = false, singleThreaded = true, testName = "CloudApplicationArchitecturesEC2ApiLiveTest")
public class CloudApplicationArchitecturesEC2ApiLiveTest extends BaseComputeServiceContextLiveTest {
public CloudApplicationArchitecturesEC2ApiLiveTest() {
provider = "ec2";
}
private EC2Client client;
private EC2Api client;
protected SshClient.Factory sshFactory;
private String instancePrefix = System.getProperty("user.name") + ".ec2";
private KeyPair keyPair;
@ -96,7 +96,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
public void setupContext() {
super.setupContext();
Injector injector = view.utils().injector();
client = injector.getInstance(EC2Client.class);
client = injector.getInstance(EC2Api.class);
sshFactory = injector.getInstance(SshClient.Factory.class);
runningTester = retry(new InstanceStateRunning(client), 180, 5,SECONDS);
hasIpTester = retry(new InstanceHasIpAddress(client), 180, 5, SECONDS);
@ -109,13 +109,13 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
securityGroupName = instancePrefix + "ingress";
try {
client.getSecurityGroupServices().deleteSecurityGroupInRegion(null, securityGroupName);
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(null, securityGroupName);
} catch (Exception e) {
}
client.getSecurityGroupServices().createSecurityGroupInRegion(null, securityGroupName, securityGroupName);
client.getSecurityGroupApi().get().createSecurityGroupInRegion(null, securityGroupName, securityGroupName);
for (int port : new int[] { 80, 443, 22 }) {
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(null, securityGroupName,
client.getSecurityGroupApi().get().authorizeSecurityGroupIngressInRegion(null, securityGroupName,
IpProtocol.TCP, port, port, "0.0.0.0/0");
}
}
@ -124,13 +124,13 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
void testCreateKeyPair() throws InterruptedException, ExecutionException, TimeoutException {
String keyName = instancePrefix + "1";
try {
client.getKeyPairServices().deleteKeyPairInRegion(null, keyName);
client.getKeyPairApi().get().deleteKeyPairInRegion(null, keyName);
} catch (Exception e) {
}
client.getKeyPairServices().deleteKeyPairInRegion(null, keyName);
client.getKeyPairApi().get().deleteKeyPairInRegion(null, keyName);
keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName);
keyPair = client.getKeyPairApi().get().createKeyPairInRegion(null, keyName);
assertNotNull(keyPair);
assertNotNull(keyPair.getKeyMaterial());
assertNotNull(keyPair.getSha1OfPrivateKey());
@ -149,7 +149,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
try {
System.out.printf("%d: running instance%n", System.currentTimeMillis());
Reservation<? extends RunningInstance> reservation = client.getInstanceServices().runInstancesInRegion(
Reservation<? extends RunningInstance> reservation = client.getInstanceApi().get().runInstancesInRegion(
null, null, // allow
// ec2
// to
@ -192,31 +192,31 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
}
private void verifyInstanceProperties(String script) {
assertEquals(script, client.getInstanceServices().getUserDataForInstanceInRegion(null, instanceId));
assertEquals(script, client.getInstanceApi().get().getUserDataForInstanceInRegion(null, instanceId));
assertEquals(null, client.getInstanceServices().getRootDeviceNameForInstanceInRegion(null, instanceId));
assertEquals(null, client.getInstanceApi().get().getRootDeviceNameForInstanceInRegion(null, instanceId));
assert client.getInstanceServices().getRamdiskForInstanceInRegion(null, instanceId).startsWith("ari-");
assert client.getInstanceApi().get().getRamdiskForInstanceInRegion(null, instanceId).startsWith("ari-");
assertEquals(false, client.getInstanceServices().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
assertEquals(false, client.getInstanceApi().get().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
assert client.getInstanceServices().getKernelForInstanceInRegion(null, instanceId).startsWith("aki-");
assert client.getInstanceApi().get().getKernelForInstanceInRegion(null, instanceId).startsWith("aki-");
assertEquals(InstanceType.M1_SMALL,
client.getInstanceServices().getInstanceTypeForInstanceInRegion(null, instanceId));
client.getInstanceApi().get().getInstanceTypeForInstanceInRegion(null, instanceId));
assertEquals(InstanceInitiatedShutdownBehavior.TERMINATE, client.getInstanceServices()
assertEquals(InstanceInitiatedShutdownBehavior.TERMINATE, client.getInstanceApi().get()
.getInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, instanceId));
assertEquals(ImmutableMap.<String, EbsBlockDevice> of(), client.getInstanceServices()
assertEquals(ImmutableMap.<String, EbsBlockDevice> of(), client.getInstanceApi().get()
.getBlockDeviceMappingForInstanceInRegion(null, instanceId));
}
private void setApiTerminationDisabledForInstanceInRegion() {
client.getInstanceServices().setApiTerminationDisabledForInstanceInRegion(null, instanceId, true);
assertEquals(true, client.getInstanceServices().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
client.getInstanceServices().setApiTerminationDisabledForInstanceInRegion(null, instanceId, false);
assertEquals(false, client.getInstanceServices().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
client.getInstanceApi().get().setApiTerminationDisabledForInstanceInRegion(null, instanceId, true);
assertEquals(true, client.getInstanceApi().get().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
client.getInstanceApi().get().setApiTerminationDisabledForInstanceInRegion(null, instanceId, false);
assertEquals(false, client.getInstanceApi().get().isApiTerminationDisabledForInstanceInRegion(null, instanceId));
}
private void tryToChangeStuff() {
@ -231,7 +231,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setUserDataForInstanceInRegion() {
try {
client.getInstanceServices().setUserDataForInstanceInRegion(null, instanceId, "test".getBytes());
client.getInstanceApi().get().setUserDataForInstanceInRegion(null, instanceId, "test".getBytes());
fail("shouldn't be allowed, as instance needs to be stopped");
} catch (AWSResponseException e) {
assertEquals("IncorrectInstanceState", e.getError().getCode());
@ -240,8 +240,8 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setRamdiskForInstanceInRegion() {
try {
String ramdisk = client.getInstanceServices().getRamdiskForInstanceInRegion(null, instanceId);
client.getInstanceServices().setRamdiskForInstanceInRegion(null, instanceId, ramdisk);
String ramdisk = client.getInstanceApi().get().getRamdiskForInstanceInRegion(null, instanceId);
client.getInstanceApi().get().setRamdiskForInstanceInRegion(null, instanceId, ramdisk);
fail("shouldn't be allowed, as instance needs to be stopped");
} catch (AWSResponseException e) {
assertEquals("IncorrectInstanceState", e.getError().getCode());
@ -250,8 +250,8 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setKernelForInstanceInRegion() {
try {
String oldKernel = client.getInstanceServices().getKernelForInstanceInRegion(null, instanceId);
client.getInstanceServices().setKernelForInstanceInRegion(null, instanceId, oldKernel);
String oldKernel = client.getInstanceApi().get().getKernelForInstanceInRegion(null, instanceId);
client.getInstanceApi().get().setKernelForInstanceInRegion(null, instanceId, oldKernel);
fail("shouldn't be allowed, as instance needs to be stopped");
} catch (AWSResponseException e) {
assertEquals("IncorrectInstanceState", e.getError().getCode());
@ -260,7 +260,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setInstanceTypeForInstanceInRegion() {
try {
client.getInstanceServices().setInstanceTypeForInstanceInRegion(null, instanceId, InstanceType.C1_MEDIUM);
client.getInstanceApi().get().setInstanceTypeForInstanceInRegion(null, instanceId, InstanceType.C1_MEDIUM);
fail("shouldn't be allowed, as instance needs to be stopped");
} catch (AWSResponseException e) {
assertEquals("IncorrectInstanceState", e.getError().getCode());
@ -270,7 +270,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setBlockDeviceMappingForInstanceInRegion() {
Map<String, BlockDevice> mapping = Maps.newLinkedHashMap();
try {
client.getInstanceServices().setBlockDeviceMappingForInstanceInRegion(null, instanceId, mapping);
client.getInstanceApi().get().setBlockDeviceMappingForInstanceInRegion(null, instanceId, mapping);
fail("shouldn't be allowed, as instance needs to be ebs based-ami");
} catch (AWSResponseException e) {
assertEquals("InvalidParameterCombination", e.getError().getCode());
@ -279,7 +279,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private void setInstanceInitiatedShutdownBehaviorForInstanceInRegion() {
try {
client.getInstanceServices().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, instanceId,
client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, instanceId,
InstanceInitiatedShutdownBehavior.STOP);
fail("shouldn't be allowed, as instance needs to be ebs based-ami");
} catch (AWSResponseException e) {
@ -291,7 +291,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
void testReboot() throws InterruptedException, ExecutionException, TimeoutException, IOException {
RunningInstance instance = getInstance(instanceId);
System.out.printf("%d: %s rebooting instance %n", System.currentTimeMillis(), instanceId);
client.getInstanceServices().rebootInstancesInRegion(null, instanceId);
client.getInstanceApi().get().rebootInstancesInRegion(null, instanceId);
Thread.sleep(1000);
instance = getInstance(instanceId);
blockUntilWeCanSshIntoInstance(instance);
@ -309,23 +309,23 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
@Test(enabled = false, dependsOnMethods = "testReboot")
void testElasticIpAddress() throws InterruptedException, ExecutionException, TimeoutException, IOException {
address = client.getElasticIPAddressServices().allocateAddressInRegion(null);
address = client.getElasticIPAddressApi().get().allocateAddressInRegion(null);
assertNotNull(address);
PublicIpInstanceIdPair compare = Iterables.getLast(client.getElasticIPAddressServices()
PublicIpInstanceIdPair compare = Iterables.getLast(client.getElasticIPAddressApi().get()
.describeAddressesInRegion(null, address));
assertEquals(compare.getPublicIp(), address);
assert compare.getInstanceId() == null;
client.getElasticIPAddressServices().associateAddressInRegion(null, address, instanceId);
client.getElasticIPAddressApi().get().associateAddressInRegion(null, address, instanceId);
compare = Iterables.getLast(client.getElasticIPAddressServices().describeAddressesInRegion(null, address));
compare = Iterables.getLast(client.getElasticIPAddressApi().get().describeAddressesInRegion(null, address));
assertEquals(compare.getPublicIp(), address);
assertEquals(compare.getInstanceId(), instanceId);
Reservation<? extends RunningInstance> reservation = Iterables.getOnlyElement(client.getInstanceServices()
Reservation<? extends RunningInstance> reservation = Iterables.getOnlyElement(client.getInstanceApi().get()
.describeInstancesInRegion(null, instanceId));
assertNotNull(Iterables.getOnlyElement(reservation).getIpAddress());
@ -333,14 +333,14 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
doCheckKey(address);
client.getElasticIPAddressServices().disassociateAddressInRegion(null, address);
client.getElasticIPAddressApi().get().disassociateAddressInRegion(null, address);
compare = Iterables.getLast(client.getElasticIPAddressServices().describeAddressesInRegion(null, address));
compare = Iterables.getLast(client.getElasticIPAddressApi().get().describeAddressesInRegion(null, address));
assertEquals(compare.getPublicIp(), address);
assert compare.getInstanceId() == null;
reservation = Iterables.getOnlyElement(client.getInstanceServices().describeInstancesInRegion(null, instanceId));
reservation = Iterables.getOnlyElement(client.getInstanceApi().get().describeInstancesInRegion(null, instanceId));
// assert reservation.getRunningInstances().last().getIpAddress() == null;
// TODO
}
@ -370,7 +370,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
private RunningInstance getInstance(String instanceId) {
// search my identity for the instance I just created
Set<? extends Reservation<? extends RunningInstance>> reservations = client.getInstanceServices()
Set<? extends Reservation<? extends RunningInstance>> reservations = client.getInstanceApi().get()
.describeInstancesInRegion(null, instanceId); // last parameter
// (ids) narrows the
// search
@ -415,13 +415,13 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest extends BaseComputeS
@AfterTest
void cleanup() throws InterruptedException, ExecutionException, TimeoutException {
if (address != null)
client.getElasticIPAddressServices().releaseAddressInRegion(null, address);
client.getElasticIPAddressApi().get().releaseAddressInRegion(null, address);
if (instanceId != null)
client.getInstanceServices().terminateInstancesInRegion(null, instanceId);
client.getInstanceApi().get().terminateInstancesInRegion(null, instanceId);
if (keyPair != null)
client.getKeyPairServices().deleteKeyPairInRegion(null, keyPair.getKeyName());
client.getKeyPairApi().get().deleteKeyPairInRegion(null, keyPair.getKeyName());
if (securityGroupName != null)
client.getSecurityGroupServices().deleteSecurityGroupInRegion(null, securityGroupName);
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(null, securityGroupName);
}
}

View File

@ -85,9 +85,9 @@ import com.google.inject.Injector;
*
* @author Adrian Cole
*/
@Test(groups = "live", enabled = false, singleThreaded = true, testName = "EBSBootEC2ClientLiveTest")
public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest {
public EBSBootEC2ClientLiveTest() {
@Test(groups = "live", enabled = false, singleThreaded = true, testName = "EBSBootEC2ApiLiveTest")
public class EBSBootEC2ApiLiveTest extends BaseComputeServiceContextLiveTest {
public EBSBootEC2ApiLiveTest() {
provider = "ec2";
}
@ -99,7 +99,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
private static final String SCRIPT_END = "----COMPLETE----";
private static final String INSTANCE_PREFIX = System.getProperty("user.name") + ".ec2ebs";
private EC2Client client;
private EC2Api client;
private SshClient.Factory sshFactory;
private KeyPair keyPair;
@ -125,7 +125,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
public void setupContext() {
super.setupContext();
Injector injector = view.utils().injector();
client = injector.getInstance(EC2Client.class);
client = injector.getInstance(EC2Api.class);
sshFactory = injector.getInstance(SshClient.Factory.class);
SocketOpen socketOpen = injector.getInstance(SocketOpen.class);
socketTester = retry(socketOpen, 120, 1, SECONDS);
@ -155,16 +155,16 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
securityGroupName = INSTANCE_PREFIX + "ingress";
try {
client.getSecurityGroupServices().deleteSecurityGroupInRegion(null, securityGroupName);
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(null, securityGroupName);
} catch (Exception e) {
}
client.getSecurityGroupServices().createSecurityGroupInRegion(null, securityGroupName, securityGroupName);
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
client.getSecurityGroupApi().get().createSecurityGroupInRegion(null, securityGroupName, securityGroupName);
client.getSecurityGroupApi().get().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
80, 80, "0.0.0.0/0");
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
client.getSecurityGroupApi().get().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
443, 443, "0.0.0.0/0");
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
client.getSecurityGroupApi().get().authorizeSecurityGroupIngressInRegion(null, securityGroupName, IpProtocol.TCP,
22, 22, "0.0.0.0/0");
}
@ -172,12 +172,12 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
void testCreateKeyPair() {
String keyName = INSTANCE_PREFIX + "1";
try {
client.getKeyPairServices().deleteKeyPairInRegion(null, keyName);
client.getKeyPairApi().get().deleteKeyPairInRegion(null, keyName);
} catch (Exception e) {
}
keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName);
keyPair = client.getKeyPairApi().get().createKeyPairInRegion(null, keyName);
assertNotNull(keyPair);
assertNotNull(keyPair.getKeyMaterial());
assertNotNull(keyPair.getSha1OfPrivateKey());
@ -194,7 +194,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
while (instance == null) {
try {
System.out.printf("%d: running instance%n", System.currentTimeMillis());
Reservation<? extends RunningInstance> reservation = client.getInstanceServices().runInstancesInRegion(
Reservation<? extends RunningInstance> reservation = client.getInstanceApi().get().runInstancesInRegion(
null, null, // allow
// ec2
// to
@ -225,13 +225,13 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
@Test(enabled = false, dependsOnMethods = "testCreateRunningInstance")
void testCreateAndAttachVolume() {
volume = client.getElasticBlockStoreServices().createVolumeInAvailabilityZone(instance.getAvailabilityZone(),
volume = client.getElasticBlockStoreApi().get().createVolumeInAvailabilityZone(instance.getAvailabilityZone(),
VOLUME_SIZE);
System.out.printf("%d: %s awaiting volume to become available%n", System.currentTimeMillis(), volume.getId());
assert volumeTester.apply(volume);
Attachment attachment = client.getElasticBlockStoreServices().attachVolumeInRegion(instance.getRegion(),
Attachment attachment = client.getElasticBlockStoreApi().get().attachVolumeInRegion(instance.getRegion(),
volume.getId(), instance.getId(), "/dev/sdh");
System.out.printf("%d: %s awaiting attachment to complete%n", System.currentTimeMillis(), attachment.getId());
@ -334,42 +334,42 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
@Test(enabled = false, dependsOnMethods = "testBundleInstance")
void testAMIFromBundle() {
volume = Iterables.getOnlyElement(client.getElasticBlockStoreServices().describeVolumesInRegion(
volume = Iterables.getOnlyElement(client.getElasticBlockStoreApi().get().describeVolumesInRegion(
volume.getRegion(), volume.getId()));
if (volume.getAttachments().size() > 0) {
// should be cleanly unmounted, so force is not necessary.
client.getElasticBlockStoreServices().detachVolumeInRegion(instance.getRegion(), volume.getId(), false);
client.getElasticBlockStoreApi().get().detachVolumeInRegion(instance.getRegion(), volume.getId(), false);
System.out.printf("%d: %s awaiting detachment to complete%n", System.currentTimeMillis(), volume.getId());
assert volumeTester.apply(volume);
} else {
attachment = null; // protect test closer so that it doesn't try to
// detach
}
snapshot = client.getElasticBlockStoreServices().createSnapshotInRegion(volume.getRegion(), volume.getId(),
snapshot = client.getElasticBlockStoreApi().get().createSnapshotInRegion(volume.getRegion(), volume.getId(),
withDescription("EBS Ubuntu Hardy"));
System.out.printf("%d: %s awaiting snapshot to complete%n", System.currentTimeMillis(), snapshot.getId());
assert snapshotTester.apply(snapshot);
Image image = Iterables.getOnlyElement(client.getAMIServices().describeImagesInRegion(snapshot.getRegion(),
Image image = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(),
imageIds(IMAGE_ID)));
String description = image.getDescription() == null ? "jclouds" : image.getDescription();
System.out.printf("%d: %s creating ami from snapshot%n", System.currentTimeMillis(), snapshot.getId());
String amiId = client.getAMIServices().registerUnixImageBackedByEbsInRegion(
String amiId = client.getAMIApi().get().registerUnixImageBackedByEbsInRegion(
snapshot.getRegion(),
"ebsboot-" + image.getId(),
snapshot.getId(),
withKernelId(image.getKernelId()).withRamdisk(image.getRamdiskId()).withDescription(description)
.asArchitecture(Architecture.I386));
try {
ebsImage = Iterables.getOnlyElement(client.getAMIServices().describeImagesInRegion(snapshot.getRegion(),
ebsImage = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(),
imageIds(amiId)));
} catch (AWSResponseException e) {
// TODO add a retry handler for this HTTP code 400 and the below error
if (e.getError().getClass().equals("InvalidAMIID.NotFound"))
ebsImage = Iterables.getOnlyElement(client.getAMIServices().describeImagesInRegion(snapshot.getRegion(),
ebsImage = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(),
imageIds(amiId)));
else
throw e;
@ -383,13 +383,13 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
ebsInstance = createInstance(ebsImage.getId());
client.getInstanceServices().stopInstancesInRegion(ebsInstance.getRegion(), true, ebsInstance.getId());
client.getInstanceApi().get().stopInstancesInRegion(ebsInstance.getRegion(), true, ebsInstance.getId());
System.out.printf("%d: %s awaiting instance to stop %n", System.currentTimeMillis(), ebsInstance.getId());
stoppedTester.apply(ebsInstance);
tryToChangeStuff();
System.out.printf("%d: %s awaiting instance to start %n", System.currentTimeMillis(), ebsInstance.getId());
client.getInstanceServices().startInstancesInRegion(ebsInstance.getRegion(), ebsInstance.getId());
client.getInstanceApi().get().startInstancesInRegion(ebsInstance.getRegion(), ebsInstance.getId());
ebsInstance = blockUntilWeCanSshIntoInstance(ebsInstance);
}
@ -411,30 +411,30 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
}
private void setUserDataForInstanceInRegion() {
client.getInstanceServices().setUserDataForInstanceInRegion(null, ebsInstance.getId(), "test".getBytes());
assertEquals("test", client.getInstanceServices().getUserDataForInstanceInRegion(null, ebsInstance.getId()));
client.getInstanceApi().get().setUserDataForInstanceInRegion(null, ebsInstance.getId(), "test".getBytes());
assertEquals("test", client.getInstanceApi().get().getUserDataForInstanceInRegion(null, ebsInstance.getId()));
}
private void setRamdiskForInstanceInRegion() {
String ramdisk = client.getInstanceServices().getRamdiskForInstanceInRegion(null, ebsInstance.getId());
client.getInstanceServices().setRamdiskForInstanceInRegion(null, ebsInstance.getId(), ramdisk);
assertEquals(ramdisk, client.getInstanceServices().getRamdiskForInstanceInRegion(null, ebsInstance.getId()));
String ramdisk = client.getInstanceApi().get().getRamdiskForInstanceInRegion(null, ebsInstance.getId());
client.getInstanceApi().get().setRamdiskForInstanceInRegion(null, ebsInstance.getId(), ramdisk);
assertEquals(ramdisk, client.getInstanceApi().get().getRamdiskForInstanceInRegion(null, ebsInstance.getId()));
}
private void setKernelForInstanceInRegion() {
String oldKernel = client.getInstanceServices().getKernelForInstanceInRegion(null, ebsInstance.getId());
client.getInstanceServices().setKernelForInstanceInRegion(null, ebsInstance.getId(), oldKernel);
assertEquals(oldKernel, client.getInstanceServices().getKernelForInstanceInRegion(null, ebsInstance.getId()));
String oldKernel = client.getInstanceApi().get().getKernelForInstanceInRegion(null, ebsInstance.getId());
client.getInstanceApi().get().setKernelForInstanceInRegion(null, ebsInstance.getId(), oldKernel);
assertEquals(oldKernel, client.getInstanceApi().get().getKernelForInstanceInRegion(null, ebsInstance.getId()));
}
private void setInstanceTypeForInstanceInRegion() {
client.getInstanceServices()
client.getInstanceApi().get()
.setInstanceTypeForInstanceInRegion(null, ebsInstance.getId(), InstanceType.C1_MEDIUM);
assertEquals(InstanceType.C1_MEDIUM,
client.getInstanceServices().getInstanceTypeForInstanceInRegion(null, ebsInstance.getId()));
client.getInstanceServices().setInstanceTypeForInstanceInRegion(null, ebsInstance.getId(), InstanceType.M1_SMALL);
client.getInstanceApi().get().getInstanceTypeForInstanceInRegion(null, ebsInstance.getId()));
client.getInstanceApi().get().setInstanceTypeForInstanceInRegion(null, ebsInstance.getId(), InstanceType.M1_SMALL);
assertEquals(InstanceType.M1_SMALL,
client.getInstanceServices().getInstanceTypeForInstanceInRegion(null, ebsInstance.getId()));
client.getInstanceApi().get().getInstanceTypeForInstanceInRegion(null, ebsInstance.getId()));
}
private void setBlockDeviceMappingForInstanceInRegion() {
@ -443,9 +443,9 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
Map<String, BlockDevice> mapping = Maps.newLinkedHashMap();
mapping.put("/dev/sda1", new BlockDevice(volumeId, false));
try {
client.getInstanceServices().setBlockDeviceMappingForInstanceInRegion(null, ebsInstance.getId(), mapping);
client.getInstanceApi().get().setBlockDeviceMappingForInstanceInRegion(null, ebsInstance.getId(), mapping);
Map<String, BlockDevice> devices = client.getInstanceServices().getBlockDeviceMappingForInstanceInRegion(null,
Map<String, BlockDevice> devices = client.getInstanceApi().get().getBlockDeviceMappingForInstanceInRegion(null,
ebsInstance.getId());
assertEquals(devices.size(), 1);
String deviceName = Iterables.getOnlyElement(devices.keySet());
@ -466,15 +466,15 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
private void setInstanceInitiatedShutdownBehaviorForInstanceInRegion() {
try {
client.getInstanceServices().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null,
client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null,
ebsInstance.getId(), InstanceInitiatedShutdownBehavior.STOP);
assertEquals(InstanceInitiatedShutdownBehavior.STOP, client.getInstanceServices()
assertEquals(InstanceInitiatedShutdownBehavior.STOP, client.getInstanceApi().get()
.getInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId()));
client.getInstanceServices().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null,
client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null,
ebsInstance.getId(), InstanceInitiatedShutdownBehavior.TERMINATE);
assertEquals(InstanceInitiatedShutdownBehavior.TERMINATE, client.getInstanceServices()
assertEquals(InstanceInitiatedShutdownBehavior.TERMINATE, client.getInstanceApi().get()
.getInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId()));
System.out.println("OK: setInstanceInitiatedShutdownBehaviorForInstanceInRegion");
} catch (Exception e) {
@ -522,7 +522,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
assert runningTester.apply(instance);
// search my identity for the instance I just created
Set<? extends Reservation<? extends RunningInstance>> reservations = client.getInstanceServices()
Set<? extends Reservation<? extends RunningInstance>> reservations = client.getInstanceApi().get()
.describeInstancesInRegion(instance.getRegion(), instance.getId()); // last
// parameter
// (ids)
@ -544,7 +544,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
void cleanup() {
if (ebsInstance != null) {
try {
client.getInstanceServices().terminateInstancesInRegion(ebsInstance.getRegion(), ebsInstance.getId());
client.getInstanceApi().get().terminateInstancesInRegion(ebsInstance.getRegion(), ebsInstance.getId());
terminatedTester.apply(ebsInstance);
} catch (Exception e) {
e.printStackTrace();
@ -552,7 +552,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
}
if (ebsImage != null) {
try {
client.getAMIServices().deregisterImageInRegion(ebsImage.getRegion(), ebsImage.getId());
client.getAMIApi().get().deregisterImageInRegion(ebsImage.getRegion(), ebsImage.getId());
} catch (Exception e) {
e.printStackTrace();
}
@ -560,14 +560,14 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
if (snapshot != null) {
try {
client.getElasticBlockStoreServices().deleteSnapshotInRegion(snapshot.getRegion(), snapshot.getId());
client.getElasticBlockStoreApi().get().deleteSnapshotInRegion(snapshot.getRegion(), snapshot.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
if (attachment != null) {
try {
client.getElasticBlockStoreServices().detachVolumeInRegion(volume.getRegion(), volume.getId(), true);
client.getElasticBlockStoreApi().get().detachVolumeInRegion(volume.getRegion(), volume.getId(), true);
assert volumeTester.apply(volume);
} catch (Exception e) {
e.printStackTrace();
@ -575,7 +575,7 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
}
if (instance != null) {
try {
client.getInstanceServices().terminateInstancesInRegion(instance.getRegion(), instance.getId());
client.getInstanceApi().get().terminateInstancesInRegion(instance.getRegion(), instance.getId());
terminatedTester.apply(instance);
} catch (Exception e) {
e.printStackTrace();
@ -583,21 +583,21 @@ public class EBSBootEC2ClientLiveTest extends BaseComputeServiceContextLiveTest
}
if (volume != null) {
try {
client.getElasticBlockStoreServices().deleteVolumeInRegion(volume.getRegion(), volume.getId());
client.getElasticBlockStoreApi().get().deleteVolumeInRegion(volume.getRegion(), volume.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
if (keyPair != null) {
try {
client.getKeyPairServices().deleteKeyPairInRegion(keyPair.getRegion(), keyPair.getKeyName());
client.getKeyPairApi().get().deleteKeyPairInRegion(keyPair.getRegion(), keyPair.getKeyName());
} catch (Exception e) {
e.printStackTrace();
}
}
if (securityGroupName != null) {
try {
client.getSecurityGroupServices().deleteSecurityGroupInRegion(null, securityGroupName);
client.getSecurityGroupApi().get().deleteSecurityGroupInRegion(null, securityGroupName);
} catch (Exception e) {
e.printStackTrace();
}

View File

@ -1,75 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.jclouds.ec2.services.BaseEC2AsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* Tests behavior of {@code EC2AsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "EC2AsyncClientTest")
public class EC2AsyncClientTest extends BaseEC2AsyncClientTest<EC2AsyncClient> {
private EC2AsyncClient asyncClient;
private EC2Client syncClient;
public void testSync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException {
assert syncClient.getAMIServices() != null;
assert syncClient.getAvailabilityZoneAndRegionServices() != null;
assert syncClient.getElasticBlockStoreServices() != null;
assert syncClient.getElasticIPAddressServices() != null;
assert syncClient.getInstanceServices() != null;
assert syncClient.getKeyPairServices() != null;
assert syncClient.getSecurityGroupServices() != null;
assert syncClient.getWindowsServices() != null;
}
public void testAsync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException {
assert asyncClient.getAMIServices() != null;
assert asyncClient.getAvailabilityZoneAndRegionServices() != null;
assert asyncClient.getElasticBlockStoreServices() != null;
assert asyncClient.getElasticIPAddressServices() != null;
assert asyncClient.getInstanceServices() != null;
assert asyncClient.getKeyPairServices() != null;
assert asyncClient.getSecurityGroupServices() != null;
assert asyncClient.getWindowsServices() != null;
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {
super.setupFactory();
asyncClient = injector.getInstance(EC2AsyncClient.class);
syncClient = injector.getInstance(EC2Client.class);
}
@Override
protected void checkFilters(HttpRequest request) {
}
}

View File

@ -20,8 +20,8 @@ import static org.testng.Assert.assertEquals;
import java.io.IOException;
import org.jclouds.ec2.services.BaseEC2AsyncClientTest;
import org.jclouds.ec2.services.InstanceAsyncClient;
import org.jclouds.ec2.features.BaseEC2ApiTest;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.http.HttpRequest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@ -33,7 +33,7 @@ import org.testng.annotations.Test;
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "BindS3UploadPolicyAndSignatureTest")
public class BindS3UploadPolicyAndSignatureTest extends BaseEC2AsyncClientTest<InstanceAsyncClient> {
public class BindS3UploadPolicyAndSignatureTest extends BaseEC2ApiTest<InstanceApi> {
private BindS3UploadPolicyAndSignature binder;
@BeforeClass

View File

@ -36,7 +36,7 @@ import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.options.EC2TemplateOptions;
import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.KeyPair;
@ -46,10 +46,10 @@ import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.Snapshot;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.reference.EC2Constants;
import org.jclouds.ec2.services.ElasticBlockStoreClient;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.services.KeyPairClient;
import org.jclouds.ec2.services.SecurityGroupClient;
import org.jclouds.ec2.features.ElasticBlockStoreApi;
import org.jclouds.ec2.features.InstanceApi;
import org.jclouds.ec2.features.KeyPairApi;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.net.domain.IpProtocol;
import org.jclouds.scriptbuilder.domain.Statements;
import org.jclouds.sshj.config.SshjSshClientModule;
@ -85,7 +85,7 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
@Override
protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
if (view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi().getTagApi().isPresent()) {
if (view.unwrapApi(EC2Api.class).getTagApi().isPresent()) {
super.checkUserMetadataContains(node, userMetadata);
} else {
assertTrue(node.getUserMetadata().isEmpty(), "not expecting metadata when tag extension isn't present" + node);
@ -103,14 +103,14 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
@Test(enabled = true, dependsOnMethods = "testCompareSizes")
public void testExtendedOptionsAndLogin() throws Exception {
SecurityGroupClient securityGroupClient = EC2Client.class.cast(view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi())
.getSecurityGroupServices();
SecurityGroupApi securityGroupClient = view.unwrapApi(EC2Api.class)
.getSecurityGroupApi().get();
KeyPairClient keyPairClient = EC2Client.class.cast(view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi())
.getKeyPairServices();
KeyPairApi keyPairClient = view.unwrapApi(EC2Api.class)
.getKeyPairApi().get();
InstanceClient instanceClient = EC2Client.class.cast(view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi())
.getInstanceServices();
InstanceApi instanceClient = view.unwrapApi(EC2Api.class)
.getInstanceApi().get();
String group = this.group + "o";
@ -203,9 +203,9 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
assertTrue(socketTester.apply(socket), String.format("failed to open socket %s on node %s", socket, node));
// check that there is an elastic ip correlating to it
EC2Client ec2 = EC2Client.class.cast(context.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi());
EC2Api ec2 = context.unwrapApi(EC2Api.class);
Set<PublicIpInstanceIdPair> ipidpairs =
ec2.getElasticIPAddressServices().describeAddressesInRegion(region, publicIps.toArray(new String[0]));
ec2.getElasticIPAddressApi().get().describeAddressesInRegion(region, publicIps.toArray(new String[0]));
assertEquals(ipidpairs.size(), 1, String.format("there should only be one address pair (%s)",
Iterables.toString(ipidpairs)));
@ -218,7 +218,7 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
// check that the ip is deallocated
Set<PublicIpInstanceIdPair> ipidcheck =
ec2.getElasticIPAddressServices().describeAddressesInRegion(region, ipidpair.getPublicIp());
ec2.getElasticIPAddressApi().get().describeAddressesInRegion(region, ipidpair.getPublicIp());
assertTrue(Iterables.isEmpty(ipidcheck), String.format("there should be no address pairs (%s)",
Iterables.toString(ipidcheck)));
} finally {
@ -246,11 +246,11 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
throw new SkipException("Test cannot run without the parameter test." + provider
+ ".ebs-template; this property should be in the format defined in TemplateBuilderSpec");
}
InstanceClient instanceClient = EC2Client.class.cast(view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi())
.getInstanceServices();
InstanceApi instanceClient = view.unwrapApi(EC2Api.class)
.getInstanceApi().get();
ElasticBlockStoreClient ebsClient = EC2Client.class.cast(view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi())
.getElasticBlockStoreServices();
ElasticBlockStoreApi ebsClient = view.unwrapApi(EC2Api.class)
.getElasticBlockStoreApi().get();
String group = this.group + "e";
int volumeSize = 8;
@ -317,14 +317,14 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
*
* @throws NoSuchElementException If no instance with that id exists, or the instance is in a different region
*/
public static RunningInstance getInstance(InstanceClient instanceClient, String id) {
public static RunningInstance getInstance(InstanceApi instanceClient, String id) {
RunningInstance instance = Iterables.getOnlyElement(Iterables.getOnlyElement(instanceClient
.describeInstancesInRegion(null, id)));
return instance;
}
protected static void cleanupExtendedStuffInRegion(String region, SecurityGroupClient securityGroupClient,
KeyPairClient keyPairClient, String group) throws InterruptedException {
protected static void cleanupExtendedStuffInRegion(String region, SecurityGroupApi securityGroupClient,
KeyPairApi keyPairClient, String group) throws InterruptedException {
try {
for (SecurityGroup secgroup : securityGroupClient.describeSecurityGroupsInRegion(region))
if (secgroup.getName().startsWith("jclouds#" + group) || secgroup.getName().equals(group)) {

View File

@ -31,8 +31,8 @@ import org.jclouds.compute.internal.BaseTemplateBuilderLiveTest;
import org.jclouds.ec2.options.DescribeAvailabilityZonesOptions;
import org.jclouds.ec2.options.DescribeImagesOptions;
import org.jclouds.ec2.options.DescribeRegionsOptions;
import org.jclouds.ec2.services.AMIAsyncClient;
import org.jclouds.ec2.services.AvailabilityZoneAndRegionAsyncClient;
import org.jclouds.ec2.features.AMIApi;
import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.internal.TrackingJavaUrlHttpCommandExecutorService;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
@ -67,8 +67,8 @@ public abstract class EC2TemplateBuilderLiveTest extends BaseTemplateBuilderLive
Collection<HttpCommand> filteredCommandsInvoked = Collections2.filter(commandsInvoked, new Predicate<HttpCommand>() {
private final Collection<Method> ignored = ImmutableSet.of(
AvailabilityZoneAndRegionAsyncClient.class.getMethod("describeRegions", DescribeRegionsOptions[].class),
AvailabilityZoneAndRegionAsyncClient.class.getMethod("describeAvailabilityZonesInRegion", String.class, DescribeAvailabilityZonesOptions[].class));
AvailabilityZoneAndRegionApi.class.getMethod("describeRegions", DescribeRegionsOptions[].class),
AvailabilityZoneAndRegionApi.class.getMethod("describeAvailabilityZonesInRegion", String.class, DescribeAvailabilityZonesOptions[].class));
@Override
public boolean apply(HttpCommand input) {
return !ignored.contains(getInvokerOfRequest(input));
@ -76,7 +76,7 @@ public abstract class EC2TemplateBuilderLiveTest extends BaseTemplateBuilderLive
});
assert filteredCommandsInvoked.size() == 1 : commandsInvoked;
assertEquals(getInvokerOfRequestAtIndex(filteredCommandsInvoked, 0), AMIAsyncClient.class
assertEquals(getInvokerOfRequestAtIndex(filteredCommandsInvoked, 0), AMIApi.class
.getMethod("describeImagesInRegion", String.class, DescribeImagesOptions[].class));
assertDescribeImagesOptionsEquals((DescribeImagesOptions[])getArgsForRequestAtIndex(filteredCommandsInvoked, 0).get(1),
defaultImageProviderId);

View File

@ -25,11 +25,12 @@ import static org.testng.Assert.assertEquals;
import java.net.UnknownHostException;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.KeyPair;
import org.jclouds.ec2.services.KeyPairClient;
import org.jclouds.ec2.features.KeyPairApi;
import org.testng.annotations.Test;
import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.inject.AbstractModule;
@ -45,11 +46,11 @@ public class CreateUniqueKeyPairTest {
@Test
public void testApply() throws UnknownHostException {
final EC2Client client = createMock(EC2Client.class);
KeyPairClient keyClient = createMock(KeyPairClient.class);
final EC2Api client = createMock(EC2Api.class);
KeyPairApi keyClient = createMock(KeyPairApi.class);
KeyPair pair = createMock(KeyPair.class);
expect(client.getKeyPairServices()).andReturn(keyClient).atLeastOnce();
expect(client.getKeyPairApi()).andReturn((Optional) Optional.of(keyClient)).atLeastOnce();
expect(keyClient.createKeyPairInRegion("region", "jclouds#group#1")).andReturn(pair);
@ -63,7 +64,7 @@ public class CreateUniqueKeyPairTest {
Names.bindProperties(binder(),new EC2ApiMetadata().getDefaultProperties());
bind(new TypeLiteral<Supplier<String>>() {
}).toInstance(Suppliers.ofInstance("1"));
bind(EC2Client.class).toInstance(client);
bind(EC2Api.class).toInstance(client);
}
}).getInstance(CreateUniqueKeyPair.class);
@ -77,13 +78,13 @@ public class CreateUniqueKeyPairTest {
@SuppressWarnings( { "unchecked" })
@Test
public void testApplyWithIllegalStateException() throws UnknownHostException {
final EC2Client client = createMock(EC2Client.class);
KeyPairClient keyClient = createMock(KeyPairClient.class);
final EC2Api client = createMock(EC2Api.class);
KeyPairApi keyClient = createMock(KeyPairApi.class);
final Supplier<String> uniqueIdSupplier = createMock(Supplier.class);
KeyPair pair = createMock(KeyPair.class);
expect(client.getKeyPairServices()).andReturn(keyClient).atLeastOnce();
expect(client.getKeyPairApi()).andReturn((Optional) Optional.of(keyClient)).atLeastOnce();
expect(uniqueIdSupplier.get()).andReturn("1");
expect(keyClient.createKeyPairInRegion("region", "jclouds#group#1")).andThrow(new IllegalStateException());
@ -101,7 +102,7 @@ public class CreateUniqueKeyPairTest {
Names.bindProperties(binder(),new EC2ApiMetadata().getDefaultProperties());
bind(new TypeLiteral<Supplier<String>>() {
}).toInstance(uniqueIdSupplier);
bind(EC2Client.class).toInstance(client);
bind(EC2Api.class).toInstance(client);
}
}).getInstance(CreateUniqueKeyPair.class);

View File

@ -24,13 +24,14 @@ import static org.testng.Assert.assertEquals;
import java.util.Set;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.features.InstanceApi;
import org.testng.annotations.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
/**
@ -45,10 +46,10 @@ public class PresentInstancesTest {
@Test
public void testWhenInstancesPresentSingleCall() {
EC2Client client = createMock(EC2Client.class);
InstanceClient instanceClient = createMock(InstanceClient.class);
EC2Api client = createMock(EC2Api.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
expect(client.getInstanceServices()).andReturn(instanceClient);
expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient));
// avoid imatcher fail. if you change this, be sure to check multiple jres
expect(instanceClient.describeInstancesInRegion("us-east-1", "i-aaaa", "i-bbbb")).andReturn(

View File

@ -19,14 +19,14 @@ package org.jclouds.ec2.compute.internal;
import java.util.Properties;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.ec2.internal.BaseEC2ClientExpectTest;
import org.jclouds.ec2.internal.BaseEC2ApiExpectTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import com.google.common.base.Function;
import com.google.inject.Module;
public abstract class BaseEC2ComputeServiceContextExpectTest<T> extends BaseEC2ClientExpectTest<T> implements
public abstract class BaseEC2ComputeServiceContextExpectTest<T> extends BaseEC2ApiExpectTest<T> implements
Function<ComputeServiceContext, T> {
@Override

View File

@ -31,7 +31,7 @@ import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
import org.jclouds.ec2.domain.SecurityGroup;
import org.jclouds.ec2.domain.UserIdGroupPair;
import org.jclouds.ec2.services.SecurityGroupClient;
import org.jclouds.ec2.features.SecurityGroupApi;
import org.jclouds.net.domain.IpProtocol;
import org.testng.annotations.Test;
@ -49,7 +49,7 @@ public class CreateSecurityGroupIfNeededTest {
@Test
public void testWhenPort22AndToItselfAuthorizesIngressTwice() throws ExecutionException {
SecurityGroupClient client = createMock(SecurityGroupClient.class);
SecurityGroupApi client = createMock(SecurityGroupApi.class);
Predicate<RegionAndName> tester = Predicates.alwaysTrue();
SecurityGroup group = createNiceMock(SecurityGroup.class);
@ -76,7 +76,7 @@ public class CreateSecurityGroupIfNeededTest {
@Test
public void testIllegalStateExceptionCreatingGroupJustReturns() throws ExecutionException {
SecurityGroupClient client = createMock(SecurityGroupClient.class);
SecurityGroupApi client = createMock(SecurityGroupApi.class);
Predicate<RegionAndName> tester = Predicates.alwaysTrue();
client.createSecurityGroupInRegion("region", "group", "group");
@ -95,7 +95,7 @@ public class CreateSecurityGroupIfNeededTest {
@Test(expectedExceptions = RuntimeException.class)
public void testWhenEventualConsistencyExpiresIllegalStateException() throws ExecutionException {
SecurityGroupClient client = createMock(SecurityGroupClient.class);
SecurityGroupApi client = createMock(SecurityGroupApi.class);
Predicate<RegionAndName> tester = Predicates.alwaysFalse();
client.createSecurityGroupInRegion("region", "group", "group");

View File

@ -22,12 +22,13 @@ import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
import org.jclouds.ec2.services.ElasticIPAddressClient;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.testng.annotations.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
/**
@ -38,10 +39,10 @@ public class LoadPublicIpForInstanceOrNullTest {
@Test
public void testReturnsPublicIpOnMatch() throws Exception {
EC2Client client = createMock(EC2Client.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
EC2Api client = createMock(EC2Api.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
expect(client.getElasticIPAddressServices()).andReturn(ipClient).atLeastOnce();
expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
expect(ipClient.describeAddressesInRegion("region")).andReturn(
ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah")))
.atLeastOnce();
@ -59,10 +60,10 @@ public class LoadPublicIpForInstanceOrNullTest {
@Test
public void testReturnsNullWhenNotFound() throws Exception {
EC2Client client = createMock(EC2Client.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
EC2Api client = createMock(EC2Api.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
expect(client.getElasticIPAddressServices()).andReturn(ipClient).atLeastOnce();
expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
expect(ipClient.describeAddressesInRegion("region")).andReturn(ImmutableSet.<PublicIpInstanceIdPair> of())
.atLeastOnce();
@ -81,10 +82,10 @@ public class LoadPublicIpForInstanceOrNullTest {
@Test
public void testReturnsNullWhenNotAssigned() throws Exception {
EC2Client client = createMock(EC2Client.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
EC2Api client = createMock(EC2Api.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
expect(client.getElasticIPAddressServices()).andReturn(ipClient).atLeastOnce();
expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
expect(ipClient.describeAddressesInRegion("region")).andReturn(
ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", null)))

View File

@ -29,13 +29,14 @@ import java.util.Set;
import java.util.concurrent.ExecutionException;
import org.jclouds.compute.domain.Image;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.functions.EC2ImageParser;
import org.jclouds.ec2.services.AMIClient;
import org.jclouds.ec2.features.AMIApi;
import org.jclouds.rest.ResourceNotFoundException;
import org.testng.annotations.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
/**
@ -49,14 +50,14 @@ public class RegionAndIdToImageTest {
public void testApply() throws ExecutionException {
EC2ImageParser parser = createMock(EC2ImageParser.class);
EC2Client caller = createMock(EC2Client.class);
AMIClient client = createMock(AMIClient.class);
EC2Api caller = createMock(EC2Api.class);
AMIApi client = createMock(AMIApi.class);
org.jclouds.ec2.domain.Image ec2Image = createMock(org.jclouds.ec2.domain.Image.class);
Image image = createNiceMock(Image.class);
Set<? extends org.jclouds.ec2.domain.Image> images = ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
expect(caller.getAMIServices()).andReturn(client).atLeastOnce();
expect(caller.getAMIApi()).andReturn((Optional) Optional.of(client)).atLeastOnce();
expect(client.describeImagesInRegion("region", imageIds("ami"))).andReturn(Set.class.cast(images));
expect(parser.apply(ec2Image)).andReturn(image);
@ -81,14 +82,14 @@ public class RegionAndIdToImageTest {
public void testApplyNotFoundMakesExecutionException() throws ExecutionException {
EC2ImageParser parser = createMock(EC2ImageParser.class);
EC2Client caller = createMock(EC2Client.class);
AMIClient client = createMock(AMIClient.class);
EC2Api caller = createMock(EC2Api.class);
AMIApi client = createMock(AMIApi.class);
org.jclouds.ec2.domain.Image ec2Image = createMock(org.jclouds.ec2.domain.Image.class);
Image image = createNiceMock(Image.class);
Set<? extends org.jclouds.ec2.domain.Image> images = ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
expect(caller.getAMIServices()).andReturn(client).atLeastOnce();
expect(caller.getAMIApi()).andReturn((Optional) Optional.of(client)).atLeastOnce();
expect(client.describeImagesInRegion("region", imageIds("ami"))).andReturn(Set.class.cast(images));
expect(parser.apply(ec2Image)).andThrow(new ResourceNotFoundException());
@ -113,14 +114,14 @@ public class RegionAndIdToImageTest {
public void testApplyNoSuchElementExceptionMakesExecutionException() throws ExecutionException {
EC2ImageParser parser = createMock(EC2ImageParser.class);
EC2Client caller = createMock(EC2Client.class);
AMIClient client = createMock(AMIClient.class);
EC2Api caller = createMock(EC2Api.class);
AMIApi client = createMock(AMIApi.class);
org.jclouds.ec2.domain.Image ec2Image = createMock(org.jclouds.ec2.domain.Image.class);
Image image = createNiceMock(Image.class);
Set<? extends org.jclouds.ec2.domain.Image> images = ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
expect(caller.getAMIServices()).andReturn(client).atLeastOnce();
expect(caller.getAMIApi()).andReturn((Optional) Optional.of(client)).atLeastOnce();
expect(client.describeImagesInRegion("region", imageIds("ami"))).andReturn(Set.class.cast(images));
expect(parser.apply(ec2Image)).andThrow(new NoSuchElementException());

View File

@ -42,7 +42,7 @@ import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.functions.PresentInstances;
import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata;
@ -50,8 +50,8 @@ import org.jclouds.ec2.compute.options.EC2TemplateOptions;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.jclouds.ec2.options.RunInstancesOptions;
import org.jclouds.ec2.services.ElasticIPAddressClient;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.jclouds.ec2.features.InstanceApi;
import org.testng.Assert;
import org.testng.annotations.Test;
@ -80,8 +80,8 @@ public class EC2CreateNodesInGroupThenAddToSetTest {
// setup mocks
EC2CreateNodesInGroupThenAddToSet strategy = setupStrategy(nodeMetadata);
InputParams input = new InputParams(location);
InstanceClient instanceClient = createMock(InstanceClient.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
RunInstancesOptions ec2Options = createMock(RunInstancesOptions.class);
RunningInstance instance = createMock(RunningInstance.class);
Reservation<? extends RunningInstance> reservation = new Reservation<RunningInstance>(region,
@ -93,11 +93,11 @@ public class EC2CreateNodesInGroupThenAddToSetTest {
// setup expectations
expect(input.template.clone()).andReturn(input.template);
expect(strategy.client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(strategy.client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(
strategy.createKeyPairAndSecurityGroupsAsNeededAndReturncustomize
.execute(region, input.tag, input.template)).andReturn(ec2Options);
expect(strategy.client.getElasticIPAddressServices()).andReturn(ipClient).atLeastOnce();
expect(strategy.client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
expect(input.template.getLocation()).andReturn(input.location).atLeastOnce();
expect(input.template.getImage()).andReturn(input.image).atLeastOnce();
@ -191,7 +191,7 @@ public class EC2CreateNodesInGroupThenAddToSetTest {
// setup mocks
EC2CreateNodesInGroupThenAddToSet strategy = setupStrategy(nodeMetadata);
InputParams input = new InputParams(location);
InstanceClient instanceClient = createMock(InstanceClient.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
RunInstancesOptions ec2Options = createMock(RunInstancesOptions.class);
RunningInstance instance = createMock(RunningInstance.class);
Reservation<? extends RunningInstance> reservation = new Reservation<RunningInstance>(region,
@ -200,7 +200,7 @@ public class EC2CreateNodesInGroupThenAddToSetTest {
// setup expectations
expect(input.template.clone()).andReturn(input.template);
expect(strategy.client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(strategy.client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(
strategy.createKeyPairAndSecurityGroupsAsNeededAndReturncustomize
.execute(region, input.tag, input.template)).andReturn(ec2Options);
@ -307,7 +307,7 @@ public class EC2CreateNodesInGroupThenAddToSetTest {
@SuppressWarnings("unchecked")
private EC2CreateNodesInGroupThenAddToSet setupStrategy(final NodeMetadata node) {
EC2Client client = createMock(EC2Client.class);
EC2Api client = createMock(EC2Api.class);
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize = createMock(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class);
PresentInstances presentInstances = createMock(PresentInstances.class);
RunningInstanceToNodeMetadata runningInstanceToNodeMetadata = createMock(RunningInstanceToNodeMetadata.class);

View File

@ -26,12 +26,13 @@ import java.util.concurrent.ExecutionException;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.services.ElasticIPAddressClient;
import org.jclouds.ec2.services.InstanceClient;
import org.jclouds.ec2.features.ElasticIPAddressApi;
import org.jclouds.ec2.features.InstanceApi;
import org.testng.annotations.Test;
import com.google.common.base.Optional;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
@ -44,14 +45,14 @@ public class EC2DestroyNodeStrategyTest {
@SuppressWarnings("unchecked")
@Test
public void testDestroyNodeTerminatesInstanceAndReturnsRefreshedNode() throws Exception {
EC2Client client = createMock(EC2Client.class);
InstanceClient instanceClient = createMock(InstanceClient.class);
EC2Api client = createMock(EC2Api.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
GetNodeMetadataStrategy getNode = createMock(GetNodeMetadataStrategy.class);
LoadingCache<RegionAndName, String> elasticIpCache = createMock(LoadingCache.class);
NodeMetadata node = createMock(NodeMetadata.class);
expect(client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(instanceClient.terminateInstancesInRegion("region", "i-blah")).andReturn(null);
expect(getNode.getNode("region/i-blah")).andReturn(node);
@ -74,23 +75,23 @@ public class EC2DestroyNodeStrategyTest {
@Test
public void testDestroyNodeDisassociatesAndReleasesIpThenTerminatesInstanceAndReturnsRefreshedNode()
throws Exception {
EC2Client client = createMock(EC2Client.class);
EC2Api client = createMock(EC2Api.class);
GetNodeMetadataStrategy getNode = createMock(GetNodeMetadataStrategy.class);
LoadingCache<RegionAndName, String> elasticIpCache = createMock(LoadingCache.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
InstanceClient instanceClient = createMock(InstanceClient.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
NodeMetadata node = createMock(NodeMetadata.class);
expect(elasticIpCache.get(new RegionAndName("region", "i-blah"))).andReturn("1.1.1.1");
expect(client.getElasticIPAddressServices()).andReturn(ipClient).atLeastOnce();
expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
ipClient.disassociateAddressInRegion("region", "1.1.1.1");
ipClient.releaseAddressInRegion("region", "1.1.1.1");
elasticIpCache.invalidate(new RegionAndName("region", "i-blah"));
expect(client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(instanceClient.terminateInstancesInRegion("region", "i-blah")).andReturn(null);
expect(getNode.getNode("region/i-blah")).andReturn(node);
@ -117,17 +118,17 @@ public class EC2DestroyNodeStrategyTest {
@Test
public void testDestroyNodeSafeOnCacheMissThenTerminatesInstanceAndReturnsRefreshedNode()
throws Exception {
EC2Client client = createMock(EC2Client.class);
EC2Api client = createMock(EC2Api.class);
GetNodeMetadataStrategy getNode = createMock(GetNodeMetadataStrategy.class);
LoadingCache<RegionAndName, String> elasticIpCache = createMock(LoadingCache.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
InstanceClient instanceClient = createMock(InstanceClient.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
NodeMetadata node = createMock(NodeMetadata.class);
expect(elasticIpCache.get(new RegionAndName("region", "i-blah"))).andThrow(new CacheLoader.InvalidCacheLoadException(null));
expect(client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(instanceClient.terminateInstancesInRegion("region", "i-blah")).andReturn(null);
expect(getNode.getNode("region/i-blah")).andReturn(node);
@ -154,17 +155,17 @@ public class EC2DestroyNodeStrategyTest {
@Test
public void testDestroyNodeSafeOnCacheExecutionExceptionThenTerminatesInstanceAndReturnsRefreshedNode()
throws Exception {
EC2Client client = createMock(EC2Client.class);
EC2Api client = createMock(EC2Api.class);
GetNodeMetadataStrategy getNode = createMock(GetNodeMetadataStrategy.class);
LoadingCache<RegionAndName, String> elasticIpCache = createMock(LoadingCache.class);
ElasticIPAddressClient ipClient = createMock(ElasticIPAddressClient.class);
InstanceClient instanceClient = createMock(InstanceClient.class);
ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
InstanceApi instanceClient = createMock(InstanceApi.class);
NodeMetadata node = createMock(NodeMetadata.class);
expect(elasticIpCache.get(new RegionAndName("region", "i-blah"))).andThrow(new ExecutionException(null));
expect(client.getInstanceServices()).andReturn(instanceClient).atLeastOnce();
expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)).atLeastOnce();
expect(instanceClient.terminateInstancesInRegion("region", "i-blah")).andReturn(null);
expect(getNode.getNode("region/i-blah")).andReturn(node);

View File

@ -23,7 +23,7 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.jclouds.ec2.internal.BaseEC2ClientExpectTest;
import org.jclouds.ec2.internal.BaseEC2ApiExpectTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.location.Region;
@ -46,8 +46,8 @@ import com.google.inject.TypeLiteral;
/**
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "EC2RestClientModuleExpectTest")
public class EC2RestClientModuleExpectTest extends BaseEC2ClientExpectTest<Injector> {
@Test(groups = "unit", testName = "EC2HttpApiModuleExpectTest")
public class EC2HttpApiModuleExpectTest extends BaseEC2ApiExpectTest<Injector> {
private Injector injector;
@BeforeClass

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.concat;
@ -36,8 +36,8 @@ import org.jclouds.compute.RunNodesException;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilderSpec;
import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.Image;
import org.jclouds.ec2.domain.Image.ImageType;
@ -53,15 +53,15 @@ import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
/**
* Tests behavior of {@code AMIClient}
* Tests behavior of {@code AMIApi}
*
* @author Adrian Cole
*/
@Test(groups = "live", singleThreaded = true)
public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
public class AMIApiLiveTest extends BaseComputeServiceContextLiveTest {
private TemplateBuilderSpec ebsTemplate;
public AMIClientLiveTest() {
public AMIApiLiveTest() {
provider = "ec2";
}
@ -74,8 +74,8 @@ public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
return overrides;
}
protected EC2Client ec2Client;
protected AMIClient client;
protected EC2Api ec2Api;
protected AMIApi client;
protected Predicate<RunningInstance> runningTester;
@ -90,10 +90,10 @@ public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
@BeforeClass(groups = { "integration", "live" })
public void setupContext() {
super.setupContext();
ec2Client = view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
runningTester = retry(new InstanceStateRunning(ec2Client), 600, 5, SECONDS);
ec2Api = view.unwrapApi(EC2Api.class);
runningTester = retry(new InstanceStateRunning(ec2Api), 600, 5, SECONDS);
client = ec2Client.getAMIServices();
client = ec2Api.getAMIApi().get();
if (ebsTemplate != null) {
Template template = view.getComputeService().templateBuilder().from(ebsTemplate).build();
regionId = template.getLocation().getId();
@ -115,7 +115,7 @@ public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
}
public void testDescribeImages() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
Set<? extends Image> allResults = client.describeImagesInRegion(region);
assertNotNull(allResults);
assert allResults.size() >= 2 : allResults.size();
@ -164,23 +164,23 @@ public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
String instanceId = null;
try {
RunningInstance instance = getOnlyElement(concat(ec2Client.getInstanceServices().runInstancesInRegion(
RunningInstance instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().runInstancesInRegion(
regionId, null, imageId, 1, 1)));
instanceId = instance.getId();
assertTrue(runningTester.apply(instance), instanceId + "didn't achieve the state running!");
instance = getOnlyElement(concat(ec2Client.getInstanceServices().describeInstancesInRegion(regionId,
instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().describeInstancesInRegion(regionId,
instanceId)));
BlockDevice device = instance.getEbsBlockDevices().get("/dev/sda1");
assertNotNull(device, "device: /dev/sda1 not present on: " + instance);
Snapshot snapshot = ec2Client.getElasticBlockStoreServices().createSnapshotInRegion(regionId,
Snapshot snapshot = ec2Api.getElasticBlockStoreApi().get().createSnapshotInRegion(regionId,
device.getVolumeId());
snapshotsToDelete.add(snapshot.getId());
return snapshot;
} finally {
if (instanceId != null)
ec2Client.getInstanceServices().terminateInstancesInRegion(regionId, instanceId);
ec2Api.getInstanceApi().get().terminateInstancesInRegion(regionId, instanceId);
}
}
@ -195,7 +195,7 @@ public class AMIClientLiveTest extends BaseComputeServiceContextLiveTest {
for (String imageId : imagesToDeregister)
client.deregisterImageInRegion(regionId, imageId);
for (String snapshotId : snapshotsToDelete)
ec2Client.getElasticBlockStoreServices().deleteSnapshotInRegion(regionId, snapshotId);
ec2Api.getElasticBlockStoreApi().get().deleteSnapshotInRegion(regionId, snapshotId);
super.tearDownContext();
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.executableBy;
import static org.jclouds.reflect.Reflection2.method;
@ -40,13 +40,13 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.reflect.Invokable;
/**
* Tests behavior of {@code AMIAsyncClient}
* Tests behavior of {@code AMIApi}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "AMIAsyncClientTest")
public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
@Test(groups = "unit", testName = "AMIApiTest")
public class AMIApiTest extends BaseEC2ApiTest<AMIApi> {
HttpRequest createImage = HttpRequest.builder().method("POST")
.endpoint("https://ec2.us-east-1.amazonaws.com/")
@ -62,7 +62,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testCreateImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "createImageInRegion", String.class, String.class, String.class,
Invokable<?, ?> method = method(AMIApi.class, "createImageInRegion", String.class, String.class, String.class,
CreateImageOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "name", "instanceId"));
@ -95,7 +95,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testCreateImageOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "createImageInRegion", String.class, String.class, String.class,
Invokable<?, ?> method = method(AMIApi.class, "createImageInRegion", String.class, String.class, String.class,
CreateImageOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "name", "instanceId", new CreateImageOptions()
.withDescription("description").noReboot()));
@ -126,7 +126,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDescribeImages() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "describeImagesInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "describeImagesInRegion", String.class,
DescribeImagesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null));
@ -161,7 +161,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDescribeImagesOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "describeImagesInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "describeImagesInRegion", String.class,
DescribeImagesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, executableBy("me").ownedBy("fred", "nancy").imageIds(
"1", "2")));
@ -193,7 +193,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDeregisterImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "deregisterImageInRegion", String.class, String.class);
Invokable<?, ?> method = method(AMIApi.class, "deregisterImageInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageId"));
request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request);
@ -224,7 +224,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testRegisterImageFromManifest() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "registerImageFromManifestInRegion", String.class, String.class,
Invokable<?, ?> method = method(AMIApi.class, "registerImageFromManifestInRegion", String.class, String.class,
String.class, RegisterImageOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "name", "pathToManifest"));
@ -256,7 +256,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testRegisterImageFromManifestOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "registerImageFromManifestInRegion", String.class, String.class,
Invokable<?, ?> method = method(AMIApi.class, "registerImageFromManifestInRegion", String.class, String.class,
String.class, RegisterImageOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "name", "pathToManifest", new RegisterImageOptions()
.withDescription("description")));
@ -291,7 +291,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testRegisterImageBackedByEBS() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "registerUnixImageBackedByEbsInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "registerUnixImageBackedByEbsInRegion", String.class,
String.class, String.class, RegisterImageBackedByEbsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageName", "snapshotId"));
@ -332,7 +332,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testRegisterImageBackedByEBSOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "registerUnixImageBackedByEbsInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "registerUnixImageBackedByEbsInRegion", String.class,
String.class, String.class, RegisterImageBackedByEbsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageName", "snapshotId",
new RegisterImageBackedByEbsOptions().withDescription("description").addBlockDeviceFromSnapshot(
@ -366,7 +366,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testGetBlockDeviceMappingsForImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "getBlockDeviceMappingsForImageInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "getBlockDeviceMappingsForImageInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageId"));
@ -398,7 +398,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testGetLaunchPermissionForImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "getLaunchPermissionForImageInRegion", String.class, String.class);
Invokable<?, ?> method = method(AMIApi.class, "getLaunchPermissionForImageInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageId"));
request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request);
@ -433,7 +433,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testAddLaunchPermissionsToImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "addLaunchPermissionsToImageInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "addLaunchPermissionsToImageInRegion", String.class,
Iterable.class, Iterable.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList
.of("all"), "imageId"));
@ -470,7 +470,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testRemoveLaunchPermissionsFromImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "removeLaunchPermissionsFromImageInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "removeLaunchPermissionsFromImageInRegion", String.class,
Iterable.class, Iterable.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList
.of("all"), "imageId"));
@ -502,7 +502,7 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
.addFormParam("AWSAccessKeyId", "identity").build();
public void testResetLaunchPermissionsOnImage() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AMIAsyncClient.class, "resetLaunchPermissionsOnImageInRegion", String.class,
Invokable<?, ?> method = method(AMIApi.class, "resetLaunchPermissionsOnImageInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "imageId"));

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.ec2.options.DescribeAvailabilityZonesOptions.Builder.availabilityZones;
import static org.jclouds.ec2.options.DescribeRegionsOptions.Builder.regions;
@ -28,8 +28,8 @@ import java.util.Set;
import java.util.SortedMap;
import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.domain.AvailabilityZoneInfo;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@ -37,29 +37,29 @@ import org.testng.annotations.Test;
import com.google.common.collect.Maps;
/**
* Tests behavior of {@code AvailabilityZoneAndRegionClient}
* Tests behavior of {@code AvailabilityZoneAndRegionApi}
*
* @author Adrian Cole
*/
@Test(groups = "live", singleThreaded = true, testName = "AvailabilityZoneAndRegionClientLiveTest")
public class AvailabilityZoneAndRegionClientLiveTest extends BaseComputeServiceContextLiveTest {
public AvailabilityZoneAndRegionClientLiveTest() {
@Test(groups = "live", singleThreaded = true, testName = "AvailabilityZoneAndRegionApiLiveTest")
public class AvailabilityZoneAndRegionApiLiveTest extends BaseComputeServiceContextLiveTest {
public AvailabilityZoneAndRegionApiLiveTest() {
provider = "ec2";
}
private EC2Client ec2Client;
private AvailabilityZoneAndRegionClient client;
private EC2Api ec2Api;
private AvailabilityZoneAndRegionApi client;
@Override
@BeforeClass(groups = { "integration", "live" })
public void setupContext() {
super.setupContext();
ec2Client = view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
client = ec2Client.getAvailabilityZoneAndRegionServices();
ec2Api = view.unwrapApi(EC2Api.class);
client = ec2Api.getAvailabilityZoneAndRegionApi().get();
}
public void testDescribeAvailabilityZones() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
Set<AvailabilityZoneInfo> allResults = client.describeAvailabilityZonesInRegion(region);
assertNotNull(allResults);
assert allResults.size() >= 1 : allResults.size();

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.ec2.options.DescribeAvailabilityZonesOptions.Builder.availabilityZones;
import static org.jclouds.ec2.options.DescribeRegionsOptions.Builder.regions;
@ -35,17 +35,17 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.reflect.Invokable;
/**
* Tests behavior of {@code AvailabilityZoneAndRegionAsyncClient}
* Tests behavior of {@code AvailabilityZoneAndRegionApi}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "AvailabilityZoneAndRegionAsyncClientTest")
public class AvailabilityZoneAndRegionAsyncClientTest extends
BaseEC2AsyncClientTest<AvailabilityZoneAndRegionAsyncClient> {
@Test(groups = "unit", testName = "AvailabilityZoneAndRegionApiTest")
public class AvailabilityZoneAndRegionApiTest extends
BaseEC2ApiTest<AvailabilityZoneAndRegionApi> {
public void testDescribeAvailabilityZones() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AvailabilityZoneAndRegionAsyncClient.class, "describeAvailabilityZonesInRegion",
Invokable<?, ?> method = method(AvailabilityZoneAndRegionApi.class, "describeAvailabilityZonesInRegion",
String.class, DescribeAvailabilityZonesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of(Region.US_WEST_1));
@ -62,7 +62,7 @@ public class AvailabilityZoneAndRegionAsyncClientTest extends
}
public void testDescribeAvailabilityZonesOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AvailabilityZoneAndRegionAsyncClient.class, "describeAvailabilityZonesInRegion",
Invokable<?, ?> method = method(AvailabilityZoneAndRegionApi.class, "describeAvailabilityZonesInRegion",
String.class, DescribeAvailabilityZonesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("us-east-1", availabilityZones("us-east-1a", "us-east-1b")));
@ -80,7 +80,7 @@ public class AvailabilityZoneAndRegionAsyncClientTest extends
}
public void testDescribeRegions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AvailabilityZoneAndRegionAsyncClient.class, "describeRegions",
Invokable<?, ?> method = method(AvailabilityZoneAndRegionApi.class, "describeRegions",
DescribeRegionsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.of());
@ -97,7 +97,7 @@ public class AvailabilityZoneAndRegionAsyncClientTest extends
}
public void testDescribeRegionsOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(AvailabilityZoneAndRegionAsyncClient.class, "describeRegions",
Invokable<?, ?> method = method(AvailabilityZoneAndRegionApi.class, "describeRegions",
DescribeRegionsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of(regions(Region.US_EAST_1, Region.US_WEST_1)));

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static com.google.common.collect.Maps.transformValues;
import static org.testng.Assert.assertEquals;
@ -32,16 +32,15 @@ import org.jclouds.aws.filters.FormSigner;
import org.jclouds.compute.domain.Image;
import org.jclouds.date.DateService;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2AsyncClient;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.config.EC2RestClientModule;
import org.jclouds.ec2.config.BaseEC2HttpApiModule;
import org.jclouds.http.HttpRequest;
import org.jclouds.location.config.LocationModule;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.ConfiguresHttpApi;
import org.jclouds.rest.internal.BaseAsyncApiTest;
import org.jclouds.util.Suppliers2;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
@ -59,9 +58,13 @@ import com.google.inject.Provides;
* @author Adrian Cole
*/
@Test(groups = "unit")
public abstract class BaseEC2AsyncClientTest<T> extends BaseAsyncClientTest<T> {
@ConfiguresRestClient
protected static class StubEC2RestClientModule extends EC2RestClientModule<EC2Client, EC2AsyncClient> {
public abstract class BaseEC2ApiTest<T> extends BaseAsyncApiTest<T> {
@ConfiguresHttpApi
protected static class StubEC2HttpApiModule extends BaseEC2HttpApiModule<EC2Api> {
protected StubEC2HttpApiModule() {
super(EC2Api.class);
}
@Provides
@Singleton
@ -132,7 +135,7 @@ public abstract class BaseEC2AsyncClientTest<T> extends BaseAsyncClientTest<T> {
@Override
protected Module createModule() {
return new StubEC2RestClientModule();
return new StubEC2HttpApiModule();
}
@Override

View File

@ -14,13 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.testng.Assert.assertEquals;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.domain.Volume;
import org.jclouds.ec2.internal.BaseEC2ClientExpectTest;
import org.jclouds.ec2.internal.BaseEC2ApiExpectTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.testng.annotations.Test;
@ -31,8 +31,8 @@ import com.google.common.collect.ImmutableMap.Builder;
/**
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "EC2ElasticBlockStoreClientExpectTest")
public class EC2ElasticBlockStoreClientExpectTest extends BaseEC2ClientExpectTest<EC2Client> {
@Test(groups = "unit", testName = "EC2ElasticBlockStoreApiExpectTest")
public class EC2ElasticBlockStoreApiExpectTest extends BaseEC2ApiExpectTest<EC2Api> {
Volume creating = Volume.builder()
.id("vol-2a21e543")
.status(Volume.Status.CREATING)
@ -57,7 +57,7 @@ public class EC2ElasticBlockStoreClientExpectTest extends BaseEC2ClientExpectTes
.statusCode(200)
.payload(payloadFromResource("/created_volume.xml")).build());
ElasticBlockStoreClient client = requestsSendResponses(builder.build()).getElasticBlockStoreServices();
ElasticBlockStoreApi client = requestsSendResponses(builder.build()).getElasticBlockStoreApi().get();
assertEquals(client.createVolumeInAvailabilityZone("us-east-1a", 4), creating);
}
@ -81,7 +81,7 @@ public class EC2ElasticBlockStoreClientExpectTest extends BaseEC2ClientExpectTes
.statusCode(200)
.payload(payloadFromResource("/created_volume.xml")).build());
ElasticBlockStoreClient client = requestsSendResponses(builder.build()).getElasticBlockStoreServices();
ElasticBlockStoreApi client = requestsSendResponses(builder.build()).getElasticBlockStoreApi().get();
assertEquals(client.createVolumeFromSnapshotInAvailabilityZone(region + "a", 1, "snap-8b7ffbdd"), creating.toBuilder().region(region).build());
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.jclouds.ec2.options.DescribeSnapshotsOptions.Builder.snapshotIds;
@ -26,8 +26,8 @@ import java.util.Set;
import java.util.SortedSet;
import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.domain.AvailabilityZoneInfo;
import org.jclouds.ec2.domain.Snapshot;
import org.jclouds.ec2.domain.Volume;
@ -42,18 +42,18 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
/**
* Tests behavior of {@code ElasticBlockStoreClient}
* Tests behavior of {@code ElasticBlockStoreApi}
*
* @author Adrian Cole
*/
@Test(groups = "live", singleThreaded = true, testName = "ElasticBlockStoreClientLiveTest")
public class ElasticBlockStoreClientLiveTest extends BaseComputeServiceContextLiveTest {
public ElasticBlockStoreClientLiveTest() {
@Test(groups = "live", singleThreaded = true, testName = "ElasticBlockStoreApiLiveTest")
public class ElasticBlockStoreApiLiveTest extends BaseComputeServiceContextLiveTest {
public ElasticBlockStoreApiLiveTest() {
provider = "ec2";
}
private EC2Client ec2Client;
private ElasticBlockStoreClient client;
private EC2Api ec2Api;
private ElasticBlockStoreApi client;
private String defaultRegion;
private String defaultZone;
@ -65,9 +65,9 @@ public class ElasticBlockStoreClientLiveTest extends BaseComputeServiceContextLi
@BeforeClass(groups = { "integration", "live" })
public void setupContext() {
super.setupContext();
ec2Client = view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
client = ec2Client.getElasticBlockStoreServices();
AvailabilityZoneInfo info = Iterables.get(ec2Client.getAvailabilityZoneAndRegionServices()
ec2Api = view.unwrapApi(EC2Api.class);
client = ec2Api.getElasticBlockStoreApi().get();
AvailabilityZoneInfo info = Iterables.get(ec2Api.getAvailabilityZoneAndRegionApi().get()
.describeAvailabilityZonesInRegion(defaultRegion), 0);
defaultRegion = checkNotNull(Strings.emptyToNull(info.getRegion()), "region of " + info);
defaultZone = checkNotNull(Strings.emptyToNull(info.getZone()), "zone of " + info);
@ -75,7 +75,7 @@ public class ElasticBlockStoreClientLiveTest extends BaseComputeServiceContextLi
@Test
void testDescribeVolumes() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
SortedSet<Volume> allResults = Sets.newTreeSet(client.describeVolumesInRegion(region));
assertNotNull(allResults);
if (allResults.size() >= 1) {
@ -163,7 +163,7 @@ public class ElasticBlockStoreClientLiveTest extends BaseComputeServiceContextLi
@Test
void testDescribeSnapshots() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
SortedSet<Snapshot> allResults = Sets.newTreeSet(client.describeSnapshotsInRegion(region));
assertNotNull(allResults);
if (allResults.size() >= 1) {

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.ec2.options.DescribeSnapshotsOptions.Builder.ownedBy;
import static org.jclouds.ec2.options.DetachVolumeOptions.Builder.fromInstance;
@ -42,16 +42,16 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.reflect.Invokable;
/**
* Tests behavior of {@code ElasticBlockStoreAsyncClient}
* Tests behavior of {@code ElasticBlockStoreApi}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "ElasticBlockStoreAsyncClientTest")
public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<ElasticBlockStoreAsyncClient> {
@Test(groups = "unit", testName = "ElasticBlockStoreApiTest")
public class ElasticBlockStoreApiTest extends BaseEC2ApiTest<ElasticBlockStoreApi> {
public void testDeleteVolume() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "deleteVolumeInRegion", String.class, String.class);
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "deleteVolumeInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -78,7 +78,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDescribeVolumes() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "describeVolumesInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeVolumesInRegion", String.class,
String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null));
@ -97,7 +97,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testDescribeVolumesArgs() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "describeVolumesInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeVolumesInRegion", String.class,
String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2"));
@ -128,7 +128,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
.addFormParam("AWSAccessKeyId", "identity").build();
public void testAttachVolume() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "attachVolumeInRegion", String.class, String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "attachVolumeInRegion", String.class, String.class,
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", "instanceId", "/device"));
@ -160,7 +160,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDetachVolume() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "detachVolumeInRegion", String.class, String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "detachVolumeInRegion", String.class, String.class,
boolean.class, DetachVolumeOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", false));
@ -194,7 +194,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
.addFormParam("AWSAccessKeyId", "identity").build();
public void testDetachVolumeOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "detachVolumeInRegion", String.class, String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "detachVolumeInRegion", String.class, String.class,
boolean.class, DetachVolumeOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", true, fromInstance("instanceId").fromDevice(
"/device")));
@ -214,7 +214,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testCreateSnapshot() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "createSnapshotInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "createSnapshotInRegion", String.class,
String.class, CreateSnapshotOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "volumeId"));
@ -231,7 +231,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testCreateSnapshotOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "createSnapshotInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "createSnapshotInRegion", String.class,
String.class, CreateSnapshotOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "volumeId", CreateSnapshotOptions.Builder
.withDescription("description")));
@ -250,7 +250,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testDescribeSnapshots() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "describeSnapshotsInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeSnapshotsInRegion", String.class,
DescribeSnapshotsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null));
@ -267,7 +267,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testDescribeSnapshotsArgs() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "describeSnapshotsInRegion", String.class,
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeSnapshotsInRegion", String.class,
DescribeSnapshotsOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ownedBy("o1", "o2").restorableBy("r1", "r2")
.snapshotIds("s1", "s2")));
@ -287,7 +287,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
}
public void testGetCreateVolumePermissionForSnapshot() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "getCreateVolumePermissionForSnapshotInRegion",
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "getCreateVolumePermissionForSnapshotInRegion",
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "snapshotId"));
@ -323,7 +323,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
.addFormParam("AWSAccessKeyId", "identity").build();
public void testAddCreateVolumePermissionsToSnapshot() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "addCreateVolumePermissionsToSnapshotInRegion",
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "addCreateVolumePermissionsToSnapshotInRegion",
String.class, Iterable.class, Iterable.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList
.of("all"), "snapshotId"));
@ -361,7 +361,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
public void testRemoveCreateVolumePermissionsFromSnapshot() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "removeCreateVolumePermissionsFromSnapshotInRegion",
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "removeCreateVolumePermissionsFromSnapshotInRegion",
String.class, Iterable.class, Iterable.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList
.of("all"), "snapshotId"));
@ -382,7 +382,7 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
public void testResetCreateVolumePermissionsOnSnapshot() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(ElasticBlockStoreAsyncClient.class, "resetCreateVolumePermissionsOnSnapshotInRegion",
Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "resetCreateVolumePermissionsOnSnapshotInRegion",
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "snapshotId"));

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
@ -22,8 +22,9 @@ import static org.testng.Assert.assertNotNull;
import java.util.SortedSet;
import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.compute.EC2ComputeServiceContext;
import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@ -31,30 +32,30 @@ import org.testng.annotations.Test;
import com.google.common.collect.Sets;
/**
* Tests behavior of {@code ElasticIPAddressClient}
* Tests behavior of {@code ElasticIPAddressApi}
*
* @author Adrian Cole
*/
@Test(groups = "live", singleThreaded = true, testName = "ElasticIPAddressClientLiveTest")
public class ElasticIPAddressClientLiveTest extends BaseComputeServiceContextLiveTest {
public ElasticIPAddressClientLiveTest() {
@Test(groups = "live", singleThreaded = true, testName = "ElasticIPAddressApiLiveTest")
public class ElasticIPAddressApiLiveTest extends BaseComputeServiceContextLiveTest {
public ElasticIPAddressApiLiveTest() {
provider = "ec2";
}
private EC2Client ec2Client;
private ElasticIPAddressClient client;
private EC2Api ec2Api;
private ElasticIPAddressApi client;
@Override
@BeforeClass(groups = { "integration", "live" })
public void setupContext() {
super.setupContext();
ec2Client = view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
client = ec2Client.getElasticIPAddressServices();
ec2Api = view.unwrapApi(EC2Api.class);
client = ec2Api.getElasticIPAddressApi().get();
}
@Test
void testDescribeAddresses() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
SortedSet<PublicIpInstanceIdPair> allResults = Sets.newTreeSet(client.describeAddressesInRegion(region));
assertNotNull(allResults);
if (allResults.size() >= 1) {

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.reflect.Reflection2.method;
@ -32,16 +32,16 @@ import org.testng.annotations.Test;
import com.google.common.collect.Lists;
import com.google.common.reflect.Invokable;
/**
* Tests behavior of {@code ElasticIPAddressAsyncClient}
* Tests behavior of {@code ElasticIPAddressApi}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "ElasticIPAddressAsyncClientTest")
public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<ElasticIPAddressAsyncClient> {
@Test(groups = "unit", testName = "ElasticIPAddressApiTest")
public class ElasticIPAddressApiTest extends BaseEC2ApiTest<ElasticIPAddressApi> {
public void testDisassociateAddress() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticIPAddressAsyncClient.class, "disassociateAddressInRegion", String.class,
Invokable<?, ?> method = method(ElasticIPAddressApi.class, "disassociateAddressInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1"));
@ -71,7 +71,7 @@ public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<Elas
.addFormParam("AWSAccessKeyId", "identity").build();
public void testAssociateAddress() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticIPAddressAsyncClient.class, "associateAddressInRegion", String.class,
Invokable<?, ?> method = method(ElasticIPAddressApi.class, "associateAddressInRegion", String.class,
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1", "me"));
@ -90,7 +90,7 @@ public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<Elas
}
public void testReleaseAddress() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticIPAddressAsyncClient.class, "releaseAddressInRegion", String.class, String.class);
Invokable<?, ?> method = method(ElasticIPAddressApi.class, "releaseAddressInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -106,7 +106,7 @@ public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<Elas
}
public void testDescribeAddresses() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticIPAddressAsyncClient.class, "describeAddressesInRegion", String.class,
Invokable<?, ?> method = method(ElasticIPAddressApi.class, "describeAddressesInRegion", String.class,
String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1"));
@ -123,7 +123,7 @@ public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<Elas
}
public void testAllocateAddress() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(ElasticIPAddressAsyncClient.class, "allocateAddressInRegion", String.class);
Invokable<?, ?> method = method(ElasticIPAddressApi.class, "allocateAddressInRegion", String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");

View File

@ -14,45 +14,45 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.testng.Assert.assertNotNull;
import java.util.Set;
import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
import org.jclouds.ec2.EC2Api;
import org.jclouds.ec2.EC2ApiMetadata;
import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.domain.Reservation;
import org.jclouds.ec2.domain.RunningInstance;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* Tests behavior of {@code EC2Client}
* Tests behavior of {@code EC2Api}
*
* @author Adrian Cole
*/
@Test(groups = "live", singleThreaded = true, testName = "InstanceClientLiveTest")
public class InstanceClientLiveTest extends BaseComputeServiceContextLiveTest {
public InstanceClientLiveTest() {
@Test(groups = "live", singleThreaded = true, testName = "InstanceApiLiveTest")
public class InstanceApiLiveTest extends BaseComputeServiceContextLiveTest {
public InstanceApiLiveTest() {
provider = "ec2";
}
private EC2Client ec2Client;
private InstanceClient client;
private EC2Api ec2Api;
private InstanceApi client;
@Override
@BeforeClass(groups = { "integration", "live" })
public void setupContext() {
super.setupContext();
ec2Client = view.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
client = ec2Client.getInstanceServices();
ec2Api = view.unwrapApi(EC2Api.class);
client = ec2Api.getInstanceApi().get();
}
@Test
void testDescribeInstances() {
for (String region : ec2Client.getConfiguredRegions()) {
for (String region : ec2Api.getConfiguredRegions()) {
Set<? extends Reservation<? extends RunningInstance>> allResults = client.describeInstancesInRegion(region);
assertNotNull(allResults);
assert allResults.size() >= 0 : allResults.size();

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.services;
package org.jclouds.ec2.features;
import static org.jclouds.reflect.Reflection2.method;
@ -47,15 +47,15 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.reflect.Invokable;
/**
* Tests behavior of {@code InstanceAsyncClient}
* Tests behavior of {@code InstanceApi}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "InstanceAsyncClientTest")
public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyncClient> {
@Test(groups = "unit", testName = "InstanceApiTest")
public class InstanceApiTest extends BaseEC2ApiTest<InstanceApi> {
public void testDescribeInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "describeInstancesInRegion", String.class, String[].class);
Invokable<?, ?> method = method(InstanceApi.class, "describeInstancesInRegion", String.class, String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -71,7 +71,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testDescribeInstancesArgs() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "describeInstancesInRegion", String.class, String[].class);
Invokable<?, ?> method = method(InstanceApi.class, "describeInstancesInRegion", String.class, String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -87,7 +87,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testTerminateInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "terminateInstancesInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "terminateInstancesInRegion", String.class,
String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2"));
@ -104,7 +104,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testRunInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "runInstancesInRegion", String.class, String.class,
Invokable<?, ?> method = method(InstanceApi.class, "runInstancesInRegion", String.class, String.class,
String.class, int.class, int.class, RunInstancesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, null, "ami-voo", 1, 1));
@ -126,7 +126,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testRunInstancesOptions() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "runInstancesInRegion", String.class, String.class,
Invokable<?, ?> method = method(InstanceApi.class, "runInstancesInRegion", String.class, String.class,
String.class, int.class, int.class, RunInstancesOptions[].class);
GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("eu-west-1", "eu-west-1a", "ami-voo",
1, 5, new RunInstancesOptions().withKernelId("kernelId").withSecurityGroups("group1", "group2")));
@ -153,7 +153,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testStopInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "stopInstancesInRegion", String.class, boolean.class,
Invokable<?, ?> method = method(InstanceApi.class, "stopInstancesInRegion", String.class, boolean.class,
String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, true, "1", "2"));
@ -170,7 +170,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testRebootInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "rebootInstancesInRegion", String.class, String[].class);
Invokable<?, ?> method = method(InstanceApi.class, "rebootInstancesInRegion", String.class, String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -186,7 +186,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testStartInstances() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "startInstancesInRegion", String.class, String[].class);
Invokable<?, ?> method = method(InstanceApi.class, "startInstancesInRegion", String.class, String[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -202,7 +202,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getUserDataForInstanceInRegion", String.class, String.class);
Invokable<?, ?> method = method(InstanceApi.class, "getUserDataForInstanceInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -219,7 +219,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetRootDeviceNameForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getRootDeviceNameForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "getRootDeviceNameForInstanceInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
@ -237,7 +237,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getRamdiskForInstanceInRegion", String.class, String.class);
Invokable<?, ?> method = method(InstanceApi.class, "getRamdiskForInstanceInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -255,7 +255,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testGetDisableApiTerminationForInstanceInRegion() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "isApiTerminationDisabledForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "isApiTerminationDisabledForInstanceInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
@ -273,7 +273,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getKernelForInstanceInRegion", String.class, String.class);
Invokable<?, ?> method = method(InstanceApi.class, "getKernelForInstanceInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
@ -289,7 +289,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getInstanceTypeForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "getInstanceTypeForInstanceInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
@ -308,7 +308,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testGetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException,
NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getInstanceInitiatedShutdownBehaviorForInstanceInRegion",
Invokable<?, ?> method = method(InstanceApi.class, "getInstanceInitiatedShutdownBehaviorForInstanceInRegion",
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
@ -328,7 +328,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testGetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getBlockDeviceMappingForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "getBlockDeviceMappingForInstanceInRegion", String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
@ -360,7 +360,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
.addFormParam("AWSAccessKeyId", "identity").build();
public void testSetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setUserDataForInstanceInRegion", String.class, String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setUserDataForInstanceInRegion", String.class, String.class,
byte[].class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test".getBytes()));
@ -393,7 +393,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
.addFormParam("AWSAccessKeyId", "identity").build();
public void testSetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setRamdiskForInstanceInRegion", String.class, String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setRamdiskForInstanceInRegion", String.class, String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test"));
@ -426,7 +426,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
.addFormParam("AWSAccessKeyId", "identity").build();
public void testSetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setKernelForInstanceInRegion", String.class, String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setKernelForInstanceInRegion", String.class, String.class,
String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test"));
@ -460,7 +460,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testSetApiTerminationDisabledForInstanceInRegion() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setApiTerminationDisabledForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setApiTerminationDisabledForInstanceInRegion", String.class,
String.class, boolean.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", true));
@ -493,7 +493,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
.addFormParam("AWSAccessKeyId", "identity").build();
public void testSetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setInstanceTypeForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setInstanceTypeForInstanceInRegion", String.class,
String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", InstanceType.C1_MEDIUM));
@ -527,7 +527,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testSetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException,
NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setInstanceInitiatedShutdownBehaviorForInstanceInRegion",
Invokable<?, ?> method = method(InstanceApi.class, "setInstanceInitiatedShutdownBehaviorForInstanceInRegion",
String.class, String.class, InstanceInitiatedShutdownBehavior.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", InstanceInitiatedShutdownBehavior.TERMINATE));
@ -556,7 +556,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
public void testSetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "setBlockDeviceMappingForInstanceInRegion", String.class,
Invokable<?, ?> method = method(InstanceApi.class, "setBlockDeviceMappingForInstanceInRegion", String.class,
String.class, Map.class);
Map<String, BlockDevice> mapping = Maps.newLinkedHashMap();
@ -575,7 +575,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
}
public void testGetConsoleOutputForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(InstanceAsyncClient.class, "getConsoleOutputForInstanceInRegion", String.class, String.class);
Invokable<?, ?> method = method(InstanceApi.class, "getConsoleOutputForInstanceInRegion", String.class, String.class);
GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1"));
assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");

Some files were not shown because too many files have changed in this diff Show More