mirror of https://github.com/apache/jclouds.git
moved cdn extension to an Optional
This commit is contained in:
parent
000ed4a393
commit
5dced71f42
|
@ -18,62 +18,55 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.hpcloud.objectstorage;
|
package org.jclouds.hpcloud.objectstorage;
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
|
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.DELETE;
|
import javax.ws.rs.DELETE;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.HEAD;
|
import javax.ws.rs.HEAD;
|
||||||
import javax.ws.rs.HeaderParam;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
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 javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound;
|
import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound;
|
||||||
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNAsyncClient;
|
||||||
import org.jclouds.hpcloud.objectstorage.functions.ParseCDNUriFromHeaders;
|
|
||||||
import org.jclouds.hpcloud.objectstorage.functions.ParseContainerCDNMetadataFromHeaders;
|
|
||||||
import org.jclouds.hpcloud.objectstorage.functions.ParseContainerMetadataFromHeaders;
|
import org.jclouds.hpcloud.objectstorage.functions.ParseContainerMetadataFromHeaders;
|
||||||
import org.jclouds.hpcloud.objectstorage.options.CreateContainerOptions;
|
import org.jclouds.hpcloud.objectstorage.options.CreateContainerOptions;
|
||||||
import org.jclouds.hpcloud.objectstorage.options.ListCDNContainerOptions;
|
|
||||||
import org.jclouds.hpcloud.objectstorage.reference.HPCloudObjectStorageHeaders;
|
|
||||||
import org.jclouds.hpcloud.services.HPExtensionCDN;
|
|
||||||
import org.jclouds.openstack.filters.AuthenticateRequest;
|
import org.jclouds.openstack.filters.AuthenticateRequest;
|
||||||
import org.jclouds.openstack.services.ObjectStore;
|
|
||||||
import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
|
import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
|
||||||
import org.jclouds.openstack.swift.Storage;
|
import org.jclouds.openstack.swift.Storage;
|
||||||
import org.jclouds.openstack.swift.domain.ContainerMetadata;
|
import org.jclouds.openstack.swift.domain.ContainerMetadata;
|
||||||
import org.jclouds.openstack.swift.functions.ReturnTrueOn404FalseOn409;
|
import org.jclouds.openstack.swift.functions.ReturnTrueOn404FalseOn409;
|
||||||
import org.jclouds.openstack.swift.options.ListContainerOptions;
|
import org.jclouds.openstack.swift.options.ListContainerOptions;
|
||||||
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.rest.annotations.Endpoint;
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
import org.jclouds.rest.annotations.Headers;
|
|
||||||
import org.jclouds.rest.annotations.QueryParams;
|
import org.jclouds.rest.annotations.QueryParams;
|
||||||
import org.jclouds.rest.annotations.RequestFilters;
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
import org.jclouds.rest.annotations.ResponseParser;
|
import org.jclouds.rest.annotations.ResponseParser;
|
||||||
import org.jclouds.rest.annotations.SkipEncoding;
|
import org.jclouds.rest.annotations.SkipEncoding;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides asynchronous access to HP Cloud Object Storage via the REST API.
|
* Provides asynchronous access to HP Cloud Object Storage via the REST API.
|
||||||
*
|
*
|
||||||
* <p/>All commands return a ListenableFuture of the result. Any exceptions incurred
|
* <p/>
|
||||||
* during processing will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in
|
* All commands return a ListenableFuture of the result. Any exceptions incurred during processing
|
||||||
|
* will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in
|
||||||
* {@link ListenableFuture#get()}.
|
* {@link ListenableFuture#get()}.
|
||||||
*
|
*
|
||||||
* @see HPCloudObjectStorageClient
|
* @see HPCloudObjectStorageClient
|
||||||
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object Storage API</a>
|
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object
|
||||||
|
* Storage API</a>
|
||||||
* @author Jeremy Daggett
|
* @author Jeremy Daggett
|
||||||
*/
|
*/
|
||||||
@SkipEncoding('/')
|
@SkipEncoding('/')
|
||||||
@RequestFilters(AuthenticateRequest.class)
|
@RequestFilters(AuthenticateRequest.class)
|
||||||
@Endpoint(ObjectStore.class)
|
@Endpoint(Storage.class)
|
||||||
public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient {
|
public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,69 +105,9 @@ public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient
|
||||||
ListenableFuture<Boolean> deleteContainerIfEmpty(@PathParam("container") String container);
|
ListenableFuture<Boolean> deleteContainerIfEmpty(@PathParam("container") String container);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see HPCloudObjectStorageClient#listCDNContainers(ListCDNContainerOptions...)
|
* Provides synchronous access to CDN features.
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Delegate
|
||||||
@GET
|
Optional<HPCloudCDNAsyncClient> getCDNExtension();
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
|
||||||
@QueryParams(keys = "format", values = "json")
|
|
||||||
@Path("/")
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<? extends Set<ContainerCDNMetadata>> listCDNContainers(ListCDNContainerOptions... options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HPCloudObjectStorageClient#getCDNMetadata(String)
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
@HEAD
|
|
||||||
@ResponseParser(ParseContainerCDNMetadataFromHeaders.class)
|
|
||||||
@ExceptionParser(ReturnNullOnContainerNotFound.class)
|
|
||||||
@Path("/{container}")
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<ContainerCDNMetadata> getCDNMetadata(@PathParam("container") String container);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HPCloudObjectStorageClient#enableCDN(String, long)
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
@PUT
|
|
||||||
@Path("/{container}")
|
|
||||||
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
|
|
||||||
@ResponseParser(ParseCDNUriFromHeaders.class)
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<URI> enableCDN(@PathParam("container") String container,
|
|
||||||
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HPCloudObjectStorageClient#enableCDN(String)
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
@PUT
|
|
||||||
@Path("/{container}")
|
|
||||||
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
|
|
||||||
@ResponseParser(ParseCDNUriFromHeaders.class)
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<URI> enableCDN(@PathParam("container") String container);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HPCloudObjectStorageClient#updateCDN(String, long)
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
@POST
|
|
||||||
@Path("/{container}")
|
|
||||||
@ResponseParser(ParseCDNUriFromHeaders.class)
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<URI> updateCDN(@PathParam("container") String container,
|
|
||||||
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HPCloudObjectStorageClient#disableCDN(String)
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
@PUT
|
|
||||||
@Path("/{container}")
|
|
||||||
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "False")
|
|
||||||
@Endpoint(HPExtensionCDN.class)
|
|
||||||
ListenableFuture<Boolean> disableCDN(@PathParam("container") String container);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,19 +18,16 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.hpcloud.objectstorage;
|
package org.jclouds.hpcloud.objectstorage;
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jclouds.concurrent.Timeout;
|
import org.jclouds.concurrent.Timeout;
|
||||||
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNClient;
|
||||||
import org.jclouds.hpcloud.objectstorage.options.CreateContainerOptions;
|
import org.jclouds.hpcloud.objectstorage.options.CreateContainerOptions;
|
||||||
import org.jclouds.hpcloud.objectstorage.options.ListCDNContainerOptions;
|
|
||||||
import org.jclouds.openstack.swift.CommonSwiftClient;
|
import org.jclouds.openstack.swift.CommonSwiftClient;
|
||||||
import org.jclouds.openstack.swift.domain.ContainerMetadata;
|
import org.jclouds.openstack.swift.domain.ContainerMetadata;
|
||||||
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,7 +35,8 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||||
*
|
*
|
||||||
* <p/>
|
* <p/>
|
||||||
* All commands return a ListenableFuture of the result. Any exceptions incurred during processing
|
* All commands return a ListenableFuture of the result. Any exceptions incurred during processing
|
||||||
* will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in {@link ListenableFuture#get()}.
|
* will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in
|
||||||
|
* {@link ListenableFuture#get()}.
|
||||||
*
|
*
|
||||||
* @see org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient
|
* @see org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient
|
||||||
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object
|
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object
|
||||||
|
@ -52,22 +50,9 @@ public interface HPCloudObjectStorageClient extends CommonSwiftClient {
|
||||||
|
|
||||||
ContainerMetadata getContainerMetadata(String container);
|
ContainerMetadata getContainerMetadata(String container);
|
||||||
|
|
||||||
@Beta
|
/**
|
||||||
Set<ContainerCDNMetadata> listCDNContainers(ListCDNContainerOptions... options);
|
* Provides synchronous access to CDN features.
|
||||||
|
*/
|
||||||
@Beta
|
@Delegate
|
||||||
ContainerCDNMetadata getCDNMetadata(String container);
|
Optional<HPCloudCDNClient> getCDNExtension();
|
||||||
|
|
||||||
@Beta
|
|
||||||
URI enableCDN(String container, long ttl);
|
|
||||||
|
|
||||||
@Beta
|
|
||||||
URI enableCDN(String container);
|
|
||||||
|
|
||||||
@Beta
|
|
||||||
URI updateCDN(String container, long ttl);
|
|
||||||
|
|
||||||
@Beta
|
|
||||||
boolean disableCDN(String container);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@ import org.jclouds.collect.Memoized;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
||||||
import org.jclouds.hpcloud.objectstorage.blobstore.functions.EnableCDNAndCache;
|
import org.jclouds.hpcloud.objectstorage.blobstore.functions.EnableCDNAndCache;
|
||||||
import org.jclouds.openstack.swift.CommonSwiftClient;
|
|
||||||
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
|
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
|
||||||
import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions;
|
import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions;
|
||||||
import org.jclouds.openstack.swift.blobstore.functions.BlobToObject;
|
import org.jclouds.openstack.swift.blobstore.functions.BlobToObject;
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.hpcloud.objectstorage.blobstore.config;
|
package org.jclouds.hpcloud.objectstorage.blobstore.config;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -31,6 +33,7 @@ import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageAsyncBlob
|
||||||
import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageBlobStore;
|
import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageBlobStore;
|
||||||
import org.jclouds.hpcloud.objectstorage.blobstore.functions.HPCloudObjectStorageObjectToBlobMetadata;
|
import org.jclouds.hpcloud.objectstorage.blobstore.functions.HPCloudObjectStorageObjectToBlobMetadata;
|
||||||
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNClient;
|
||||||
import org.jclouds.http.HttpResponseException;
|
import org.jclouds.http.HttpResponseException;
|
||||||
import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore;
|
import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore;
|
||||||
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
|
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
|
||||||
|
@ -38,6 +41,7 @@ import org.jclouds.openstack.swift.blobstore.config.SwiftBlobStoreContextModule;
|
||||||
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata;
|
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
|
@ -66,8 +70,10 @@ public class HPCloudObjectStorageBlobStoreContextModule extends SwiftBlobStoreCo
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URI load(String container) {
|
public URI load(String container) {
|
||||||
|
Optional<HPCloudCDNClient> cdnExension = client.getCDNExtension();
|
||||||
|
checkArgument(cdnExension.isPresent(), "CDN is required, but the extension is not available!");
|
||||||
try {
|
try {
|
||||||
ContainerCDNMetadata md = client.getCDNMetadata(container);
|
ContainerCDNMetadata md = cdnExension.get().getCDNMetadata(container);
|
||||||
return md != null ? md.getCDNUri() : null;
|
return md != null ? md.getCDNUri() : null;
|
||||||
} catch (HttpResponseException e) {
|
} catch (HttpResponseException e) {
|
||||||
// TODO: this is due to beta status
|
// TODO: this is due to beta status
|
||||||
|
|
|
@ -18,14 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.hpcloud.objectstorage.blobstore.functions;
|
package org.jclouds.hpcloud.objectstorage.blobstore.functions;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNClient;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,7 +49,9 @@ public class EnableCDNAndCache implements Function<String, URI> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URI apply(String input) {
|
public URI apply(String input) {
|
||||||
URI uri = sync.enableCDN(input);
|
Optional<HPCloudCDNClient> cdnExension = sync.getCDNExtension();
|
||||||
|
checkArgument(cdnExension.isPresent(), "CDN is required, but the extension is not available!");
|
||||||
|
URI uri = cdnExension.get().enableCDN(input);
|
||||||
cdnContainer.put(input, uri);
|
cdnContainer.put(input, uri);
|
||||||
return uri;
|
return uri;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,12 +21,14 @@ package org.jclouds.hpcloud.objectstorage.config;
|
||||||
import static org.jclouds.util.Suppliers2.getLastValueInMap;
|
import static org.jclouds.util.Suppliers2.getLastValueInMap;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import com.google.inject.Scopes;
|
|
||||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageAsyncClient;
|
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageAsyncClient;
|
||||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNAsyncClient;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNClient;
|
||||||
import org.jclouds.hpcloud.services.HPExtensionCDN;
|
import org.jclouds.hpcloud.services.HPExtensionCDN;
|
||||||
import org.jclouds.hpcloud.services.HPExtensionServiceType;
|
import org.jclouds.hpcloud.services.HPExtensionServiceType;
|
||||||
import org.jclouds.http.HttpErrorHandler;
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
@ -40,10 +42,10 @@ import org.jclouds.location.suppliers.ImplicitLocationSupplier;
|
||||||
import org.jclouds.location.suppliers.RegionIdToURISupplier;
|
import org.jclouds.location.suppliers.RegionIdToURISupplier;
|
||||||
import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone;
|
import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone;
|
||||||
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
|
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
|
||||||
import org.jclouds.openstack.services.ObjectStore;
|
|
||||||
import org.jclouds.openstack.services.ServiceType;
|
import org.jclouds.openstack.services.ServiceType;
|
||||||
import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
|
import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
|
||||||
import org.jclouds.openstack.swift.CommonSwiftClient;
|
import org.jclouds.openstack.swift.CommonSwiftClient;
|
||||||
|
import org.jclouds.openstack.swift.Storage;
|
||||||
import org.jclouds.openstack.swift.config.SwiftObjectModule;
|
import org.jclouds.openstack.swift.config.SwiftObjectModule;
|
||||||
import org.jclouds.openstack.swift.handlers.ParseSwiftErrorFromHttpResponse;
|
import org.jclouds.openstack.swift.handlers.ParseSwiftErrorFromHttpResponse;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
|
@ -51,7 +53,9 @@ import org.jclouds.rest.annotations.ApiVersion;
|
||||||
import org.jclouds.rest.config.RestClientModule;
|
import org.jclouds.rest.config.RestClientModule;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
import com.google.inject.Scopes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -61,9 +65,11 @@ import com.google.inject.Provides;
|
||||||
@RequiresHttp
|
@RequiresHttp
|
||||||
public class HPCloudObjectStorageRestClientModule extends
|
public class HPCloudObjectStorageRestClientModule extends
|
||||||
RestClientModule<HPCloudObjectStorageClient, HPCloudObjectStorageAsyncClient> {
|
RestClientModule<HPCloudObjectStorageClient, HPCloudObjectStorageAsyncClient> {
|
||||||
|
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder().put(
|
||||||
|
HPCloudCDNClient.class, HPCloudCDNAsyncClient.class).build();
|
||||||
|
|
||||||
public HPCloudObjectStorageRestClientModule() {
|
public HPCloudObjectStorageRestClientModule() {
|
||||||
super(HPCloudObjectStorageClient.class, HPCloudObjectStorageAsyncClient.class);
|
super(HPCloudObjectStorageClient.class, HPCloudObjectStorageAsyncClient.class, DELEGATE_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
|
@ -108,7 +114,7 @@ public class HPCloudObjectStorageRestClientModule extends
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
@ObjectStore
|
@Storage
|
||||||
protected Supplier<URI> provideStorageUrl(RegionIdToURISupplier.Factory factory, @ApiVersion String apiVersion) {
|
protected Supplier<URI> provideStorageUrl(RegionIdToURISupplier.Factory factory, @ApiVersion String apiVersion) {
|
||||||
return getLastValueInMap(factory.createForApiTypeAndVersion(ServiceType.OBJECT_STORE, apiVersion));
|
return getLastValueInMap(factory.createForApiTypeAndVersion(ServiceType.OBJECT_STORE, apiVersion));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jclouds.hpcloud.objectstorage.extensions;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.HEAD;
|
||||||
|
import javax.ws.rs.HeaderParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.functions.ParseCDNUriFromHeaders;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.functions.ParseContainerCDNMetadataFromHeaders;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.options.ListCDNContainerOptions;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.reference.HPCloudObjectStorageHeaders;
|
||||||
|
import org.jclouds.hpcloud.services.HPExtensionCDN;
|
||||||
|
import org.jclouds.openstack.filters.AuthenticateRequest;
|
||||||
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
import org.jclouds.rest.annotations.Headers;
|
||||||
|
import org.jclouds.rest.annotations.QueryParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.ResponseParser;
|
||||||
|
import org.jclouds.rest.annotations.SkipEncoding;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to HP Cloud Object Storage via the REST API.
|
||||||
|
*
|
||||||
|
* <p/>All commands return a ListenableFuture of the result. Any exceptions incurred
|
||||||
|
* during processing will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in
|
||||||
|
* {@link ListenableFuture#get()}.
|
||||||
|
*
|
||||||
|
* @see HPCloudObjectStorageClient
|
||||||
|
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object Storage API</a>
|
||||||
|
* @author Jeremy Daggett
|
||||||
|
*/
|
||||||
|
@SkipEncoding('/')
|
||||||
|
@RequestFilters(AuthenticateRequest.class)
|
||||||
|
@Endpoint(HPExtensionCDN.class)
|
||||||
|
public interface HPCloudCDNAsyncClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#listCDNContainers(ListCDNContainerOptions...)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@GET
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@QueryParams(keys = "format", values = "json")
|
||||||
|
@Path("/")
|
||||||
|
ListenableFuture<? extends Set<ContainerCDNMetadata>> listCDNContainers(ListCDNContainerOptions... options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#getCDNMetadata(String)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@HEAD
|
||||||
|
@ResponseParser(ParseContainerCDNMetadataFromHeaders.class)
|
||||||
|
@ExceptionParser(ReturnNullOnContainerNotFound.class)
|
||||||
|
@Path("/{container}")
|
||||||
|
ListenableFuture<ContainerCDNMetadata> getCDNMetadata(@PathParam("container") String container);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#enableCDN(String, long)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@PUT
|
||||||
|
@Path("/{container}")
|
||||||
|
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
|
||||||
|
@ResponseParser(ParseCDNUriFromHeaders.class)
|
||||||
|
ListenableFuture<URI> enableCDN(@PathParam("container") String container,
|
||||||
|
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#enableCDN(String)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@PUT
|
||||||
|
@Path("/{container}")
|
||||||
|
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
|
||||||
|
@ResponseParser(ParseCDNUriFromHeaders.class)
|
||||||
|
ListenableFuture<URI> enableCDN(@PathParam("container") String container);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#updateCDN(String, long)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@POST
|
||||||
|
@Path("/{container}")
|
||||||
|
@ResponseParser(ParseCDNUriFromHeaders.class)
|
||||||
|
ListenableFuture<URI> updateCDN(@PathParam("container") String container,
|
||||||
|
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see HPCloudObjectStorageClient#disableCDN(String)
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@PUT
|
||||||
|
@Path("/{container}")
|
||||||
|
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "False")
|
||||||
|
ListenableFuture<Boolean> disableCDN(@PathParam("container") String container);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jclouds.hpcloud.objectstorage.extensions;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
||||||
|
import org.jclouds.hpcloud.objectstorage.options.ListCDNContainerOptions;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to HP Cloud Object Storage via the REST API.
|
||||||
|
*
|
||||||
|
* <p/>
|
||||||
|
* All commands return a ListenableFuture of the result. Any exceptions incurred during processing
|
||||||
|
* will be wrapped in an {@link java.util.concurrent.ExecutionException} as documented in {@link ListenableFuture#get()}.
|
||||||
|
*
|
||||||
|
* @see org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient
|
||||||
|
* @see <a href="https://manage.hpcloud.com/pages/build/docs/objectstorage-lvs/api">HP Cloud Object
|
||||||
|
* Storage API</a>
|
||||||
|
* @author Jeremy Daggett
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 120, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface HPCloudCDNClient {
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
Set<ContainerCDNMetadata> listCDNContainers(ListCDNContainerOptions... options);
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
ContainerCDNMetadata getCDNMetadata(String container);
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
URI enableCDN(String container, long ttl);
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
URI enableCDN(String container);
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
URI updateCDN(String container, long ttl);
|
||||||
|
|
||||||
|
@Beta
|
||||||
|
boolean disableCDN(String container);
|
||||||
|
|
||||||
|
}
|
|
@ -57,34 +57,34 @@ public class HPCloudObjectStorageClientLiveTest extends CommonSwiftClientLiveTes
|
||||||
final String containerNameWithoutCDN = getContainerName();
|
final String containerNameWithoutCDN = getContainerName();
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
getApi().disableCDN(containerNameWithCDN);
|
getApi().getCDNExtension().get().disableCDN(containerNameWithCDN);
|
||||||
getApi().disableCDN(containerNameWithoutCDN);
|
getApi().getCDNExtension().get().disableCDN(containerNameWithoutCDN);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
ContainerCDNMetadata cdnMetadata = null;
|
ContainerCDNMetadata cdnMetadata = null;
|
||||||
|
|
||||||
// Enable CDN with PUT for one container
|
// Enable CDN with PUT for one container
|
||||||
final URI cdnUri = getApi().enableCDN(containerNameWithCDN);
|
final URI cdnUri = getApi().getCDNExtension().get().enableCDN(containerNameWithCDN);
|
||||||
assertTrue(cdnUri != null);
|
assertTrue(cdnUri != null);
|
||||||
|
|
||||||
// Confirm CDN is enabled via HEAD request and has default TTL
|
// Confirm CDN is enabled via HEAD request and has default TTL
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithCDN);
|
||||||
|
|
||||||
assertTrue(cdnMetadata.isCDNEnabled());
|
assertTrue(cdnMetadata.isCDNEnabled());
|
||||||
|
|
||||||
assertEquals(cdnMetadata.getCDNUri(), cdnUri);
|
assertEquals(cdnMetadata.getCDNUri(), cdnUri);
|
||||||
|
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithoutCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithoutCDN);
|
||||||
assert cdnMetadata == null || !cdnMetadata.isCDNEnabled() : containerNameWithoutCDN
|
assert cdnMetadata == null || !cdnMetadata.isCDNEnabled() : containerNameWithoutCDN
|
||||||
+ " should not have metadata";
|
+ " should not have metadata";
|
||||||
|
|
||||||
assert getApi().getCDNMetadata("DoesNotExist") == null;
|
assert getApi().getCDNExtension().get().getCDNMetadata("DoesNotExist") == null;
|
||||||
|
|
||||||
// List CDN metadata for containers, and ensure all CDN info is
|
// List CDN metadata for containers, and ensure all CDN info is
|
||||||
// available for enabled
|
// available for enabled
|
||||||
// container
|
// container
|
||||||
Set<ContainerCDNMetadata> cdnMetadataList = getApi().listCDNContainers();
|
Set<ContainerCDNMetadata> cdnMetadataList = getApi().getCDNExtension().get().listCDNContainers();
|
||||||
assertTrue(cdnMetadataList.size() >= 1);
|
assertTrue(cdnMetadataList.size() >= 1);
|
||||||
|
|
||||||
final long initialTTL = cdnMetadata.getTTL();
|
final long initialTTL = cdnMetadata.getTTL();
|
||||||
|
@ -98,7 +98,7 @@ public class HPCloudObjectStorageClientLiveTest extends CommonSwiftClientLiveTes
|
||||||
* }));
|
* }));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
cdnMetadataList = getApi().listCDNContainers(
|
cdnMetadataList = getApi().getCDNExtension().get().listCDNContainers(
|
||||||
ListCDNContainerOptions.Builder.afterMarker(
|
ListCDNContainerOptions.Builder.afterMarker(
|
||||||
containerNameWithCDN.substring(0, containerNameWithCDN.length() - 1)).maxResults(1));
|
containerNameWithCDN.substring(0, containerNameWithCDN.length() - 1)).maxResults(1));
|
||||||
assertEquals(cdnMetadataList.size(), 1);
|
assertEquals(cdnMetadataList.size(), 1);
|
||||||
|
@ -106,9 +106,9 @@ public class HPCloudObjectStorageClientLiveTest extends CommonSwiftClientLiveTes
|
||||||
// Enable CDN with PUT for the same container, this time with a custom
|
// Enable CDN with PUT for the same container, this time with a custom
|
||||||
// TTL
|
// TTL
|
||||||
long ttl = 4000;
|
long ttl = 4000;
|
||||||
getApi().enableCDN(containerNameWithCDN, ttl);
|
getApi().getCDNExtension().get().enableCDN(containerNameWithCDN, ttl);
|
||||||
|
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithCDN);
|
||||||
|
|
||||||
assertTrue(cdnMetadata.isCDNEnabled());
|
assertTrue(cdnMetadata.isCDNEnabled());
|
||||||
|
|
||||||
|
@ -116,23 +116,23 @@ public class HPCloudObjectStorageClientLiveTest extends CommonSwiftClientLiveTes
|
||||||
|
|
||||||
// Check POST by updating TTL settings
|
// Check POST by updating TTL settings
|
||||||
ttl = minimumTTL;
|
ttl = minimumTTL;
|
||||||
getApi().updateCDN(containerNameWithCDN, minimumTTL);
|
getApi().getCDNExtension().get().updateCDN(containerNameWithCDN, minimumTTL);
|
||||||
|
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithCDN);
|
||||||
assertTrue(cdnMetadata.isCDNEnabled());
|
assertTrue(cdnMetadata.isCDNEnabled());
|
||||||
|
|
||||||
assertEquals(cdnMetadata.getTTL(), minimumTTL);
|
assertEquals(cdnMetadata.getTTL(), minimumTTL);
|
||||||
|
|
||||||
// Confirm that minimum allowed value for TTL is 3600, lower values are
|
// Confirm that minimum allowed value for TTL is 3600, lower values are
|
||||||
// ignored.
|
// ignored.
|
||||||
getApi().updateCDN(containerNameWithCDN, 3599L);
|
getApi().getCDNExtension().get().updateCDN(containerNameWithCDN, 3599L);
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithCDN);
|
||||||
assertEquals(cdnMetadata.getTTL(), 3599L);
|
assertEquals(cdnMetadata.getTTL(), 3599L);
|
||||||
|
|
||||||
// Disable CDN with POST
|
// Disable CDN with POST
|
||||||
assertTrue(getApi().disableCDN(containerNameWithCDN));
|
assertTrue(getApi().getCDNExtension().get().disableCDN(containerNameWithCDN));
|
||||||
|
|
||||||
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
|
cdnMetadata = getApi().getCDNExtension().get().getCDNMetadata(containerNameWithCDN);
|
||||||
assertEquals(cdnMetadata.isCDNEnabled(), false);
|
assertEquals(cdnMetadata.isCDNEnabled(), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package org.jclouds.hpcloud.objectstorage.internal;
|
package org.jclouds.hpcloud.objectstorage.internal;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import static org.testng.Assert.assertEquals;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import static org.testng.Assert.assertNotNull;
|
||||||
import com.google.common.collect.ImmutableMultimap;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import java.util.Map;
|
||||||
import com.google.inject.Module;
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.blobstore.BlobStore;
|
import org.jclouds.blobstore.BlobStore;
|
||||||
import org.jclouds.blobstore.BlobStoreContext;
|
|
||||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
|
@ -15,13 +16,10 @@ import org.jclouds.logging.config.NullLoggingModule;
|
||||||
import org.jclouds.rest.BaseRestClientExpectTest;
|
import org.jclouds.rest.BaseRestClientExpectTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import java.net.URI;
|
import com.google.common.base.Function;
|
||||||
import java.util.Map;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import java.util.Properties;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import java.util.Set;
|
import com.google.inject.Module;
|
||||||
|
|
||||||
import static org.testng.Assert.assertEquals;
|
|
||||||
import static org.testng.Assert.assertNotNull;
|
|
||||||
|
|
||||||
@Test(groups = "unit", testName = "HPCloudObjectStorageExpectTest")
|
@Test(groups = "unit", testName = "HPCloudObjectStorageExpectTest")
|
||||||
public class HPCloudObjectStorageExpectTest extends BaseRestClientExpectTest<BlobStore> {
|
public class HPCloudObjectStorageExpectTest extends BaseRestClientExpectTest<BlobStore> {
|
||||||
|
|
Loading…
Reference in New Issue