mirror of https://github.com/apache/jclouds.git
Issue 130, Issue 29: normalize location, called Region in amazon speak, restructured domain model across compute and blobstore
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2658 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
bc334b9447
commit
d8e6c0e248
|
@ -32,7 +32,7 @@ import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.binders.BindAtmosObjectToPayloadAndMetadataToHeaders;
|
import org.jclouds.atmosonline.saas.binders.BindAtmosObjectToPayloadAndMetadataToHeaders;
|
||||||
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
||||||
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
||||||
|
@ -84,7 +84,7 @@ public interface AtmosStorageAsyncClient {
|
||||||
@Path("/rest/namespace")
|
@Path("/rest/namespace")
|
||||||
@ResponseParser(ParseDirectoryListFromContentAndHeaders.class)
|
@ResponseParser(ParseDirectoryListFromContentAndHeaders.class)
|
||||||
@Consumes(MediaType.TEXT_XML)
|
@Consumes(MediaType.TEXT_XML)
|
||||||
ListenableFuture<? extends BoundedSortedSet<? extends DirectoryEntry>> listDirectories(
|
ListenableFuture<? extends BoundedSet<? extends DirectoryEntry>> listDirectories(
|
||||||
ListOptions... options);
|
ListOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,7 +95,7 @@ public interface AtmosStorageAsyncClient {
|
||||||
@ResponseParser(ParseDirectoryListFromContentAndHeaders.class)
|
@ResponseParser(ParseDirectoryListFromContentAndHeaders.class)
|
||||||
@ExceptionParser(ThrowContainerNotFoundOn404.class)
|
@ExceptionParser(ThrowContainerNotFoundOn404.class)
|
||||||
@Consumes(MediaType.TEXT_XML)
|
@Consumes(MediaType.TEXT_XML)
|
||||||
ListenableFuture<? extends BoundedSortedSet<? extends DirectoryEntry>> listDirectory(
|
ListenableFuture<? extends BoundedSet<? extends DirectoryEntry>> listDirectory(
|
||||||
@PathParam("directoryName") String directoryName, ListOptions... options);
|
@PathParam("directoryName") String directoryName, ListOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -22,7 +22,7 @@ import java.net.URI;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
||||||
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
||||||
|
@ -43,9 +43,9 @@ public interface AtmosStorageClient {
|
||||||
|
|
||||||
AtmosObject newObject();
|
AtmosObject newObject();
|
||||||
|
|
||||||
BoundedSortedSet<? extends DirectoryEntry> listDirectories(ListOptions... options);
|
BoundedSet<? extends DirectoryEntry> listDirectories(ListOptions... options);
|
||||||
|
|
||||||
BoundedSortedSet<? extends DirectoryEntry> listDirectory(String directoryName,
|
BoundedSet<? extends DirectoryEntry> listDirectory(String directoryName,
|
||||||
ListOptions... options);
|
ListOptions... options);
|
||||||
|
|
||||||
URI createDirectory(String directoryName);
|
URI createDirectory(String directoryName);
|
||||||
|
|
|
@ -43,7 +43,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||||
import org.jclouds.blobstore.strategy.ClearListStrategy;
|
import org.jclouds.blobstore.strategy.ClearListStrategy;
|
||||||
|
@ -101,7 +101,10 @@ public class AtmosAsyncBlobStore extends BaseAtmosBlobStore implements AsyncBlob
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainer(String container) {
|
/**
|
||||||
|
* Note that location is currently ignored.
|
||||||
|
*/
|
||||||
|
public ListenableFuture<Boolean> createContainerInLocation(String location, String container) {
|
||||||
return compose(async.createDirectory(container), new Function<URI, Boolean>() {
|
return compose(async.createDirectory(container), new Function<URI, Boolean>() {
|
||||||
|
|
||||||
public Boolean apply(URI from) {
|
public Boolean apply(URI from) {
|
||||||
|
@ -155,11 +158,11 @@ public class AtmosAsyncBlobStore extends BaseAtmosBlobStore implements AsyncBlob
|
||||||
return compose(returnVal, object2Blob, service);
|
return compose(returnVal, object2Blob, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListResponse<? extends ResourceMetadata>> list() {
|
public ListenableFuture<? extends ListResponse<? extends StorageMetadata>> list() {
|
||||||
return compose(async.listDirectories(), container2ResourceList, service);
|
return compose(async.listDirectories(), container2ResourceList, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListContainerResponse<? extends ResourceMetadata>> list(
|
public ListenableFuture<? extends ListContainerResponse<? extends StorageMetadata>> list(
|
||||||
String container, org.jclouds.blobstore.options.ListContainerOptions... optionsList) {
|
String container, org.jclouds.blobstore.options.ListContainerOptions... optionsList) {
|
||||||
if (optionsList.length == 1) {
|
if (optionsList.length == 1) {
|
||||||
if (optionsList[0].isRecursive()) {
|
if (optionsList[0].isRecursive()) {
|
||||||
|
|
|
@ -38,7 +38,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||||
import org.jclouds.blobstore.strategy.ClearListStrategy;
|
import org.jclouds.blobstore.strategy.ClearListStrategy;
|
||||||
|
@ -59,7 +59,8 @@ public class AtmosBlobStore extends BaseAtmosBlobStore implements BlobStore {
|
||||||
ObjectToBlob object2Blob, BlobToObject blob2Object,
|
ObjectToBlob object2Blob, BlobToObject blob2Object,
|
||||||
BlobStoreListOptionsToListOptions container2ContainerListOptions,
|
BlobStoreListOptionsToListOptions container2ContainerListOptions,
|
||||||
BlobToHttpGetOptions blob2ObjectGetOptions,
|
BlobToHttpGetOptions blob2ObjectGetOptions,
|
||||||
DirectoryEntryListToResourceMetadataList container2ResourceList, ExecutorService service,EncryptionService encryptionService) {
|
DirectoryEntryListToResourceMetadataList container2ResourceList,
|
||||||
|
ExecutorService service, EncryptionService encryptionService) {
|
||||||
super(async, sync, blobFactory, logFactory, clearContainerStrategy, object2BlobMd,
|
super(async, sync, blobFactory, logFactory, clearContainerStrategy, object2BlobMd,
|
||||||
object2Blob, blob2Object, container2ContainerListOptions, blob2ObjectGetOptions,
|
object2Blob, blob2Object, container2ContainerListOptions, blob2ObjectGetOptions,
|
||||||
container2ResourceList, service);
|
container2ResourceList, service);
|
||||||
|
@ -77,7 +78,10 @@ public class AtmosBlobStore extends BaseAtmosBlobStore implements BlobStore {
|
||||||
clearContainerStrategy.execute(container, recursive());
|
clearContainerStrategy.execute(container, recursive());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean createContainer(String container) {
|
/**
|
||||||
|
* Note that location is currently ignored.
|
||||||
|
*/
|
||||||
|
public boolean createContainerInLocation(String location, String container) {
|
||||||
sync.createDirectory(container);
|
sync.createDirectory(container);
|
||||||
return true;// no etag
|
return true;// no etag
|
||||||
}
|
}
|
||||||
|
@ -120,11 +124,11 @@ public class AtmosBlobStore extends BaseAtmosBlobStore implements BlobStore {
|
||||||
return object2Blob.apply(sync.readFile(container + "/" + key, httpOptions));
|
return object2Blob.apply(sync.readFile(container + "/" + key, httpOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListResponse<? extends ResourceMetadata> list() {
|
public ListResponse<? extends StorageMetadata> list() {
|
||||||
return container2ResourceList.apply(sync.listDirectories());
|
return container2ResourceList.apply(sync.listDirectories());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> list(String container,
|
public ListContainerResponse<? extends StorageMetadata> list(String container,
|
||||||
org.jclouds.blobstore.options.ListContainerOptions... optionsList) {
|
org.jclouds.blobstore.options.ListContainerOptions... optionsList) {
|
||||||
if (optionsList.length == 1) {
|
if (optionsList.length == 1) {
|
||||||
if (optionsList[0].isRecursive()) {
|
if (optionsList[0].isRecursive()) {
|
||||||
|
|
|
@ -20,15 +20,15 @@ package org.jclouds.atmosonline.saas.blobstore.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.FileType;
|
import org.jclouds.atmosonline.saas.domain.FileType;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
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.blobstore.domain.internal.BlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.BlobMetadataImpl;
|
||||||
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
||||||
import org.jclouds.blobstore.domain.internal.ResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.StorageMetadataImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
@ -40,24 +40,24 @@ import com.google.common.collect.Maps;
|
||||||
@Singleton
|
@Singleton
|
||||||
public class DirectoryEntryListToResourceMetadataList
|
public class DirectoryEntryListToResourceMetadataList
|
||||||
implements
|
implements
|
||||||
Function<BoundedSortedSet<? extends DirectoryEntry>, ListContainerResponse<? extends ResourceMetadata>> {
|
Function<BoundedSet<? extends DirectoryEntry>, ListContainerResponse<? extends StorageMetadata>> {
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> apply(
|
public ListContainerResponse<? extends StorageMetadata> apply(
|
||||||
BoundedSortedSet<? extends DirectoryEntry> from) {
|
BoundedSet<? extends DirectoryEntry> from) {
|
||||||
|
|
||||||
return new ListContainerResponseImpl<ResourceMetadata>(Iterables.transform(from,
|
return new ListContainerResponseImpl<StorageMetadata>(Iterables.transform(from,
|
||||||
new Function<DirectoryEntry, ResourceMetadata>() {
|
new Function<DirectoryEntry, StorageMetadata>() {
|
||||||
|
|
||||||
public ResourceMetadata apply(DirectoryEntry from) {
|
public StorageMetadata apply(DirectoryEntry from) {
|
||||||
ResourceType type = from.getType() == FileType.DIRECTORY ? ResourceType.FOLDER
|
StorageType type = from.getType() == FileType.DIRECTORY ? StorageType.FOLDER
|
||||||
: ResourceType.BLOB;
|
: StorageType.BLOB;
|
||||||
if (type == ResourceType.FOLDER)
|
if (type == StorageType.FOLDER)
|
||||||
return new ResourceMetadataImpl(type, from.getObjectID(), from
|
return new StorageMetadataImpl(type, from.getObjectID(), from
|
||||||
.getObjectName(), null, null, null, null, Maps
|
.getObjectName(), null, null, null, null, null, Maps
|
||||||
.<String, String> newHashMap());
|
.<String, String> newHashMap());
|
||||||
else
|
else
|
||||||
return new BlobMetadataImpl(from.getObjectID(), from.getObjectName(), null,
|
return new BlobMetadataImpl(from.getObjectID(), from.getObjectName(), null,
|
||||||
null, null, null, Maps.<String, String> newHashMap(), null, null);
|
null, null, null, null, Maps.<String, String> newHashMap(), null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}), null, from.getToken(),
|
}), null, from.getToken(),
|
||||||
|
|
|
@ -29,7 +29,7 @@ import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
||||||
import org.jclouds.atmosonline.saas.domain.FileType;
|
import org.jclouds.atmosonline.saas.domain.FileType;
|
||||||
import org.jclouds.atmosonline.saas.functions.AtmosObjectName;
|
import org.jclouds.atmosonline.saas.functions.AtmosObjectName;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||||
import org.jclouds.encryption.EncryptionService;
|
import org.jclouds.encryption.EncryptionService;
|
||||||
|
|
||||||
|
@ -66,9 +66,9 @@ public class ObjectToBlobMetadata implements Function<AtmosObject, MutableBlobMe
|
||||||
to.setName(objectName.apply(from));
|
to.setName(objectName.apply(from));
|
||||||
to.setSize(from.getSystemMetadata().getSize());
|
to.setSize(from.getSystemMetadata().getSize());
|
||||||
if (from.getSystemMetadata().getType() == FileType.DIRECTORY) {
|
if (from.getSystemMetadata().getType() == FileType.DIRECTORY) {
|
||||||
to.setType(ResourceType.FOLDER);
|
to.setType(StorageType.FOLDER);
|
||||||
} else {
|
} else {
|
||||||
to.setType(ResourceType.BLOB);
|
to.setType(StorageType.BLOB);
|
||||||
}
|
}
|
||||||
Map<String, String> lowerKeyMetadata = Maps.newHashMap();
|
Map<String, String> lowerKeyMetadata = Maps.newHashMap();
|
||||||
for (Entry<String, String> entry : from.getUserMetadata().getMetadata().entrySet()) {
|
for (Entry<String, String> entry : from.getUserMetadata().getMetadata().entrySet()) {
|
||||||
|
|
|
@ -20,12 +20,12 @@ package org.jclouds.atmosonline.saas.blobstore.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.FileType;
|
import org.jclouds.atmosonline.saas.domain.FileType;
|
||||||
import org.jclouds.atmosonline.saas.domain.internal.BoundedTreeSet;
|
import org.jclouds.atmosonline.saas.domain.internal.BoundedHashSet;
|
||||||
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 com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
@ -36,15 +36,15 @@ import com.google.common.collect.Iterables;
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ResourceMetadataListToDirectoryEntryList
|
public class ResourceMetadataListToDirectoryEntryList
|
||||||
implements
|
implements
|
||||||
Function<org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>, BoundedSortedSet<? extends DirectoryEntry>> {
|
Function<org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>, BoundedSet<? extends DirectoryEntry>> {
|
||||||
|
|
||||||
public BoundedSortedSet<DirectoryEntry> apply(
|
public BoundedSet<DirectoryEntry> apply(
|
||||||
org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata> from) {
|
org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata> from) {
|
||||||
|
|
||||||
return new BoundedTreeSet<DirectoryEntry>(Iterables.transform(from,
|
return new BoundedHashSet<DirectoryEntry>(Iterables.transform(from,
|
||||||
new Function<ResourceMetadata, DirectoryEntry>() {
|
new Function<StorageMetadata, DirectoryEntry>() {
|
||||||
public DirectoryEntry apply(ResourceMetadata from) {
|
public DirectoryEntry apply(StorageMetadata from) {
|
||||||
FileType type = (from.getType() == ResourceType.FOLDER || from.getType() == ResourceType.RELATIVE_PATH) ? FileType.DIRECTORY
|
FileType type = (from.getType() == StorageType.FOLDER || from.getType() == StorageType.RELATIVE_PATH) ? FileType.DIRECTORY
|
||||||
: FileType.REGULAR;
|
: FileType.REGULAR;
|
||||||
return new DirectoryEntry(from.getId(), type, from.getName());
|
return new DirectoryEntry(from.getId(), type, from.getName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.atmosonline.saas.domain;
|
package org.jclouds.atmosonline.saas.domain;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.internal.BoundedTreeSet;
|
import org.jclouds.atmosonline.saas.domain.internal.BoundedHashSet;
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ import com.google.inject.ImplementedBy;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ImplementedBy(BoundedTreeSet.class)
|
@ImplementedBy(BoundedHashSet.class)
|
||||||
public interface BoundedSortedSet<T> extends SortedSet<T> {
|
public interface BoundedSet<T> extends Set<T> {
|
||||||
|
|
||||||
String getToken();
|
String getToken();
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.atmosonline.saas.domain.internal;
|
package org.jclouds.atmosonline.saas.domain.internal;
|
||||||
|
|
||||||
import java.util.TreeSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
@ -29,13 +29,13 @@ import com.google.common.collect.Iterables;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class BoundedTreeSet<T> extends TreeSet<T> implements BoundedSortedSet<T> {
|
public class BoundedHashSet<T> extends HashSet<T> implements BoundedSet<T> {
|
||||||
|
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = -7133632087734650835L;
|
private static final long serialVersionUID = -7133632087734650835L;
|
||||||
protected final String token;
|
protected final String token;
|
||||||
|
|
||||||
public BoundedTreeSet(Iterable<T> contents, String token) {
|
public BoundedHashSet(Iterable<T> contents, String token) {
|
||||||
Iterables.addAll(this, contents);
|
Iterables.addAll(this, contents);
|
||||||
this.token = token;
|
this.token = token;
|
||||||
}
|
}
|
|
@ -22,9 +22,9 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.internal.BoundedTreeSet;
|
import org.jclouds.atmosonline.saas.domain.internal.BoundedHashSet;
|
||||||
import org.jclouds.atmosonline.saas.reference.AtmosStorageHeaders;
|
import org.jclouds.atmosonline.saas.reference.AtmosStorageHeaders;
|
||||||
import org.jclouds.atmosonline.saas.xml.ListDirectoryResponseHandler;
|
import org.jclouds.atmosonline.saas.xml.ListDirectoryResponseHandler;
|
||||||
import org.jclouds.http.HttpResponse;
|
import org.jclouds.http.HttpResponse;
|
||||||
|
@ -34,13 +34,13 @@ import org.jclouds.http.functions.ParseSax.Factory;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This parses {@link BoundedSortedSet} from HTTP headers and xml content.
|
* This parses {@link BoundedSet} from HTTP headers and xml content.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ParseDirectoryListFromContentAndHeaders implements
|
public class ParseDirectoryListFromContentAndHeaders implements
|
||||||
Function<HttpResponse, BoundedSortedSet<DirectoryEntry>> {
|
Function<HttpResponse, BoundedSet<DirectoryEntry>> {
|
||||||
|
|
||||||
private final ParseSax.Factory factory;
|
private final ParseSax.Factory factory;
|
||||||
private final Provider<ListDirectoryResponseHandler> listHandlerProvider;
|
private final Provider<ListDirectoryResponseHandler> listHandlerProvider;
|
||||||
|
@ -53,11 +53,11 @@ public class ParseDirectoryListFromContentAndHeaders implements
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* parses the http response headers to create a new {@link BoundedSortedSet} object.
|
* parses the http response headers to create a new {@link BoundedSet} object.
|
||||||
*/
|
*/
|
||||||
public BoundedSortedSet<DirectoryEntry> apply(HttpResponse from) {
|
public BoundedSet<DirectoryEntry> apply(HttpResponse from) {
|
||||||
String token = from.getFirstHeaderOrNull(AtmosStorageHeaders.TOKEN);
|
String token = from.getFirstHeaderOrNull(AtmosStorageHeaders.TOKEN);
|
||||||
return new BoundedTreeSet<DirectoryEntry>(factory.create(listHandlerProvider.get()).parse(
|
return new BoundedHashSet<DirectoryEntry>(factory.create(listHandlerProvider.get()).parse(
|
||||||
from.getContent()), token);
|
from.getContent()), token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.atmosonline.saas.blobstore.strategy.RecursiveRemove;
|
import org.jclouds.atmosonline.saas.blobstore.strategy.RecursiveRemove;
|
||||||
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.FileType;
|
import org.jclouds.atmosonline.saas.domain.FileType;
|
||||||
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
||||||
|
@ -128,7 +128,7 @@ public class AtmosStorageClientLiveTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testListDirectorys() throws Exception {
|
public void testListDirectorys() throws Exception {
|
||||||
BoundedSortedSet<? extends DirectoryEntry> response = connection.listDirectories();
|
BoundedSet<? extends DirectoryEntry> response = connection.listDirectories();
|
||||||
assert null != response;
|
assert null != response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,9 +150,9 @@ public class AtmosStorageClientLiveTest {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BoundedSortedSet<? extends DirectoryEntry> response = connection.listDirectories();
|
BoundedSet<? extends DirectoryEntry> response = connection.listDirectories();
|
||||||
for (DirectoryEntry id : response) {
|
for (DirectoryEntry id : response) {
|
||||||
BoundedSortedSet<? extends DirectoryEntry> r2 = connection.listDirectory(id
|
BoundedSet<? extends DirectoryEntry> r2 = connection.listDirectory(id
|
||||||
.getObjectName());
|
.getObjectName());
|
||||||
assert r2 != null;
|
assert r2 != null;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ public class AtmosStorageClientLiveTest {
|
||||||
createOrReplaceObject("object2", "here is my data!", "meta-value1");
|
createOrReplaceObject("object2", "here is my data!", "meta-value1");
|
||||||
createOrReplaceObject("object3", "here is my data!", "meta-value1");
|
createOrReplaceObject("object3", "here is my data!", "meta-value1");
|
||||||
createOrReplaceObject("object4", "here is my data!", "meta-value1");
|
createOrReplaceObject("object4", "here is my data!", "meta-value1");
|
||||||
BoundedSortedSet<? extends DirectoryEntry> r2 = connection.listDirectory(privateDirectory,
|
BoundedSet<? extends DirectoryEntry> r2 = connection.listDirectory(privateDirectory,
|
||||||
ListOptions.Builder.limit(1));
|
ListOptions.Builder.limit(1));
|
||||||
// test bug exists:
|
// test bug exists:
|
||||||
assertEquals(r2.size(), 3);
|
assertEquals(r2.size(), 3);
|
||||||
|
|
|
@ -35,7 +35,7 @@ import org.jclouds.atmosonline.saas.blobstore.functions.ListOptionsToBlobStoreLi
|
||||||
import org.jclouds.atmosonline.saas.blobstore.functions.ObjectToBlob;
|
import org.jclouds.atmosonline.saas.blobstore.functions.ObjectToBlob;
|
||||||
import org.jclouds.atmosonline.saas.blobstore.functions.ResourceMetadataListToDirectoryEntryList;
|
import org.jclouds.atmosonline.saas.blobstore.functions.ResourceMetadataListToDirectoryEntryList;
|
||||||
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
import org.jclouds.atmosonline.saas.domain.AtmosObject;
|
||||||
import org.jclouds.atmosonline.saas.domain.BoundedSortedSet;
|
import org.jclouds.atmosonline.saas.domain.BoundedSet;
|
||||||
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
import org.jclouds.atmosonline.saas.domain.DirectoryEntry;
|
||||||
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
import org.jclouds.atmosonline.saas.domain.SystemMetadata;
|
||||||
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
import org.jclouds.atmosonline.saas.domain.UserMetadata;
|
||||||
|
@ -96,13 +96,14 @@ public class StubAtmosStorageAsyncClient implements AtmosStorageAsyncClient {
|
||||||
container = directoryName.substring(0, directoryName.indexOf('/'));
|
container = directoryName.substring(0, directoryName.indexOf('/'));
|
||||||
else
|
else
|
||||||
container = directoryName;
|
container = directoryName;
|
||||||
return Futures.compose(blobStore.createContainer(container), new Function<Boolean, URI>() {
|
return Futures.compose(blobStore.createContainerInLocation("default", container),
|
||||||
|
new Function<Boolean, URI>() {
|
||||||
|
|
||||||
public URI apply(Boolean from) {
|
public URI apply(Boolean from) {
|
||||||
return URI.create("http://stub/containers/" + container);
|
return URI.create("http://stub/containers/" + container);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<URI> createFile(String parent, AtmosObject object) {
|
public ListenableFuture<URI> createFile(String parent, AtmosObject object) {
|
||||||
|
@ -171,14 +172,14 @@ public class StubAtmosStorageAsyncClient implements AtmosStorageAsyncClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends BoundedSortedSet<? extends DirectoryEntry>> listDirectories(
|
public ListenableFuture<? extends BoundedSet<? extends DirectoryEntry>> listDirectories(
|
||||||
ListOptions... optionsList) {
|
ListOptions... optionsList) {
|
||||||
// org.jclouds.blobstore.options.ListOptions options = container2ContainerListOptions
|
// org.jclouds.blobstore.options.ListOptions options = container2ContainerListOptions
|
||||||
// .apply(optionsList);
|
// .apply(optionsList);
|
||||||
return Futures.compose(blobStore.list(), resource2ObjectList);
|
return Futures.compose(blobStore.list(), resource2ObjectList);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends BoundedSortedSet<? extends DirectoryEntry>> listDirectory(
|
public ListenableFuture<? extends BoundedSet<? extends DirectoryEntry>> listDirectory(
|
||||||
String directoryName, ListOptions... optionsList) {
|
String directoryName, ListOptions... optionsList) {
|
||||||
org.jclouds.blobstore.options.ListContainerOptions options = container2ContainerListOptions
|
org.jclouds.blobstore.options.ListContainerOptions options = container2ContainerListOptions
|
||||||
.apply(optionsList);
|
.apply(optionsList);
|
||||||
|
|
|
@ -27,10 +27,63 @@ import com.google.common.base.CaseFormat;
|
||||||
* Regions used for all aws commands.
|
* Regions used for all aws commands.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
* @see <a href=
|
||||||
|
* "http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?LocationSelection.html" />
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public enum Region {
|
public enum Region {
|
||||||
|
|
||||||
DEFAULT, UNKNOWN, EU_WEST_1, US_EAST_1, US_WEST_1;
|
/**
|
||||||
|
* Allow the default region to be chosen based on the user-configured endpoint.
|
||||||
|
*/
|
||||||
|
DEFAULT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Region returned is unknown.
|
||||||
|
*/
|
||||||
|
UNKNOWN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EU (Ireland)
|
||||||
|
* <p/>
|
||||||
|
* <h3>S3</h3>
|
||||||
|
* <p/>
|
||||||
|
* In Amazon S3, the EU (Ireland) Region provides read-after-write consistency for PUTS of new
|
||||||
|
* objects in your Amazon S3 bucket and eventual consistency for overwrite PUTS and DELETES.
|
||||||
|
*/
|
||||||
|
EU_WEST_1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* US Standard
|
||||||
|
* <p/>
|
||||||
|
* <h3>S3</h3>
|
||||||
|
* <p/>
|
||||||
|
* This is the default Region. All requests sent to s3.amazonaws.com go to this Region unless you
|
||||||
|
* specify a LocationConstraint on a bucket. The US Standard Region automatically places your
|
||||||
|
* data in either Amazon's east or west coast data centers depending on what will provide you
|
||||||
|
* with the lowest latency. To use this region, do not set the LocationConstraint bucket
|
||||||
|
* parameter. The US Standard Region provides eventual consistency for all requests.
|
||||||
|
*/
|
||||||
|
US_STANDARD,
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
US_EAST_1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* US-West (Northern California) <h3>S3</h3> Uses Amazon S3 servers in Northern California
|
||||||
|
* <p/>
|
||||||
|
* Optionally, use the endpoint s3-us-west-1.amazonaws.com on all requests to this bucket to
|
||||||
|
* reduce the latency you might experience after the first hour of creating a bucket in this
|
||||||
|
* Region.
|
||||||
|
* <p/>
|
||||||
|
* In Amazon S3, the US-West (Northern California) Region provides read-after-write consistency
|
||||||
|
* for PUTS of new objects in your Amazon S3 bucket and eventual consistency for overwrite PUTS
|
||||||
|
* and DELETES.
|
||||||
|
*/
|
||||||
|
US_WEST_1;
|
||||||
|
|
||||||
public String value() {
|
public String value() {
|
||||||
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name());
|
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name());
|
||||||
|
|
|
@ -18,12 +18,15 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.ec2.compute;
|
package org.jclouds.aws.ec2.compute;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.withKeyName;
|
import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.withKeyName;
|
||||||
import static org.jclouds.scriptbuilder.domain.Statements.exec;
|
import static org.jclouds.scriptbuilder.domain.Statements.exec;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -38,18 +41,19 @@ import org.jclouds.aws.ec2.domain.InstanceState;
|
||||||
import org.jclouds.aws.ec2.domain.InstanceType;
|
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||||
import org.jclouds.aws.ec2.domain.IpProtocol;
|
import org.jclouds.aws.ec2.domain.IpProtocol;
|
||||||
import org.jclouds.aws.ec2.domain.KeyPair;
|
import org.jclouds.aws.ec2.domain.KeyPair;
|
||||||
import org.jclouds.aws.ec2.domain.Reservation;
|
|
||||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||||
import org.jclouds.compute.ComputeService;
|
import org.jclouds.compute.ComputeService;
|
||||||
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
|
import org.jclouds.compute.domain.ComputeType;
|
||||||
import org.jclouds.compute.domain.CreateNodeResponse;
|
import org.jclouds.compute.domain.CreateNodeResponse;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.LoginType;
|
import org.jclouds.compute.domain.LoginType;
|
||||||
import org.jclouds.compute.domain.NodeIdentity;
|
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.NodeState;
|
import org.jclouds.compute.domain.NodeState;
|
||||||
import org.jclouds.compute.domain.Profile;
|
import org.jclouds.compute.domain.Profile;
|
||||||
|
import org.jclouds.compute.domain.Size;
|
||||||
|
import org.jclouds.compute.domain.internal.ComputeMetadataImpl;
|
||||||
import org.jclouds.compute.domain.internal.CreateNodeResponseImpl;
|
import org.jclouds.compute.domain.internal.CreateNodeResponseImpl;
|
||||||
import org.jclouds.compute.domain.internal.NodeIdentityImpl;
|
|
||||||
import org.jclouds.compute.domain.internal.NodeMetadataImpl;
|
import org.jclouds.compute.domain.internal.NodeMetadataImpl;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
|
@ -107,14 +111,17 @@ public class EC2ComputeService implements ComputeService {
|
||||||
NodeState.PENDING).put(InstanceState.TERMINATED, NodeState.TERMINATED).build();
|
NodeState.PENDING).put(InstanceState.TERMINATED, NodeState.TERMINATED).build();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CreateNodeResponse createNode(String name, Profile profile, Image image) {
|
public CreateNodeResponse startNodeInLocation(String location, String name, Profile profile,
|
||||||
|
Image image) {
|
||||||
|
Region region = Region.fromValue(location);
|
||||||
|
|
||||||
InstanceType type = checkNotNull(profileInstanceTypeMap.get(profile),
|
InstanceType type = checkNotNull(profileInstanceTypeMap.get(profile),
|
||||||
"profile not supported: " + profile);
|
"profile not supported: " + profile);
|
||||||
String ami = checkNotNull(imageAmiIdMap.get(type).get(image), "image not supported: " + image);
|
String ami = checkNotNull(imageAmiIdMap.get(type).get(image), "image not supported: " + image);
|
||||||
|
|
||||||
KeyPair keyPair = createKeyPair(name);
|
KeyPair keyPair = createKeyPairInRegion(region, name);
|
||||||
String securityGroupName = name;
|
String securityGroupName = name;
|
||||||
createSecurityGroup(securityGroupName, 22, 80, 8080, 443);
|
createSecurityGroupInRegion(region, securityGroupName, 22, 80, 8080, 443);
|
||||||
|
|
||||||
String script = new ScriptBuilder() // update and install jdk
|
String script = new ScriptBuilder() // update and install jdk
|
||||||
.addStatement(exec("apt-get update"))//
|
.addStatement(exec("apt-get update"))//
|
||||||
|
@ -127,43 +134,46 @@ public class EC2ComputeService implements ComputeService {
|
||||||
logger.debug(">> running instance ami(%s) type(%s) keyPair(%s) securityGroup(%s)", ami, type,
|
logger.debug(">> running instance ami(%s) type(%s) keyPair(%s) securityGroup(%s)", ami, type,
|
||||||
keyPair.getKeyName(), securityGroupName);
|
keyPair.getKeyName(), securityGroupName);
|
||||||
|
|
||||||
RunningInstance runningInstance = Iterables.getLast(ec2Client.getInstanceServices()
|
RunningInstance runningInstance = Iterables.getOnlyElement(ec2Client.getInstanceServices()
|
||||||
.runInstancesInRegion(Region.DEFAULT, null, ami, 1, 1,
|
.runInstancesInRegion(region, null, ami, 1, 1, withKeyName(keyPair.getKeyName())// key
|
||||||
withKeyName(keyPair.getKeyName())// key I created above
|
// I
|
||||||
.asType(type)// instance size
|
// created
|
||||||
.withSecurityGroup(securityGroupName)// group I created above
|
// above
|
||||||
.withAdditionalInfo(name)// description
|
.asType(type)// instance size
|
||||||
.withUserData(script.getBytes()) // script to run as root
|
.withSecurityGroup(securityGroupName)// group I created above
|
||||||
).getRunningInstances());
|
.withAdditionalInfo(name)// description
|
||||||
|
.withUserData(script.getBytes()) // script to run as root
|
||||||
|
));
|
||||||
logger.debug("<< started instance(%s)", runningInstance.getId());
|
logger.debug("<< started instance(%s)", runningInstance.getId());
|
||||||
instanceStateRunning.apply(runningInstance);
|
instanceStateRunning.apply(runningInstance);
|
||||||
logger.debug("<< running instance(%s)", runningInstance.getId());
|
logger.debug("<< running instance(%s)", runningInstance.getId());
|
||||||
|
|
||||||
// refresh to get IP address
|
// refresh to get IP address
|
||||||
runningInstance = getRunningInstance(runningInstance.getId());
|
runningInstance = getOnlyRunningInstanceInRegion(region, runningInstance.getId());
|
||||||
|
|
||||||
Set<InetAddress> publicAddresses = runningInstance.getIpAddress() == null ? ImmutableSet
|
Set<InetAddress> publicAddresses = runningInstance.getIpAddress() == null ? ImmutableSet
|
||||||
.<InetAddress> of() : ImmutableSet.<InetAddress> of(runningInstance.getIpAddress());
|
.<InetAddress> of() : ImmutableSet.<InetAddress> of(runningInstance.getIpAddress());
|
||||||
Set<InetAddress> privateAddresses = runningInstance.getPrivateIpAddress() == null ? ImmutableSet
|
Set<InetAddress> privateAddresses = runningInstance.getPrivateIpAddress() == null ? ImmutableSet
|
||||||
.<InetAddress> of()
|
.<InetAddress> of()
|
||||||
: ImmutableSet.<InetAddress> of(runningInstance.getPrivateIpAddress());
|
: ImmutableSet.<InetAddress> of(runningInstance.getPrivateIpAddress());
|
||||||
return new CreateNodeResponseImpl(runningInstance.getId(), name, instanceToNodeState
|
return new CreateNodeResponseImpl(runningInstance.getId(), name, runningInstance.getRegion()
|
||||||
|
.toString(), null, ImmutableMap.<String, String> of(), instanceToNodeState
|
||||||
.get(runningInstance.getInstanceState()), publicAddresses, privateAddresses, 22,
|
.get(runningInstance.getInstanceState()), publicAddresses, privateAddresses, 22,
|
||||||
LoginType.SSH, new Credentials("root", keyPair.getKeyMaterial()), ImmutableMap
|
LoginType.SSH, new Credentials(image == Image.UBUNTU_90 ? "ubuntu" : "root", keyPair
|
||||||
.<String, String> of());
|
.getKeyMaterial()), ImmutableMap.<String, String> of());
|
||||||
}
|
}
|
||||||
|
|
||||||
private KeyPair createKeyPair(String name) {
|
private KeyPair createKeyPairInRegion(Region region, String name) {
|
||||||
logger.debug(">> creating keyPair name(%s)", name);
|
logger.debug(">> creating keyPair name(%s)", name);
|
||||||
KeyPair keyPair;
|
KeyPair keyPair;
|
||||||
try {
|
try {
|
||||||
keyPair = ec2Client.getKeyPairServices().createKeyPairInRegion(Region.DEFAULT, name);
|
keyPair = ec2Client.getKeyPairServices().createKeyPairInRegion(region, name);
|
||||||
logger.debug("<< created keyPair(%s)", keyPair.getKeyName());
|
logger.debug("<< created keyPair(%s)", keyPair.getKeyName());
|
||||||
|
|
||||||
} catch (AWSResponseException e) {
|
} catch (AWSResponseException e) {
|
||||||
if (e.getError().getCode().equals("InvalidKeyPair.Duplicate")) {
|
if (e.getError().getCode().equals("InvalidKeyPair.Duplicate")) {
|
||||||
keyPair = Iterables.getLast(ec2Client.getKeyPairServices().describeKeyPairsInRegion(
|
keyPair = Iterables.getLast(ec2Client.getKeyPairServices().describeKeyPairsInRegion(
|
||||||
Region.DEFAULT, name));
|
region, name));
|
||||||
logger.debug("<< reused keyPair(%s)", keyPair.getKeyName());
|
logger.debug("<< reused keyPair(%s)", keyPair.getKeyName());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -173,18 +183,17 @@ public class EC2ComputeService implements ComputeService {
|
||||||
return keyPair;
|
return keyPair;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSecurityGroup(String name, int... ports) {
|
private void createSecurityGroupInRegion(Region region, String name, int... ports) {
|
||||||
logger.debug(">> creating securityGroup name(%s)", name);
|
logger.debug(">> creating securityGroup name(%s)", name);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ec2Client.getSecurityGroupServices().createSecurityGroupInRegion(Region.DEFAULT, name,
|
ec2Client.getSecurityGroupServices().createSecurityGroupInRegion(region, name, name);
|
||||||
name);
|
|
||||||
logger.debug("<< created securityGroup(%s)", name);
|
logger.debug("<< created securityGroup(%s)", name);
|
||||||
logger.debug(">> authorizing securityGroup name(%s) ports(%s)", name, ImmutableSet
|
logger
|
||||||
.of(ports));
|
.debug(">> authorizing securityGroup name(%s) ports(%s)", name, Arrays
|
||||||
|
.asList(ports));
|
||||||
for (int port : ports) {
|
for (int port : ports) {
|
||||||
ec2Client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(
|
ec2Client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(region,
|
||||||
Region.DEFAULT, name, IpProtocol.TCP, port, port, "0.0.0.0/0");
|
name, IpProtocol.TCP, port, port, "0.0.0.0/0");
|
||||||
}
|
}
|
||||||
logger.debug("<< authorized securityGroup(%s)", name);
|
logger.debug("<< authorized securityGroup(%s)", name);
|
||||||
} catch (AWSResponseException e) {
|
} catch (AWSResponseException e) {
|
||||||
|
@ -198,8 +207,13 @@ public class EC2ComputeService implements ComputeService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NodeMetadata getNodeMetadata(String id) {
|
public NodeMetadata getNodeMetadata(ComputeMetadata node) {
|
||||||
RunningInstance runningInstance = getRunningInstance(id);
|
checkArgument(node.getType() == ComputeType.NODE, "this is only valid for nodes, not "
|
||||||
|
+ node.getType());
|
||||||
|
checkNotNull(node.getId(), "node.id");
|
||||||
|
Region region = getRegionFromNodeOrDefault(node);
|
||||||
|
RunningInstance runningInstance = Iterables.getOnlyElement(getAllRunningInstancesInRegion(
|
||||||
|
region, node.getId()));
|
||||||
return runningInstanceToNodeMetadata.apply(runningInstance);
|
return runningInstanceToNodeMetadata.apply(runningInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,9 +223,12 @@ public class EC2ComputeService implements ComputeService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NodeMetadata apply(RunningInstance from) {
|
public NodeMetadata apply(RunningInstance from) {
|
||||||
return new NodeMetadataImpl(from.getId(), from.getKeyName(), instanceToNodeState.get(from
|
return new NodeMetadataImpl(from.getId(), from.getKeyName(), from.getRegion().toString(),
|
||||||
.getInstanceState()), nullSafeSet(from.getIpAddress()), nullSafeSet(from
|
null, ImmutableMap.<String, String> of(), instanceToNodeState.get(from
|
||||||
.getPrivateIpAddress()), 22, LoginType.SSH, ImmutableMap.<String, String> of());
|
.getInstanceState()), nullSafeSet(from.getIpAddress()), nullSafeSet(from
|
||||||
|
.getPrivateIpAddress()), 22, LoginType.SSH, ImmutableMap
|
||||||
|
.<String, String> of("availabilityZone", from.getAvailabilityZone()
|
||||||
|
.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<InetAddress> nullSafeSet(InetAddress in) {
|
Set<InetAddress> nullSafeSet(InetAddress in) {
|
||||||
|
@ -222,21 +239,32 @@ public class EC2ComputeService implements ComputeService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private RunningInstance getRunningInstance(String id) {
|
private RunningInstance getOnlyRunningInstanceInRegion(Region region, String id) {
|
||||||
RunningInstance runningInstance = Iterables.getLast(Iterables.getLast(
|
Iterable<RunningInstance> instances = Iterables.filter(getAllRunningInstancesInRegion(region,
|
||||||
ec2Client.getInstanceServices().describeInstancesInRegion(Region.DEFAULT, id))
|
id), new Predicate<RunningInstance>() {
|
||||||
.getRunningInstances());
|
|
||||||
return runningInstance;
|
@Override
|
||||||
|
public boolean apply(RunningInstance instance) {
|
||||||
|
return instance.getInstanceState() == InstanceState.PENDING
|
||||||
|
|| instance.getInstanceState() == InstanceState.RUNNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
int size = Iterables.size(instances);
|
||||||
|
if (size == 0)
|
||||||
|
throw new NoSuchElementException(String.format(
|
||||||
|
"%d instances in region %s have an instance with id %s running.", size, region,
|
||||||
|
id));
|
||||||
|
if (size > 1)
|
||||||
|
throw new IllegalStateException(String.format(
|
||||||
|
"%d instances in region %s have an instance with id %s running. Expected 1",
|
||||||
|
size, region, id));
|
||||||
|
return Iterables.getOnlyElement(instances);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private Iterable<RunningInstance> getAllRunningInstancesInRegion(Region region, String id) {
|
||||||
public Set<NodeIdentity> getNodeByName(final String name) {
|
return Iterables
|
||||||
return Sets.newHashSet(Iterables.filter(listNodes(), new Predicate<NodeIdentity>() {
|
.concat(ec2Client.getInstanceServices().describeInstancesInRegion(region, id));
|
||||||
@Override
|
|
||||||
public boolean apply(NodeIdentity input) {
|
|
||||||
return input.getName().equalsIgnoreCase(name);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -244,16 +272,18 @@ public class EC2ComputeService implements ComputeService {
|
||||||
* keyname. This will break.
|
* keyname. This will break.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Set<NodeIdentity> listNodes() {
|
public Set<ComputeMetadata> listNodes() {
|
||||||
logger.debug(">> listing servers");
|
logger.debug(">> listing servers");
|
||||||
Set<NodeIdentity> servers = Sets.newHashSet();
|
Set<ComputeMetadata> servers = Sets.newHashSet();
|
||||||
for (Reservation reservation : ec2Client.getInstanceServices().describeInstancesInRegion(
|
for (Region region : ImmutableSet.of(Region.US_EAST_1, Region.US_WEST_1, Region.EU_WEST_1)) {
|
||||||
Region.DEFAULT)) {
|
Iterables.addAll(servers, Iterables.transform(Iterables.concat(ec2Client
|
||||||
Iterables.addAll(servers, Iterables.transform(reservation.getRunningInstances(),
|
.getInstanceServices().describeInstancesInRegion(region)),
|
||||||
new Function<RunningInstance, NodeIdentity>() {
|
new Function<RunningInstance, ComputeMetadata>() {
|
||||||
@Override
|
@Override
|
||||||
public NodeIdentity apply(RunningInstance from) {
|
public ComputeMetadata apply(RunningInstance from) {
|
||||||
return new NodeIdentityImpl(from.getId(), from.getKeyName());
|
return new ComputeMetadataImpl(ComputeType.NODE, from.getId(), from
|
||||||
|
.getKeyName(), from.getRegion().toString(), null, ImmutableMap
|
||||||
|
.<String, String> of());
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -262,18 +292,34 @@ public class EC2ComputeService implements ComputeService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyNode(String id) {
|
public void destroyNode(ComputeMetadata node) {
|
||||||
RunningInstance runningInstance = getRunningInstance(id);
|
checkArgument(node.getType() == ComputeType.NODE, "this is only valid for nodes, not "
|
||||||
// grab the old keyname
|
+ node.getType());
|
||||||
String name = runningInstance.getKeyName();
|
checkNotNull(node.getId(), "node.id");
|
||||||
logger.debug(">> terminating instance(%s)", runningInstance.getId());
|
Region region = getRegionFromNodeOrDefault(node);
|
||||||
ec2Client.getInstanceServices().terminateInstancesInRegion(Region.DEFAULT, id);
|
for (RunningInstance runningInstance : getAllRunningInstancesInRegion(region, node.getId())) {
|
||||||
logger.debug("<< terminated instance(%s)", runningInstance.getId());
|
// grab the old keyname
|
||||||
logger.debug(">> deleting keyPair(%s)", name);
|
String name = runningInstance.getKeyName();
|
||||||
ec2Client.getKeyPairServices().deleteKeyPairInRegion(Region.DEFAULT, name);
|
logger.debug(">> terminating instance(%s)", node.getId());
|
||||||
logger.debug("<< deleted keyPair(%s)", name);
|
ec2Client.getInstanceServices().terminateInstancesInRegion(region, node.getId());
|
||||||
logger.debug(">> deleting securityGroup(%s)", name);
|
logger.debug("<< terminated instance(%s)", node.getId());
|
||||||
ec2Client.getSecurityGroupServices().deleteSecurityGroupInRegion(Region.DEFAULT, name);
|
logger.debug(">> deleting keyPair(%s)", name);
|
||||||
logger.debug("<< deleted securityGroup(%s)", name);
|
ec2Client.getKeyPairServices().deleteKeyPairInRegion(region, name);
|
||||||
|
logger.debug("<< deleted keyPair(%s)", name);
|
||||||
|
logger.debug(">> deleting securityGroup(%s)", name);
|
||||||
|
ec2Client.getSecurityGroupServices().deleteSecurityGroupInRegion(region, name);
|
||||||
|
logger.debug("<< deleted securityGroup(%s)", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Region getRegionFromNodeOrDefault(ComputeMetadata node) {
|
||||||
|
Region region = node.getLocation() != null ? Region.fromValue(node.getLocation())
|
||||||
|
: Region.DEFAULT;
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Size> getSizes() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,10 +20,13 @@ package org.jclouds.aws.ec2.domain;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.aws.domain.Region;
|
import org.jclouds.aws.domain.Region;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.inject.internal.Nullable;
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,11 +35,13 @@ import com.google.inject.internal.Nullable;
|
||||||
* />
|
* />
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class Reservation implements Comparable<Reservation> {
|
public class Reservation extends LinkedHashSet<RunningInstance> implements Comparable<Reservation>,
|
||||||
|
Set<RunningInstance> {
|
||||||
|
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = -9051777593518861395L;
|
||||||
private final Region region;
|
private final Region region;
|
||||||
private final Set<String> groupIds;
|
private final Set<String> groupIds = Sets.newLinkedHashSet();
|
||||||
private final Set<RunningInstance> instances;
|
|
||||||
private final @Nullable
|
private final @Nullable
|
||||||
String ownerId;
|
String ownerId;
|
||||||
private final @Nullable
|
private final @Nullable
|
||||||
|
@ -44,11 +49,12 @@ public class Reservation implements Comparable<Reservation> {
|
||||||
private final @Nullable
|
private final @Nullable
|
||||||
String reservationId;
|
String reservationId;
|
||||||
|
|
||||||
public Reservation(Region region, Set<String> groupIds, Set<RunningInstance> instances,
|
public Reservation(Region region, Iterable<String> groupIds,
|
||||||
@Nullable String ownerId, @Nullable String requesterId, @Nullable String reservationId) {
|
Iterable<RunningInstance> instances, @Nullable String ownerId,
|
||||||
|
@Nullable String requesterId, @Nullable String reservationId) {
|
||||||
this.region = checkNotNull(region, "region");
|
this.region = checkNotNull(region, "region");
|
||||||
this.groupIds = checkNotNull(groupIds, "groupIds");
|
Iterables.addAll(this.groupIds, checkNotNull(groupIds, "groupIds"));
|
||||||
this.instances = checkNotNull(instances, "instances");
|
Iterables.addAll(this, checkNotNull(instances, "instances"));
|
||||||
this.ownerId = ownerId;
|
this.ownerId = ownerId;
|
||||||
this.requesterId = requesterId;
|
this.requesterId = requesterId;
|
||||||
this.reservationId = reservationId;
|
this.reservationId = reservationId;
|
||||||
|
@ -72,10 +78,6 @@ public class Reservation implements Comparable<Reservation> {
|
||||||
return groupIds;
|
return groupIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<RunningInstance> getRunningInstances() {
|
|
||||||
return instances;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AWS Access Key ID of the user who owns the reservation.
|
* AWS Access Key ID of the user who owns the reservation.
|
||||||
*/
|
*/
|
||||||
|
@ -100,9 +102,8 @@ public class Reservation implements Comparable<Reservation> {
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = super.hashCode();
|
||||||
result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode());
|
result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode());
|
||||||
result = prime * result + ((instances == null) ? 0 : instances.hashCode());
|
|
||||||
result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode());
|
result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode());
|
||||||
result = prime * result + ((region == null) ? 0 : region.hashCode());
|
result = prime * result + ((region == null) ? 0 : region.hashCode());
|
||||||
result = prime * result + ((requesterId == null) ? 0 : requesterId.hashCode());
|
result = prime * result + ((requesterId == null) ? 0 : requesterId.hashCode());
|
||||||
|
@ -114,7 +115,7 @@ public class Reservation implements Comparable<Reservation> {
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj)
|
if (this == obj)
|
||||||
return true;
|
return true;
|
||||||
if (obj == null)
|
if (!super.equals(obj))
|
||||||
return false;
|
return false;
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
|
@ -124,11 +125,6 @@ public class Reservation implements Comparable<Reservation> {
|
||||||
return false;
|
return false;
|
||||||
} else if (!groupIds.equals(other.groupIds))
|
} else if (!groupIds.equals(other.groupIds))
|
||||||
return false;
|
return false;
|
||||||
if (instances == null) {
|
|
||||||
if (other.instances != null)
|
|
||||||
return false;
|
|
||||||
} else if (!instances.equals(other.instances))
|
|
||||||
return false;
|
|
||||||
if (ownerId == null) {
|
if (ownerId == null) {
|
||||||
if (other.ownerId != null)
|
if (other.ownerId != null)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -22,7 +22,6 @@ import javax.annotation.Resource;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.AWSResponseException;
|
import org.jclouds.aws.AWSResponseException;
|
||||||
import org.jclouds.aws.domain.Region;
|
|
||||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||||
import org.jclouds.aws.ec2.services.InstanceClient;
|
import org.jclouds.aws.ec2.services.InstanceClient;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
@ -53,7 +52,7 @@ public class InstanceHasIpAddress implements Predicate<RunningInstance> {
|
||||||
public boolean apply(RunningInstance instance) {
|
public boolean apply(RunningInstance instance) {
|
||||||
logger.trace("looking for ipAddress on instance %s", instance);
|
logger.trace("looking for ipAddress on instance %s", instance);
|
||||||
try {
|
try {
|
||||||
instance = refresh(instance.getId());
|
instance = refresh(instance);
|
||||||
return instance.getIpAddress() != null;
|
return instance.getIpAddress() != null;
|
||||||
} catch (AWSResponseException e) {
|
} catch (AWSResponseException e) {
|
||||||
if (e.getError().getCode().equals("InvalidInstanceID.NotFound"))
|
if (e.getError().getCode().equals("InvalidInstanceID.NotFound"))
|
||||||
|
@ -62,8 +61,8 @@ public class InstanceHasIpAddress implements Predicate<RunningInstance> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private RunningInstance refresh(String instanceId) {
|
private RunningInstance refresh(RunningInstance instance) {
|
||||||
return Iterables.getLast(Iterables.getLast(
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.describeInstancesInRegion(
|
||||||
client.describeInstancesInRegion(Region.DEFAULT, instanceId)).getRunningInstances());
|
instance.getRegion(), instance.getId())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import javax.annotation.Resource;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.AWSResponseException;
|
import org.jclouds.aws.AWSResponseException;
|
||||||
import org.jclouds.aws.domain.Region;
|
|
||||||
import org.jclouds.aws.ec2.domain.InstanceState;
|
import org.jclouds.aws.ec2.domain.InstanceState;
|
||||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||||
import org.jclouds.aws.ec2.services.InstanceClient;
|
import org.jclouds.aws.ec2.services.InstanceClient;
|
||||||
|
@ -54,7 +53,7 @@ public class InstanceStateRunning implements Predicate<RunningInstance> {
|
||||||
public boolean apply(RunningInstance instance) {
|
public boolean apply(RunningInstance instance) {
|
||||||
logger.trace("looking for state on instance %s", instance);
|
logger.trace("looking for state on instance %s", instance);
|
||||||
try {
|
try {
|
||||||
instance = refresh(instance.getId());
|
instance = refresh(instance);
|
||||||
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
||||||
InstanceState.RUNNING, instance.getInstanceState());
|
InstanceState.RUNNING, instance.getInstanceState());
|
||||||
return instance.getInstanceState() == InstanceState.RUNNING;
|
return instance.getInstanceState() == InstanceState.RUNNING;
|
||||||
|
@ -65,8 +64,8 @@ public class InstanceStateRunning implements Predicate<RunningInstance> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private RunningInstance refresh(String instanceId) {
|
private RunningInstance refresh(RunningInstance instance) {
|
||||||
return Iterables.getLast(Iterables.getLast(
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.describeInstancesInRegion(
|
||||||
client.describeInstancesInRegion(Region.DEFAULT, instanceId)).getRunningInstances());
|
instance.getRegion(), instance.getId())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.jclouds.aws.ec2.predicates;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.domain.Region;
|
|
||||||
import org.jclouds.aws.ec2.domain.InstanceState;
|
import org.jclouds.aws.ec2.domain.InstanceState;
|
||||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||||
import org.jclouds.aws.ec2.services.InstanceClient;
|
import org.jclouds.aws.ec2.services.InstanceClient;
|
||||||
|
@ -53,15 +52,14 @@ public class InstanceStateStopped implements Predicate<RunningInstance> {
|
||||||
public boolean apply(RunningInstance instance) {
|
public boolean apply(RunningInstance instance) {
|
||||||
logger.trace("looking for state on instance %s", instance);
|
logger.trace("looking for state on instance %s", instance);
|
||||||
|
|
||||||
instance = refresh(instance.getId());
|
instance = refresh(instance);
|
||||||
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
||||||
InstanceState.STOPPED, instance.getInstanceState());
|
InstanceState.STOPPED, instance.getInstanceState());
|
||||||
return instance.getInstanceState() == InstanceState.STOPPED;
|
return instance.getInstanceState() == InstanceState.STOPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RunningInstance refresh(String instanceId) {
|
private RunningInstance refresh(RunningInstance instance) {
|
||||||
return Iterables.getLast(Iterables.getLast(client.describeInstancesInRegion(
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.describeInstancesInRegion(
|
||||||
Region.DEFAULT,instanceId))
|
instance.getRegion(), instance.getId())));
|
||||||
.getRunningInstances());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.jclouds.aws.ec2.predicates;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.domain.Region;
|
|
||||||
import org.jclouds.aws.ec2.domain.InstanceState;
|
import org.jclouds.aws.ec2.domain.InstanceState;
|
||||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||||
import org.jclouds.aws.ec2.services.InstanceClient;
|
import org.jclouds.aws.ec2.services.InstanceClient;
|
||||||
|
@ -53,14 +52,14 @@ public class InstanceStateTerminated implements Predicate<RunningInstance> {
|
||||||
public boolean apply(RunningInstance instance) {
|
public boolean apply(RunningInstance instance) {
|
||||||
logger.trace("looking for state on instance %s", instance);
|
logger.trace("looking for state on instance %s", instance);
|
||||||
|
|
||||||
instance = refresh(instance.getId());
|
instance = refresh(instance);
|
||||||
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
logger.trace("%s: looking for instance state %s: currently: %s", instance.getId(),
|
||||||
InstanceState.TERMINATED, instance.getInstanceState());
|
InstanceState.TERMINATED, instance.getInstanceState());
|
||||||
return instance.getInstanceState() == InstanceState.TERMINATED;
|
return instance.getInstanceState() == InstanceState.TERMINATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RunningInstance refresh(String instanceId) {
|
private RunningInstance refresh(RunningInstance instance) {
|
||||||
return Iterables.getLast(Iterables.getLast(
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(client.describeInstancesInRegion(
|
||||||
client.describeInstancesInRegion(Region.DEFAULT, instanceId)).getRunningInstances());
|
instance.getRegion(), instance.getId())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.binders.BindACLToXMLPayload;
|
import org.jclouds.aws.s3.binders.BindACLToXMLPayload;
|
||||||
import org.jclouds.aws.s3.binders.BindBucketLoggingToXmlPayload;
|
import org.jclouds.aws.s3.binders.BindBucketLoggingToXmlPayload;
|
||||||
import org.jclouds.aws.s3.binders.BindNoBucketLoggingToXmlPayload;
|
import org.jclouds.aws.s3.binders.BindNoBucketLoggingToXmlPayload;
|
||||||
|
@ -42,8 +43,8 @@ import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
import org.jclouds.aws.s3.domain.Payer;
|
import org.jclouds.aws.s3.domain.Payer;
|
||||||
import org.jclouds.aws.s3.domain.S3Object;
|
import org.jclouds.aws.s3.domain.S3Object;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.filters.RequestAuthorizeSignature;
|
import org.jclouds.aws.s3.filters.RequestAuthorizeSignature;
|
||||||
|
import org.jclouds.aws.s3.functions.BindRegionToXmlPayload;
|
||||||
import org.jclouds.aws.s3.functions.ObjectKey;
|
import org.jclouds.aws.s3.functions.ObjectKey;
|
||||||
import org.jclouds.aws.s3.functions.ParseObjectFromHeadersAndHttpContent;
|
import org.jclouds.aws.s3.functions.ParseObjectFromHeadersAndHttpContent;
|
||||||
import org.jclouds.aws.s3.functions.ParseObjectMetadataFromHeaders;
|
import org.jclouds.aws.s3.functions.ParseObjectMetadataFromHeaders;
|
||||||
|
@ -150,13 +151,14 @@ public interface S3AsyncClient {
|
||||||
PutObjectOptions... options);
|
PutObjectOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see S3Client#putBucketIfNotExists
|
* @see S3Client#putBucketInRegion
|
||||||
*/
|
*/
|
||||||
@PUT
|
@PUT
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@ExceptionParser(ReturnTrueIfBucketAlreadyOwnedByYou.class)
|
@ExceptionParser(ReturnTrueIfBucketAlreadyOwnedByYou.class)
|
||||||
ListenableFuture<Boolean> putBucketIfNotExists(@HostPrefixParam String bucketName,
|
ListenableFuture<Boolean> putBucketInRegion(//TODO endpoint based on region
|
||||||
PutBucketOptions... options);
|
@BinderParam(BindRegionToXmlPayload.class) Region region,
|
||||||
|
@HostPrefixParam String bucketName, PutBucketOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see S3Client#deleteBucketIfEmpty
|
* @see S3Client#deleteBucketIfEmpty
|
||||||
|
@ -182,7 +184,7 @@ public interface S3AsyncClient {
|
||||||
@QueryParams(keys = "location")
|
@QueryParams(keys = "location")
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@XMLResponseParser(LocationConstraintHandler.class)
|
@XMLResponseParser(LocationConstraintHandler.class)
|
||||||
ListenableFuture<LocationConstraint> getBucketLocation(@HostPrefixParam String bucketName);
|
ListenableFuture<Region> getBucketLocation(@HostPrefixParam String bucketName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see S3Client#getBucketPayer
|
* @see S3Client#getBucketPayer
|
||||||
|
|
|
@ -22,6 +22,7 @@ import java.util.SortedSet;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
import org.jclouds.aws.s3.domain.BucketLogging;
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
|
@ -29,7 +30,6 @@ import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
import org.jclouds.aws.s3.domain.Payer;
|
import org.jclouds.aws.s3.domain.Payer;
|
||||||
import org.jclouds.aws.s3.domain.S3Object;
|
import org.jclouds.aws.s3.domain.S3Object;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.options.CopyObjectOptions;
|
import org.jclouds.aws.s3.options.CopyObjectOptions;
|
||||||
import org.jclouds.aws.s3.options.ListBucketOptions;
|
import org.jclouds.aws.s3.options.ListBucketOptions;
|
||||||
import org.jclouds.aws.s3.options.PutBucketOptions;
|
import org.jclouds.aws.s3.options.PutBucketOptions;
|
||||||
|
@ -42,8 +42,9 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||||
/**
|
/**
|
||||||
* Provides access to S3 via their REST API.
|
* Provides access to S3 via their REST API.
|
||||||
* <p/>
|
* <p/>
|
||||||
* All commands return a ListenableFuture of the result from S3. Any exceptions incurred during processing
|
* All commands return a ListenableFuture of the result from S3. Any exceptions incurred during
|
||||||
* will be wrapped in an {@link ExecutionException} as documented in {@link ListenableFuture#get()}.
|
* processing will be wrapped in an {@link ExecutionException} as documented in
|
||||||
|
* {@link ListenableFuture#get()}.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
* @author James Murty
|
* @author James Murty
|
||||||
|
@ -78,8 +79,8 @@ public interface S3Client {
|
||||||
* namespace of the object you are retrieving
|
* namespace of the object you are retrieving
|
||||||
* @param key
|
* @param key
|
||||||
* unique key in the s3Bucket identifying the object
|
* unique key in the s3Bucket identifying the object
|
||||||
* @return ListenableFuture reference to a fully populated S3Object including data stored in S3 or
|
* @return ListenableFuture reference to a fully populated S3Object including data stored in S3
|
||||||
* {@link S3Object#NOT_FOUND} if not present.
|
* or {@link S3Object#NOT_FOUND} if not present.
|
||||||
*
|
*
|
||||||
* @throws org.jclouds.http.HttpResponseException
|
* @throws org.jclouds.http.HttpResponseException
|
||||||
* if the conditions requested set were not satisfied by the object on the server.
|
* if the conditions requested set were not satisfied by the object on the server.
|
||||||
|
@ -181,7 +182,7 @@ public interface S3Client {
|
||||||
* />
|
* />
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
boolean putBucketIfNotExists(String bucketName, PutBucketOptions... options);
|
boolean putBucketInRegion(Region region, String bucketName, PutBucketOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes the bucket, if it is empty.
|
* Deletes the bucket, if it is empty.
|
||||||
|
@ -217,8 +218,8 @@ public interface S3Client {
|
||||||
*
|
*
|
||||||
* @param bucketName
|
* @param bucketName
|
||||||
* namespace of the objects you wish to list
|
* namespace of the objects you wish to list
|
||||||
* @return ListenableFuture reference to a fully populated S3Bucket including metadata of the S3Objects it
|
* @return ListenableFuture reference to a fully populated S3Bucket including metadata of the
|
||||||
* contains or {@link BoundedList<ObjectMetadata>#NOT_FOUND} if not present.
|
* S3Objects it contains or {@link BoundedList<ObjectMetadata>#NOT_FOUND} if not present.
|
||||||
* @see ListBucketOptions
|
* @see ListBucketOptions
|
||||||
*
|
*
|
||||||
* @see <a
|
* @see <a
|
||||||
|
@ -344,7 +345,7 @@ public interface S3Client {
|
||||||
* "http://docs.amazonwebservices.com/AmazonS3/latest/index.html?RESTBucketLocationGET.html"
|
* "http://docs.amazonwebservices.com/AmazonS3/latest/index.html?RESTBucketLocationGET.html"
|
||||||
* />
|
* />
|
||||||
*/
|
*/
|
||||||
LocationConstraint getBucketLocation(String bucketName);
|
Region getBucketLocation(String bucketName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A GET request operation on a requestPayment resource returns the request payment configuration
|
* A GET request operation on a requestPayment resource returns the request payment configuration
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.S3Client;
|
import org.jclouds.aws.s3.S3Client;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
||||||
|
@ -48,7 +49,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
@ -120,8 +121,8 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainer(String container) {
|
public ListenableFuture<Boolean> createContainerInLocation(String location, String container) {
|
||||||
return async.putBucketIfNotExists(container);
|
return async.putBucketInRegion(Region.DEFAULT, container);// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> containerExists(String container) {
|
public ListenableFuture<Boolean> containerExists(String container) {
|
||||||
|
@ -160,19 +161,19 @@ public class S3AsyncBlobStore extends BaseS3BlobStore implements AsyncBlobStore
|
||||||
return compose(async.getObject(container, key, httpOptions), object2Blob, service);
|
return compose(async.getObject(container, key, httpOptions), object2Blob, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListResponse<? extends ResourceMetadata>> list() {
|
public ListenableFuture<? extends ListResponse<? extends StorageMetadata>> list() {
|
||||||
return compose(
|
return compose(
|
||||||
async.listOwnedBuckets(),
|
async.listOwnedBuckets(),
|
||||||
new Function<SortedSet<BucketMetadata>, org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>>() {
|
new Function<SortedSet<BucketMetadata>, org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>>() {
|
||||||
public org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata> apply(
|
public org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata> apply(
|
||||||
SortedSet<BucketMetadata> from) {
|
SortedSet<BucketMetadata> from) {
|
||||||
return new ListResponseImpl<ResourceMetadata>(Iterables.transform(from,
|
return new ListResponseImpl<StorageMetadata>(Iterables.transform(from,
|
||||||
bucket2ResourceMd), null, null, false);
|
bucket2ResourceMd), null, null, false);
|
||||||
}
|
}
|
||||||
}, service);
|
}, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListContainerResponse<? extends ResourceMetadata>> list(
|
public ListenableFuture<? extends ListContainerResponse<? extends StorageMetadata>> list(
|
||||||
String container, ListContainerOptions... optionsList) {
|
String container, ListContainerOptions... optionsList) {
|
||||||
ListBucketOptions httpOptions = container2BucketListOptions.apply(optionsList);
|
ListBucketOptions httpOptions = container2BucketListOptions.apply(optionsList);
|
||||||
ListenableFuture<ListBucketResponse> returnVal = async.listBucket(container, httpOptions);
|
ListenableFuture<ListBucketResponse> returnVal = async.listBucket(container, httpOptions);
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.S3Client;
|
import org.jclouds.aws.s3.S3Client;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
||||||
|
@ -43,7 +44,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
@ -90,8 +91,8 @@ public class S3BlobStore extends BaseS3BlobStore implements BlobStore {
|
||||||
return sync.bucketExists(container);
|
return sync.bucketExists(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean createContainer(String container) {
|
public boolean createContainerInLocation(String location, String container) {
|
||||||
return sync.putBucketIfNotExists(container);
|
return sync.putBucketInRegion(Region.DEFAULT, container);// TODO parameterize
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteContainer(String container) {
|
public void deleteContainer(String container) {
|
||||||
|
@ -118,17 +119,17 @@ public class S3BlobStore extends BaseS3BlobStore implements BlobStore {
|
||||||
return object2Blob.apply(sync.getObject(container, key, httpOptions));
|
return object2Blob.apply(sync.getObject(container, key, httpOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListResponse<? extends ResourceMetadata> list() {
|
public ListResponse<? extends StorageMetadata> list() {
|
||||||
return new Function<SortedSet<BucketMetadata>, org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>>() {
|
return new Function<SortedSet<BucketMetadata>, org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>>() {
|
||||||
public org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata> apply(
|
public org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata> apply(
|
||||||
SortedSet<BucketMetadata> from) {
|
SortedSet<BucketMetadata> from) {
|
||||||
return new ListResponseImpl<ResourceMetadata>(Iterables.transform(from,
|
return new ListResponseImpl<StorageMetadata>(Iterables.transform(from,
|
||||||
bucket2ResourceMd), null, null, false);
|
bucket2ResourceMd), null, null, false);
|
||||||
}
|
}
|
||||||
}.apply(sync.listOwnedBuckets());
|
}.apply(sync.listOwnedBuckets());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> list(String container,
|
public ListContainerResponse<? extends StorageMetadata> list(String container,
|
||||||
ListContainerOptions... optionsList) {
|
ListContainerOptions... optionsList) {
|
||||||
ListBucketOptions httpOptions = container2BucketListOptions.apply(optionsList);
|
ListBucketOptions httpOptions = container2BucketListOptions.apply(optionsList);
|
||||||
return bucket2ResourceList.apply(sync.listBucket(container, httpOptions));
|
return bucket2ResourceList.apply(sync.listBucket(container, httpOptions));
|
||||||
|
|
|
@ -25,7 +25,7 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
@ -37,7 +37,7 @@ import com.google.common.collect.Sets;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class BucketToResourceList implements
|
public class BucketToResourceList implements
|
||||||
Function<ListBucketResponse, ListContainerResponse<? extends ResourceMetadata>> {
|
Function<ListBucketResponse, ListContainerResponse<? extends StorageMetadata>> {
|
||||||
private final ObjectToBlobMetadata object2blobMd;
|
private final ObjectToBlobMetadata object2blobMd;
|
||||||
private final CommonPrefixesToResourceMetadata prefix2ResourceMd;
|
private final CommonPrefixesToResourceMetadata prefix2ResourceMd;
|
||||||
|
|
||||||
|
@ -48,10 +48,10 @@ public class BucketToResourceList implements
|
||||||
this.prefix2ResourceMd = prefix2ResourceMd;
|
this.prefix2ResourceMd = prefix2ResourceMd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> apply(ListBucketResponse from) {
|
public ListContainerResponse<? extends StorageMetadata> apply(ListBucketResponse from) {
|
||||||
SortedSet<ResourceMetadata> contents = Sets.newTreeSet(Iterables.concat(Iterables.transform(
|
SortedSet<StorageMetadata> contents = Sets.newTreeSet(Iterables.concat(Iterables.transform(
|
||||||
from, object2blobMd), prefix2ResourceMd.apply(from.getCommonPrefixes())));
|
from, object2blobMd), prefix2ResourceMd.apply(from.getCommonPrefixes())));
|
||||||
return new ListContainerResponseImpl<ResourceMetadata>(contents, from.getPrefix(), from.getMarker(),
|
return new ListContainerResponseImpl<StorageMetadata>(contents, from.getPrefix(), from.getMarker(),
|
||||||
from.getMaxKeys(), from.isTruncated());
|
from.getMaxKeys(), from.isTruncated());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,10 +21,10 @@ package org.jclouds.aws.s3.blobstore.functions;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
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.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
@ -32,11 +32,11 @@ import com.google.common.base.Function;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class BucketToResourceMetadata implements Function<BucketMetadata, ResourceMetadata> {
|
public class BucketToResourceMetadata implements Function<BucketMetadata, StorageMetadata> {
|
||||||
public ResourceMetadata apply(BucketMetadata from) {
|
public StorageMetadata apply(BucketMetadata from) {
|
||||||
MutableResourceMetadata to = new MutableResourceMetadataImpl();
|
MutableStorageMetadata to = new MutableStorageMetadataImpl();
|
||||||
to.setName(from.getName());
|
to.setName(from.getName());
|
||||||
to.setType(ResourceType.CONTAINER);
|
to.setType(StorageType.CONTAINER);
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,10 +20,10 @@ package org.jclouds.aws.s3.blobstore.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
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.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
@ -33,14 +33,14 @@ import com.google.common.collect.Iterables;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class CommonPrefixesToResourceMetadata implements
|
public class CommonPrefixesToResourceMetadata implements
|
||||||
Function<Iterable<String>, Iterable<ResourceMetadata>> {
|
Function<Iterable<String>, Iterable<StorageMetadata>> {
|
||||||
public Iterable<ResourceMetadata> apply(
|
public Iterable<StorageMetadata> apply(
|
||||||
|
|
||||||
Iterable<String> prefixes) {
|
Iterable<String> prefixes) {
|
||||||
return Iterables.transform(prefixes, new Function<String, ResourceMetadata>() {
|
return Iterables.transform(prefixes, new Function<String, StorageMetadata>() {
|
||||||
public ResourceMetadata apply(String from) {
|
public StorageMetadata apply(String from) {
|
||||||
MutableResourceMetadata returnVal = new MutableResourceMetadataImpl();
|
MutableStorageMetadata returnVal = new MutableStorageMetadataImpl();
|
||||||
returnVal.setType(ResourceType.RELATIVE_PATH);
|
returnVal.setType(StorageType.RELATIVE_PATH);
|
||||||
returnVal.setName(from);
|
returnVal.setName(from);
|
||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||||
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
||||||
|
|
||||||
|
@ -49,11 +49,11 @@ public class ObjectToBlobMetadata implements Function<ObjectMetadata, MutableBlo
|
||||||
to.setETag(from.getETag());
|
to.setETag(from.getETag());
|
||||||
to.setName(from.getKey());
|
to.setName(from.getKey());
|
||||||
to.setSize(from.getSize());
|
to.setSize(from.getSize());
|
||||||
to.setType(ResourceType.BLOB);
|
to.setType(StorageType.BLOB);
|
||||||
to.setLastModified(from.getLastModified());
|
to.setLastModified(from.getLastModified());
|
||||||
to.setUserMetadata(from.getUserMetadata());
|
to.setUserMetadata(from.getUserMetadata());
|
||||||
if (isDirectoryStrategy.execute(to)) {
|
if (isDirectoryStrategy.execute(to)) {
|
||||||
to.setType(ResourceType.RELATIVE_PATH);
|
to.setType(StorageType.RELATIVE_PATH);
|
||||||
}
|
}
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,8 @@ import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
import org.jclouds.aws.s3.domain.internal.TreeSetListBucketResponse;
|
import org.jclouds.aws.s3.domain.internal.TreeSetListBucketResponse;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
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 com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
@ -42,7 +42,7 @@ import com.google.common.collect.Sets;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ResourceToBucketList implements
|
public class ResourceToBucketList implements
|
||||||
Function<ListContainerResponse<? extends ResourceMetadata>, ListBucketResponse> {
|
Function<ListContainerResponse<? extends StorageMetadata>, ListBucketResponse> {
|
||||||
private final BlobToObjectMetadata blob2ObjectMd;
|
private final BlobToObjectMetadata blob2ObjectMd;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -50,33 +50,33 @@ public class ResourceToBucketList implements
|
||||||
this.blob2ObjectMd = blob2ObjectMd;
|
this.blob2ObjectMd = blob2ObjectMd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListBucketResponse apply(ListContainerResponse<? extends ResourceMetadata> list) {
|
public ListBucketResponse apply(ListContainerResponse<? extends StorageMetadata> list) {
|
||||||
|
|
||||||
Iterable<ObjectMetadata> contents = Iterables.transform(Iterables.filter(
|
Iterable<ObjectMetadata> contents = Iterables.transform(Iterables.filter(
|
||||||
list, new Predicate<ResourceMetadata>() {
|
list, new Predicate<StorageMetadata>() {
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata input) {
|
public boolean apply(StorageMetadata input) {
|
||||||
return input.getType() == ResourceType.BLOB;
|
return input.getType() == StorageType.BLOB;
|
||||||
}
|
}
|
||||||
|
|
||||||
}), new Function<ResourceMetadata, ObjectMetadata>() {
|
}), new Function<StorageMetadata, ObjectMetadata>() {
|
||||||
|
|
||||||
public MutableObjectMetadata apply(ResourceMetadata from) {
|
public MutableObjectMetadata apply(StorageMetadata from) {
|
||||||
return blob2ObjectMd.apply((BlobMetadata) from);
|
return blob2ObjectMd.apply((BlobMetadata) from);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
SortedSet<String> commonPrefixes = Sets.newTreeSet(Iterables.transform(Iterables.filter(list,
|
SortedSet<String> commonPrefixes = Sets.newTreeSet(Iterables.transform(Iterables.filter(list,
|
||||||
new Predicate<ResourceMetadata>() {
|
new Predicate<StorageMetadata>() {
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata input) {
|
public boolean apply(StorageMetadata input) {
|
||||||
return input.getType() == ResourceType.RELATIVE_PATH;
|
return input.getType() == StorageType.RELATIVE_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
}), new Function<ResourceMetadata, String>() {
|
}), new Function<StorageMetadata, String>() {
|
||||||
|
|
||||||
public String apply(ResourceMetadata from) {
|
public String apply(StorageMetadata from) {
|
||||||
return from.getName();
|
return from.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,84 +32,6 @@ public class BucketMetadata implements Comparable<BucketMetadata> {
|
||||||
private final CanonicalUser owner;
|
private final CanonicalUser owner;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
/**
|
|
||||||
* Location constraint of the bucket.
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/RESTBucketLocationGET.html"
|
|
||||||
* />
|
|
||||||
* @see <a href=
|
|
||||||
* "http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?LocationSelection.html"
|
|
||||||
* />
|
|
||||||
*/
|
|
||||||
public static enum LocationConstraint {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* US Standard—Uses Amazon S3 servers in the United States
|
|
||||||
* <p/>
|
|
||||||
* This is the default Region. All requests sent to s3.amazonaws.com go to this Region unless
|
|
||||||
* you specify a LocationConstraint on a bucket. The US Standard Region automatically places
|
|
||||||
* your data in either Amazon's east or west coast data centers depending on what will provide
|
|
||||||
* you with the lowest latency. To use this region, do not set the LocationConstraint bucket
|
|
||||||
* parameter. The US Standard Region provides eventual consistency for all requests.
|
|
||||||
*/
|
|
||||||
US_STANDARD,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Uses Amazon S3 servers in Ireland.
|
|
||||||
* <p/>
|
|
||||||
* In Amazon S3, the EU (Ireland) Region provides read-after-write consistency for PUTS of new
|
|
||||||
* objects in your Amazon S3 bucket and eventual consistency for overwrite PUTS and DELETES.
|
|
||||||
*/
|
|
||||||
EU,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* US-West (Northern California)—Uses Amazon S3 servers in Northern California
|
|
||||||
* <p/>
|
|
||||||
* Optionally, use the endpoint s3-us-west-1.amazonaws.com on all requests to this bucket to
|
|
||||||
* reduce the latency you might experience after the first hour of creating a bucket in this
|
|
||||||
* Region.
|
|
||||||
* <p/>
|
|
||||||
* In Amazon S3, the US-West (Northern California) Region provides read-after-write
|
|
||||||
* consistency for PUTS of new objects in your Amazon S3 bucket and eventual consistency for
|
|
||||||
* overwrite PUTS and DELETES.
|
|
||||||
*/
|
|
||||||
US_WEST;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns the value expected in xml documents from the S3 service.
|
|
||||||
* <p/>
|
|
||||||
* {@code US_STANDARD} is returned as "" xml documents, so we return "".
|
|
||||||
*/
|
|
||||||
public String value() {
|
|
||||||
switch (this) {
|
|
||||||
case US_STANDARD:
|
|
||||||
return "";
|
|
||||||
case EU:
|
|
||||||
return "EU";
|
|
||||||
case US_WEST:
|
|
||||||
return "us-west-1";
|
|
||||||
default:
|
|
||||||
throw new IllegalStateException("unimplemented location: " + this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* parses the value expected in xml documents from the S3 service.=
|
|
||||||
* <p/>
|
|
||||||
* {@code US_STANDARD} is returned as "" xml documents.
|
|
||||||
*/
|
|
||||||
public static LocationConstraint fromValue(String v) {
|
|
||||||
if (v.equals(""))
|
|
||||||
return US_STANDARD;
|
|
||||||
if (v.equals("EU"))
|
|
||||||
return EU;
|
|
||||||
else if (v.equals("us-west-1"))
|
|
||||||
return US_WEST;
|
|
||||||
throw new IllegalStateException("unimplemented location: " + v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public BucketMetadata(String name, Date creationDate, CanonicalUser owner) {
|
public BucketMetadata(String name, Date creationDate, CanonicalUser owner) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.creationDate = creationDate;
|
this.creationDate = creationDate;
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
package org.jclouds.aws.s3.functions;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.rest.binders.BindToStringPayload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Depending on your latency and legal requirements, you can specify a location constraint that will
|
||||||
|
* affect where your data physically resides.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class BindRegionToXmlPayload extends BindToStringPayload {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bindToRequest(HttpRequest request, Object input) {
|
||||||
|
checkArgument(checkNotNull(input, "input") instanceof Region,
|
||||||
|
"this binder is only valid for Region!");
|
||||||
|
Region constraint = (Region) input;
|
||||||
|
String value = null;
|
||||||
|
switch (constraint) {
|
||||||
|
case US_STANDARD:
|
||||||
|
case US_EAST_1:
|
||||||
|
case DEFAULT:// TODO get this from the url
|
||||||
|
return;
|
||||||
|
case EU_WEST_1:
|
||||||
|
value = "EU";
|
||||||
|
break;
|
||||||
|
case US_WEST_1:
|
||||||
|
value = "us-west-1";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("unimplemented location: " + this);
|
||||||
|
}
|
||||||
|
super
|
||||||
|
.bindToRequest(
|
||||||
|
request,
|
||||||
|
String
|
||||||
|
.format(
|
||||||
|
"<CreateBucketConfiguration><LocationConstraint>%s</LocationConstraint></CreateBucketConfiguration>",
|
||||||
|
value));
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,6 @@ package org.jclouds.aws.s3.options;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.reference.S3Headers;
|
import org.jclouds.aws.s3.reference.S3Headers;
|
||||||
import org.jclouds.http.options.BaseHttpRequestOptions;
|
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
|
|
||||||
|
@ -47,20 +46,6 @@ import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
*/
|
*/
|
||||||
public class PutBucketOptions extends BaseHttpRequestOptions {
|
public class PutBucketOptions extends BaseHttpRequestOptions {
|
||||||
private CannedAccessPolicy acl = CannedAccessPolicy.PRIVATE;
|
private CannedAccessPolicy acl = CannedAccessPolicy.PRIVATE;
|
||||||
private LocationConstraint constraint;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Depending on your latency and legal requirements, you can specify a location constraint that
|
|
||||||
* will affect where your data physically resides.
|
|
||||||
*/
|
|
||||||
public PutBucketOptions createIn(LocationConstraint constraint) {
|
|
||||||
this.constraint = checkNotNull(constraint, "constraint");
|
|
||||||
this.payload = String
|
|
||||||
.format(
|
|
||||||
"<CreateBucketConfiguration><LocationConstraint>%s</LocationConstraint></CreateBucketConfiguration>",
|
|
||||||
constraint.value());
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the default ACL (private) with the specified one.
|
* Override the default ACL (private) with the specified one.
|
||||||
|
@ -75,30 +60,15 @@ public class PutBucketOptions extends BaseHttpRequestOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see PutBucketOptions#withBucketAcl(CannedAccessPolicy)
|
* @see PutBucketOptions#withBucketAcl
|
||||||
*/
|
*/
|
||||||
public CannedAccessPolicy getAcl() {
|
public CannedAccessPolicy getAcl() {
|
||||||
return acl;
|
return acl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see PutBucketOptions#createIn(org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint)
|
|
||||||
*/
|
|
||||||
public LocationConstraint getLocationConstraint() {
|
|
||||||
return constraint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
/**
|
/**
|
||||||
* @see PutBucketOptions#createIn(org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint)
|
* @see PutBucketOptions#withBucketAcl
|
||||||
*/
|
|
||||||
public static PutBucketOptions createIn(LocationConstraint constraint) {
|
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
|
||||||
return options.createIn(constraint);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see PutBucketOptions#withBucketAcl(CannedAccessPolicy)
|
|
||||||
*/
|
*/
|
||||||
public static PutBucketOptions withBucketAcl(CannedAccessPolicy acl) {
|
public static PutBucketOptions withBucketAcl(CannedAccessPolicy acl) {
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
PutBucketOptions options = new PutBucketOptions();
|
||||||
|
|
|
@ -18,27 +18,42 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.xml;
|
package org.jclouds.aws.s3.xml;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the response from Amazon S3 GET Bucket Location
|
* Parses the response from Amazon S3 GET Bucket Location
|
||||||
* <p/>
|
* <p/>
|
||||||
* LocationConstraint is the document we expect to parse.
|
* Region is the document we expect to parse.
|
||||||
*
|
*
|
||||||
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/RESTBucketLocationGET.html" />
|
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/RESTBucketLocationGET.html" />
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class LocationConstraintHandler extends ParseSax.HandlerWithResult<LocationConstraint> {
|
public class LocationConstraintHandler extends ParseSax.HandlerWithResult<Region> {
|
||||||
private StringBuilder currentText = new StringBuilder();
|
private StringBuilder currentText = new StringBuilder();
|
||||||
private LocationConstraint constraint;
|
private Region region;
|
||||||
|
|
||||||
public LocationConstraint getResult() {
|
public Region getResult() {
|
||||||
return constraint;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void endElement(String uri, String name, String qName) {
|
public void endElement(String uri, String name, String qName) {
|
||||||
constraint = LocationConstraint.fromValue(currentText.toString().trim());
|
region = fromValue(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parses the value expected in xml documents from the S3 service.=
|
||||||
|
* <p/>
|
||||||
|
* {@code US_STANDARD} is returned as "" xml documents.
|
||||||
|
*/
|
||||||
|
public static Region fromValue(String v) {
|
||||||
|
if (v.equals(""))
|
||||||
|
return Region.US_STANDARD;
|
||||||
|
if (v.equals("EU"))
|
||||||
|
return Region.EU_WEST_1;
|
||||||
|
else if (v.equals("us-west-1"))
|
||||||
|
return Region.US_WEST_1;
|
||||||
|
throw new IllegalStateException("unimplemented location: " + v);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void characters(char ch[], int start, int length) {
|
public void characters(char ch[], int start, int length) {
|
||||||
|
|
|
@ -68,7 +68,7 @@ public interface SQSAsyncClient {
|
||||||
ListQueuesOptions... options);
|
ListQueuesOptions... options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see SQSClient#createQueuesInRegion
|
* @see SQSClient#createQueueInRegion
|
||||||
*/
|
*/
|
||||||
@POST
|
@POST
|
||||||
@Path("/")
|
@Path("/")
|
||||||
|
|
|
@ -164,7 +164,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest {
|
||||||
.withSecurityGroup(securityGroupName) // group I created above
|
.withSecurityGroup(securityGroupName) // group I created above
|
||||||
.withUserData(script.getBytes())); // script to run as root
|
.withUserData(script.getBytes())); // script to run as root
|
||||||
|
|
||||||
instance = Iterables.getOnlyElement(reservation.getRunningInstances());
|
instance = Iterables.getOnlyElement(reservation);
|
||||||
|
|
||||||
} catch (HttpResponseException htpe) {
|
} catch (HttpResponseException htpe) {
|
||||||
if (htpe.getResponse().getStatusCode() == 400)
|
if (htpe.getResponse().getStatusCode() == 400)
|
||||||
|
@ -339,9 +339,8 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest {
|
||||||
Reservation reservation = Iterables.getOnlyElement(client.getInstanceServices()
|
Reservation reservation = Iterables.getOnlyElement(client.getInstanceServices()
|
||||||
.describeInstancesInRegion(Region.DEFAULT, instanceId));
|
.describeInstancesInRegion(Region.DEFAULT, instanceId));
|
||||||
|
|
||||||
assertNotNull(Iterables.getOnlyElement(reservation.getRunningInstances()).getIpAddress());
|
assertNotNull(Iterables.getOnlyElement(reservation).getIpAddress());
|
||||||
assertFalse(Iterables.getOnlyElement(reservation.getRunningInstances()).getIpAddress()
|
assertFalse(Iterables.getOnlyElement(reservation).getIpAddress().equals(address));
|
||||||
.equals(address));
|
|
||||||
|
|
||||||
doCheckKey(address);
|
doCheckKey(address);
|
||||||
|
|
||||||
|
@ -393,7 +392,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest {
|
||||||
Set<Reservation> reservations = client.getInstanceServices().describeInstancesInRegion(
|
Set<Reservation> reservations = client.getInstanceServices().describeInstancesInRegion(
|
||||||
Region.DEFAULT, instanceId); // last parameter (ids) narrows the search
|
Region.DEFAULT, instanceId); // last parameter (ids) narrows the search
|
||||||
|
|
||||||
return Iterables.getOnlyElement(Iterables.getOnlyElement(reservations).getRunningInstances());
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(reservations));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -206,7 +206,7 @@ public class EBSBootEC2ClientLiveTest {
|
||||||
withKeyName(keyPair.getKeyName())// key I created above
|
withKeyName(keyPair.getKeyName())// key I created above
|
||||||
.asType(InstanceType.M1_SMALL)// smallest instance size
|
.asType(InstanceType.M1_SMALL)// smallest instance size
|
||||||
.withSecurityGroup(securityGroupName));// group I created above
|
.withSecurityGroup(securityGroupName));// group I created above
|
||||||
instance = Iterables.getOnlyElement(reservation.getRunningInstances());
|
instance = Iterables.getOnlyElement(reservation);
|
||||||
} catch (HttpResponseException htpe) {
|
} catch (HttpResponseException htpe) {
|
||||||
if (htpe.getResponse().getStatusCode() == 400)
|
if (htpe.getResponse().getStatusCode() == 400)
|
||||||
continue;
|
continue;
|
||||||
|
@ -540,8 +540,7 @@ public class EBSBootEC2ClientLiveTest {
|
||||||
Set<Reservation> reservations = client.getInstanceServices().describeInstancesInRegion(
|
Set<Reservation> reservations = client.getInstanceServices().describeInstancesInRegion(
|
||||||
instance.getRegion(), instance.getId()); // last parameter (ids) narrows the search
|
instance.getRegion(), instance.getId()); // last parameter (ids) narrows the search
|
||||||
|
|
||||||
instance = Iterables.getOnlyElement(Iterables.getOnlyElement(reservations)
|
instance = Iterables.getOnlyElement(Iterables.getOnlyElement(reservations));
|
||||||
.getRunningInstances());
|
|
||||||
|
|
||||||
System.out.printf("%d: %s awaiting ssh service to start%n", System.currentTimeMillis(),
|
System.out.printf("%d: %s awaiting ssh service to start%n", System.currentTimeMillis(),
|
||||||
instance.getIpAddress());
|
instance.getIpAddress());
|
||||||
|
|
|
@ -23,7 +23,6 @@ import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -31,19 +30,20 @@ import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
|
import org.jclouds.compute.domain.ComputeType;
|
||||||
import org.jclouds.compute.domain.CreateNodeResponse;
|
import org.jclouds.compute.domain.CreateNodeResponse;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.LoginType;
|
import org.jclouds.compute.domain.LoginType;
|
||||||
import org.jclouds.compute.domain.NodeIdentity;
|
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.Profile;
|
import org.jclouds.compute.domain.Profile;
|
||||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
import org.jclouds.predicates.RetryablePredicate;
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
import org.jclouds.predicates.SocketOpen;
|
import org.jclouds.predicates.SocketOpen;
|
||||||
|
import org.jclouds.ssh.ExecResponse;
|
||||||
import org.jclouds.ssh.SshClient;
|
import org.jclouds.ssh.SshClient;
|
||||||
import org.jclouds.ssh.SshException;
|
import org.jclouds.ssh.SshException;
|
||||||
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
import org.jclouds.util.Utils;
|
|
||||||
import org.testng.annotations.AfterTest;
|
import org.testng.annotations.AfterTest;
|
||||||
import org.testng.annotations.BeforeGroups;
|
import org.testng.annotations.BeforeGroups;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
@ -62,7 +62,7 @@ import com.google.inject.Injector;
|
||||||
public class EC2ComputeServiceLiveTest {
|
public class EC2ComputeServiceLiveTest {
|
||||||
|
|
||||||
protected SshClient.Factory sshFactory;
|
protected SshClient.Factory sshFactory;
|
||||||
private String nodePrefix = System.getProperty("user.name") + ".ec2";
|
private String nodePrefix = System.getProperty("user.name") + ".ec2serv";
|
||||||
|
|
||||||
private RetryablePredicate<InetSocketAddress> socketTester;
|
private RetryablePredicate<InetSocketAddress> socketTester;
|
||||||
private CreateNodeResponse node;
|
private CreateNodeResponse node;
|
||||||
|
@ -83,7 +83,8 @@ public class EC2ComputeServiceLiveTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreate() throws Exception {
|
public void testCreate() throws Exception {
|
||||||
node = context.getComputeService().createNode(nodePrefix, Profile.SMALLEST, Image.RHEL_53);
|
node = context.getComputeService().startNodeInLocation("default", nodePrefix,
|
||||||
|
Profile.SMALLEST, Image.UBUNTU_90);
|
||||||
assertNotNull(node.getId());
|
assertNotNull(node.getId());
|
||||||
assertEquals(node.getLoginPort(), 22);
|
assertEquals(node.getLoginPort(), 22);
|
||||||
assertEquals(node.getLoginType(), LoginType.SSH);
|
assertEquals(node.getLoginType(), LoginType.SSH);
|
||||||
|
@ -98,7 +99,7 @@ public class EC2ComputeServiceLiveTest {
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testCreate")
|
@Test(dependsOnMethods = "testCreate")
|
||||||
public void testGet() throws Exception {
|
public void testGet() throws Exception {
|
||||||
NodeMetadata metadata = context.getComputeService().getNodeMetadata(node.getId());
|
NodeMetadata metadata = context.getComputeService().getNodeMetadata(node);
|
||||||
assertEquals(metadata.getId(), node.getId());
|
assertEquals(metadata.getId(), node.getId());
|
||||||
assertEquals(metadata.getLoginPort(), node.getLoginPort());
|
assertEquals(metadata.getLoginPort(), node.getLoginPort());
|
||||||
assertEquals(metadata.getLoginType(), node.getLoginType());
|
assertEquals(metadata.getLoginType(), node.getLoginType());
|
||||||
|
@ -108,8 +109,10 @@ public class EC2ComputeServiceLiveTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testList() throws Exception {
|
public void testList() throws Exception {
|
||||||
for (NodeIdentity node : context.getComputeService().listNodes()) {
|
for (ComputeMetadata node : context.getComputeService().listNodes()) {
|
||||||
assert node.getId() != null;
|
assert node.getId() != null;
|
||||||
|
assert node.getLocation() != null;
|
||||||
|
assertEquals(node.getType(), ComputeType.NODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,22 +132,24 @@ public class EC2ComputeServiceLiveTest {
|
||||||
InetSocketAddress socket = new InetSocketAddress(node.getPublicAddresses().last(), node
|
InetSocketAddress socket = new InetSocketAddress(node.getPublicAddresses().last(), node
|
||||||
.getLoginPort());
|
.getLoginPort());
|
||||||
socketTester.apply(socket);
|
socketTester.apply(socket);
|
||||||
SshClient connection = sshFactory.create(socket, node.getCredentials().account, node
|
SshClient ssh = node.getCredentials().key.startsWith("-----BEGIN RSA PRIVATE KEY-----") ? sshFactory
|
||||||
.getCredentials().key.getBytes());
|
.create(socket, node.getCredentials().account, node.getCredentials().key.getBytes())
|
||||||
|
: sshFactory
|
||||||
|
.create(socket, node.getCredentials().account, node.getCredentials().key);
|
||||||
try {
|
try {
|
||||||
connection.connect();
|
ssh.connect();
|
||||||
InputStream etcPasswd = connection.get("/etc/passwd");
|
ExecResponse hello = ssh.exec("echo hello");
|
||||||
Utils.toStringAndClose(etcPasswd);
|
assertEquals(hello.getOutput().trim(), "hello");
|
||||||
} finally {
|
} finally {
|
||||||
if (connection != null)
|
if (ssh != null)
|
||||||
connection.disconnect();
|
ssh.disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterTest
|
@AfterTest
|
||||||
void cleanup() throws InterruptedException, ExecutionException, TimeoutException {
|
void cleanup() throws InterruptedException, ExecutionException, TimeoutException {
|
||||||
if (node != null)
|
if (node != null)
|
||||||
context.getComputeService().destroyNode(node.getId());
|
context.getComputeService().destroyNode(node);
|
||||||
context.close();
|
context.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,9 @@
|
||||||
package org.jclouds.aws.ec2.services;
|
package org.jclouds.aws.ec2.services;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.testng.Assert.assertEquals;
|
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
|
||||||
|
|
||||||
import org.jclouds.aws.domain.Region;
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.ec2.EC2ContextFactory;
|
import org.jclouds.aws.ec2.EC2ContextFactory;
|
||||||
|
@ -33,7 +31,6 @@ import org.testng.annotations.BeforeGroups;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code EC2Client}
|
* Tests behavior of {@code EC2Client}
|
||||||
|
@ -60,27 +57,9 @@ public class InstanceClientLiveTest {
|
||||||
void testDescribeInstances() {
|
void testDescribeInstances() {
|
||||||
for (Region region : ImmutableSet.of(Region.DEFAULT, Region.EU_WEST_1, Region.US_EAST_1,
|
for (Region region : ImmutableSet.of(Region.DEFAULT, Region.EU_WEST_1, Region.US_EAST_1,
|
||||||
Region.US_WEST_1)) {
|
Region.US_WEST_1)) {
|
||||||
SortedSet<Reservation> allResults = Sets.newTreeSet(client
|
Set<Reservation> allResults = client.describeInstancesInRegion(region);
|
||||||
.describeInstancesInRegion(region));
|
|
||||||
assertNotNull(allResults);
|
assertNotNull(allResults);
|
||||||
assert allResults.size() >= 0 : allResults.size();
|
assert allResults.size() >= 0 : allResults.size();
|
||||||
if (allResults.size() >= 2) {
|
|
||||||
Iterator<Reservation> iterator = allResults.iterator();
|
|
||||||
String id1 = Sets.newTreeSet(iterator.next().getRunningInstances()).first()
|
|
||||||
.getId();
|
|
||||||
String id2 = Sets.newTreeSet(iterator.next().getRunningInstances()).first()
|
|
||||||
.getId();
|
|
||||||
SortedSet<Reservation> twoResults = Sets.newTreeSet(client.describeInstancesInRegion(
|
|
||||||
region, id1, id2));
|
|
||||||
assertNotNull(twoResults);
|
|
||||||
assertEquals(twoResults.size(), 2);
|
|
||||||
iterator = allResults.iterator();
|
|
||||||
assertEquals(Sets.newTreeSet(iterator.next().getRunningInstances()).first()
|
|
||||||
.getId(), id1);
|
|
||||||
assertEquals(Sets.newTreeSet(iterator.next().getRunningInstances()).first()
|
|
||||||
.getId(), id2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ import org.testng.annotations.BeforeTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.ImmutableSortedSet;
|
import com.google.common.collect.ImmutableSortedSet;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
@ -68,7 +69,7 @@ public class RunInstancesResponseHandlerTest extends BaseHandlerTest {
|
||||||
InputStream is = getClass().getResourceAsStream("/ec2/run_instances.xml");
|
InputStream is = getClass().getResourceAsStream("/ec2/run_instances.xml");
|
||||||
|
|
||||||
Reservation expected = new Reservation(Region.DEFAULT, ImmutableSortedSet.of("default"),
|
Reservation expected = new Reservation(Region.DEFAULT, ImmutableSortedSet.of("default"),
|
||||||
ImmutableSortedSet.of(new RunningInstance(Region.DEFAULT, "0", null, "ami-60a54009",
|
ImmutableSet.of(new RunningInstance(Region.DEFAULT, "0", null, "ami-60a54009",
|
||||||
"i-2ba64342", InstanceState.PENDING, InstanceType.M1_SMALL,
|
"i-2ba64342", InstanceState.PENDING, InstanceType.M1_SMALL,
|
||||||
(InetAddress) null, null, "example-key-name", dateService
|
(InetAddress) null, null, "example-key-name", dateService
|
||||||
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
||||||
|
@ -76,7 +77,7 @@ public class RunInstancesResponseHandlerTest extends BaseHandlerTest {
|
||||||
.<String> newTreeSet(), null, null, null, null,
|
.<String> newTreeSet(), null, null, null, null,
|
||||||
RootDeviceType.INSTANCE_STORE, null, ImmutableMap
|
RootDeviceType.INSTANCE_STORE, null, ImmutableMap
|
||||||
.<String, EbsBlockDevice> of()), new RunningInstance(
|
.<String, EbsBlockDevice> of()), new RunningInstance(
|
||||||
Region.DEFAULT, "0", null, "ami-60a54009", "i-2bc64242",
|
Region.DEFAULT, "1", null, "ami-60a54009", "i-2bc64242",
|
||||||
InstanceState.PENDING, InstanceType.M1_SMALL, (InetAddress) null, null,
|
InstanceState.PENDING, InstanceType.M1_SMALL, (InetAddress) null, null,
|
||||||
"example-key-name", dateService
|
"example-key-name", dateService
|
||||||
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
||||||
|
@ -84,7 +85,7 @@ public class RunInstancesResponseHandlerTest extends BaseHandlerTest {
|
||||||
.<String> newTreeSet(), null, null, null, null,
|
.<String> newTreeSet(), null, null, null, null,
|
||||||
RootDeviceType.INSTANCE_STORE, null, ImmutableMap
|
RootDeviceType.INSTANCE_STORE, null, ImmutableMap
|
||||||
.<String, EbsBlockDevice> of()), new RunningInstance(
|
.<String, EbsBlockDevice> of()), new RunningInstance(
|
||||||
Region.DEFAULT, "0", null, "ami-60a54009", "i-2be64332",
|
Region.DEFAULT, "2", null, "ami-60a54009", "i-2be64332",
|
||||||
InstanceState.PENDING, InstanceType.M1_SMALL, (InetAddress) null, null,
|
InstanceState.PENDING, InstanceType.M1_SMALL, (InetAddress) null, null,
|
||||||
"example-key-name", dateService
|
"example-key-name", dateService
|
||||||
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
.iso8601DateParse("2007-08-07T11:51:50.000Z"), true,
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
||||||
import org.jclouds.aws.s3.config.S3ObjectModule;
|
import org.jclouds.aws.s3.config.S3ObjectModule;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
@ -352,11 +353,12 @@ public class S3AsyncClientTest extends RestClientTest<S3AsyncClient> {
|
||||||
checkFilters(httpMethod);
|
checkFilters(httpMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPutBucketIfNotExists() throws ArrayIndexOutOfBoundsException, SecurityException,
|
public void testPutBucketDefault() throws ArrayIndexOutOfBoundsException, SecurityException,
|
||||||
IllegalArgumentException, NoSuchMethodException, IOException {
|
IllegalArgumentException, NoSuchMethodException, IOException {
|
||||||
Method method = S3AsyncClient.class.getMethod("putBucketIfNotExists", String.class, Array
|
Method method = S3AsyncClient.class.getMethod("putBucketInRegion", Region.class,
|
||||||
.newInstance(PutBucketOptions.class, 0).getClass());
|
String.class, Array.newInstance(PutBucketOptions.class, 0).getClass());
|
||||||
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method, "bucket");
|
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method,
|
||||||
|
Region.DEFAULT, "bucket");
|
||||||
|
|
||||||
assertRequestLineEquals(httpMethod, "PUT http://bucket.stub:8080/ HTTP/1.1");
|
assertRequestLineEquals(httpMethod, "PUT http://bucket.stub:8080/ HTTP/1.1");
|
||||||
assertHeadersEqual(httpMethod, "Content-Length: 0\nHost: bucket.stub\n");
|
assertHeadersEqual(httpMethod, "Content-Length: 0\nHost: bucket.stub\n");
|
||||||
|
@ -369,6 +371,24 @@ public class S3AsyncClientTest extends RestClientTest<S3AsyncClient> {
|
||||||
checkFilters(httpMethod);
|
checkFilters(httpMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException,
|
||||||
|
IllegalArgumentException, NoSuchMethodException, IOException {
|
||||||
|
Method method = S3AsyncClient.class.getMethod("putBucketInRegion", Region.class,
|
||||||
|
String.class, Array.newInstance(PutBucketOptions.class, 0).getClass());
|
||||||
|
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method,
|
||||||
|
Region.EU_WEST_1, "bucket");
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpMethod, "PUT http://bucket.stub:8080/ HTTP/1.1");
|
||||||
|
assertHeadersEqual(httpMethod, "Content-Length: 98\nContent-Type: application/unknown\nHost: bucket.stub\n");
|
||||||
|
assertPayloadEquals(httpMethod, "<CreateBucketConfiguration><LocationConstraint>EU</LocationConstraint></CreateBucketConfiguration>");
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpMethod, ReturnTrueIf2xx.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, ReturnTrueIfBucketAlreadyOwnedByYou.class);
|
||||||
|
|
||||||
|
checkFilters(httpMethod);
|
||||||
|
}
|
||||||
|
|
||||||
public void testPutObject() throws ArrayIndexOutOfBoundsException, SecurityException,
|
public void testPutObject() throws ArrayIndexOutOfBoundsException, SecurityException,
|
||||||
IllegalArgumentException, NoSuchMethodException, IOException {
|
IllegalArgumentException, NoSuchMethodException, IOException {
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
||||||
|
@ -49,7 +50,6 @@ import org.jclouds.aws.s3.domain.S3Object;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.options.CopyObjectOptions;
|
import org.jclouds.aws.s3.options.CopyObjectOptions;
|
||||||
import org.jclouds.aws.s3.options.ListBucketOptions;
|
import org.jclouds.aws.s3.options.ListBucketOptions;
|
||||||
import org.jclouds.aws.s3.options.PutBucketOptions;
|
import org.jclouds.aws.s3.options.PutBucketOptions;
|
||||||
|
@ -114,7 +114,7 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
|
|
||||||
public static final String TEST_ACL_ID = "1a405254c932b52e5b5caaa88186bc431a1bacb9ece631f835daddaf0c47677c";
|
public static final String TEST_ACL_ID = "1a405254c932b52e5b5caaa88186bc431a1bacb9ece631f835daddaf0c47677c";
|
||||||
public static final String TEST_ACL_EMAIL = "james@misterm.org";
|
public static final String TEST_ACL_EMAIL = "james@misterm.org";
|
||||||
private static Map<String, BucketMetadata.LocationConstraint> bucketToLocation = new ConcurrentHashMap<String, BucketMetadata.LocationConstraint>();
|
private static Map<String, Region> bucketToLocation = new ConcurrentHashMap<String, Region>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An S3 item's "ACL" may be a {@link CannedAccessPolicy} or an {@link AccessControlList}.
|
* An S3 item's "ACL" may be a {@link CannedAccessPolicy} or an {@link AccessControlList}.
|
||||||
|
@ -123,14 +123,14 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
|
|
||||||
public static final String DEFAULT_OWNER_ID = "abc123";
|
public static final String DEFAULT_OWNER_ID = "abc123";
|
||||||
|
|
||||||
public ListenableFuture<Boolean> putBucketIfNotExists(String name,
|
@Override
|
||||||
|
public ListenableFuture<Boolean> putBucketInRegion(Region region, String name,
|
||||||
PutBucketOptions... optionsList) {
|
PutBucketOptions... optionsList) {
|
||||||
final PutBucketOptions options = (optionsList.length == 0) ? new PutBucketOptions()
|
final PutBucketOptions options = (optionsList.length == 0) ? new PutBucketOptions()
|
||||||
: optionsList[0];
|
: optionsList[0];
|
||||||
if (options.getLocationConstraint() != null)
|
bucketToLocation.put(name, region);
|
||||||
bucketToLocation.put(name, options.getLocationConstraint());
|
|
||||||
keyToAcl.put(name, options.getAcl());
|
keyToAcl.put(name, options.getAcl());
|
||||||
return blobStore.createContainer(name);
|
return blobStore.createContainerInLocation(region.value(), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<ListBucketResponse> listBucket(final String name,
|
public ListenableFuture<ListBucketResponse> listBucket(final String name,
|
||||||
|
@ -292,8 +292,8 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<LocationConstraint> getBucketLocation(String bucketName) {
|
public ListenableFuture<Region> getBucketLocation(String bucketName) {
|
||||||
return immediateFuture(LocationConstraint.US_STANDARD);
|
return immediateFuture(bucketToLocation.get(bucketName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -18,80 +18,43 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.options;
|
package org.jclouds.aws.s3.options;
|
||||||
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
|
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.createIn;
|
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.options.PutBucketOptions;
|
|
||||||
import org.jclouds.aws.s3.reference.S3Headers;
|
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNull;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
||||||
|
import org.jclouds.aws.s3.reference.S3Headers;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests possible uses of PutBucketOptions and PutBucketOptions.Builder.*
|
* Tests possible uses of PutBucketOptions and PutBucketOptions.Builder.*
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit", testName = "s3.PutBucketOptionsTest")
|
@Test(groups = "unit", testName = "s3.PutBucketOptionsTest")
|
||||||
public class PutBucketOptionsTest {
|
public class PutBucketOptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLocationConstraint() {
|
public void testAclDefault() {
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
PutBucketOptions options = new PutBucketOptions();
|
||||||
options.createIn(LocationConstraint.EU);
|
assertEquals(options.getAcl(), CannedAccessPolicy.PRIVATE);
|
||||||
assertEquals(options.getLocationConstraint(), LocationConstraint.EU);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPayload() {
|
public void testAclStatic() {
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
PutBucketOptions options = withBucketAcl(CannedAccessPolicy.AUTHENTICATED_READ);
|
||||||
options.createIn(LocationConstraint.EU);
|
assertEquals(options.getAcl(), CannedAccessPolicy.AUTHENTICATED_READ);
|
||||||
assertEquals(
|
}
|
||||||
options.buildStringPayload(),
|
|
||||||
"<CreateBucketConfiguration><LocationConstraint>EU</LocationConstraint></CreateBucketConfiguration>");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullLocationConstraint() {
|
void testBuildRequestHeaders() throws UnsupportedEncodingException {
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
|
||||||
assertNull(options.getLocationConstraint());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
Multimap<String, String> headers = withBucketAcl(CannedAccessPolicy.AUTHENTICATED_READ)
|
||||||
public void testLocationConstraintStatic() {
|
.buildRequestHeaders();
|
||||||
PutBucketOptions options = createIn(LocationConstraint.EU);
|
assertEquals(headers.get(S3Headers.CANNED_ACL).iterator().next(),
|
||||||
assertEquals(options.getLocationConstraint(), LocationConstraint.EU);
|
CannedAccessPolicy.AUTHENTICATED_READ.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = NullPointerException.class)
|
|
||||||
public void testNPE() {
|
|
||||||
createIn(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAclDefault() {
|
|
||||||
PutBucketOptions options = new PutBucketOptions();
|
|
||||||
assertEquals(options.getAcl(), CannedAccessPolicy.PRIVATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAclStatic() {
|
|
||||||
PutBucketOptions options = withBucketAcl(CannedAccessPolicy.AUTHENTICATED_READ);
|
|
||||||
assertEquals(options.getAcl(), CannedAccessPolicy.AUTHENTICATED_READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testBuildRequestHeaders() throws UnsupportedEncodingException {
|
|
||||||
|
|
||||||
Multimap<String, String> headers = withBucketAcl(
|
|
||||||
CannedAccessPolicy.AUTHENTICATED_READ).buildRequestHeaders();
|
|
||||||
assertEquals(headers.get(S3Headers.CANNED_ACL).iterator().next(),
|
|
||||||
CannedAccessPolicy.AUTHENTICATED_READ.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.afterMarker;
|
||||||
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.delimiter;
|
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.delimiter;
|
||||||
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.maxResults;
|
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.maxResults;
|
||||||
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.withPrefix;
|
import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.withPrefix;
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.createIn;
|
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNull;
|
import static org.testng.Assert.assertNull;
|
||||||
|
@ -36,6 +35,7 @@ import java.util.SortedSet;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.S3Client;
|
import org.jclouds.aws.s3.S3Client;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
@ -50,7 +50,6 @@ import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
|
||||||
import org.jclouds.aws.s3.internal.StubS3AsyncClient;
|
import org.jclouds.aws.s3.internal.StubS3AsyncClient;
|
||||||
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
||||||
import org.jclouds.util.Utils;
|
import org.jclouds.util.Utils;
|
||||||
|
@ -148,7 +147,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
public void testPublicReadAccessPolicy() throws Exception {
|
public void testPublicReadAccessPolicy() throws Exception {
|
||||||
String bucketName = getScratchContainerName();
|
String bucketName = getScratchContainerName();
|
||||||
try {
|
try {
|
||||||
context.getApi().putBucketIfNotExists(bucketName,
|
context.getApi().putBucketInRegion(Region.DEFAULT, bucketName,
|
||||||
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||||
AccessControlList acl = context.getApi().getBucketACL(bucketName);
|
AccessControlList acl = context.getApi().getBucketACL(bucketName);
|
||||||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString());
|
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString());
|
||||||
|
@ -176,8 +175,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
public void testDefaultBucketLocation() throws Exception {
|
public void testDefaultBucketLocation() throws Exception {
|
||||||
String bucketName = getContainerName();
|
String bucketName = getContainerName();
|
||||||
try {
|
try {
|
||||||
assertEquals(LocationConstraint.US_STANDARD, context.getApi()
|
assertEquals(Region.US_STANDARD, context.getApi().getBucketLocation(bucketName));
|
||||||
.getBucketLocation(bucketName));
|
|
||||||
} finally {
|
} finally {
|
||||||
returnContainer(bucketName);
|
returnContainer(bucketName);
|
||||||
}
|
}
|
||||||
|
@ -232,8 +230,8 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
BucketLogging newLogging = context.getApi().getBucketLogging(bucketName);
|
BucketLogging newLogging = context.getApi().getBucketLogging(bucketName);
|
||||||
AccessControlList acl = new AccessControlList();
|
AccessControlList acl = new AccessControlList();
|
||||||
for (Grant grant : newLogging.getTargetGrants()) { // TODO: add permission
|
for (Grant grant : newLogging.getTargetGrants()) { // TODO: add permission
|
||||||
// checking features to
|
// checking features to
|
||||||
// bucketlogging
|
// bucketlogging
|
||||||
acl.addPermission(grant.getGrantee(), grant.getPermission());
|
acl.addPermission(grant.getGrantee(), grant.getPermission());
|
||||||
}
|
}
|
||||||
// EmailAddressGrantee is replaced by a CanonicalUserGrantee, so we cannot test by
|
// EmailAddressGrantee is replaced by a CanonicalUserGrantee, so we cannot test by
|
||||||
|
@ -277,8 +275,8 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
public void testEu() throws Exception {
|
public void testEu() throws Exception {
|
||||||
final String bucketName = getScratchContainerName();
|
final String bucketName = getScratchContainerName();
|
||||||
try {
|
try {
|
||||||
context.getApi().putBucketIfNotExists(bucketName + "eu",
|
context.getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "eu",
|
||||||
createIn(LocationConstraint.EU).withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||||
assertConsistencyAware(new Runnable() {
|
assertConsistencyAware(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
|
@ -290,7 +288,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
assertEquals(LocationConstraint.EU, context.getApi().getBucketLocation(bucketName + "eu"));
|
assertEquals(Region.EU_WEST_1, context.getApi().getBucketLocation(bucketName + "eu"));
|
||||||
// TODO: I believe that the following should work based on the above acl assertion passing.
|
// TODO: I believe that the following should work based on the above acl assertion passing.
|
||||||
// However, it fails on 403
|
// However, it fails on 403
|
||||||
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
||||||
|
@ -306,10 +304,8 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
public void testNorthernCalifornia() throws Exception {
|
public void testNorthernCalifornia() throws Exception {
|
||||||
final String bucketName = getScratchContainerName();
|
final String bucketName = getScratchContainerName();
|
||||||
try {
|
try {
|
||||||
context.getApi().putBucketIfNotExists(
|
context.getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "cali",
|
||||||
bucketName + "cali",
|
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||||
createIn(LocationConstraint.US_WEST)
|
|
||||||
.withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
|
||||||
assertConsistencyAware(new Runnable() {
|
assertConsistencyAware(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
|
@ -321,8 +317,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
assertEquals(LocationConstraint.US_WEST, context.getApi().getBucketLocation(
|
assertEquals(Region.EU_WEST_1, context.getApi().getBucketLocation(bucketName + "cali"));
|
||||||
bucketName + "cali"));
|
|
||||||
// TODO: I believe that the following should work based on the above acl assertion passing.
|
// TODO: I believe that the following should work based on the above acl assertion passing.
|
||||||
// However, it fails on 403
|
// However, it fails on 403
|
||||||
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
||||||
|
|
|
@ -18,12 +18,13 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.samples;
|
package org.jclouds.aws.s3.samples;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||||
import org.jclouds.blobstore.BlobStore;
|
import org.jclouds.blobstore.BlobStore;
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
import org.jclouds.blobstore.BlobStoreContext;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This the Main class of an Application that demonstrates the use of the blobstore.
|
* This the Main class of an Application that demonstrates the use of the blobstore.
|
||||||
|
@ -56,16 +57,16 @@ public class MainApp {
|
||||||
|
|
||||||
// Create Container
|
// Create Container
|
||||||
BlobStore blobStore = context.getBlobStore();
|
BlobStore blobStore = context.getBlobStore();
|
||||||
blobStore.createContainer(containerName);
|
blobStore.createContainerInLocation(Region.DEFAULT.toString(), containerName);
|
||||||
|
|
||||||
Blob blob = blobStore.newBlob("test");
|
Blob blob = blobStore.newBlob("test");
|
||||||
blob.setPayload("testdata");
|
blob.setPayload("testdata");
|
||||||
blobStore.putBlob(containerName, blob);
|
blobStore.putBlob(containerName, blob);
|
||||||
|
|
||||||
// List Container
|
// List Container
|
||||||
for (ResourceMetadata resourceMd : blobStore.list()) {
|
for (StorageMetadata resourceMd : blobStore.list()) {
|
||||||
if (resourceMd.getType() == ResourceType.CONTAINER
|
if (resourceMd.getType() == StorageType.CONTAINER
|
||||||
|| resourceMd.getType() == ResourceType.FOLDER) {
|
|| resourceMd.getType() == StorageType.FOLDER) {
|
||||||
System.out.printf(" %s: %s entries%n", resourceMd.getName(), context
|
System.out.printf(" %s: %s entries%n", resourceMd.getName(), context
|
||||||
.createInputStreamMap(resourceMd.getName()).size());
|
.createInputStreamMap(resourceMd.getName()).size());
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ public class MainApp {
|
||||||
.withSecurityGroup(securityGroupName) // group I created above
|
.withSecurityGroup(securityGroupName) // group I created above
|
||||||
.withUserData(script.getBytes())); // script to run as root
|
.withUserData(script.getBytes())); // script to run as root
|
||||||
|
|
||||||
return Iterables.getOnlyElement(reservation.getRunningInstances());
|
return Iterables.getOnlyElement(reservation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ public class MainApp {
|
||||||
Region.DEFAULT, instanceId); // last parameter (ids) narrows the search
|
Region.DEFAULT, instanceId); // last parameter (ids) narrows the search
|
||||||
|
|
||||||
// since we refined by instanceId there should only be one instance
|
// since we refined by instanceId there should only be one instance
|
||||||
return Iterables.getOnlyElement(Iterables.getOnlyElement(reservations).getRunningInstances());
|
return Iterables.getOnlyElement(Iterables.getOnlyElement(reservations));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RunningInstance findInstanceByKeyName(EC2Client client, final String keyName) {
|
private static RunningInstance findInstanceByKeyName(EC2Client client, final String keyName) {
|
||||||
|
@ -228,7 +228,7 @@ public class MainApp {
|
||||||
// extract all the instances from all reservations
|
// extract all the instances from all reservations
|
||||||
Set<RunningInstance> allInstances = Sets.newHashSet();
|
Set<RunningInstance> allInstances = Sets.newHashSet();
|
||||||
for (Reservation reservation : reservations) {
|
for (Reservation reservation : reservations) {
|
||||||
allInstances.addAll(reservation.getRunningInstances());
|
allInstances.addAll(reservation);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the first one that has a keyname matching what I just created
|
// get the first one that has a keyname matching what I just created
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.S3Client;
|
import org.jclouds.aws.s3.S3Client;
|
||||||
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
||||||
|
@ -121,7 +122,7 @@ public class JCloudsS3Service extends S3Service {
|
||||||
throw new UnsupportedOperationException("Bucket ACL is not yet supported");
|
throw new UnsupportedOperationException("Bucket ACL is not yet supported");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (connection.putBucketIfNotExists(bucketName)) {
|
if (connection.putBucketInRegion(Region.fromValue(location), bucketName)) {
|
||||||
// Bucket created.
|
// Bucket created.
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -47,7 +47,7 @@ import org.jclouds.blobstore.KeyNotFoundException;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
||||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||||
|
@ -109,7 +109,10 @@ public class AzureAsyncBlobStore extends BaseAzureBlobStore implements AsyncBlob
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainer(String container) {
|
/**
|
||||||
|
* Note that location is currently ignored.
|
||||||
|
*/
|
||||||
|
public ListenableFuture<Boolean> createContainerInLocation(String location, String container) {
|
||||||
return async.createContainer(container);
|
return async.createContainer(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,19 +132,19 @@ public class AzureAsyncBlobStore extends BaseAzureBlobStore implements AsyncBlob
|
||||||
return compose(returnVal, object2Blob, service);
|
return compose(returnVal, object2Blob, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>> list() {
|
public ListenableFuture<? extends org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>> list() {
|
||||||
return compose(
|
return compose(
|
||||||
async.listContainers(),
|
async.listContainers(),
|
||||||
new Function<SortedSet<ListableContainerProperties>, org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>>() {
|
new Function<SortedSet<ListableContainerProperties>, org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>>() {
|
||||||
public org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata> apply(
|
public org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata> apply(
|
||||||
SortedSet<ListableContainerProperties> from) {
|
SortedSet<ListableContainerProperties> from) {
|
||||||
return new ListResponseImpl<ResourceMetadata>(Iterables.transform(from,
|
return new ListResponseImpl<StorageMetadata>(Iterables.transform(from,
|
||||||
container2ResourceMd), null, null, false);
|
container2ResourceMd), null, null, false);
|
||||||
}
|
}
|
||||||
}, service);
|
}, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListContainerResponse<? extends ResourceMetadata>> list(
|
public ListenableFuture<? extends ListContainerResponse<? extends StorageMetadata>> list(
|
||||||
String container, ListContainerOptions... optionsList) {
|
String container, ListContainerOptions... optionsList) {
|
||||||
ListBlobsOptions httpOptions = container2ContainerListOptions.apply(optionsList);
|
ListBlobsOptions httpOptions = container2ContainerListOptions.apply(optionsList);
|
||||||
ListenableFuture<ListBlobsResponse> returnVal = async.listBlobs(container, httpOptions);
|
ListenableFuture<ListBlobsResponse> returnVal = async.listBlobs(container, httpOptions);
|
||||||
|
|
|
@ -42,7 +42,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||||
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
||||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||||
|
@ -86,7 +86,10 @@ public class AzureBlobStore extends BaseAzureBlobStore implements BlobStore {
|
||||||
clearContainerStrategy.execute(container, recursive());
|
clearContainerStrategy.execute(container, recursive());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean createContainer(String container) {
|
/**
|
||||||
|
* Note that location is currently ignored.
|
||||||
|
*/
|
||||||
|
public boolean createContainerInLocation(String location, String container) {
|
||||||
return sync.createContainer(container);
|
return sync.createContainer(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,17 +120,17 @@ public class AzureBlobStore extends BaseAzureBlobStore implements BlobStore {
|
||||||
return object2Blob.apply(sync.getBlob(container, key, httpOptions));
|
return object2Blob.apply(sync.getBlob(container, key, httpOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListResponse<? extends ResourceMetadata> list() {
|
public ListResponse<? extends StorageMetadata> list() {
|
||||||
return new Function<SortedSet<ListableContainerProperties>, org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata>>() {
|
return new Function<SortedSet<ListableContainerProperties>, org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata>>() {
|
||||||
public org.jclouds.blobstore.domain.ListResponse<? extends ResourceMetadata> apply(
|
public org.jclouds.blobstore.domain.ListResponse<? extends StorageMetadata> apply(
|
||||||
SortedSet<ListableContainerProperties> from) {
|
SortedSet<ListableContainerProperties> from) {
|
||||||
return new ListResponseImpl<ResourceMetadata>(Iterables.transform(from,
|
return new ListResponseImpl<StorageMetadata>(Iterables.transform(from,
|
||||||
container2ResourceMd), null, null, false);
|
container2ResourceMd), null, null, false);
|
||||||
}
|
}
|
||||||
}.apply(sync.listContainers());
|
}.apply(sync.listContainers());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> list(String container,
|
public ListContainerResponse<? extends StorageMetadata> list(String container,
|
||||||
ListContainerOptions... optionsList) {
|
ListContainerOptions... optionsList) {
|
||||||
ListBlobsOptions httpOptions = container2ContainerListOptions.apply(optionsList);
|
ListBlobsOptions httpOptions = container2ContainerListOptions.apply(optionsList);
|
||||||
return container2ResourceList.apply(sync.listBlobs(container, httpOptions));
|
return container2ResourceList.apply(sync.listBlobs(container, httpOptions));
|
||||||
|
|
|
@ -20,10 +20,10 @@ package org.jclouds.azure.storage.blob.blobstore.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
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.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
@ -33,14 +33,14 @@ import com.google.common.collect.Iterables;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class CommonPrefixesToResourceMetadata implements
|
public class CommonPrefixesToResourceMetadata implements
|
||||||
Function<Iterable<String>, Iterable<ResourceMetadata>> {
|
Function<Iterable<String>, Iterable<StorageMetadata>> {
|
||||||
public Iterable<ResourceMetadata> apply(
|
public Iterable<StorageMetadata> apply(
|
||||||
|
|
||||||
Iterable<String> prefixes) {
|
Iterable<String> prefixes) {
|
||||||
return Iterables.transform(prefixes, new Function<String, ResourceMetadata>() {
|
return Iterables.transform(prefixes, new Function<String, StorageMetadata>() {
|
||||||
public ResourceMetadata apply(String from) {
|
public StorageMetadata apply(String from) {
|
||||||
MutableResourceMetadata returnVal = new MutableResourceMetadataImpl();
|
MutableStorageMetadata returnVal = new MutableStorageMetadataImpl();
|
||||||
returnVal.setType(ResourceType.RELATIVE_PATH);
|
returnVal.setType(StorageType.RELATIVE_PATH);
|
||||||
returnVal.setName(from);
|
returnVal.setName(from);
|
||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,10 +21,10 @@ package org.jclouds.azure.storage.blob.blobstore.functions;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.azure.storage.blob.domain.ListableContainerProperties;
|
import org.jclouds.azure.storage.blob.domain.ListableContainerProperties;
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
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.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
@ -32,14 +32,15 @@ import com.google.common.base.Function;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ContainerToResourceMetadata implements Function<ListableContainerProperties, ResourceMetadata> {
|
public class ContainerToResourceMetadata implements
|
||||||
public ResourceMetadata apply(ListableContainerProperties from) {
|
Function<ListableContainerProperties, StorageMetadata> {
|
||||||
MutableResourceMetadata to = new MutableResourceMetadataImpl();
|
public StorageMetadata apply(ListableContainerProperties from) {
|
||||||
|
MutableStorageMetadata to = new MutableStorageMetadataImpl();
|
||||||
to.setName(from.getName());
|
to.setName(from.getName());
|
||||||
to.setETag(from.getETag());
|
to.setETag(from.getETag());
|
||||||
to.setLastModified(from.getLastModified());
|
to.setLastModified(from.getLastModified());
|
||||||
to.setLocation(from.getUrl());
|
to.setUri(from.getUrl());
|
||||||
to.setType(ResourceType.CONTAINER);
|
to.setType(StorageType.CONTAINER);
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -26,7 +26,7 @@ import javax.inject.Singleton;
|
||||||
import org.jclouds.azure.storage.blob.domain.ListBlobsResponse;
|
import org.jclouds.azure.storage.blob.domain.ListBlobsResponse;
|
||||||
import org.jclouds.azure.storage.blob.domain.ListableBlobProperties;
|
import org.jclouds.azure.storage.blob.domain.ListableBlobProperties;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
@ -38,7 +38,7 @@ import com.google.common.collect.Sets;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ListBlobsResponseToResourceList implements
|
public class ListBlobsResponseToResourceList implements
|
||||||
Function<ListBlobsResponse, ListContainerResponse<? extends ResourceMetadata>> {
|
Function<ListBlobsResponse, ListContainerResponse<? extends StorageMetadata>> {
|
||||||
private final ListableBlobPropertiesToBlobMetadata<ListableBlobProperties> object2blobMd;
|
private final ListableBlobPropertiesToBlobMetadata<ListableBlobProperties> object2blobMd;
|
||||||
private final CommonPrefixesToResourceMetadata prefix2ResourceMd;
|
private final CommonPrefixesToResourceMetadata prefix2ResourceMd;
|
||||||
|
|
||||||
|
@ -50,10 +50,10 @@ public class ListBlobsResponseToResourceList implements
|
||||||
this.prefix2ResourceMd = prefix2ResourceMd;
|
this.prefix2ResourceMd = prefix2ResourceMd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListContainerResponse<? extends ResourceMetadata> apply(ListBlobsResponse from) {
|
public ListContainerResponse<? extends StorageMetadata> apply(ListBlobsResponse from) {
|
||||||
SortedSet<ResourceMetadata> contents = Sets.newTreeSet(Iterables.concat(Iterables.transform(
|
SortedSet<StorageMetadata> contents = Sets.newTreeSet(Iterables.concat(Iterables.transform(
|
||||||
from, object2blobMd), prefix2ResourceMd.apply(from.getBlobPrefixes())));
|
from, object2blobMd), prefix2ResourceMd.apply(from.getBlobPrefixes())));
|
||||||
return new ListContainerResponseImpl<ResourceMetadata>(contents, from.getPrefix(), from.getMarker(),
|
return new ListContainerResponseImpl<StorageMetadata>(contents, from.getPrefix(), from.getMarker(),
|
||||||
from.getMaxResults(), from.size() == from.getMaxResults());
|
from.getMaxResults(), from.size() == from.getMaxResults());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.azure.storage.blob.domain.ListableBlobProperties;
|
import org.jclouds.azure.storage.blob.domain.ListableBlobProperties;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||||
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
||||||
|
|
||||||
|
@ -50,9 +50,9 @@ public class ListableBlobPropertiesToBlobMetadata<T extends ListableBlobProperti
|
||||||
to.setLastModified(from.getLastModified());
|
to.setLastModified(from.getLastModified());
|
||||||
to.setName(from.getName());
|
to.setName(from.getName());
|
||||||
to.setSize(from.getSize());
|
to.setSize(from.getSize());
|
||||||
to.setType(ResourceType.BLOB);
|
to.setType(StorageType.BLOB);
|
||||||
if (isDirectoryStrategy.execute(to)) {
|
if (isDirectoryStrategy.execute(to)) {
|
||||||
to.setType(ResourceType.RELATIVE_PATH);
|
to.setType(StorageType.RELATIVE_PATH);
|
||||||
}
|
}
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,8 @@ import org.jclouds.azure.storage.blob.domain.MutableBlobProperties;
|
||||||
import org.jclouds.azure.storage.blob.domain.internal.TreeSetListBlobsResponse;
|
import org.jclouds.azure.storage.blob.domain.internal.TreeSetListBlobsResponse;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
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 com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
@ -42,7 +42,7 @@ import com.google.common.collect.Sets;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ResourceToListBlobsResponse implements
|
public class ResourceToListBlobsResponse implements
|
||||||
Function<ListContainerResponse<? extends ResourceMetadata>, ListBlobsResponse> {
|
Function<ListContainerResponse<? extends StorageMetadata>, ListBlobsResponse> {
|
||||||
private final BlobMetadataToBlobProperties blob2ObjectMd;
|
private final BlobMetadataToBlobProperties blob2ObjectMd;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -50,33 +50,33 @@ public class ResourceToListBlobsResponse implements
|
||||||
this.blob2ObjectMd = blob2ObjectMd;
|
this.blob2ObjectMd = blob2ObjectMd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListBlobsResponse apply(ListContainerResponse<? extends ResourceMetadata> list) {
|
public ListBlobsResponse apply(ListContainerResponse<? extends StorageMetadata> list) {
|
||||||
|
|
||||||
Iterable<ListableBlobProperties> contents = Iterables.transform(Iterables.filter(list,
|
Iterable<ListableBlobProperties> contents = Iterables.transform(Iterables.filter(list,
|
||||||
new Predicate<ResourceMetadata>() {
|
new Predicate<StorageMetadata>() {
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata input) {
|
public boolean apply(StorageMetadata input) {
|
||||||
return input.getType() == ResourceType.BLOB;
|
return input.getType() == StorageType.BLOB;
|
||||||
}
|
}
|
||||||
|
|
||||||
}), new Function<ResourceMetadata, ListableBlobProperties>() {
|
}), new Function<StorageMetadata, ListableBlobProperties>() {
|
||||||
|
|
||||||
public MutableBlobProperties apply(ResourceMetadata from) {
|
public MutableBlobProperties apply(StorageMetadata from) {
|
||||||
return blob2ObjectMd.apply((BlobMetadata) from);
|
return blob2ObjectMd.apply((BlobMetadata) from);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
SortedSet<String> commonPrefixes = Sets.newTreeSet(Iterables.transform(Iterables.filter(list,
|
SortedSet<String> commonPrefixes = Sets.newTreeSet(Iterables.transform(Iterables.filter(list,
|
||||||
new Predicate<ResourceMetadata>() {
|
new Predicate<StorageMetadata>() {
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata input) {
|
public boolean apply(StorageMetadata input) {
|
||||||
return input.getType() == ResourceType.RELATIVE_PATH;
|
return input.getType() == StorageType.RELATIVE_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
}), new Function<ResourceMetadata, String>() {
|
}), new Function<StorageMetadata, String>() {
|
||||||
|
|
||||||
public String apply(ResourceMetadata from) {
|
public String apply(StorageMetadata from) {
|
||||||
return from.getName();
|
return from.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ public class StubAzureBlobAsyncClient implements AzureBlobAsyncClient {
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainer(String container,
|
public ListenableFuture<Boolean> createContainer(String container,
|
||||||
CreateContainerOptions... options) {
|
CreateContainerOptions... options) {
|
||||||
return blobStore.createContainer(container);
|
return blobStore.createContainerInLocation("default", container);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createRootContainer(CreateContainerOptions... options) {
|
public ListenableFuture<Boolean> createRootContainer(CreateContainerOptions... options) {
|
||||||
|
@ -118,8 +118,7 @@ public class StubAzureBlobAsyncClient implements AzureBlobAsyncClient {
|
||||||
|
|
||||||
public ListenableFuture<AzureBlob> getBlob(String container, String key, GetOptions... options) {
|
public ListenableFuture<AzureBlob> getBlob(String container, String key, GetOptions... options) {
|
||||||
org.jclouds.blobstore.options.GetOptions getOptions = httpGetOptionsConverter.apply(options);
|
org.jclouds.blobstore.options.GetOptions getOptions = httpGetOptionsConverter.apply(options);
|
||||||
return compose(blobStore.getBlob(container, key, getOptions),
|
return compose(blobStore.getBlob(container, key, getOptions), blob2Object);
|
||||||
blob2Object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<BlobProperties> getBlobProperties(String container, String key) {
|
public ListenableFuture<BlobProperties> getBlobProperties(String container, String key) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.options.GetOptions;
|
import org.jclouds.blobstore.options.GetOptions;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public interface AsyncBlobStore {
|
||||||
/**
|
/**
|
||||||
* Lists all root-level resources available to the account.
|
* Lists all root-level resources available to the account.
|
||||||
*/
|
*/
|
||||||
ListenableFuture<? extends ListResponse<? extends ResourceMetadata>> list();
|
ListenableFuture<? extends ListResponse<? extends StorageMetadata>> list();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all resources available at the specified path. Note that path may be a container, or a
|
* Lists all resources available at the specified path. Note that path may be a container, or a
|
||||||
|
@ -49,14 +49,14 @@ public interface AsyncBlobStore {
|
||||||
* @param parent
|
* @param parent
|
||||||
* - base path to list; non-recursive
|
* - base path to list; non-recursive
|
||||||
*/
|
*/
|
||||||
ListenableFuture<? extends ListContainerResponse<? extends ResourceMetadata>> list(String container,
|
ListenableFuture<? extends ListContainerResponse<? extends StorageMetadata>> list(
|
||||||
ListContainerOptions... options);
|
String container, ListContainerOptions... options);
|
||||||
|
|
||||||
ListenableFuture<Boolean> containerExists(String container);
|
ListenableFuture<Boolean> containerExists(String container);
|
||||||
|
|
||||||
ListenableFuture<Boolean> directoryExists(String container, String directory);
|
ListenableFuture<Boolean> directoryExists(String container, String directory);
|
||||||
|
|
||||||
ListenableFuture<Boolean> createContainer(String container);
|
ListenableFuture<Boolean> createContainerInLocation(String location, String container);
|
||||||
|
|
||||||
ListenableFuture<Void> createDirectory(String container, String directory);
|
ListenableFuture<Void> createDirectory(String container, String directory);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.options.GetOptions;
|
import org.jclouds.blobstore.options.GetOptions;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ public interface BlobStore {
|
||||||
/**
|
/**
|
||||||
* Lists all root-level resources available to the account.
|
* Lists all root-level resources available to the account.
|
||||||
*/
|
*/
|
||||||
ListResponse<? extends ResourceMetadata> list();
|
ListResponse<? extends StorageMetadata> list();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all resources available at the specified path. Note that path may be a container, or a
|
* Lists all resources available at the specified path. Note that path may be a container, or a
|
||||||
|
@ -47,14 +47,14 @@ public interface BlobStore {
|
||||||
* @param parent
|
* @param parent
|
||||||
* - base path to list; non-recursive
|
* - base path to list; non-recursive
|
||||||
*/
|
*/
|
||||||
ListContainerResponse<? extends ResourceMetadata> list(String container,
|
ListContainerResponse<? extends StorageMetadata> list(String container,
|
||||||
ListContainerOptions... options);
|
ListContainerOptions... options);
|
||||||
|
|
||||||
boolean containerExists(String container);
|
boolean containerExists(String container);
|
||||||
|
|
||||||
boolean directoryExists(String container, String directory);
|
boolean directoryExists(String container, String directory);
|
||||||
|
|
||||||
boolean createContainer(String container);
|
boolean createContainerInLocation(String location, String container);
|
||||||
|
|
||||||
void createDirectory(String container, String directory);
|
void createDirectory(String container, String directory);
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ package org.jclouds.blobstore;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All Map views of {@link ContainerListing}s provide means to access the underlying Blob.
|
* All Map views of {@link ContainerListing}s provide means to access the underlying Blob.
|
||||||
|
@ -35,6 +35,6 @@ public interface ListableMap<K, V> extends Map<K, V> {
|
||||||
*
|
*
|
||||||
* @return blob listing that this map represents
|
* @return blob listing that this map represents
|
||||||
*/
|
*/
|
||||||
SortedSet<? extends ResourceMetadata> list();
|
SortedSet<? extends StorageMetadata> list();
|
||||||
|
|
||||||
}
|
}
|
|
@ -28,7 +28,7 @@ import com.google.inject.ImplementedBy;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@ImplementedBy(BlobMetadataImpl.class)
|
@ImplementedBy(BlobMetadataImpl.class)
|
||||||
public interface BlobMetadata extends ResourceMetadata {
|
public interface BlobMetadata extends StorageMetadata {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A standard MIME type describing the format of the contents. If none is provided, the default
|
* A standard MIME type describing the format of the contents. If none is provided, the default
|
||||||
|
|
|
@ -28,7 +28,7 @@ import com.google.inject.ImplementedBy;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@ImplementedBy(MutableBlobMetadataImpl.class)
|
@ImplementedBy(MutableBlobMetadataImpl.class)
|
||||||
public interface MutableBlobMetadata extends BlobMetadata, MutableResourceMetadata {
|
public interface MutableBlobMetadata extends BlobMetadata, MutableStorageMetadata {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A standard MIME type describing the format of the contents. If none is provided, the default
|
* A standard MIME type describing the format of the contents. If none is provided, the default
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* 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.blobstore.domain;
|
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.internal.MutableResourceMetadataImpl;
|
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Identifies containers, files, etc.
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@ImplementedBy(MutableResourceMetadataImpl.class)
|
|
||||||
public interface MutableResourceMetadata extends ResourceMetadata {
|
|
||||||
void setId(String id);
|
|
||||||
|
|
||||||
void setLocation(URI url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether this resource is a container, file, etc.
|
|
||||||
*/
|
|
||||||
void setType(ResourceType type);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of this resource. Names are dictated by the user. For files, this may be the filename,
|
|
||||||
* ex. file.txt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void setName(String name);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The eTag value stored in the Etag header returned by HTTP.
|
|
||||||
*
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_ETAG
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_ETAG
|
|
||||||
*/
|
|
||||||
void setETag(String eTag);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Size of the resource in bytes
|
|
||||||
*
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_SIZE
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_SIZE
|
|
||||||
*/
|
|
||||||
void setSize(long size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last modification time of the resource
|
|
||||||
*
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_LAST_MODIFIED
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_LAST_MODIFIED
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#MILLISECOND_PRECISION
|
|
||||||
*/
|
|
||||||
void setLastModified(Date lastModified);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Any key-value pairs associated with the resource.
|
|
||||||
*
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_METADATA
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_METADATA
|
|
||||||
*/
|
|
||||||
void setUserMetadata(Map<String, String> userMetadata);
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.blobstore.domain;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
|
import org.jclouds.domain.MutableResourceMetadata;
|
||||||
|
|
||||||
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to construct new resources or modify existing ones.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@ImplementedBy(MutableStorageMetadataImpl.class)
|
||||||
|
public interface MutableStorageMetadata extends MutableResourceMetadata<StorageType>,
|
||||||
|
StorageMetadata {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getETag
|
||||||
|
*/
|
||||||
|
void setETag(String eTag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getSize
|
||||||
|
*/
|
||||||
|
void setSize(long size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getLastModified
|
||||||
|
*/
|
||||||
|
void setLastModified(Date lastModified);
|
||||||
|
|
||||||
|
}
|
|
@ -22,7 +22,8 @@ import java.net.URI;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.internal.ResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.StorageMetadataImpl;
|
||||||
|
import org.jclouds.domain.ResourceMetadata;
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
@ -31,13 +32,14 @@ import com.google.inject.ImplementedBy;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@ImplementedBy(ResourceMetadataImpl.class)
|
@ImplementedBy(StorageMetadataImpl.class)
|
||||||
public interface ResourceMetadata extends Comparable<ResourceMetadata> {
|
public interface StorageMetadata extends ResourceMetadata<StorageType> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether this resource is a container, file, etc.
|
* Whether this resource is a container, file, etc.
|
||||||
*/
|
*/
|
||||||
ResourceType getType();
|
@Override
|
||||||
|
StorageType getType();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unique identifier of this resource within its enclosing namespace. In some scenarios, this id
|
* Unique identifier of this resource within its enclosing namespace. In some scenarios, this id
|
||||||
|
@ -46,6 +48,7 @@ public interface ResourceMetadata extends Comparable<ResourceMetadata> {
|
||||||
*
|
*
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_METADATA
|
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_METADATA
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
String getId();
|
String getId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -53,12 +56,32 @@ public interface ResourceMetadata extends Comparable<ResourceMetadata> {
|
||||||
* ex. file.txt
|
* ex. file.txt
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Physical location of the resource.
|
||||||
|
*
|
||||||
|
* ex. us-west-1
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
String getLocation();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URI used to access this resource
|
* URI used to access this resource
|
||||||
*/
|
*/
|
||||||
URI getLocation();
|
@Override
|
||||||
|
URI getUri();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any key-value pairs associated with the resource.
|
||||||
|
*
|
||||||
|
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_METADATA
|
||||||
|
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_METADATA
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
Map<String, String> getUserMetadata();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The eTag value stored in the Etag header returned by HTTP.
|
* The eTag value stored in the Etag header returned by HTTP.
|
||||||
|
@ -85,12 +108,4 @@ public interface ResourceMetadata extends Comparable<ResourceMetadata> {
|
||||||
*/
|
*/
|
||||||
Date getLastModified();
|
Date getLastModified();
|
||||||
|
|
||||||
/**
|
|
||||||
* Any key-value pairs associated with the resource.
|
|
||||||
*
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#CONTAINER_METADATA
|
|
||||||
* @see org.jclouds.blobstore.attr.ContainerCapability#BLOB_METADATA
|
|
||||||
*/
|
|
||||||
Map<String, String> getUserMetadata();
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.blobstore.domain;
|
package org.jclouds.blobstore.domain;
|
||||||
|
|
||||||
public enum ResourceType {
|
public enum StorageType {
|
||||||
|
|
||||||
CONTAINER, BLOB, FOLDER,
|
CONTAINER, BLOB, FOLDER,
|
||||||
/**
|
/**
|
|
@ -24,7 +24,7 @@ import javax.inject.Inject;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.encryption.EncryptionService;
|
import org.jclouds.encryption.EncryptionService;
|
||||||
import org.jclouds.http.internal.BasePayloadEnclosingImpl;
|
import org.jclouds.http.internal.BasePayloadEnclosingImpl;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ import com.google.common.collect.LinkedHashMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value type for an HTTP Blob service. Blobs are stored in {@link ResourceMetadata containers} and consist
|
* Value type for an HTTP Blob service. Blobs are stored in {@link StorageMetadata containers} and consist
|
||||||
* of a {@link org.jclouds.blobstore.domain.Value#getContent() value}, a {@link Blob#getKey key and
|
* of a {@link org.jclouds.blobstore.domain.Value#getContent() value}, a {@link Blob#getKey key and
|
||||||
*
|
*
|
||||||
* @link Blob.Metadata#getUserMetadata() metadata}
|
* @link Blob.Metadata#getUserMetadata() metadata}
|
||||||
|
|
|
@ -25,32 +25,42 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
|
|
||||||
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System and user Metadata for the {@link Blob}.
|
* System and user Metadata for the {@link Blob}.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class BlobMetadataImpl extends ResourceMetadataImpl implements Serializable, BlobMetadata {
|
public class BlobMetadataImpl extends StorageMetadataImpl implements Serializable, BlobMetadata {
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = -5932618957134612231L;
|
private static final long serialVersionUID = -5932618957134612231L;
|
||||||
|
|
||||||
private final String contentType;
|
private final String contentType;
|
||||||
private final byte[] contentMD5;
|
private final byte[] contentMD5;
|
||||||
|
|
||||||
public BlobMetadataImpl(String id, String name, URI location, String eTag, Long size,
|
public BlobMetadataImpl(String id, String name, @Nullable String location, URI uri, String eTag,
|
||||||
Date lastModified, Map<String, String> userMetadata, String contentType,
|
Long size, Date lastModified, Map<String, String> userMetadata, String contentType,
|
||||||
byte[] contentMD5) {
|
byte[] contentMD5) {
|
||||||
super(ResourceType.BLOB, id, name, location, eTag, size, lastModified, userMetadata);
|
super(StorageType.BLOB, id, name, location, uri, eTag, size, lastModified, userMetadata);
|
||||||
this.contentType = contentType;
|
this.contentType = contentType;
|
||||||
this.contentMD5 = contentMD5;
|
this.contentMD5 = contentMD5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public String getContentType() {
|
public String getContentType() {
|
||||||
return contentType;
|
return contentType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public byte[] getContentMD5() {
|
public byte[] getContentMD5() {
|
||||||
if (contentMD5 != null) {
|
if (contentMD5 != null) {
|
||||||
byte[] retval = new byte[contentMD5.length];
|
byte[] retval = new byte[contentMD5.length];
|
||||||
|
@ -61,9 +71,4 @@ public class BlobMetadataImpl extends ResourceMetadataImpl implements Serializab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compareTo(BlobMetadata o) {
|
|
||||||
if (getName() == null)
|
|
||||||
return -1;
|
|
||||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -25,14 +25,14 @@ import javax.ws.rs.core.MediaType;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System and user Metadata for the {@link Blob}.
|
* System and user Metadata for the {@link Blob}.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class MutableBlobMetadataImpl extends MutableResourceMetadataImpl implements
|
public class MutableBlobMetadataImpl extends MutableStorageMetadataImpl implements
|
||||||
MutableBlobMetadata {
|
MutableBlobMetadata {
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = -5932618957134612231L;
|
private static final long serialVersionUID = -5932618957134612231L;
|
||||||
|
@ -42,12 +42,12 @@ public class MutableBlobMetadataImpl extends MutableResourceMetadataImpl impleme
|
||||||
|
|
||||||
public MutableBlobMetadataImpl() {
|
public MutableBlobMetadataImpl() {
|
||||||
super();
|
super();
|
||||||
this.setType(ResourceType.BLOB);
|
this.setType(StorageType.BLOB);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MutableBlobMetadataImpl(BlobMetadata from) {
|
public MutableBlobMetadataImpl(BlobMetadata from) {
|
||||||
super(from);
|
super(from);
|
||||||
this.setType(ResourceType.BLOB);
|
this.setType(StorageType.BLOB);
|
||||||
this.contentType = from.getContentType();
|
this.contentType = from.getContentType();
|
||||||
this.contentMD5 = from.getContentMD5();
|
this.contentMD5 = from.getContentMD5();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.blobstore.domain.internal;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
|
import org.jclouds.domain.internal.MutableResourceMetadataImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to construct new resources or modify existing ones.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class MutableStorageMetadataImpl extends MutableResourceMetadataImpl<StorageType> implements
|
||||||
|
MutableStorageMetadata, Serializable {
|
||||||
|
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = -280558162576368264L;
|
||||||
|
|
||||||
|
private String eTag;
|
||||||
|
private Long size;
|
||||||
|
private Date lastModified;
|
||||||
|
|
||||||
|
public MutableStorageMetadataImpl() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MutableStorageMetadataImpl(StorageMetadata from) {
|
||||||
|
super(from);
|
||||||
|
this.eTag = from.getETag();
|
||||||
|
this.size = from.getSize();
|
||||||
|
this.lastModified = from.getLastModified();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getETag() {
|
||||||
|
return eTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Long getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Date getLastModified() {
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setLastModified(Date lastModified) {
|
||||||
|
this.lastModified = lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setSize(long size) {
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setETag(String eTag) {
|
||||||
|
this.eTag = eTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = super.hashCode();
|
||||||
|
result = prime * result + ((eTag == null) ? 0 : eTag.hashCode());
|
||||||
|
result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode());
|
||||||
|
result = prime * result + ((size == null) ? 0 : size.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (!super.equals(obj))
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
MutableStorageMetadataImpl other = (MutableStorageMetadataImpl) obj;
|
||||||
|
if (eTag == null) {
|
||||||
|
if (other.eTag != null)
|
||||||
|
return false;
|
||||||
|
} else if (!eTag.equals(other.eTag))
|
||||||
|
return false;
|
||||||
|
if (lastModified == null) {
|
||||||
|
if (other.lastModified != null)
|
||||||
|
return false;
|
||||||
|
} else if (!lastModified.equals(other.lastModified))
|
||||||
|
return false;
|
||||||
|
if (size == null) {
|
||||||
|
if (other.size != null)
|
||||||
|
return false;
|
||||||
|
} else if (!size.equals(other.size))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.blobstore.domain.internal;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
|
import org.jclouds.blobstore.domain.StorageType;
|
||||||
|
import org.jclouds.domain.internal.ResourceMetadataImpl;
|
||||||
|
|
||||||
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Idpayload of the object
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class StorageMetadataImpl extends ResourceMetadataImpl<StorageType> implements
|
||||||
|
StorageMetadata, Serializable {
|
||||||
|
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = -280558162576368264L;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final String eTag;
|
||||||
|
@Nullable
|
||||||
|
private final Long size;
|
||||||
|
@Nullable
|
||||||
|
private final Date lastModified;
|
||||||
|
|
||||||
|
public StorageMetadataImpl(StorageType type, @Nullable String id, @Nullable String name,
|
||||||
|
@Nullable String location, @Nullable URI uri, @Nullable String eTag,
|
||||||
|
@Nullable Long size, @Nullable Date lastModified, Map<String, String> userMetadata) {
|
||||||
|
super(type, id, name, location, uri, userMetadata);
|
||||||
|
this.eTag = eTag;
|
||||||
|
this.size = size;
|
||||||
|
this.lastModified = lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getETag() {
|
||||||
|
return eTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getLastModified() {
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -20,25 +20,25 @@ package org.jclouds.blobstore.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
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.blobstore.domain.internal.ResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.StorageMetadataImpl;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ResourceMetadataToRelativePathResourceMetadata implements
|
public class ResourceMetadataToRelativePathResourceMetadata implements
|
||||||
Function<ResourceMetadata, ResourceMetadata> {
|
Function<StorageMetadata, StorageMetadata> {
|
||||||
|
|
||||||
public ResourceMetadata apply(ResourceMetadata md) {
|
public StorageMetadata apply(StorageMetadata md) {
|
||||||
String name = md.getName();
|
String name = md.getName();
|
||||||
for (String suffix : BlobStoreConstants.DIRECTORY_SUFFIXES) {
|
for (String suffix : BlobStoreConstants.DIRECTORY_SUFFIXES) {
|
||||||
if (name.endsWith(suffix))
|
if (name.endsWith(suffix))
|
||||||
name = name.substring(0, name.length() - suffix.length());
|
name = name.substring(0, name.length() - suffix.length());
|
||||||
}
|
}
|
||||||
return new ResourceMetadataImpl(ResourceType.RELATIVE_PATH, md.getId(), name, md
|
return new StorageMetadataImpl(StorageType.RELATIVE_PATH, md.getId(), name, md
|
||||||
.getLocation(), md.getETag(), md.getSize(), md.getLastModified(), md
|
.getLocation(), md.getUri(), md.getETag(), md.getSize(), md.getLastModified(), md
|
||||||
.getUserMetadata());
|
.getUserMetadata());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,8 @@ import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
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.blobstore.domain.internal.MutableBlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
|
@ -193,8 +193,8 @@ public abstract class BaseBlobMap<V> {
|
||||||
|
|
||||||
public Set<String> keySet() {
|
public Set<String> keySet() {
|
||||||
Set<String> keys = Sets.newHashSet();
|
Set<String> keys = Sets.newHashSet();
|
||||||
for (ResourceMetadata object : getAllBlobMetadata.execute(containerName, options))
|
for (StorageMetadata object : getAllBlobMetadata.execute(containerName, options))
|
||||||
if (object.getType() == ResourceType.BLOB)
|
if (object.getType() == StorageType.BLOB)
|
||||||
keys.add(pathStripper.apply(object.getName()));
|
keys.add(pathStripper.apply(object.getName()));
|
||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
package org.jclouds.blobstore.strategy;
|
package org.jclouds.blobstore.strategy;
|
||||||
|
|
||||||
import org.jclouds.blobstore.AsyncBlobStore;
|
import org.jclouds.blobstore.AsyncBlobStore;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.strategy.internal.MarkersGetDirectoryStrategy;
|
import org.jclouds.blobstore.strategy.internal.MarkersGetDirectoryStrategy;
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
import com.google.inject.ImplementedBy;
|
||||||
|
@ -32,5 +32,5 @@ import com.google.inject.ImplementedBy;
|
||||||
@ImplementedBy(MarkersGetDirectoryStrategy.class)
|
@ImplementedBy(MarkersGetDirectoryStrategy.class)
|
||||||
public interface GetDirectoryStrategy {
|
public interface GetDirectoryStrategy {
|
||||||
|
|
||||||
ResourceMetadata execute(AsyncBlobStore connection, String containerName, String directory);
|
StorageMetadata execute(AsyncBlobStore connection, String containerName, String directory);
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.blobstore.strategy;
|
package org.jclouds.blobstore.strategy;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.strategy.internal.MarkersIsDirectoryStrategy;
|
import org.jclouds.blobstore.strategy.internal.MarkersIsDirectoryStrategy;
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
import com.google.inject.ImplementedBy;
|
||||||
|
@ -31,5 +31,5 @@ import com.google.inject.ImplementedBy;
|
||||||
@ImplementedBy(MarkersIsDirectoryStrategy.class)
|
@ImplementedBy(MarkersIsDirectoryStrategy.class)
|
||||||
public interface IsDirectoryStrategy {
|
public interface IsDirectoryStrategy {
|
||||||
|
|
||||||
boolean execute(ResourceMetadata metadata);
|
boolean execute(StorageMetadata metadata);
|
||||||
}
|
}
|
|
@ -25,8 +25,8 @@ import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.AsyncBlobStore;
|
import org.jclouds.blobstore.AsyncBlobStore;
|
||||||
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.blobstore.internal.BlobRuntimeException;
|
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
|
@ -67,8 +67,8 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr
|
||||||
|
|
||||||
public void execute(final String containerName, ListContainerOptions options) {
|
public void execute(final String containerName, ListContainerOptions options) {
|
||||||
Set<ListenableFuture<Void>> deletes = Sets.newHashSet();
|
Set<ListenableFuture<Void>> deletes = Sets.newHashSet();
|
||||||
for (ResourceMetadata md : getAllBlobMetadata.execute(containerName, options)) {
|
for (StorageMetadata md : getAllBlobMetadata.execute(containerName, options)) {
|
||||||
if (md.getType() == ResourceType.BLOB)
|
if (md.getType() == StorageType.BLOB)
|
||||||
deletes.add(connection.removeBlob(containerName, md.getName()));
|
deletes.add(connection.removeBlob(containerName, md.getName()));
|
||||||
}
|
}
|
||||||
for (ListenableFuture<Void> isdeleted : deletes) {
|
for (ListenableFuture<Void> isdeleted : deletes) {
|
||||||
|
|
|
@ -27,8 +27,8 @@ import javax.inject.Singleton;
|
||||||
import org.jclouds.blobstore.AsyncBlobStore;
|
import org.jclouds.blobstore.AsyncBlobStore;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
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.blobstore.internal.BlobRuntimeException;
|
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
|
@ -60,11 +60,11 @@ public class ListBlobMetadataInContainer implements ListBlobMetadataStrategy {
|
||||||
|
|
||||||
public SortedSet<? extends BlobMetadata> execute(String container, ListContainerOptions options) {
|
public SortedSet<? extends BlobMetadata> execute(String container, ListContainerOptions options) {
|
||||||
try {
|
try {
|
||||||
ListResponse<? extends ResourceMetadata> resources = connection.list(container, options)
|
ListResponse<? extends StorageMetadata> resources = connection.list(container, options)
|
||||||
.get(requestTimeoutMilliseconds, TimeUnit.MILLISECONDS);
|
.get(requestTimeoutMilliseconds, TimeUnit.MILLISECONDS);
|
||||||
SortedSet<BlobMetadata> blobM = Sets.newTreeSet();
|
SortedSet<BlobMetadata> blobM = Sets.newTreeSet();
|
||||||
for (ResourceMetadata from : resources) {
|
for (StorageMetadata from : resources) {
|
||||||
if (from.getType() == ResourceType.BLOB)
|
if (from.getType() == StorageType.BLOB)
|
||||||
blobM.add((BlobMetadata) from);
|
blobM.add((BlobMetadata) from);
|
||||||
}
|
}
|
||||||
return blobM;
|
return blobM;
|
||||||
|
|
|
@ -25,7 +25,7 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.AsyncBlobStore;
|
import org.jclouds.blobstore.AsyncBlobStore;
|
||||||
import org.jclouds.blobstore.KeyNotFoundException;
|
import org.jclouds.blobstore.KeyNotFoundException;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.functions.ResourceMetadataToRelativePathResourceMetadata;
|
import org.jclouds.blobstore.functions.ResourceMetadataToRelativePathResourceMetadata;
|
||||||
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
|
@ -69,7 +69,7 @@ public class MarkersGetDirectoryStrategy implements GetDirectoryStrategy {
|
||||||
this.resource2Directory = resource2Directory;
|
this.resource2Directory = resource2Directory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResourceMetadata execute(AsyncBlobStore connection, String containerName, String directory) {
|
public StorageMetadata execute(AsyncBlobStore connection, String containerName, String directory) {
|
||||||
for (String suffix : BlobStoreConstants.DIRECTORY_SUFFIXES) {
|
for (String suffix : BlobStoreConstants.DIRECTORY_SUFFIXES) {
|
||||||
try {
|
try {
|
||||||
return resource2Directory.apply(connection.blobMetadata(containerName,
|
return resource2Directory.apply(connection.blobMetadata(containerName,
|
||||||
|
|
|
@ -21,7 +21,7 @@ package org.jclouds.blobstore.strategy.internal;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||||
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
||||||
@Singleton
|
@Singleton
|
||||||
public class MarkersIsDirectoryStrategy implements IsDirectoryStrategy {
|
public class MarkersIsDirectoryStrategy implements IsDirectoryStrategy {
|
||||||
|
|
||||||
public boolean execute(ResourceMetadata metadata) {
|
public boolean execute(StorageMetadata metadata) {
|
||||||
switch (metadata.getType()) {
|
switch (metadata.getType()) {
|
||||||
case CONTAINER:
|
case CONTAINER:
|
||||||
case FOLDER:
|
case FOLDER:
|
||||||
|
|
|
@ -26,7 +26,7 @@ import java.io.InputStream;
|
||||||
import org.jclouds.blobstore.BlobStore;
|
import org.jclouds.blobstore.BlobStore;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.util.Utils;
|
import org.jclouds.util.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,7 +36,7 @@ import org.jclouds.util.Utils;
|
||||||
*/
|
*/
|
||||||
public class BlobStoreUtils {
|
public class BlobStoreUtils {
|
||||||
|
|
||||||
public static Blob newBlob(BlobStore blobStore, ResourceMetadata blobMeta) {
|
public static Blob newBlob(BlobStore blobStore, StorageMetadata blobMeta) {
|
||||||
Blob blob = blobStore.newBlob(blobMeta.getName());
|
Blob blob = blobStore.newBlob(blobMeta.getName());
|
||||||
if (blobMeta instanceof BlobMetadata) {
|
if (blobMeta instanceof BlobMetadata) {
|
||||||
blob.getMetadata().setContentMD5(((BlobMetadata) blobMeta).getContentMD5());
|
blob.getMetadata().setContentMD5(((BlobMetadata) blobMeta).getContentMD5());
|
||||||
|
@ -46,6 +46,7 @@ public class BlobStoreUtils {
|
||||||
blob.getMetadata().setId(blobMeta.getId());
|
blob.getMetadata().setId(blobMeta.getId());
|
||||||
blob.getMetadata().setLastModified(blobMeta.getLastModified());
|
blob.getMetadata().setLastModified(blobMeta.getLastModified());
|
||||||
blob.getMetadata().setLocation(blobMeta.getLocation());
|
blob.getMetadata().setLocation(blobMeta.getLocation());
|
||||||
|
blob.getMetadata().setUri(blobMeta.getUri());
|
||||||
blob.getMetadata().setUserMetadata(blobMeta.getUserMetadata());
|
blob.getMetadata().setUserMetadata(blobMeta.getUserMetadata());
|
||||||
return blob;
|
return blob;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ import static org.testng.Assert.assertEquals;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
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.blobstore.domain.internal.MutableBlobMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ public class BlobMetadataToRelativePathResourceMetadataTest {
|
||||||
MutableBlobMetadata md = blobMetadataProvider.get();
|
MutableBlobMetadata md = blobMetadataProvider.get();
|
||||||
md.setName("dir/");
|
md.setName("dir/");
|
||||||
md.setId("dir/");
|
md.setId("dir/");
|
||||||
ResourceMetadata rd = parser.apply(md);
|
StorageMetadata rd = parser.apply(md);
|
||||||
assertEquals(rd.getName(), "dir");
|
assertEquals(rd.getName(), "dir");
|
||||||
assertEquals(rd.getId(), "dir/");
|
assertEquals(rd.getId(), "dir/");
|
||||||
assertEquals(rd.getType(), ResourceType.RELATIVE_PATH);
|
assertEquals(rd.getType(), StorageType.RELATIVE_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -56,10 +56,10 @@ public class BlobMetadataToRelativePathResourceMetadataTest {
|
||||||
MutableBlobMetadata md = blobMetadataProvider.get();
|
MutableBlobMetadata md = blobMetadataProvider.get();
|
||||||
md.setName("dir_$folder$");
|
md.setName("dir_$folder$");
|
||||||
md.setId("dir_$folder$");
|
md.setId("dir_$folder$");
|
||||||
ResourceMetadata rd = parser.apply(md);
|
StorageMetadata rd = parser.apply(md);
|
||||||
assertEquals(rd.getName(), "dir");
|
assertEquals(rd.getName(), "dir");
|
||||||
assertEquals(rd.getId(), "dir_$folder$");
|
assertEquals(rd.getId(), "dir_$folder$");
|
||||||
assertEquals(rd.getType(), ResourceType.RELATIVE_PATH);
|
assertEquals(rd.getType(), StorageType.RELATIVE_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -67,9 +67,9 @@ public class BlobMetadataToRelativePathResourceMetadataTest {
|
||||||
MutableBlobMetadata md = blobMetadataProvider.get();
|
MutableBlobMetadata md = blobMetadataProvider.get();
|
||||||
md.setName("dir");
|
md.setName("dir");
|
||||||
md.setId("dir");
|
md.setId("dir");
|
||||||
ResourceMetadata rd = parser.apply(md);
|
StorageMetadata rd = parser.apply(md);
|
||||||
assertEquals(rd.getName(), "dir");
|
assertEquals(rd.getName(), "dir");
|
||||||
assertEquals(rd.getId(), "dir");
|
assertEquals(rd.getId(), "dir");
|
||||||
assertEquals(rd.getType(), ResourceType.RELATIVE_PATH);
|
assertEquals(rd.getType(), StorageType.RELATIVE_PATH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ import java.util.SortedSet;
|
||||||
import org.jclouds.blobstore.ContainerNotFoundException;
|
import org.jclouds.blobstore.ContainerNotFoundException;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.util.BlobStoreUtils;
|
import org.jclouds.blobstore.util.BlobStoreUtils;
|
||||||
import org.jclouds.encryption.internal.JCEEncryptionService;
|
import org.jclouds.encryption.internal.JCEEncryptionService;
|
||||||
import org.jclouds.http.HttpResponseException;
|
import org.jclouds.http.HttpResponseException;
|
||||||
|
@ -266,7 +266,7 @@ public class BaseBlobIntegrationTest<A, S> extends BaseBlobStoreIntegrationTest<
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertContainerEmptyDeleting(String containerName, String key) {
|
private void assertContainerEmptyDeleting(String containerName, String key) {
|
||||||
SortedSet<? extends ResourceMetadata> listing = context.getBlobStore().list(containerName);
|
SortedSet<? extends StorageMetadata> listing = context.getBlobStore().list(containerName);
|
||||||
assertEquals(listing.size(), 0, String.format(
|
assertEquals(listing.size(), 0, String.format(
|
||||||
"deleting %s, we still have %s left in container %s, using encoding %s", key,
|
"deleting %s, we still have %s left in container %s, using encoding %s", key,
|
||||||
listing.size(), containerName, LOCAL_ENCODING));
|
listing.size(), containerName, LOCAL_ENCODING));
|
||||||
|
|
|
@ -37,8 +37,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
import org.jclouds.blobstore.BlobStoreContext;
|
||||||
import org.jclouds.blobstore.attr.ConsistencyModels;
|
import org.jclouds.blobstore.attr.ConsistencyModels;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
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.blobstore.util.BlobStoreUtils;
|
import org.jclouds.blobstore.util.BlobStoreUtils;
|
||||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||||
import org.testng.ITestContext;
|
import org.testng.ITestContext;
|
||||||
|
@ -176,16 +176,16 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
||||||
protected static void deleteEverything(final BlobStoreContext<?, ?> context) throws Exception {
|
protected static void deleteEverything(final BlobStoreContext<?, ?> context) throws Exception {
|
||||||
try {
|
try {
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
Iterable<? extends ResourceMetadata> testContainers = Iterables.filter(context
|
Iterable<? extends StorageMetadata> testContainers = 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 || input.getType() == ResourceType.FOLDER)
|
return (input.getType() == StorageType.CONTAINER || input.getType() == StorageType.FOLDER)
|
||||||
&& input.getName().startsWith(CONTAINER_PREFIX.toLowerCase());
|
&& input.getName().startsWith(CONTAINER_PREFIX.toLowerCase());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (testContainers.iterator().hasNext()) {
|
if (testContainers.iterator().hasNext()) {
|
||||||
ExecutorService executor = Executors.newCachedThreadPool();
|
ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
for (final ResourceMetadata metaDatum : testContainers) {
|
for (final StorageMetadata metaDatum : testContainers) {
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
deleteContainerOrWarnIfUnable(context, metaDatum.getName());
|
deleteContainerOrWarnIfUnable(context, metaDatum.getName());
|
||||||
|
@ -239,7 +239,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
||||||
|
|
||||||
protected static void createContainerAndEnsureEmpty(BlobStoreContext<?, ?> context,
|
protected static void createContainerAndEnsureEmpty(BlobStoreContext<?, ?> context,
|
||||||
final String containerName) throws InterruptedException {
|
final String containerName) throws InterruptedException {
|
||||||
context.getBlobStore().createContainer(containerName);
|
context.getBlobStore().createContainerInLocation("default", containerName);
|
||||||
if (context.getConsistencyModel() == ConsistencyModels.EVENTUAL)
|
if (context.getConsistencyModel() == ConsistencyModels.EVENTUAL)
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
context.getBlobStore().clearContainer(containerName);
|
context.getBlobStore().clearContainer(containerName);
|
||||||
|
@ -287,13 +287,13 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
||||||
assertConsistencyAware(new Runnable() {
|
assertConsistencyAware(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
SortedSet<? extends ResourceMetadata> list = context.getBlobStore().list(
|
SortedSet<? extends StorageMetadata> list = context.getBlobStore().list(
|
||||||
containerName);
|
containerName);
|
||||||
assert list.size() == count : String.format("expected only %d values in %s: %s",
|
assert list.size() == count : String.format("expected only %d values in %s: %s",
|
||||||
count, containerName, Sets.newHashSet(Iterables.transform(list,
|
count, containerName, Sets.newHashSet(Iterables.transform(list,
|
||||||
new Function<ResourceMetadata, String>() {
|
new Function<StorageMetadata, String>() {
|
||||||
|
|
||||||
public String apply(ResourceMetadata from) {
|
public String apply(StorageMetadata from) {
|
||||||
return from.getName();
|
return from.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,8 +335,8 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
||||||
* *substantially* slow down tests on a real server over a network.
|
* *substantially* slow down tests on a real server over a network.
|
||||||
*/
|
*/
|
||||||
if (SANITY_CHECK_RETURNED_BUCKET_NAME) {
|
if (SANITY_CHECK_RETURNED_BUCKET_NAME) {
|
||||||
if (!Iterables.any(context.getBlobStore().list(), new Predicate<ResourceMetadata>() {
|
if (!Iterables.any(context.getBlobStore().list(), new Predicate<StorageMetadata>() {
|
||||||
public boolean apply(ResourceMetadata md) {
|
public boolean apply(StorageMetadata md) {
|
||||||
return containerName.equals(md.getName());
|
return containerName.equals(md.getName());
|
||||||
}
|
}
|
||||||
})) {
|
})) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
import org.jclouds.blobstore.domain.Blob;
|
import org.jclouds.blobstore.domain.Blob;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
@ -44,15 +44,16 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
@Test(groups = { "integration", "live" })
|
@Test(groups = { "integration", "live" })
|
||||||
public void containerDoesntExist() {
|
public void containerDoesntExist() {
|
||||||
assert !context.getBlobStore().containerExists("forgetaboutit");
|
assert !context.getBlobStore().containerExists("forgetaboutit");
|
||||||
assert !context.getBlobStore().containerExists("bog.cloudcachestorefunctionalintegrationtest-first");
|
assert !context.getBlobStore().containerExists(
|
||||||
|
"bog.cloudcachestorefunctionalintegrationtest-first");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = { "integration", "live" })
|
@Test(groups = { "integration", "live" })
|
||||||
public void testPutTwiceIsOk() throws InterruptedException {
|
public void testPutTwiceIsOk() throws InterruptedException {
|
||||||
String containerName = getContainerName();
|
String containerName = getContainerName();
|
||||||
try {
|
try {
|
||||||
context.getBlobStore().createContainer(containerName);
|
context.getBlobStore().createContainerInLocation("default", containerName);
|
||||||
context.getBlobStore().createContainer(containerName);
|
context.getBlobStore().createContainerInLocation("default", containerName);
|
||||||
} finally {
|
} finally {
|
||||||
returnContainer(containerName);
|
returnContainer(containerName);
|
||||||
}
|
}
|
||||||
|
@ -74,7 +75,7 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
String containerName = getContainerName();
|
String containerName = getContainerName();
|
||||||
try {
|
try {
|
||||||
addAlphabetUnderRoot(containerName);
|
addAlphabetUnderRoot(containerName);
|
||||||
ListResponse<? extends ResourceMetadata> container = context.getBlobStore().list(
|
ListResponse<? extends StorageMetadata> container = context.getBlobStore().list(
|
||||||
containerName, afterMarker("y"));
|
containerName, afterMarker("y"));
|
||||||
assertEquals(container.getMarker(), "y");
|
assertEquals(container.getMarker(), "y");
|
||||||
assert !container.isTruncated();
|
assert !container.isTruncated();
|
||||||
|
@ -91,7 +92,7 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
String prefix = "apps";
|
String prefix = "apps";
|
||||||
addTenObjectsUnderPrefix(containerName, prefix);
|
addTenObjectsUnderPrefix(containerName, prefix);
|
||||||
add15UnderRoot(containerName);
|
add15UnderRoot(containerName);
|
||||||
ListResponse<? extends ResourceMetadata> container = context.getBlobStore().list(
|
ListResponse<? extends StorageMetadata> container = context.getBlobStore().list(
|
||||||
containerName);
|
containerName);
|
||||||
assert !container.isTruncated();
|
assert !container.isTruncated();
|
||||||
assertEquals(container.size(), 16);
|
assertEquals(container.size(), 16);
|
||||||
|
@ -108,7 +109,7 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
addTenObjectsUnderPrefix(containerName, prefix);
|
addTenObjectsUnderPrefix(containerName, prefix);
|
||||||
add15UnderRoot(containerName);
|
add15UnderRoot(containerName);
|
||||||
|
|
||||||
ListContainerResponse<? extends ResourceMetadata> container = context.getBlobStore().list(
|
ListContainerResponse<? extends StorageMetadata> container = context.getBlobStore().list(
|
||||||
containerName, inDirectory("apps/"));
|
containerName, inDirectory("apps/"));
|
||||||
assert !container.isTruncated();
|
assert !container.isTruncated();
|
||||||
assertEquals(container.size(), 10);
|
assertEquals(container.size(), 10);
|
||||||
|
@ -124,7 +125,7 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
String containerName = getContainerName();
|
String containerName = getContainerName();
|
||||||
try {
|
try {
|
||||||
addAlphabetUnderRoot(containerName);
|
addAlphabetUnderRoot(containerName);
|
||||||
ListResponse<? extends ResourceMetadata> container = context.getBlobStore().list(
|
ListResponse<? extends StorageMetadata> container = context.getBlobStore().list(
|
||||||
containerName, maxResults(5));
|
containerName, maxResults(5));
|
||||||
assertEquals(container.getMaxResults(), 5);
|
assertEquals(container.getMaxResults(), 5);
|
||||||
assert container.isTruncated();
|
assert container.isTruncated();
|
||||||
|
@ -172,8 +173,8 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
assertConsistencyAware(new Runnable() {
|
assertConsistencyAware(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
assert !context.getBlobStore().containerExists(containerName) : "container " + containerName
|
assert !context.getBlobStore().containerExists(containerName) : "container "
|
||||||
+ " still exists";
|
+ containerName + " still exists";
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Throwables.propagateIfPossible(e);
|
Throwables.propagateIfPossible(e);
|
||||||
}
|
}
|
||||||
|
@ -187,8 +188,8 @@ public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegration
|
||||||
String containerName = getContainerName();
|
String containerName = getContainerName();
|
||||||
try {
|
try {
|
||||||
add15UnderRoot(containerName);
|
add15UnderRoot(containerName);
|
||||||
SortedSet<? extends ResourceMetadata> container = context.getBlobStore().list(
|
SortedSet<? extends StorageMetadata> container = context.getBlobStore()
|
||||||
containerName);
|
.list(containerName);
|
||||||
assertEquals(container.size(), 15);
|
assertEquals(container.size(), 15);
|
||||||
} finally {
|
} finally {
|
||||||
returnContainer(containerName);
|
returnContainer(containerName);
|
||||||
|
|
|
@ -20,8 +20,8 @@ package org.jclouds.blobstore.integration.internal;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,8 +32,8 @@ public class BaseServiceIntegrationTest<A, S> extends BaseBlobStoreIntegrationTe
|
||||||
|
|
||||||
@Test(groups = { "integration", "live" })
|
@Test(groups = { "integration", "live" })
|
||||||
void containerDoesntExist() {
|
void containerDoesntExist() {
|
||||||
SortedSet<? extends ResourceMetadata> list = context.getBlobStore().list();
|
SortedSet<? extends StorageMetadata> list = context.getBlobStore().list();
|
||||||
assert !list.contains(new MutableResourceMetadataImpl());
|
assert !list.contains(new MutableStorageMetadataImpl());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -20,7 +20,8 @@ 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.*;
|
import static com.google.common.util.concurrent.Futures.immediateFuture;
|
||||||
|
import static com.google.common.util.concurrent.Futures.makeListenable;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -58,12 +59,12 @@ import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.ListContainerResponse;
|
import org.jclouds.blobstore.domain.ListContainerResponse;
|
||||||
import org.jclouds.blobstore.domain.ListResponse;
|
import org.jclouds.blobstore.domain.ListResponse;
|
||||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.blobstore.domain.MutableStorageMetadata;
|
||||||
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.blobstore.domain.internal.ListContainerResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListContainerResponseImpl;
|
||||||
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
import org.jclouds.blobstore.domain.internal.ListResponseImpl;
|
||||||
import org.jclouds.blobstore.domain.internal.MutableResourceMetadataImpl;
|
import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
|
||||||
import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
|
import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
|
||||||
import org.jclouds.blobstore.options.GetOptions;
|
import org.jclouds.blobstore.options.GetOptions;
|
||||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||||
|
@ -164,7 +165,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
return immediateFuture(returnVal);
|
return immediateFuture(returnVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListContainerResponse<? extends ResourceMetadata>> list(
|
public ListenableFuture<? extends ListContainerResponse<? extends StorageMetadata>> list(
|
||||||
final String name, ListContainerOptions... optionsList) {
|
final String name, ListContainerOptions... optionsList) {
|
||||||
final ListContainerOptions options = (optionsList.length == 0) ? new ListContainerOptions()
|
final ListContainerOptions options = (optionsList.length == 0) ? new ListContainerOptions()
|
||||||
: optionsList[0];
|
: optionsList[0];
|
||||||
|
@ -174,21 +175,21 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
if (realContents == null)
|
if (realContents == null)
|
||||||
return immediateFailedFuture(new ContainerNotFoundException(name));
|
return immediateFailedFuture(new ContainerNotFoundException(name));
|
||||||
|
|
||||||
SortedSet<ResourceMetadata> contents = Sets.newTreeSet(Iterables.transform(realContents
|
SortedSet<StorageMetadata> contents = Sets.newTreeSet(Iterables.transform(realContents
|
||||||
.keySet(), new Function<String, ResourceMetadata>() {
|
.keySet(), new Function<String, StorageMetadata>() {
|
||||||
public ResourceMetadata apply(String key) {
|
public StorageMetadata apply(String key) {
|
||||||
MutableBlobMetadata md = copy(realContents.get(key).getMetadata());
|
MutableBlobMetadata md = copy(realContents.get(key).getMetadata());
|
||||||
if (isDirectoryStrategy.execute(md))
|
if (isDirectoryStrategy.execute(md))
|
||||||
md.setType(ResourceType.RELATIVE_PATH);
|
md.setType(StorageType.RELATIVE_PATH);
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (options.getMarker() != null) {
|
if (options.getMarker() != null) {
|
||||||
final String finalMarker = options.getMarker();
|
final String finalMarker = options.getMarker();
|
||||||
ResourceMetadata lastMarkerMetadata = Iterables.find(contents,
|
StorageMetadata lastMarkerMetadata = Iterables.find(contents,
|
||||||
new Predicate<ResourceMetadata>() {
|
new Predicate<StorageMetadata>() {
|
||||||
public boolean apply(ResourceMetadata metadata) {
|
public boolean apply(StorageMetadata metadata) {
|
||||||
return metadata.getName().equals(finalMarker);
|
return metadata.getName().equals(finalMarker);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -198,8 +199,8 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
|
|
||||||
final String prefix = options.getDir();
|
final String prefix = options.getDir();
|
||||||
if (prefix != null) {
|
if (prefix != null) {
|
||||||
contents = Sets.newTreeSet(Iterables.filter(contents, new Predicate<ResourceMetadata>() {
|
contents = Sets.newTreeSet(Iterables.filter(contents, new Predicate<StorageMetadata>() {
|
||||||
public boolean apply(ResourceMetadata o) {
|
public boolean apply(StorageMetadata o) {
|
||||||
return (o != null && o.getName().startsWith(prefix));
|
return (o != null && o.getName().startsWith(prefix));
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
@ -209,7 +210,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
boolean truncated = false;
|
boolean truncated = false;
|
||||||
String marker = null;
|
String marker = null;
|
||||||
if (options.getMaxResults() != null && contents.size() > 0) {
|
if (options.getMaxResults() != null && contents.size() > 0) {
|
||||||
SortedSet<ResourceMetadata> contentsSlice = firstSliceOfSize(contents, options
|
SortedSet<StorageMetadata> contentsSlice = firstSliceOfSize(contents, options
|
||||||
.getMaxResults().intValue());
|
.getMaxResults().intValue());
|
||||||
maxResults = options.getMaxResults();
|
maxResults = options.getMaxResults();
|
||||||
if (!contentsSlice.contains(contents.last())) {
|
if (!contentsSlice.contains(contents.last())) {
|
||||||
|
@ -233,17 +234,17 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
contents = Sets.newTreeSet(Iterables.filter(contents, new DelimiterFilter(
|
contents = Sets.newTreeSet(Iterables.filter(contents, new DelimiterFilter(
|
||||||
prefix != null ? prefix : null, delimiter)));
|
prefix != null ? prefix : null, delimiter)));
|
||||||
|
|
||||||
Iterables.<ResourceMetadata> addAll(contents, Iterables.transform(commonPrefixes,
|
Iterables.<StorageMetadata> addAll(contents, Iterables.transform(commonPrefixes,
|
||||||
new Function<String, ResourceMetadata>() {
|
new Function<String, StorageMetadata>() {
|
||||||
public ResourceMetadata apply(String o) {
|
public StorageMetadata apply(String o) {
|
||||||
MutableResourceMetadata md = new MutableResourceMetadataImpl();
|
MutableStorageMetadata md = new MutableStorageMetadataImpl();
|
||||||
md.setType(ResourceType.RELATIVE_PATH);
|
md.setType(StorageType.RELATIVE_PATH);
|
||||||
md.setName(o);
|
md.setName(o);
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
return immediateFuture(new ListContainerResponseImpl<ResourceMetadata>(contents, prefix,
|
return immediateFuture(new ListContainerResponseImpl<StorageMetadata>(contents, prefix,
|
||||||
marker, maxResults, truncated));
|
marker, maxResults, truncated));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -315,24 +316,25 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
return immediateFuture(getContainerToBlobs().containsKey(container));
|
return immediateFuture(getContainerToBlobs().containsKey(container));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<? extends ListResponse<? extends ResourceMetadata>> list() {
|
public ListenableFuture<? extends ListResponse<? extends StorageMetadata>> list() {
|
||||||
return immediateFuture(new ListResponseImpl<ResourceMetadata>(Iterables.transform(
|
return immediateFuture(new ListResponseImpl<StorageMetadata>(Iterables.transform(
|
||||||
getContainerToBlobs().keySet(), new Function<String, ResourceMetadata>() {
|
getContainerToBlobs().keySet(), new Function<String, StorageMetadata>() {
|
||||||
public ResourceMetadata apply(String name) {
|
public StorageMetadata apply(String name) {
|
||||||
MutableResourceMetadata cmd = create();
|
MutableStorageMetadata cmd = create();
|
||||||
cmd.setName(name);
|
cmd.setName(name);
|
||||||
cmd.setType(ResourceType.CONTAINER);
|
cmd.setType(StorageType.CONTAINER);
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
}), null, null, false));
|
}), null, null, false));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MutableResourceMetadata create() {
|
protected MutableStorageMetadata create() {
|
||||||
return new MutableResourceMetadataImpl();
|
return new MutableStorageMetadataImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<Boolean> createContainer(final String name) {
|
public ListenableFuture<Boolean> createContainerInLocation(final String location,
|
||||||
|
final String name) {
|
||||||
if (!getContainerToBlobs().containsKey(name)) {
|
if (!getContainerToBlobs().containsKey(name)) {
|
||||||
getContainerToBlobs().put(name, new ConcurrentHashMap<String, Blob>());
|
getContainerToBlobs().put(name, new ConcurrentHashMap<String, Blob>());
|
||||||
}
|
}
|
||||||
|
@ -346,7 +348,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class DelimiterFilter implements Predicate<ResourceMetadata> {
|
protected class DelimiterFilter implements Predicate<StorageMetadata> {
|
||||||
private final String prefix;
|
private final String prefix;
|
||||||
private final String delimiter;
|
private final String delimiter;
|
||||||
|
|
||||||
|
@ -355,7 +357,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
this.delimiter = delimiter;
|
this.delimiter = delimiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean apply(ResourceMetadata metadata) {
|
public boolean apply(StorageMetadata metadata) {
|
||||||
if (prefix == null)
|
if (prefix == null)
|
||||||
return metadata.getName().indexOf(delimiter) == -1;
|
return metadata.getName().indexOf(delimiter) == -1;
|
||||||
if (metadata.getName().startsWith(prefix))
|
if (metadata.getName().startsWith(prefix))
|
||||||
|
@ -364,7 +366,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class CommonPrefixes implements Function<ResourceMetadata, String> {
|
protected class CommonPrefixes implements Function<StorageMetadata, String> {
|
||||||
private final String prefix;
|
private final String prefix;
|
||||||
private final String delimiter;
|
private final String delimiter;
|
||||||
public static final String NO_PREFIX = "NO_PREFIX";
|
public static final String NO_PREFIX = "NO_PREFIX";
|
||||||
|
@ -374,7 +376,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
||||||
this.delimiter = delimiter;
|
this.delimiter = delimiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String apply(ResourceMetadata metadata) {
|
public String apply(StorageMetadata metadata) {
|
||||||
String working = metadata.getName();
|
String working = metadata.getName();
|
||||||
|
|
||||||
if (prefix != null) {
|
if (prefix != null) {
|
||||||
|
|
|
@ -67,7 +67,8 @@ public class RetryOnNotFoundGetAllBlobsStrategyTest {
|
||||||
Injector context = new StubBlobStoreContextBuilder().buildInjector();
|
Injector context = new StubBlobStoreContextBuilder().buildInjector();
|
||||||
GetAllBlobsInListAndRetryOnFailure map = context
|
GetAllBlobsInListAndRetryOnFailure map = context
|
||||||
.getInstance(GetAllBlobsInListAndRetryOnFailure.class);
|
.getInstance(GetAllBlobsInListAndRetryOnFailure.class);
|
||||||
context.getInstance(AsyncBlobStore.class).createContainer("container").get();
|
context.getInstance(AsyncBlobStore.class).createContainerInLocation("default", "container")
|
||||||
|
.get();
|
||||||
|
|
||||||
ListenableFuture<Blob> futureObject = createMock(ListenableFuture.class);
|
ListenableFuture<Blob> futureObject = createMock(ListenableFuture.class);
|
||||||
Blob object = blobProvider.create(null);
|
Blob object = blobProvider.create(null);
|
||||||
|
@ -93,7 +94,8 @@ public class RetryOnNotFoundGetAllBlobsStrategyTest {
|
||||||
Injector context = new StubBlobStoreContextBuilder().buildInjector();
|
Injector context = new StubBlobStoreContextBuilder().buildInjector();
|
||||||
GetAllBlobsInListAndRetryOnFailure map = context
|
GetAllBlobsInListAndRetryOnFailure map = context
|
||||||
.getInstance(GetAllBlobsInListAndRetryOnFailure.class);
|
.getInstance(GetAllBlobsInListAndRetryOnFailure.class);
|
||||||
context.getInstance(AsyncBlobStore.class).createContainer("container").get();
|
context.getInstance(AsyncBlobStore.class).createContainerInLocation("default", "container")
|
||||||
|
.get();
|
||||||
|
|
||||||
ListenableFuture<Blob> futureObject = createMock(ListenableFuture.class);
|
ListenableFuture<Blob> futureObject = createMock(ListenableFuture.class);
|
||||||
Blob object = createMock(Blob.class);
|
Blob object = createMock(Blob.class);
|
||||||
|
|
|
@ -18,44 +18,49 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.compute;
|
package org.jclouds.compute;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
import org.jclouds.compute.domain.CreateNodeResponse;
|
import org.jclouds.compute.domain.CreateNodeResponse;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeIdentity;
|
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.Profile;
|
import org.jclouds.compute.domain.Profile;
|
||||||
|
import org.jclouds.compute.domain.Size;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Provides portable access to launching compute instances.
|
||||||
*
|
*
|
||||||
* @author Ivan Meredith
|
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
* @author Ivan Meredith
|
||||||
*/
|
*/
|
||||||
public interface ComputeService {
|
public interface ComputeService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List all sizes available to the current user
|
||||||
|
*/
|
||||||
|
Map<String, Size> getSizes();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List all nodes available to the current user
|
* List all nodes available to the current user
|
||||||
*/
|
*/
|
||||||
Set<NodeIdentity> listNodes();
|
Set<ComputeMetadata> listNodes();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find all nodes matching the specified name
|
* Create a new node given the name, size, and Image
|
||||||
*/
|
|
||||||
Set<NodeIdentity> getNodeByName(String name);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new node given the name, profile, and Image
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
CreateNodeResponse createNode(String name, Profile profile, Image image);
|
CreateNodeResponse startNodeInLocation(String location, String name, Profile size, Image image);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* destroy the node.
|
* destroy the node.
|
||||||
*/
|
*/
|
||||||
void destroyNode(String id);
|
void destroyNode(ComputeMetadata node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a node by its id
|
* Find a node by its id
|
||||||
*/
|
*/
|
||||||
NodeMetadata getNodeMetadata(String id);
|
NodeMetadata getNodeMetadata(ComputeMetadata node);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.compute.domain;
|
package org.jclouds.compute.domain;
|
||||||
|
|
||||||
import org.jclouds.compute.domain.internal.NodeIdentityImpl;
|
import org.jclouds.compute.domain.internal.ComputeMetadataImpl;
|
||||||
|
import org.jclouds.domain.ResourceMetadata;
|
||||||
|
|
||||||
import com.google.inject.ImplementedBy;
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
@ -26,19 +27,34 @@ import com.google.inject.ImplementedBy;
|
||||||
* @author Ivan Meredith
|
* @author Ivan Meredith
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@ImplementedBy(NodeIdentityImpl.class)
|
@ImplementedBy(ComputeMetadataImpl.class)
|
||||||
public interface NodeIdentity extends Comparable<NodeIdentity> {
|
public interface ComputeMetadata extends ResourceMetadata<ComputeType> {
|
||||||
|
/**
|
||||||
|
* Type of the resource, ex node, image, size
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ComputeType getType();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* unique id of the server. potentially generated by the service.
|
* unique id of the server. potentially generated by the service.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String getId();
|
public String getId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* user defined name of the server.
|
* user defined name of the server.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String getName();
|
public String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* location where the node exists..
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getLocation();
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.compute.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public enum ComputeType {
|
||||||
|
|
||||||
|
NODE, IMAGE, SIZE;
|
||||||
|
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ import java.util.SortedSet;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
* @author Ivan Meredith
|
* @author Ivan Meredith
|
||||||
*/
|
*/
|
||||||
public interface NodeMetadata extends NodeIdentity {
|
public interface NodeMetadata extends ComputeMetadata {
|
||||||
NodeState getState();
|
NodeState getState();
|
||||||
|
|
||||||
SortedSet<InetAddress> getPublicAddresses();
|
SortedSet<InetAddress> getPublicAddresses();
|
||||||
|
|
|
@ -27,7 +27,7 @@ import java.util.Map;
|
||||||
*/
|
*/
|
||||||
public interface Size {
|
public interface Size {
|
||||||
/**
|
/**
|
||||||
* Unique ID provided by the provider (m1.small, etc)
|
* provider-specific identifier (m1.small, etc)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
String getId();
|
String getId();
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.compute.domain.internal;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
|
import org.jclouds.compute.domain.ComputeType;
|
||||||
|
import org.jclouds.domain.internal.ResourceMetadataImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
* @author Ivan Meredith
|
||||||
|
*/
|
||||||
|
public class ComputeMetadataImpl extends ResourceMetadataImpl<ComputeType> implements
|
||||||
|
ComputeMetadata {
|
||||||
|
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = 7374704415964898694L;
|
||||||
|
|
||||||
|
public ComputeMetadataImpl(ComputeType type, String id, String name, String location, URI uri,
|
||||||
|
Map<String, String> userMetadata) {
|
||||||
|
super(type, id, name, location, uri, userMetadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -19,6 +19,7 @@
|
||||||
package org.jclouds.compute.domain.internal;
|
package org.jclouds.compute.domain.internal;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.compute.domain.CreateNodeResponse;
|
import org.jclouds.compute.domain.CreateNodeResponse;
|
||||||
|
@ -32,12 +33,17 @@ import org.jclouds.domain.Credentials;
|
||||||
*/
|
*/
|
||||||
public class CreateNodeResponseImpl extends NodeMetadataImpl implements CreateNodeResponse {
|
public class CreateNodeResponseImpl extends NodeMetadataImpl implements CreateNodeResponse {
|
||||||
|
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = 3414239861247046054L;
|
||||||
|
|
||||||
private final Credentials credentials;
|
private final Credentials credentials;
|
||||||
|
|
||||||
public CreateNodeResponseImpl(String id, String name, NodeState state,
|
public CreateNodeResponseImpl(String id, String name, String location, URI uri,
|
||||||
|
Map<String, String> userMetadata, NodeState state,
|
||||||
Iterable<InetAddress> publicAddresses, Iterable<InetAddress> privateAddresses,
|
Iterable<InetAddress> publicAddresses, Iterable<InetAddress> privateAddresses,
|
||||||
int loginPort, LoginType loginType, Credentials credentials, Map<String, String> extra) {
|
int loginPort, LoginType loginType, Credentials credentials, Map<String, String> extra) {
|
||||||
super(id, name, state, publicAddresses, privateAddresses, loginPort, loginType, extra);
|
super(id, name, location, uri, userMetadata, state, publicAddresses, privateAddresses,
|
||||||
|
loginPort, loginType, extra);
|
||||||
this.credentials = credentials;
|
this.credentials = credentials;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* 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.compute.domain.internal;
|
|
||||||
|
|
||||||
import org.jclouds.compute.domain.NodeIdentity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Adrian Cole
|
|
||||||
* @author Ivan Meredith
|
|
||||||
*/
|
|
||||||
public class NodeIdentityImpl implements NodeIdentity {
|
|
||||||
|
|
||||||
private final String id;
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
public NodeIdentityImpl(String id, String name) {
|
|
||||||
this.id = id;
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public int compareTo(NodeIdentity o) {
|
|
||||||
if (getName() == null)
|
|
||||||
return -1;
|
|
||||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
final int prime = 31;
|
|
||||||
int result = 1;
|
|
||||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
|
||||||
if (getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
NodeIdentityImpl other = (NodeIdentityImpl) obj;
|
|
||||||
if (id == null) {
|
|
||||||
if (other.id != null)
|
|
||||||
return false;
|
|
||||||
} else if (!id.equals(other.id))
|
|
||||||
return false;
|
|
||||||
if (name == null) {
|
|
||||||
if (other.name != null)
|
|
||||||
return false;
|
|
||||||
} else if (!name.equals(other.name))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "[id=" + id + ", name=" + name + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -19,10 +19,12 @@
|
||||||
package org.jclouds.compute.domain.internal;
|
package org.jclouds.compute.domain.internal;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ComputeType;
|
||||||
import org.jclouds.compute.domain.LoginType;
|
import org.jclouds.compute.domain.LoginType;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.NodeState;
|
import org.jclouds.compute.domain.NodeState;
|
||||||
|
@ -35,7 +37,10 @@ import com.google.common.collect.Sets;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
* @author Ivan Meredith
|
* @author Ivan Meredith
|
||||||
*/
|
*/
|
||||||
public class NodeMetadataImpl extends NodeIdentityImpl implements NodeMetadata {
|
public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadata {
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = 7924307572338157887L;
|
||||||
|
|
||||||
public static final Comparator<InetAddress> ADDRESS_COMPARATOR = new Comparator<InetAddress>() {
|
public static final Comparator<InetAddress> ADDRESS_COMPARATOR = new Comparator<InetAddress>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -51,17 +56,11 @@ public class NodeMetadataImpl extends NodeIdentityImpl implements NodeMetadata {
|
||||||
private final int loginPort;
|
private final int loginPort;
|
||||||
private final LoginType loginType;
|
private final LoginType loginType;
|
||||||
|
|
||||||
@Override
|
public NodeMetadataImpl(String id, String name, String location, URI uri,
|
||||||
public String toString() {
|
Map<String, String> userMetadata, NodeState state,
|
||||||
return "[id=" + getId() + ", name=" + getName() + ", state=" + getState()
|
|
||||||
+ ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses
|
|
||||||
+ "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
public NodeMetadataImpl(String id, String name, NodeState state,
|
|
||||||
Iterable<InetAddress> publicAddresses, Iterable<InetAddress> privateAddresses,
|
Iterable<InetAddress> publicAddresses, Iterable<InetAddress> privateAddresses,
|
||||||
int loginPort, LoginType loginType, Map<String, String> extra) {
|
int loginPort, LoginType loginType, Map<String, String> extra) {
|
||||||
super(id, name);
|
super(ComputeType.NODE, id, name, location, uri, userMetadata);
|
||||||
this.state = state;
|
this.state = state;
|
||||||
Iterables.addAll(this.publicAddresses, publicAddresses);
|
Iterables.addAll(this.publicAddresses, publicAddresses);
|
||||||
Iterables.addAll(this.privateAddresses, privateAddresses);
|
Iterables.addAll(this.privateAddresses, privateAddresses);
|
||||||
|
@ -113,6 +112,14 @@ public class NodeMetadataImpl extends NodeIdentityImpl implements NodeMetadata {
|
||||||
return extra;
|
return extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "[id=" + getId() + ", name=" + getName() + ", location=" + getLocation() + ", uri="
|
||||||
|
+ getUri() + ", userMetadata=" + getUserMetadata() + ", state=" + getState()
|
||||||
|
+ ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.compute.util;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class ComputeUtils {
|
||||||
|
public static Iterable<ComputeMetadata> filterByName(Iterable<ComputeMetadata> nodes,
|
||||||
|
final String name) {
|
||||||
|
return Iterables.filter(nodes, new Predicate<ComputeMetadata>() {
|
||||||
|
@Override
|
||||||
|
public boolean apply(ComputeMetadata input) {
|
||||||
|
return input.getName().equalsIgnoreCase(name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package org.jclouds.domain;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jclouds.domain.internal.MutableResourceMetadataImpl;
|
||||||
|
|
||||||
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to construct new resources or modify existing ones.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@ImplementedBy(MutableResourceMetadataImpl.class)
|
||||||
|
public interface MutableResourceMetadata<T extends Enum<T>> extends ResourceMetadata<T> {
|
||||||
|
/**
|
||||||
|
* @see #getType
|
||||||
|
*/
|
||||||
|
void setType(T type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getId
|
||||||
|
*/
|
||||||
|
void setId(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getName
|
||||||
|
*/
|
||||||
|
void setName(String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getLocation
|
||||||
|
*/
|
||||||
|
void setLocation(String location);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getUri
|
||||||
|
*/
|
||||||
|
void setUri(URI url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #getUserMetadata
|
||||||
|
*/
|
||||||
|
void setUserMetadata(Map<String, String> userMetadata);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.domain;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifies containers, files, etc.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@ImplementedBy(ResourceMetadata.class)
|
||||||
|
public interface ResourceMetadata<T extends Enum<T>> extends Comparable<ResourceMetadata<T>> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this resource is a container, file, node, queue, etc.
|
||||||
|
*/
|
||||||
|
T getType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unique identifier of this resource within its enclosing namespace. In some scenarios, this id
|
||||||
|
* is not user assignable. For files, this may be an system generated key, or the full path to
|
||||||
|
* the resource. ex. /path/to/file.txt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getId();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of this resource. Names are dictated by the user. For files, this may be the filename,
|
||||||
|
* ex. file.txt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Physical location of the resource.
|
||||||
|
*
|
||||||
|
* ex. us-west-1
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String getLocation();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URI used to access this resource
|
||||||
|
*/
|
||||||
|
URI getUri();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any key-value pairs associated with the resource.
|
||||||
|
*/
|
||||||
|
Map<String, String> getUserMetadata();
|
||||||
|
|
||||||
|
}
|
|
@ -16,33 +16,34 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
package org.jclouds.blobstore.domain.internal;
|
package org.jclouds.domain.internal;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.MutableResourceMetadata;
|
import org.jclouds.domain.MutableResourceMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.domain.ResourceMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Idpayload of the object
|
* Used to construct new resources or modify existing ones.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class MutableResourceMetadataImpl implements MutableResourceMetadata, Serializable {
|
public class MutableResourceMetadataImpl<T extends Enum<T>> implements MutableResourceMetadata<T>,
|
||||||
|
Serializable {
|
||||||
|
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = -280558162576368264L;
|
private static final long serialVersionUID = -280558162576368264L;
|
||||||
|
|
||||||
private ResourceType type;
|
private T type;
|
||||||
private String id;
|
private String id;
|
||||||
private String name;
|
private String name;
|
||||||
private URI location;
|
private String location;
|
||||||
|
private URI uri;
|
||||||
private String eTag;
|
private String eTag;
|
||||||
private Long size;
|
private Long size;
|
||||||
private Date lastModified;
|
private Date lastModified;
|
||||||
|
@ -52,53 +53,125 @@ public class MutableResourceMetadataImpl implements MutableResourceMetadata, Ser
|
||||||
userMetadata = Maps.newHashMap();
|
userMetadata = Maps.newHashMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MutableResourceMetadataImpl(ResourceMetadata from) {
|
public MutableResourceMetadataImpl(ResourceMetadata<T> from) {
|
||||||
this.type = from.getType();
|
this.type = from.getType();
|
||||||
this.id = from.getId();
|
this.id = from.getId();
|
||||||
this.name = from.getName();
|
this.name = from.getName();
|
||||||
this.location = from.getLocation();
|
this.location = from.getLocation();
|
||||||
this.eTag = from.getETag();
|
this.uri = from.getUri();
|
||||||
this.size = from.getSize();
|
|
||||||
this.lastModified = from.getLastModified();
|
|
||||||
this.userMetadata = from.getUserMetadata();
|
this.userMetadata = from.getUserMetadata();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compareTo(ResourceMetadata o) {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int compareTo(ResourceMetadata<T> o) {
|
||||||
if (getName() == null)
|
if (getName() == null)
|
||||||
return -1;
|
return -1;
|
||||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
return (this == o) ? 0 : getName().compareTo(o.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResourceType getType() {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public T getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public URI getLocation() {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public URI getUri() {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Map<String, String> getUserMetadata() {
|
||||||
|
return userMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setType(T type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setUserMetadata(Map<String, String> userMetadata) {
|
||||||
|
this.userMetadata = userMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setUri(URI uri) {
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setLocation(String location) {
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getLocation() {
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getETag() {
|
@Override
|
||||||
return eTag;
|
public String toString() {
|
||||||
}
|
return "[type=" + type + ", id=" + id + ", name=" + name + ", location=" + location
|
||||||
|
+ ", uri=" + uri + ", userMetadata=" + userMetadata + "]";
|
||||||
public Long getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getLastModified() {
|
|
||||||
return lastModified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getUserMetadata() {
|
|
||||||
return userMetadata;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -112,6 +185,7 @@ public class MutableResourceMetadataImpl implements MutableResourceMetadata, Ser
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
result = prime * result + ((size == null) ? 0 : size.hashCode());
|
result = prime * result + ((size == null) ? 0 : size.hashCode());
|
||||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||||
|
result = prime * result + ((uri == null) ? 0 : uri.hashCode());
|
||||||
result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode());
|
result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +198,7 @@ public class MutableResourceMetadataImpl implements MutableResourceMetadata, Ser
|
||||||
return false;
|
return false;
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
MutableResourceMetadataImpl other = (MutableResourceMetadataImpl) obj;
|
MutableResourceMetadataImpl<?> other = (MutableResourceMetadataImpl<?>) obj;
|
||||||
if (eTag == null) {
|
if (eTag == null) {
|
||||||
if (other.eTag != null)
|
if (other.eTag != null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -160,6 +234,11 @@ public class MutableResourceMetadataImpl implements MutableResourceMetadata, Ser
|
||||||
return false;
|
return false;
|
||||||
} else if (!type.equals(other.type))
|
} else if (!type.equals(other.type))
|
||||||
return false;
|
return false;
|
||||||
|
if (uri == null) {
|
||||||
|
if (other.uri != null)
|
||||||
|
return false;
|
||||||
|
} else if (!uri.equals(other.uri))
|
||||||
|
return false;
|
||||||
if (userMetadata == null) {
|
if (userMetadata == null) {
|
||||||
if (other.userMetadata != null)
|
if (other.userMetadata != null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -168,42 +247,4 @@ public class MutableResourceMetadataImpl implements MutableResourceMetadata, Ser
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastModified(Date lastModified) {
|
|
||||||
this.lastModified = lastModified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSize(long size) {
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(ResourceType type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserMetadata(Map<String, String> userMetadata) {
|
|
||||||
this.userMetadata = userMetadata;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setETag(String eTag) {
|
|
||||||
this.eTag = eTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLocation(URI location) {
|
|
||||||
this.location = location;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "[type=" + type + ", id=" + id + ", name=" + name + ", size=" + size
|
|
||||||
+ ", lastModified=" + lastModified + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,18 +16,17 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
package org.jclouds.blobstore.domain.internal;
|
package org.jclouds.domain.internal;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.blobstore.domain.ResourceMetadata;
|
import org.jclouds.domain.ResourceMetadata;
|
||||||
import org.jclouds.blobstore.domain.ResourceType;
|
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
import com.google.inject.internal.Nullable;
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,73 +34,86 @@ import com.google.inject.internal.Nullable;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class ResourceMetadataImpl implements ResourceMetadata, Serializable {
|
public class ResourceMetadataImpl<T extends Enum<T>> implements ResourceMetadata<T>, Serializable {
|
||||||
|
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = -280558162576368264L;
|
private static final long serialVersionUID = -280558162576368264L;
|
||||||
|
|
||||||
private final ResourceType type;
|
private final T type;
|
||||||
private final @Nullable
|
@Nullable
|
||||||
String id;
|
private final String id;
|
||||||
private final @Nullable
|
@Nullable
|
||||||
String name;
|
private final String name;
|
||||||
private final @Nullable
|
@Nullable
|
||||||
URI location;
|
private final String location;
|
||||||
private final @Nullable
|
@Nullable
|
||||||
String eTag;
|
private final URI uri;
|
||||||
private final @Nullable
|
private final Map<String, String> userMetadata = Maps.newLinkedHashMap();
|
||||||
Long size;
|
|
||||||
private final @Nullable
|
|
||||||
Date lastModified;
|
|
||||||
private final Map<String, String> userMetadata;
|
|
||||||
|
|
||||||
public ResourceMetadataImpl(ResourceType type, @Nullable String id, @Nullable String name,
|
public ResourceMetadataImpl(T type, @Nullable String id, @Nullable String name,
|
||||||
@Nullable URI location, @Nullable String eTag, @Nullable Long size,
|
@Nullable String location, @Nullable URI uri, Map<String, String> userMetadata) {
|
||||||
@Nullable Date lastModified, Map<String, String> userMetadata) {
|
|
||||||
this.type = checkNotNull(type, "type");
|
this.type = checkNotNull(type, "type");
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.location = location;
|
this.location = location;
|
||||||
this.eTag = eTag;
|
this.uri = uri;
|
||||||
this.size = size;
|
this.userMetadata.putAll(checkNotNull(userMetadata, "userMetadata"));
|
||||||
this.lastModified = lastModified;
|
|
||||||
this.userMetadata = checkNotNull(userMetadata, "userMetadata");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compareTo(ResourceMetadata o) {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int compareTo(ResourceMetadata<T> o) {
|
||||||
if (getName() == null)
|
if (getName() == null)
|
||||||
return -1;
|
return -1;
|
||||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
return (this == o) ? 0 : getName().compareTo(o.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResourceType getType() {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public T getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
/**
|
||||||
return name;
|
* {@inheritDoc}
|
||||||
}
|
*/
|
||||||
|
@Override
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public URI getLocation() {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getLocation() {
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getETag() {
|
/**
|
||||||
return eTag;
|
* {@inheritDoc}
|
||||||
}
|
*/
|
||||||
|
@Override
|
||||||
public Long getSize() {
|
public URI getUri() {
|
||||||
return size;
|
return uri;
|
||||||
}
|
|
||||||
|
|
||||||
public Date getLastModified() {
|
|
||||||
return lastModified;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public Map<String, String> getUserMetadata() {
|
public Map<String, String> getUserMetadata() {
|
||||||
return userMetadata;
|
return userMetadata;
|
||||||
}
|
}
|
||||||
|
@ -110,13 +122,11 @@ public class ResourceMetadataImpl implements ResourceMetadata, Serializable {
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ((eTag == null) ? 0 : eTag.hashCode());
|
|
||||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||||
result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode());
|
|
||||||
result = prime * result + ((location == null) ? 0 : location.hashCode());
|
result = prime * result + ((location == null) ? 0 : location.hashCode());
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
result = prime * result + ((size == null) ? 0 : size.hashCode());
|
|
||||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||||
|
result = prime * result + ((uri == null) ? 0 : uri.hashCode());
|
||||||
result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode());
|
result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -129,22 +139,12 @@ public class ResourceMetadataImpl implements ResourceMetadata, Serializable {
|
||||||
return false;
|
return false;
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
ResourceMetadataImpl other = (ResourceMetadataImpl) obj;
|
ResourceMetadataImpl<?> other = (ResourceMetadataImpl<?>) obj;
|
||||||
if (eTag == null) {
|
|
||||||
if (other.eTag != null)
|
|
||||||
return false;
|
|
||||||
} else if (!eTag.equals(other.eTag))
|
|
||||||
return false;
|
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
if (other.id != null)
|
if (other.id != null)
|
||||||
return false;
|
return false;
|
||||||
} else if (!id.equals(other.id))
|
} else if (!id.equals(other.id))
|
||||||
return false;
|
return false;
|
||||||
if (lastModified == null) {
|
|
||||||
if (other.lastModified != null)
|
|
||||||
return false;
|
|
||||||
} else if (!lastModified.equals(other.lastModified))
|
|
||||||
return false;
|
|
||||||
if (location == null) {
|
if (location == null) {
|
||||||
if (other.location != null)
|
if (other.location != null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -155,16 +155,16 @@ public class ResourceMetadataImpl implements ResourceMetadata, Serializable {
|
||||||
return false;
|
return false;
|
||||||
} else if (!name.equals(other.name))
|
} else if (!name.equals(other.name))
|
||||||
return false;
|
return false;
|
||||||
if (size == null) {
|
|
||||||
if (other.size != null)
|
|
||||||
return false;
|
|
||||||
} else if (!size.equals(other.size))
|
|
||||||
return false;
|
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
if (other.type != null)
|
if (other.type != null)
|
||||||
return false;
|
return false;
|
||||||
} else if (!type.equals(other.type))
|
} else if (!type.equals(other.type))
|
||||||
return false;
|
return false;
|
||||||
|
if (uri == null) {
|
||||||
|
if (other.uri != null)
|
||||||
|
return false;
|
||||||
|
} else if (!uri.equals(other.uri))
|
||||||
|
return false;
|
||||||
if (userMetadata == null) {
|
if (userMetadata == null) {
|
||||||
if (other.userMetadata != null)
|
if (other.userMetadata != null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -173,4 +173,10 @@ public class ResourceMetadataImpl implements ResourceMetadata, Serializable {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "[type=" + type + ", id=" + id + ", name=" + name + ", location=" + location
|
||||||
|
+ ", uri=" + uri + ", userMetadata=" + userMetadata + "]";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ public class WireLiveTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = "live")
|
@Test(groups = "live")
|
||||||
public void testRemoteInputInputStream() throws Exception {
|
public void testRemoteInputStream() throws Exception {
|
||||||
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
||||||
URLConnection connection = url.openConnection();
|
URLConnection connection = url.openConnection();
|
||||||
HttpWire wire = setUp();
|
HttpWire wire = setUp();
|
||||||
|
@ -154,8 +154,8 @@ public class WireLiveTest {
|
||||||
assertEquals(((BufferLogger) wire.getWireLog()).buff.toString().getBytes().length, 3331484);
|
assertEquals(((BufferLogger) wire.getWireLog()).buff.toString().getBytes().length, 3331484);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = "live")
|
@Test(groups = "live", enabled = false)
|
||||||
public void testCopyRemoteInputInputStream() throws Exception {
|
public void testCopyRemoteInputStream() throws Exception {
|
||||||
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
||||||
URLConnection connection = url.openConnection();
|
URLConnection connection = url.openConnection();
|
||||||
Callable<Void> callable = new ConnectionTester(connection.getInputStream());
|
Callable<Void> callable = new ConnectionTester(connection.getInputStream());
|
||||||
|
@ -165,7 +165,7 @@ public class WireLiveTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = "live")
|
@Test(groups = "live")
|
||||||
public void testRemoteInputInputStreamSynch() throws Exception {
|
public void testRemoteInputStreamSynch() throws Exception {
|
||||||
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
URL url = new URL(checkNotNull(sysHttpStreamUrl, "sysHttpStreamUrl"));
|
||||||
URLConnection connection = url.openConnection();
|
URLConnection connection = url.openConnection();
|
||||||
HttpWire wire = setUpSynch();
|
HttpWire wire = setUpSynch();
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
<artifact:localRepository id="local.repository" path="${user.home}/.m2/repository" />
|
<artifact:localRepository id="local.repository" path="${user.home}/.m2/repository" />
|
||||||
<artifact:remoteRepository id="jclouds-snapshot.repository" url="http://jclouds.rimuhosting.com/maven2/snapshots" />
|
<artifact:remoteRepository id="jclouds-snapshot.repository" url="http://jclouds.rimuhosting.com/maven2/snapshots" />
|
||||||
|
<artifact:remoteRepository id="shrinkwrap.repository" url="http://repository.jboss.org/maven2" />
|
||||||
|
|
||||||
<!-- Setup maven so that we can get latest version of jclouds, shrinkwrap, and jruby -->
|
<!-- Setup maven so that we can get latest version of jclouds, shrinkwrap, and jruby -->
|
||||||
<artifact:dependencies pathId="shrinkwrap.classpath">
|
<artifact:dependencies pathId="shrinkwrap.classpath">
|
||||||
|
@ -41,6 +41,7 @@
|
||||||
<dependency groupId="org.jclouds" artifactId="jclouds-atmos" version="1.0-SNAPSHOT" />
|
<dependency groupId="org.jclouds" artifactId="jclouds-atmos" version="1.0-SNAPSHOT" />
|
||||||
<dependency groupId="org.jclouds" artifactId="jclouds-azure" version="1.0-SNAPSHOT" />
|
<dependency groupId="org.jclouds" artifactId="jclouds-azure" version="1.0-SNAPSHOT" />
|
||||||
<dependency groupId="org.jclouds" artifactId="jclouds-rackspace" version="1.0-SNAPSHOT" />
|
<dependency groupId="org.jclouds" artifactId="jclouds-rackspace" version="1.0-SNAPSHOT" />
|
||||||
|
<remoteRepository refid="shrinkwrap.repository" />
|
||||||
<remoteRepository refid="jclouds-snapshot.repository" />
|
<remoteRepository refid="jclouds-snapshot.repository" />
|
||||||
<localRepository refid="local.repository" />
|
<localRepository refid="local.repository" />
|
||||||
</artifact:dependencies>
|
</artifact:dependencies>
|
||||||
|
@ -76,6 +77,8 @@
|
||||||
addproperty="key"
|
addproperty="key"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<property name="location" value="default" />
|
||||||
|
|
||||||
<property name="urltoparse" value="blobstore://${account}:${key}@${service}/${container}" />
|
<property name="urltoparse" value="blobstore://${account}:${key}@${service}/${container}" />
|
||||||
|
|
||||||
<target name="export">
|
<target name="export">
|
||||||
|
@ -120,7 +123,7 @@ class ShrinkBlob < Task
|
||||||
|
|
||||||
# array thing is a weird hack since jruby doesn't understand varargs
|
# array thing is a weird hack since jruby doesn't understand varargs
|
||||||
context = BlobStoreContextFactory.new().createContext(destination)
|
context = BlobStoreContextFactory.new().createContext(destination)
|
||||||
context.getBlobStore().createContainer(@container)
|
context.getBlobStore().createContainerInLocation(@location, @container)
|
||||||
|
|
||||||
print "uploading to ",destination.getHost(),"/",@container,"/",@zip,"\n"
|
print "uploading to ",destination.getHost(),"/",@container,"/",@zip,"\n"
|
||||||
context.createInputStreamMap(@container).put(@zip,zipStream);
|
context.createInputStreamMap(@container).put(@zip,zipStream);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue