mirror of https://github.com/apache/jclouds.git
Issue 144: Temporary hack until http://code.google.com/p/guava-libraries/issues/detail?id=317 is fixed.
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2670 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
4407490ff0
commit
969bb8ea38
|
@ -19,8 +19,8 @@
|
||||||
package org.jclouds.atmosonline.saas.blobstore;
|
package org.jclouds.atmosonline.saas.blobstore;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.compose;
|
import static com.google.common.util.concurrent.Futures.compose;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
|
||||||
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
||||||
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -98,7 +98,7 @@ public class AtmosAsyncBlobStore extends BaseAtmosBlobStore implements AsyncBlob
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,7 +140,7 @@ public class AtmosAsyncBlobStore extends BaseAtmosBlobStore implements AsyncBlob
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> containerExists(String container) {
|
public ListenableFuture<Boolean> containerExists(String container) {
|
||||||
|
|
|
@ -182,6 +182,7 @@ public interface S3Client {
|
||||||
* />
|
* />
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Timeout(duration = 90, timeUnit = TimeUnit.SECONDS)
|
||||||
boolean putBucketInRegion(Region region, String bucketName, PutBucketOptions... options);
|
boolean putBucketInRegion(Region region, String bucketName, PutBucketOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,8 +18,15 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3;
|
package org.jclouds.aws.s3;
|
||||||
|
|
||||||
|
import static org.jclouds.aws.s3.reference.S3Constants.PROPERTY_S3_METADATA_PREFIX;
|
||||||
|
import static org.jclouds.aws.s3.reference.S3Constants.PROPERTY_S3_RETRY;
|
||||||
|
import static org.jclouds.aws.s3.reference.S3Constants.PROPERTY_S3_TIMEOUT;
|
||||||
|
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_RETRY;
|
||||||
|
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.config.S3ContextModule;
|
import org.jclouds.aws.s3.config.S3ContextModule;
|
||||||
|
@ -28,6 +35,7 @@ import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||||
import org.jclouds.logging.jdk.config.JDKLoggingModule;
|
import org.jclouds.logging.jdk.config.JDKLoggingModule;
|
||||||
import org.jclouds.rest.RestContextBuilder;
|
import org.jclouds.rest.RestContextBuilder;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.TypeLiteral;
|
import com.google.inject.TypeLiteral;
|
||||||
|
@ -50,7 +58,17 @@ public class S3ContextBuilder extends RestContextBuilder<S3AsyncClient, S3Client
|
||||||
public S3ContextBuilder(Properties props) {
|
public S3ContextBuilder(Properties props) {
|
||||||
super(new TypeLiteral<S3AsyncClient>() {
|
super(new TypeLiteral<S3AsyncClient>() {
|
||||||
}, new TypeLiteral<S3Client>() {
|
}, new TypeLiteral<S3Client>() {
|
||||||
}, props);
|
}, convert(props));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties convert(Properties props) {
|
||||||
|
for (Entry<String, String> entry : ImmutableMap.of(PROPERTY_S3_METADATA_PREFIX,
|
||||||
|
PROPERTY_USER_METADATA_PREFIX, PROPERTY_S3_RETRY, PROPERTY_BLOBSTORE_RETRY,
|
||||||
|
PROPERTY_S3_TIMEOUT, PROPERTY_USER_METADATA_PREFIX).entrySet()) {
|
||||||
|
if (props.containsKey(entry.getKey()))
|
||||||
|
props.setProperty(entry.getValue(), props.getProperty(entry.getKey()));
|
||||||
|
}
|
||||||
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
package org.jclouds.aws.s3.blobstore;
|
package org.jclouds.aws.s3.blobstore;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.compose;
|
import static com.google.common.util.concurrent.Futures.compose;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
|
||||||
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
||||||
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -87,7 +87,7 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
* This implementation uses the S3 HEAD Object command to return the result
|
* This implementation uses the S3 HEAD Object command to return the result
|
||||||
*/
|
*/
|
||||||
public ListenableFuture<BlobMetadata> blobMetadata(String container, String key) {
|
public ListenableFuture<BlobMetadata> blobMetadata(String container, String key) {
|
||||||
return compose(makeListenable(async.headObject(container, key)),
|
return compose(makeListenable(async.headObject(container, key), service),
|
||||||
new Function<ObjectMetadata, BlobMetadata>() {
|
new Function<ObjectMetadata, BlobMetadata>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -106,7 +106,7 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Void> deleteContainer(final String container) {
|
public ListenableFuture<Void> deleteContainer(final String container) {
|
||||||
|
@ -118,7 +118,7 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainerInLocation(String location, String container) {
|
public ListenableFuture<Boolean> createContainerInLocation(String location, String container) {
|
||||||
|
@ -137,7 +137,7 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
||||||
|
@ -152,7 +152,7 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Blob> getBlob(String container, String key,
|
public ListenableFuture<Blob> getBlob(String container, String key,
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Map;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
@ -63,13 +64,13 @@ import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
|
import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
|
||||||
import org.jclouds.blobstore.integration.internal.StubAsyncBlobStore;
|
import org.jclouds.blobstore.integration.internal.StubAsyncBlobStore;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
import org.jclouds.concurrent.internal.ConcurrentUtils;
|
||||||
import org.jclouds.date.DateService;
|
import org.jclouds.date.DateService;
|
||||||
import org.jclouds.http.options.GetOptions;
|
import org.jclouds.http.options.GetOptions;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.util.concurrent.Futures;
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,6 +91,7 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
private final BlobToObjectMetadata blob2ObjectMetadata;
|
private final BlobToObjectMetadata blob2ObjectMetadata;
|
||||||
private final BucketToContainerListOptions bucket2ContainerListOptions;
|
private final BucketToContainerListOptions bucket2ContainerListOptions;
|
||||||
private final ResourceToBucketList resource2BucketList;
|
private final ResourceToBucketList resource2BucketList;
|
||||||
|
private final ExecutorService executorService;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private StubS3AsyncClient(StubAsyncBlobStore blobStore,
|
private StubS3AsyncClient(StubAsyncBlobStore blobStore,
|
||||||
|
@ -98,7 +100,7 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
HttpGetOptionsListToGetOptions httpGetOptionsConverter, ObjectToBlob object2Blob,
|
HttpGetOptionsListToGetOptions httpGetOptionsConverter, ObjectToBlob object2Blob,
|
||||||
BlobToObject blob2Object, BlobToObjectMetadata blob2ObjectMetadata,
|
BlobToObject blob2Object, BlobToObjectMetadata blob2ObjectMetadata,
|
||||||
BucketToContainerListOptions bucket2ContainerListOptions,
|
BucketToContainerListOptions bucket2ContainerListOptions,
|
||||||
ResourceToBucketList resource2BucketList) {
|
ResourceToBucketList resource2BucketList, ExecutorService executorService) {
|
||||||
this.blobStore = blobStore;
|
this.blobStore = blobStore;
|
||||||
this.objectProvider = objectProvider;
|
this.objectProvider = objectProvider;
|
||||||
this.blobProvider = blobProvider;
|
this.blobProvider = blobProvider;
|
||||||
|
@ -110,6 +112,7 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
this.bucket2ContainerListOptions = checkNotNull(bucket2ContainerListOptions,
|
this.bucket2ContainerListOptions = checkNotNull(bucket2ContainerListOptions,
|
||||||
"bucket2ContainerListOptions");
|
"bucket2ContainerListOptions");
|
||||||
this.resource2BucketList = checkNotNull(resource2BucketList, "resource2BucketList");
|
this.resource2BucketList = checkNotNull(resource2BucketList, "resource2BucketList");
|
||||||
|
this.executorService = checkNotNull(executorService, "executorService");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String TEST_ACL_ID = "1a405254c932b52e5b5caaa88186bc431a1bacb9ece631f835daddaf0c47677c";
|
public static final String TEST_ACL_ID = "1a405254c932b52e5b5caaa88186bc431a1bacb9ece631f835daddaf0c47677c";
|
||||||
|
@ -268,13 +271,13 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<ObjectMetadata> headObject(String bucketName, String key) {
|
public ListenableFuture<ObjectMetadata> headObject(String bucketName, String key) {
|
||||||
return compose(Futures.makeListenable(blobStore.blobMetadata(bucketName, key)),
|
return compose(ConcurrentUtils.makeListenable(blobStore.blobMetadata(bucketName, key),
|
||||||
new Function<BlobMetadata, ObjectMetadata>() {
|
executorService), new Function<BlobMetadata, ObjectMetadata>() {
|
||||||
@Override
|
@Override
|
||||||
public ObjectMetadata apply(BlobMetadata from) {
|
public ObjectMetadata apply(BlobMetadata from) {
|
||||||
return blob2ObjectMetadata.apply(from);
|
return blob2ObjectMetadata.apply(from);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends SortedSet<BucketMetadata>> listOwnedBuckets() {
|
public ListenableFuture<? extends SortedSet<BucketMetadata>> listOwnedBuckets() {
|
||||||
|
|
|
@ -26,8 +26,8 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
import org.jclouds.blobstore.BlobStoreContext;
|
||||||
import org.jclouds.blobstore.ContainerNotFoundException;
|
import org.jclouds.blobstore.ContainerNotFoundException;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.samples.googleappengine.domain.ContainerResult;
|
import org.jclouds.samples.googleappengine.domain.ContainerResult;
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ import com.google.common.collect.Sets;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class BlobStoreContextToContainerResult implements Function<String, ContainerResult> {
|
public class BlobStoreContextToContainerResult implements Function<String, ContainerResult> {
|
||||||
private final class BuildContainerResult implements Function<ResourceMetadata, ContainerResult> {
|
private final class BuildContainerResult implements Function<StorageMetadata, ContainerResult> {
|
||||||
private final String host;
|
private final String host;
|
||||||
private final BlobStoreContext<?, ?> context;
|
private final BlobStoreContext<?, ?> context;
|
||||||
private final String contextName;
|
private final String contextName;
|
||||||
|
@ -49,7 +49,7 @@ public class BlobStoreContextToContainerResult implements Function<String, Conta
|
||||||
this.contextName = contextName;
|
this.contextName = contextName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContainerResult apply(ResourceMetadata from) {
|
public ContainerResult apply(StorageMetadata from) {
|
||||||
String status;
|
String status;
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
|
@ -77,11 +77,11 @@ public class BlobStoreContextToContainerResult implements Function<String, Conta
|
||||||
final BlobStoreContext<?, ?> context = contexts.get(contextName);
|
final BlobStoreContext<?, ?> context = contexts.get(contextName);
|
||||||
final String host = context.getEndPoint().getHost();
|
final String host = context.getEndPoint().getHost();
|
||||||
try {
|
try {
|
||||||
ResourceMetadata md = Iterables.getLast(Sets.newTreeSet(Iterables.filter(context
|
StorageMetadata md = Iterables.getLast(Sets.newTreeSet(Iterables.filter(context
|
||||||
.getBlobStore().list(), new Predicate<ResourceMetadata>() {
|
.getBlobStore().list(), new Predicate<StorageMetadata>() {
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata input) {
|
public boolean apply(StorageMetadata input) {
|
||||||
return input.getType() == ResourceType.CONTAINER;
|
return input.getType() == StorageType.CONTAINER;
|
||||||
}
|
}
|
||||||
|
|
||||||
})));
|
})));
|
||||||
|
|
|
@ -80,13 +80,13 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.appengine</groupId>
|
<groupId>com.google.appengine</groupId>
|
||||||
<artifactId>appengine-api-stubs</artifactId>
|
<artifactId>appengine-api-stubs</artifactId>
|
||||||
<version>1.2.5</version>
|
<version>1.3.0</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.appengine</groupId>
|
<groupId>com.google.appengine</groupId>
|
||||||
<artifactId>appengine-local-runtime</artifactId>
|
<artifactId>appengine-local-runtime</artifactId>
|
||||||
<version>1.2.5</version>
|
<version>1.3.0</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3;
|
package org.jclouds.aws.s3;
|
||||||
|
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.createIn;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
@ -35,7 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
||||||
import org.testng.annotations.AfterClass;
|
import org.testng.annotations.AfterClass;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
|
@ -89,7 +87,7 @@ public abstract class BasePerformanceLiveTest extends
|
||||||
protected String createScratchContainerInEU() throws InterruptedException, ExecutionException,
|
protected String createScratchContainerInEU() throws InterruptedException, ExecutionException,
|
||||||
TimeoutException {
|
TimeoutException {
|
||||||
String containerName = getScratchContainerName();
|
String containerName = getScratchContainerName();
|
||||||
context.getApi().putBucketIfNotExists(containerName, createIn(LocationConstraint.EU));
|
context.getApi().putBucketInRegion(Region.EU_WEST_1, containerName);
|
||||||
return containerName;
|
return containerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
package org.jclouds.azure.storage.blob.blobstore;
|
package org.jclouds.azure.storage.blob.blobstore;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.compose;
|
import static com.google.common.util.concurrent.Futures.compose;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
|
||||||
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
||||||
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -106,7 +106,7 @@ public class AzureAsyncBlobStore extends BaseAzureBlobStore implements AsyncBlob
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -167,7 +167,7 @@ public class AzureAsyncBlobStore extends BaseAzureBlobStore implements AsyncBlob
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
||||||
|
@ -182,7 +182,7 @@ public class AzureAsyncBlobStore extends BaseAzureBlobStore implements AsyncBlob
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ package org.jclouds.blobstore.integration.internal;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
|
import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
|
||||||
import static com.google.common.util.concurrent.Futures.immediateFuture;
|
import static com.google.common.util.concurrent.Futures.immediateFuture;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -593,7 +593,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
||||||
|
@ -607,7 +607,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Blob newBlob(String name) {
|
public Blob newBlob(String name) {
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.concurrent.internal;
|
||||||
|
|
||||||
|
import java.util.concurrent.CancellationException;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ExecutionList;
|
||||||
|
import com.google.common.util.concurrent.ForwardingFuture;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapt things missing from Guava.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ConcurrentUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just like {@code Futures#makeListenable} except that we pass in an executorService.
|
||||||
|
* <p/>
|
||||||
|
* Temporary hack until http://code.google.com/p/guava-libraries/issues/detail?id=317 is fixed.
|
||||||
|
*/
|
||||||
|
public static <T> ListenableFuture<T> makeListenable(Future<T> future, ExecutorService executorService) {
|
||||||
|
if (future instanceof ListenableFuture<?>) {
|
||||||
|
return (ListenableFuture<T>) future;
|
||||||
|
}
|
||||||
|
return new ListenableFutureAdapter<T>(executorService, future);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just like {@code Futures#ListenableFutureAdapter} except that we pass in an executorService.
|
||||||
|
* <p/>
|
||||||
|
* Temporary hack until http://code.google.com/p/guava-libraries/issues/detail?id=317 is fixed.
|
||||||
|
*/
|
||||||
|
private static class ListenableFutureAdapter<T> extends ForwardingFuture<T> implements
|
||||||
|
ListenableFuture<T> {
|
||||||
|
|
||||||
|
private final Executor adapterExecutor;
|
||||||
|
|
||||||
|
// The execution list to hold our listeners.
|
||||||
|
private final ExecutionList executionList = new ExecutionList();
|
||||||
|
|
||||||
|
// This allows us to only start up a thread waiting on the delegate future
|
||||||
|
// when the first listener is added.
|
||||||
|
private final AtomicBoolean hasListeners = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
// The delegate future.
|
||||||
|
private final Future<T> delegate;
|
||||||
|
|
||||||
|
ListenableFutureAdapter(ExecutorService executorService, final Future<T> delegate) {
|
||||||
|
this.adapterExecutor = executorService;
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Future<T> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @Override */
|
||||||
|
public void addListener(Runnable listener, Executor exec) {
|
||||||
|
|
||||||
|
// When a listener is first added, we run a task that will wait for
|
||||||
|
// the delegate to finish, and when it is done will run the listeners.
|
||||||
|
if (!hasListeners.get() && hasListeners.compareAndSet(false, true)) {
|
||||||
|
adapterExecutor.execute(new Runnable() {
|
||||||
|
/* @Override */
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
delegate.get();
|
||||||
|
} catch (CancellationException e) {
|
||||||
|
// The task was cancelled, so it is done, run the listeners.
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// This thread was interrupted. This should never happen, so we
|
||||||
|
// throw an IllegalStateException.
|
||||||
|
throw new IllegalStateException("Adapter thread interrupted!", e);
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
// The task caused an exception, so it is done, run the listeners.
|
||||||
|
}
|
||||||
|
executionList.run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
executionList.add(listener, exec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http.internal;
|
package org.jclouds.http.internal;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -64,7 +64,8 @@ public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandEx
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<HttpResponse> submit(HttpCommand command) {
|
public ListenableFuture<HttpResponse> submit(HttpCommand command) {
|
||||||
return makeListenable(executorService.submit(new HttpResponseCallable(command)));
|
return makeListenable(executorService.submit(new HttpResponseCallable(command)),
|
||||||
|
executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class HttpResponseCallable implements Callable<HttpResponse> {
|
public class HttpResponseCallable implements Callable<HttpResponse> {
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.concurrent;
|
package org.jclouds.concurrent;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -76,7 +76,7 @@ public class FutureExceptionParserTest {
|
||||||
throw exception;
|
throw exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
|
|
||||||
future = new FutureExceptionParser(future, new Function<Exception, String>() {
|
future = new FutureExceptionParser(future, new Function<Exception, String>() {
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.concurrent.internal;
|
package org.jclouds.concurrent.internal;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
@ -79,7 +79,7 @@ public class SyncProxyTest {
|
||||||
return "foo";
|
return "foo";
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<String> getRuntimeException() {
|
public ListenableFuture<String> getRuntimeException() {
|
||||||
|
@ -89,7 +89,7 @@ public class SyncProxyTest {
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<String> getTypedException() throws FileNotFoundException {
|
public ListenableFuture<String> getTypedException() throws FileNotFoundException {
|
||||||
|
@ -99,7 +99,7 @@ public class SyncProxyTest {
|
||||||
throw new FileNotFoundException();
|
throw new FileNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String newString() {
|
public String newString() {
|
||||||
|
@ -118,7 +118,7 @@ public class SyncProxyTest {
|
||||||
return "foo";
|
return "foo";
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<String> take100MillisecondsAndTimeout() {
|
public ListenableFuture<String> take100MillisecondsAndTimeout() {
|
||||||
|
@ -133,7 +133,7 @@ public class SyncProxyTest {
|
||||||
return "foo";
|
return "foo";
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), executorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<String> take100MillisecondsAndOverride() {
|
public ListenableFuture<String> take100MillisecondsAndOverride() {
|
||||||
|
|
|
@ -53,7 +53,7 @@ public class AddTweetsControllerTest {
|
||||||
for (String name : new String[] { "1", "2" }) {
|
for (String name : new String[] { "1", "2" }) {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getAsyncBlobStore().createContainer(container).get();
|
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||||
blob.setPayload("I love beans!");
|
blob.setPayload("I love beans!");
|
||||||
|
|
|
@ -60,7 +60,7 @@ public class StoreTweetsControllerTest {
|
||||||
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
||||||
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
||||||
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
||||||
blobstore.getAsyncBlobStore().createContainer("favo").get();
|
blobstore.getAsyncBlobStore().createContainerInLocation(null, "favo").get();
|
||||||
}
|
}
|
||||||
return contexts;
|
return contexts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class KeyToStoredTweetStatusTest {
|
||||||
BlobMap createMap() throws InterruptedException, ExecutionException {
|
BlobMap createMap() throws InterruptedException, ExecutionException {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getBlobStore().createContainer("test1");
|
context.getBlobStore().createContainerInLocation(null, "test1");
|
||||||
return context.createBlobMap("test1");
|
return context.createBlobMap("test1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class ServiceToStoredTweetStatusesTest {
|
||||||
for (String name : new String[] { "1", "2" }) {
|
for (String name : new String[] { "1", "2" }) {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getAsyncBlobStore().createContainer(container).get();
|
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||||
blob.setPayload("I love beans!");
|
blob.setPayload("I love beans!");
|
||||||
|
|
|
@ -42,8 +42,6 @@ import org.jclouds.aws.s3.S3PropertiesBuilder;
|
||||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextBuilder;
|
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextBuilder;
|
||||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||||
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
||||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextBuilder;
|
|
||||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextFactory;
|
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
import org.jclouds.blobstore.BlobStoreContext;
|
||||||
import org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder;
|
import org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder;
|
||||||
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStoreContextBuilder;
|
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStoreContextBuilder;
|
||||||
|
@ -58,146 +56,146 @@ import org.testng.annotations.Test;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts up the Google App Engine for Java Development environment and deploys
|
* Starts up the Google App Engine for Java Development environment and deploys an application which
|
||||||
* an application which tests accesses twitter and blobstores.
|
* tests accesses twitter and blobstores.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "live", sequential = true, testName = "functionalTests")
|
@Test(groups = "live", sequential = true, testName = "functionalTests")
|
||||||
public class TweetStoreLiveTest {
|
public class TweetStoreLiveTest {
|
||||||
|
|
||||||
GoogleDevServer server;
|
GoogleDevServer server;
|
||||||
private URL url;
|
private URL url;
|
||||||
private ImmutableSet<BlobStoreContext<? extends Object, ? extends Object>> contexts;
|
private ImmutableSet<BlobStoreContext<? extends Object, ? extends Object>> contexts;
|
||||||
private String container;
|
private String container;
|
||||||
|
|
||||||
@BeforeTest
|
@BeforeTest
|
||||||
@Parameters( { "warfile", "devappserver.address", "devappserver.port" })
|
@Parameters( { "warfile", "devappserver.address", "devappserver.port" })
|
||||||
public void startDevAppServer(final String warfile, final String address,
|
public void startDevAppServer(final String warfile, final String address, final String port)
|
||||||
final String port) throws Exception {
|
throws Exception {
|
||||||
url = new URL(String.format("http://%s:%s", address, port));
|
url = new URL(String.format("http://%s:%s", address, port));
|
||||||
Properties props = new Properties();
|
Properties props = new Properties();
|
||||||
props.setProperty(PROPERTY_TWEETSTORE_CONTAINER,
|
props.setProperty(PROPERTY_TWEETSTORE_CONTAINER, checkNotNull(System
|
||||||
checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER), PROPERTY_TWEETSTORE_CONTAINER));
|
.getProperty(PROPERTY_TWEETSTORE_CONTAINER), PROPERTY_TWEETSTORE_CONTAINER));
|
||||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS,
|
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS,
|
||||||
// WATCH THIS.. when adding a new context, you must update the string
|
// WATCH THIS.. when adding a new context, you must update the string
|
||||||
String.format("%s,%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
// String.format("%s,%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
||||||
CloudFilesBlobStoreContextBuilder.class.getName(),
|
// CloudFilesBlobStoreContextBuilder.class.getName(),
|
||||||
AzureBlobStoreContextBuilder.class.getName()));
|
// AzureBlobStoreContextBuilder.class.getName()));
|
||||||
|
String.format("%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
||||||
|
CloudFilesBlobStoreContextBuilder.class.getName()));
|
||||||
|
props = new TwitterPropertiesBuilder(props).withCredentials(
|
||||||
|
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
||||||
|
System.getProperty(PROPERTY_TWITTER_PASSWORD, PROPERTY_TWITTER_PASSWORD)).build();
|
||||||
|
|
||||||
props = new TwitterPropertiesBuilder(props).withCredentials(
|
props = new S3PropertiesBuilder(props)
|
||||||
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
.withCredentials(
|
||||||
System.getProperty(PROPERTY_TWITTER_PASSWORD, PROPERTY_TWITTER_PASSWORD))
|
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID),
|
||||||
.build();
|
PROPERTY_AWS_ACCESSKEYID),
|
||||||
|
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY,
|
||||||
|
PROPERTY_AWS_SECRETACCESSKEY)).build();
|
||||||
|
|
||||||
props = new S3PropertiesBuilder(props).withCredentials(
|
props = new CloudFilesPropertiesBuilder(props).withCredentials(
|
||||||
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID),
|
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
||||||
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY))
|
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY)).build();
|
||||||
.build();
|
|
||||||
|
|
||||||
props = new CloudFilesPropertiesBuilder(props).withCredentials(
|
props = new AzureBlobPropertiesBuilder(props).withCredentials(
|
||||||
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY))
|
PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
.build();
|
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY)).build();
|
||||||
|
|
||||||
props = new AzureBlobPropertiesBuilder(props).withCredentials(
|
server = new GoogleDevServer();
|
||||||
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
server.writePropertiesAndStartServer(address, port, warfile, props);
|
||||||
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY))
|
}
|
||||||
.build();
|
|
||||||
|
|
||||||
server = new GoogleDevServer();
|
@BeforeClass
|
||||||
server.writePropertiesAndStartServer(address, port, warfile, props);
|
void clearAndCreateContainers() throws InterruptedException, ExecutionException,
|
||||||
}
|
TimeoutException {
|
||||||
|
container = checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER));
|
||||||
|
BlobStoreContext<?, ?> s3Context = S3BlobStoreContextFactory.createContext(checkNotNull(
|
||||||
|
System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID), System
|
||||||
|
.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY));
|
||||||
|
|
||||||
@BeforeClass
|
BlobStoreContext<?, ?> cfContext = CloudFilesBlobStoreContextFactory.createContext(
|
||||||
void clearAndCreateContainers() throws InterruptedException,
|
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
||||||
ExecutionException, TimeoutException {
|
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY));
|
||||||
container = checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER));
|
|
||||||
BlobStoreContext<?, ?> s3Context = S3BlobStoreContextFactory.createContext(
|
|
||||||
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID),
|
|
||||||
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY));
|
|
||||||
|
|
||||||
BlobStoreContext<?, ?> cfContext = CloudFilesBlobStoreContextFactory.createContext(
|
// BlobStoreContext<?, ?> azContext = AzureBlobStoreContextFactory.createContext(checkNotNull(
|
||||||
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
// System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY));
|
// System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
||||||
|
//
|
||||||
|
// this.contexts = ImmutableSet.of(s3Context, cfContext, azContext);
|
||||||
|
this.contexts = ImmutableSet.of(s3Context, cfContext);
|
||||||
|
boolean deleted = false;
|
||||||
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
|
if (context.getBlobStore().containerExists(container)) {
|
||||||
|
System.err.printf("deleting container %s at %s%n", container, context.getEndPoint());
|
||||||
|
context.getBlobStore().deleteContainer(container);
|
||||||
|
deleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (deleted) {
|
||||||
|
System.err.println("sleeping 30 seconds to allow containers to clear");
|
||||||
|
Thread.sleep(30000);
|
||||||
|
}
|
||||||
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
|
System.err.printf("creating container %s at %s%n", container, context.getEndPoint());
|
||||||
|
context.getBlobStore().createContainerInLocation(null, container);
|
||||||
|
}
|
||||||
|
if (deleted) {
|
||||||
|
System.err.println("sleeping 5 seconds to allow containers to create");
|
||||||
|
Thread.sleep(30000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BlobStoreContext<?, ?> azContext = AzureBlobStoreContextFactory.createContext(
|
@Test
|
||||||
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
public void shouldPass() throws InterruptedException, IOException {
|
||||||
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
InputStream i = url.openStream();
|
||||||
|
String string = Utils.toStringAndClose(i);
|
||||||
|
assert string.indexOf("Welcome") >= 0 : string;
|
||||||
|
}
|
||||||
|
|
||||||
this.contexts = ImmutableSet.of(s3Context, cfContext, azContext);
|
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class)
|
||||||
boolean deleted = false;
|
public void shouldFail() throws InterruptedException, IOException {
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
new URL(url, "/store/do").openStream();
|
||||||
if (context.getBlobStore().containerExists(container)) {
|
}
|
||||||
System.err.printf("deleting container %s at %s%n", container,
|
|
||||||
context.getEndPoint());
|
|
||||||
context.getBlobStore().deleteContainer(container);
|
|
||||||
deleted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (deleted) {
|
|
||||||
System.err.println("sleeping 30 seconds to allow containers to clear");
|
|
||||||
Thread.sleep(30000);
|
|
||||||
}
|
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
|
||||||
System.err.printf("creating container %s at %s%n", container,
|
|
||||||
context.getEndPoint());
|
|
||||||
context.getBlobStore().createContainer(container);
|
|
||||||
}
|
|
||||||
if (deleted) {
|
|
||||||
System.err.println("sleeping 5 seconds to allow containers to create");
|
|
||||||
Thread.sleep(30000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test(dependsOnMethods = "shouldFail")
|
||||||
public void shouldPass() throws InterruptedException, IOException {
|
public void testPrimeContainers() throws IOException, InterruptedException {
|
||||||
InputStream i = url.openStream();
|
URL gurl = new URL(url, "/store/do");
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Welcome") >= 0 : string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class)
|
for (String context : new String[] { "S3", "CloudFiles" }) {
|
||||||
public void shouldFail() throws InterruptedException, IOException {
|
// for (String context : new String[] { "S3", "Azure", "CloudFiles" }) {
|
||||||
new URL(url, "/store/do").openStream();
|
System.out.println("storing at context: " + context);
|
||||||
}
|
HttpURLConnection connection = (HttpURLConnection) gurl.openConnection();
|
||||||
|
connection.addRequestProperty("X-AppEngine-QueueName", "twitter");
|
||||||
|
connection.addRequestProperty("context", context);
|
||||||
|
InputStream i = connection.getInputStream();
|
||||||
|
String string = Utils.toStringAndClose(i);
|
||||||
|
assert string.indexOf("Done!") >= 0 : string;
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "shouldFail")
|
System.err.println("sleeping 10 seconds to allow for eventual consistency delay");
|
||||||
public void testPrimeContainers() throws IOException, InterruptedException {
|
Thread.sleep(10000);
|
||||||
URL gurl = new URL(url, "/store/do");
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
|
assert context.createInputStreamMap(container).size() > 0 : context.getEndPoint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (String context : new String[] { "S3", "Azure", "CloudFiles" }) {
|
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers")
|
||||||
System.out.println("storing at context: " + context);
|
public void testSerial() throws InterruptedException, IOException {
|
||||||
HttpURLConnection connection = (HttpURLConnection) gurl
|
URL gurl = new URL(url, "/tweets/get");
|
||||||
.openConnection();
|
InputStream i = gurl.openStream();
|
||||||
connection.addRequestProperty("X-AppEngine-QueueName", "twitter");
|
String string = Utils.toStringAndClose(i);
|
||||||
connection.addRequestProperty("context", context);
|
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
||||||
InputStream i = connection.getInputStream();
|
}
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Done!") >= 0 : string;
|
|
||||||
connection.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.err.println("sleeping 10 seconds to allow for eventual consistency delay");
|
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3)
|
||||||
Thread.sleep(10000);
|
public void testParallel() throws InterruptedException, IOException {
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
URL gurl = new URL(url, "/tweets/get");
|
||||||
assert context.createInputStreamMap(container).size() > 0 : context.getEndPoint();
|
InputStream i = gurl.openStream();
|
||||||
}
|
String string = Utils.toStringAndClose(i);
|
||||||
}
|
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
||||||
|
}
|
||||||
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers")
|
|
||||||
public void testSerial() throws InterruptedException, IOException {
|
|
||||||
URL gurl = new URL(url, "/tweets/get");
|
|
||||||
InputStream i = gurl.openStream();
|
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3)
|
|
||||||
public void testParallel() throws InterruptedException, IOException {
|
|
||||||
URL gurl = new URL(url, "/tweets/get");
|
|
||||||
InputStream i = gurl.openStream();
|
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -53,7 +53,7 @@ public class AddTweetsControllerTest {
|
||||||
for (String name : new String[] { "1", "2" }) {
|
for (String name : new String[] { "1", "2" }) {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getAsyncBlobStore().createContainer(container).get();
|
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||||
blob.setPayload("I love beans!");
|
blob.setPayload("I love beans!");
|
||||||
|
|
|
@ -60,7 +60,7 @@ public class StoreTweetsControllerTest {
|
||||||
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
||||||
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
||||||
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
||||||
blobstore.getAsyncBlobStore().createContainer("favo").get();
|
blobstore.getAsyncBlobStore().createContainerInLocation(null, "favo").get();
|
||||||
}
|
}
|
||||||
return contexts;
|
return contexts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class KeyToStoredTweetStatusTest {
|
||||||
BlobMap createMap() throws InterruptedException, ExecutionException {
|
BlobMap createMap() throws InterruptedException, ExecutionException {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getBlobStore().createContainer("test1");
|
context.getBlobStore().createContainerInLocation(null, "test1");
|
||||||
return context.createBlobMap("test1");
|
return context.createBlobMap("test1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class ServiceToStoredTweetStatusesTest {
|
||||||
for (String name : new String[] { "1", "2" }) {
|
for (String name : new String[] { "1", "2" }) {
|
||||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||||
.buildContext();
|
.buildContext();
|
||||||
context.getAsyncBlobStore().createContainer(container).get();
|
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||||
blob.setPayload("I love beans!");
|
blob.setPayload("I love beans!");
|
||||||
|
|
|
@ -42,8 +42,6 @@ import org.jclouds.aws.s3.S3PropertiesBuilder;
|
||||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextBuilder;
|
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextBuilder;
|
||||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||||
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
||||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextBuilder;
|
|
||||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextFactory;
|
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
import org.jclouds.blobstore.BlobStoreContext;
|
||||||
import org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder;
|
import org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder;
|
||||||
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStoreContextBuilder;
|
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStoreContextBuilder;
|
||||||
|
@ -58,146 +56,150 @@ import org.testng.annotations.Test;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts up the Google App Engine for Java Development environment and deploys
|
* Starts up the Google App Engine for Java Development environment and deploys an application which
|
||||||
* an application which tests accesses twitter and blobstores.
|
* tests accesses twitter and blobstores.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "live", sequential = true, testName = "functionalTests")
|
@Test(groups = "live", sequential = true, testName = "functionalTests")
|
||||||
public class TweetStoreLiveTest {
|
public class TweetStoreLiveTest {
|
||||||
|
|
||||||
GoogleDevServer server;
|
GoogleDevServer server;
|
||||||
private URL url;
|
private URL url;
|
||||||
private ImmutableSet<BlobStoreContext<? extends Object, ? extends Object>> contexts;
|
private ImmutableSet<BlobStoreContext<? extends Object, ? extends Object>> contexts;
|
||||||
private String container;
|
private String container;
|
||||||
|
|
||||||
@BeforeTest
|
@BeforeTest
|
||||||
@Parameters( { "warfile", "devappserver.address", "devappserver.port" })
|
@Parameters( { "warfile", "devappserver.address", "devappserver.port" })
|
||||||
public void startDevAppServer(final String warfile, final String address,
|
public void startDevAppServer(final String warfile, final String address, final String port)
|
||||||
final String port) throws Exception {
|
throws Exception {
|
||||||
url = new URL(String.format("http://%s:%s", address, port));
|
url = new URL(String.format("http://%s:%s", address, port));
|
||||||
Properties props = new Properties();
|
Properties props = new Properties();
|
||||||
props.setProperty(PROPERTY_TWEETSTORE_CONTAINER,
|
props.setProperty(PROPERTY_TWEETSTORE_CONTAINER, checkNotNull(System
|
||||||
checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER), PROPERTY_TWEETSTORE_CONTAINER));
|
.getProperty(PROPERTY_TWEETSTORE_CONTAINER), PROPERTY_TWEETSTORE_CONTAINER));
|
||||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS,
|
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS,
|
||||||
// WATCH THIS.. when adding a new context, you must update the string
|
// WATCH THIS.. when adding a new context, you must update the string
|
||||||
String.format("%s,%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
// String.format("%s,%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
||||||
CloudFilesBlobStoreContextBuilder.class.getName(),
|
// CloudFilesBlobStoreContextBuilder.class.getName(),
|
||||||
AzureBlobStoreContextBuilder.class.getName()));
|
// AzureBlobStoreContextBuilder.class.getName()));
|
||||||
|
String.format("%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
||||||
|
CloudFilesBlobStoreContextBuilder.class.getName()));
|
||||||
|
props = new TwitterPropertiesBuilder(props).withCredentials(
|
||||||
|
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
||||||
|
System.getProperty(PROPERTY_TWITTER_PASSWORD, PROPERTY_TWITTER_PASSWORD)).build();
|
||||||
|
|
||||||
props = new TwitterPropertiesBuilder(props).withCredentials(
|
props = new TwitterPropertiesBuilder(props).withCredentials(
|
||||||
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
||||||
System.getProperty(PROPERTY_TWITTER_PASSWORD, PROPERTY_TWITTER_PASSWORD))
|
System.getProperty(PROPERTY_TWITTER_PASSWORD, PROPERTY_TWITTER_PASSWORD)).build();
|
||||||
.build();
|
|
||||||
|
|
||||||
props = new S3PropertiesBuilder(props).withCredentials(
|
props = new S3PropertiesBuilder(props)
|
||||||
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID),
|
.withCredentials(
|
||||||
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY))
|
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID),
|
||||||
.build();
|
PROPERTY_AWS_ACCESSKEYID),
|
||||||
|
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY,
|
||||||
|
PROPERTY_AWS_SECRETACCESSKEY)).build();
|
||||||
|
|
||||||
props = new CloudFilesPropertiesBuilder(props).withCredentials(
|
props = new CloudFilesPropertiesBuilder(props).withCredentials(
|
||||||
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
||||||
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY))
|
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY)).build();
|
||||||
.build();
|
|
||||||
|
|
||||||
props = new AzureBlobPropertiesBuilder(props).withCredentials(
|
props = new AzureBlobPropertiesBuilder(props).withCredentials(
|
||||||
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY))
|
PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
.build();
|
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY)).build();
|
||||||
|
|
||||||
server = new GoogleDevServer();
|
server = new GoogleDevServer();
|
||||||
server.writePropertiesAndStartServer(address, port, warfile, props);
|
server.writePropertiesAndStartServer(address, port, warfile, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
void clearAndCreateContainers() throws InterruptedException,
|
void clearAndCreateContainers() throws InterruptedException, ExecutionException,
|
||||||
ExecutionException, TimeoutException {
|
TimeoutException {
|
||||||
container = checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER));
|
container = checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER));
|
||||||
BlobStoreContext<?, ?> s3Context = S3BlobStoreContextFactory.createContext(
|
BlobStoreContext<?, ?> s3Context = S3BlobStoreContextFactory.createContext(checkNotNull(
|
||||||
checkNotNull(System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID),
|
System.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID), System
|
||||||
System.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY));
|
.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY));
|
||||||
|
|
||||||
BlobStoreContext<?, ?> cfContext = CloudFilesBlobStoreContextFactory.createContext(
|
BlobStoreContext<?, ?> cfContext = CloudFilesBlobStoreContextFactory.createContext(
|
||||||
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
checkNotNull(System.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER),
|
||||||
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY));
|
System.getProperty(PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY));
|
||||||
|
|
||||||
BlobStoreContext<?, ?> azContext = AzureBlobStoreContextFactory.createContext(
|
// BlobStoreContext<?, ?> azContext = AzureBlobStoreContextFactory.createContext(checkNotNull(
|
||||||
checkNotNull(System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
// System.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT),
|
||||||
System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
// System.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
||||||
|
//
|
||||||
|
// this.contexts = ImmutableSet.of(s3Context, cfContext, azContext);
|
||||||
|
this.contexts = ImmutableSet.of(s3Context, cfContext);
|
||||||
|
boolean deleted = false;
|
||||||
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
|
if (context.getBlobStore().containerExists(container)) {
|
||||||
|
System.err.printf("deleting container %s at %s%n", container, context.getEndPoint());
|
||||||
|
context.getBlobStore().deleteContainer(container);
|
||||||
|
deleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (deleted) {
|
||||||
|
System.err.println("sleeping 30 seconds to allow containers to clear");
|
||||||
|
Thread.sleep(30000);
|
||||||
|
}
|
||||||
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
|
System.err.printf("creating container %s at %s%n", container, context.getEndPoint());
|
||||||
|
context.getBlobStore().createContainerInLocation(null, container);
|
||||||
|
}
|
||||||
|
if (deleted) {
|
||||||
|
System.err.println("sleeping 5 seconds to allow containers to create");
|
||||||
|
Thread.sleep(30000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.contexts = ImmutableSet.of(s3Context, cfContext, azContext);
|
@Test
|
||||||
boolean deleted = false;
|
public void shouldPass() throws InterruptedException, IOException {
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
InputStream i = url.openStream();
|
||||||
if (context.getBlobStore().containerExists(container)) {
|
String string = Utils.toStringAndClose(i);
|
||||||
System.err.printf("deleting container %s at %s%n", container,
|
assert string.indexOf("Welcome") >= 0 : string;
|
||||||
context.getEndPoint());
|
}
|
||||||
context.getBlobStore().deleteContainer(container);
|
|
||||||
deleted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (deleted) {
|
|
||||||
System.err.println("sleeping 30 seconds to allow containers to clear");
|
|
||||||
Thread.sleep(30000);
|
|
||||||
}
|
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
|
||||||
System.err.printf("creating container %s at %s%n", container,
|
|
||||||
context.getEndPoint());
|
|
||||||
context.getBlobStore().createContainer(container);
|
|
||||||
}
|
|
||||||
if (deleted) {
|
|
||||||
System.err.println("sleeping 5 seconds to allow containers to create");
|
|
||||||
Thread.sleep(30000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class)
|
||||||
public void shouldPass() throws InterruptedException, IOException {
|
public void shouldFail() throws InterruptedException, IOException {
|
||||||
InputStream i = url.openStream();
|
new URL(url, "/store/do").openStream();
|
||||||
String string = Utils.toStringAndClose(i);
|
}
|
||||||
assert string.indexOf("Welcome") >= 0 : string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class)
|
@Test(dependsOnMethods = "shouldFail")
|
||||||
public void shouldFail() throws InterruptedException, IOException {
|
public void testPrimeContainers() throws IOException, InterruptedException {
|
||||||
new URL(url, "/store/do").openStream();
|
URL gurl = new URL(url, "/store/do");
|
||||||
}
|
|
||||||
|
|
||||||
@Test(dependsOnMethods = "shouldFail")
|
for (String context : new String[] { "S3", "CloudFiles" }) {
|
||||||
public void testPrimeContainers() throws IOException, InterruptedException {
|
// for (String context : new String[] { "S3", "Azure", "CloudFiles" }) {
|
||||||
URL gurl = new URL(url, "/store/do");
|
System.out.println("storing at context: " + context);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) gurl.openConnection();
|
||||||
|
connection.addRequestProperty("X-AppEngine-QueueName", "twitter");
|
||||||
|
connection.addRequestProperty("context", context);
|
||||||
|
InputStream i = connection.getInputStream();
|
||||||
|
String string = Utils.toStringAndClose(i);
|
||||||
|
assert string.indexOf("Done!") >= 0 : string;
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
for (String context : new String[] { "S3", "Azure", "CloudFiles" }) {
|
System.err.println("sleeping 10 seconds to allow for eventual consistency delay");
|
||||||
System.out.println("storing at context: " + context);
|
Thread.sleep(10000);
|
||||||
HttpURLConnection connection = (HttpURLConnection) gurl
|
for (BlobStoreContext<?, ?> context : contexts) {
|
||||||
.openConnection();
|
assert context.createInputStreamMap(container).size() > 0 : context.getEndPoint();
|
||||||
connection.addRequestProperty("X-AppEngine-QueueName", "twitter");
|
}
|
||||||
connection.addRequestProperty("context", context);
|
}
|
||||||
InputStream i = connection.getInputStream();
|
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Done!") >= 0 : string;
|
|
||||||
connection.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.err.println("sleeping 10 seconds to allow for eventual consistency delay");
|
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers")
|
||||||
Thread.sleep(10000);
|
public void testSerial() throws InterruptedException, IOException {
|
||||||
for (BlobStoreContext<?, ?> context : contexts) {
|
URL gurl = new URL(url, "/tweets/get");
|
||||||
assert context.createInputStreamMap(container).size() > 0 : context.getEndPoint();
|
InputStream i = gurl.openStream();
|
||||||
}
|
String string = Utils.toStringAndClose(i);
|
||||||
}
|
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
||||||
|
}
|
||||||
|
|
||||||
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers")
|
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3)
|
||||||
public void testSerial() throws InterruptedException, IOException {
|
public void testParallel() throws InterruptedException, IOException {
|
||||||
URL gurl = new URL(url, "/tweets/get");
|
URL gurl = new URL(url, "/tweets/get");
|
||||||
InputStream i = gurl.openStream();
|
InputStream i = gurl.openStream();
|
||||||
String string = Utils.toStringAndClose(i);
|
String string = Utils.toStringAndClose(i);
|
||||||
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3)
|
|
||||||
public void testParallel() throws InterruptedException, IOException {
|
|
||||||
URL gurl = new URL(url, "/tweets/get");
|
|
||||||
InputStream i = gurl.openStream();
|
|
||||||
String string = Utils.toStringAndClose(i);
|
|
||||||
assert string.indexOf("Tweets in Clouds") >= 0 : string;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -19,7 +19,7 @@
|
||||||
package org.jclouds.http.pool;
|
package org.jclouds.http.pool;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
|
@ -148,10 +148,10 @@ public class ConnectionPoolTransformingHttpCommandExecutorService<C> extends Bas
|
||||||
transformerLogger.debug("Processed intermediate result for: %s", o);
|
transformerLogger.debug("Processed intermediate result for: %s", o);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}));
|
}), executorService);
|
||||||
|
|
||||||
HttpCommandRendezvous<T> rendezvous = new HttpCommandRendezvous<T>(command, channel,
|
HttpCommandRendezvous<T> rendezvous = new HttpCommandRendezvous<T>(command, channel,
|
||||||
makeListenable(future));
|
makeListenable(future, executorService));
|
||||||
commandQueue.add(rendezvous);
|
commandQueue.add(rendezvous);
|
||||||
return rendezvous.getListenableFuture();
|
return rendezvous.getListenableFuture();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
package org.jclouds.rackspace.cloudfiles.blobstore;
|
package org.jclouds.rackspace.cloudfiles.blobstore;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.compose;
|
import static com.google.common.util.concurrent.Futures.compose;
|
||||||
import static com.google.common.util.concurrent.Futures.makeListenable;
|
import static org.jclouds.concurrent.internal.ConcurrentUtils.makeListenable;
|
||||||
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
@ -108,7 +108,7 @@ public class CloudFilesAsyncBlobStore extends BaseCloudFilesBlobStore implements
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -128,7 +128,7 @@ public class CloudFilesAsyncBlobStore extends BaseCloudFilesBlobStore implements
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> containerExists(String container) {
|
public ListenableFuture<Boolean> containerExists(String container) {
|
||||||
|
@ -179,7 +179,7 @@ public class CloudFilesAsyncBlobStore extends BaseCloudFilesBlobStore implements
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
public ListenableFuture<Boolean> directoryExists(final String container, final String directory) {
|
||||||
|
@ -193,7 +193,7 @@ public class CloudFilesAsyncBlobStore extends BaseCloudFilesBlobStore implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,7 @@ public class VCloudClientLiveTest {
|
||||||
assertNotNull(response.getId());
|
assertNotNull(response.getId());
|
||||||
assertNotNull(response.getLocation());
|
assertNotNull(response.getLocation());
|
||||||
assertNotNull(response.getTasks());
|
assertNotNull(response.getTasks());
|
||||||
assertEquals(connection.getTasksList(response.getId()), response.getId());
|
assertEquals(connection.getTasksList(response.getId()).getId(), response.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue