Issue 86: added root container commands and delete container

git-svn-id: http://jclouds.googlecode.com/svn/trunk@1879 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
adrian.f.cole 2009-09-03 08:14:45 +00:00
parent 9e2a68cf36
commit 0412f20614
3 changed files with 165 additions and 6 deletions

View File

@ -26,6 +26,7 @@ package org.jclouds.azure.storage.blob;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
@ -87,4 +88,48 @@ public interface AzureBlobConnection {
@Query(key = "restype", value = "container") @Query(key = "restype", value = "container")
boolean createContainer(@PathParam("container") String container, boolean createContainer(@PathParam("container") String container,
CreateContainerOptions... options); CreateContainerOptions... options);
/**
* The Delete Container operation marks the specified container for deletion. The container and
* any blobs contained within it are later deleted during garbage collection.
* <p/>
* When a container is deleted, a container with the same name cannot be created for at least 30
* seconds; the container may not be available for more than 30 seconds if the service is still
* processing the request. While the container is being deleted, attempts to create a container
* of the same name will fail with status code 409 (Conflict), with the service returning
* additional error information indicating that the container is being deleted. All other
* operations, including operations on any blobs under the container, will fail with status code
* 404 (Not Found) while the container is being deleted.
*
*/
@DELETE
@Path("{container}")
@Query(key = "restype", value = "container")
boolean deleteContainer(@PathParam("container") String container);
/**
* The root container is a default container that may be inferred from a URL requesting a blob
* resource. The root container makes it possible to reference a blob from the top level of the
* storage account hierarchy, without referencing the container name.
* <p/>
* The container resource includes metadata and properties for that container. It does not
* include a list of the blobs contained by the container.
*
* @see CreateContainerOptions
*
*/
@PUT
@Path("$root")
@Query(key = "restype", value = "container")
boolean createRootContainer(CreateContainerOptions... options);// TODO public is not supported!
/**
*
* @see deleteContainer(String)
* @see createRootContainer(CreateContainerOptions)
*/
@DELETE
@Path("$root")
@Query(key = "restype", value = "container")
boolean deleteRootContainer();
} }

View File

@ -7,10 +7,12 @@ import java.lang.reflect.UndeclaredThrowableException;
import java.net.URL; import java.net.URL;
import java.security.SecureRandom; import java.security.SecureRandom;
import org.jclouds.azure.storage.AzureStorageResponseException;
import org.jclouds.azure.storage.blob.domain.ContainerMetadataList; import org.jclouds.azure.storage.blob.domain.ContainerMetadataList;
import org.jclouds.azure.storage.blob.options.CreateContainerOptions; import org.jclouds.azure.storage.blob.options.CreateContainerOptions;
import org.jclouds.azure.storage.options.ListOptions; import org.jclouds.azure.storage.options.ListOptions;
import org.jclouds.azure.storage.reference.AzureStorageConstants; import org.jclouds.azure.storage.reference.AzureStorageConstants;
import org.jclouds.http.HttpResponseException;
import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.util.Utils; import org.jclouds.util.Utils;
import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeGroups;
@ -65,8 +67,9 @@ public class AzureBlobConnectionLiveTest {
created = connection.createContainer(privateContainer, CreateContainerOptions.Builder created = connection.createContainer(privateContainer, CreateContainerOptions.Builder
.withMetadata(ImmutableMultimap.of("foo", "bar"))); .withMetadata(ImmutableMultimap.of("foo", "bar")));
} catch (UndeclaredThrowableException e) { } catch (UndeclaredThrowableException e) {
// HttpResponseException htpe = (HttpResponseException) e.getCause().getCause(); HttpResponseException htpe = (HttpResponseException) e.getCause().getCause();
// TODO: check if already created and see what the error is, and continue if (htpe.getResponse().getStatusCode() == 409)
continue;
throw e; throw e;
} }
} }
@ -86,8 +89,9 @@ public class AzureBlobConnectionLiveTest {
created = connection.createContainer(publicContainer, CreateContainerOptions.Builder created = connection.createContainer(publicContainer, CreateContainerOptions.Builder
.withPublicAcl()); .withPublicAcl());
} catch (UndeclaredThrowableException e) { } catch (UndeclaredThrowableException e) {
// HttpResponseException htpe = (HttpResponseException) e.getCause().getCause(); HttpResponseException htpe = (HttpResponseException) e.getCause().getCause();
// TODO: check if already created and see what the error is, and continue if (htpe.getResponse().getStatusCode() == 409)
continue;
throw e; throw e;
} }
} }
@ -97,6 +101,30 @@ public class AzureBlobConnectionLiveTest {
Utils.toStringAndClose(url.openStream()); Utils.toStringAndClose(url.openStream());
} }
@Test(timeOut = 5 * 60 * 1000)
public void testCreatePublicRootContainer() throws Exception {
try {
connection.deleteRootContainer();
} catch (Exception e) {
// don't care.. we wish to recreate it.
}
boolean created = false;
while (!created) {
try {
created = connection.createRootContainer();
} catch (UndeclaredThrowableException e) {
AzureStorageResponseException htpe = (AzureStorageResponseException) e.getCause()
.getCause();
if (htpe.getError().getCode().equals("ContainerBeingDeleted")) {
Thread.sleep(5000);
continue;
}
throw e;
}
}
// TODO check if it really exists.
}
@Test @Test
public void testListContainersWithOptions() throws Exception { public void testListContainersWithOptions() throws Exception {
@ -107,6 +135,19 @@ public class AzureBlobConnectionLiveTest {
assertTrue(initialContainerCount >= 0); assertTrue(initialContainerCount >= 0);
assertEquals(privateContainer, response.getPrefix()); assertEquals(privateContainer, response.getPrefix());
assertEquals(1, response.getMaxResults()); assertEquals(1, response.getMaxResults());
}
@Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreateContainer",
"testCreatePublicContainer" })
public void testDeleteContainer() throws Exception {
assert connection.deleteContainer(privateContainer);
assert connection.deleteContainer(publicContainer);
// TODO loop for up to 30 seconds checking if they are really gone
}
@Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreatePublicRootContainer" })
public void testDeleteRootContainer() throws Exception {
assert connection.deleteRootContainer();
// TODO loop for up to 30 seconds checking if they are really gone
} }
} }

View File

@ -82,7 +82,7 @@ public class AzureBlobConnectionTest {
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null); assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
} }
public void testCreateContainers() throws SecurityException, NoSuchMethodException { public void testCreateContainer() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("createContainer", String.class, Method method = AzureBlobConnection.class.getMethod("createContainer", String.class,
createContainerOptionsVarargsClass); createContainerOptionsVarargsClass);
URI endpoint = URI.create("http://localhost"); URI endpoint = URI.create("http://localhost");
@ -101,7 +101,24 @@ public class AzureBlobConnectionTest {
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null); assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
} }
public void testCreateContainersOptions() throws SecurityException, NoSuchMethodException { public void testDeleteContainer() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("deleteContainer", String.class);
URI endpoint = URI.create("http://localhost");
HttpRequest httpMethod = processor.createRequest(endpoint, method,
new Object[] { "container" });
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
assertEquals(httpMethod.getHeaders().size(), 1);
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
.singletonList("2009-07-17"));
assertEquals(processor.createResponseParser(method).getClass(), ReturnTrueIf2xx.class);
// TODO check generic type of response parser
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
}
public void testCreateContainerOptions() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("createContainer", String.class, Method method = AzureBlobConnection.class.getMethod("createContainer", String.class,
createContainerOptionsVarargsClass); createContainerOptionsVarargsClass);
URI endpoint = URI.create("http://localhost"); URI endpoint = URI.create("http://localhost");
@ -123,6 +140,62 @@ public class AzureBlobConnectionTest {
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null); assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
} }
public void testCreateRootContainer() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("createRootContainer",
createContainerOptionsVarargsClass);
URI endpoint = URI.create("http://localhost");
HttpRequest httpMethod = processor.createRequest(endpoint, method, new Object[] {});
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
assertEquals(httpMethod.getHeaders().size(), 2);
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
.singletonList("2009-07-17"));
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
assertEquals(processor.createResponseParser(method).getClass(), ReturnTrueIf2xx.class);
// TODO check generic type of response parser
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
}
public void testDeleteRootContainer() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("deleteRootContainer");
URI endpoint = URI.create("http://localhost");
HttpRequest httpMethod = processor.createRequest(endpoint, method, new Object[] {});
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
assertEquals(httpMethod.getHeaders().size(), 1);
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
.singletonList("2009-07-17"));
assertEquals(processor.createResponseParser(method).getClass(), ReturnTrueIf2xx.class);
// TODO check generic type of response parser
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
}
public void testCreateRootContainerOptions() throws SecurityException, NoSuchMethodException {
Method method = AzureBlobConnection.class.getMethod("createRootContainer",
createContainerOptionsVarargsClass);
URI endpoint = URI.create("http://localhost");
HttpRequest httpMethod = processor.createRequest(endpoint, method,
new Object[] { withPublicAcl().withMetadata(ImmutableMultimap.of("foo", "bar")) });
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
assertEquals(httpMethod.getHeaders().size(), 4);
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
.singletonList("2009-07-17"));
assertEquals(httpMethod.getHeaders().get("x-ms-meta-foo"), Collections.singletonList("bar"));
assertEquals(httpMethod.getHeaders().get("x-ms-prop-publicaccess"), Collections
.singletonList("true"));
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
assertEquals(processor.createResponseParser(method).getClass(), ReturnTrueIf2xx.class);
// TODO check generic type of response parser
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
}
JaxrsAnnotationProcessor processor; JaxrsAnnotationProcessor processor;
@BeforeClass @BeforeClass