HDDS-520. Implement HeadBucket REST endpoint. Contributed by Bharat Viswanadham.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ec075791
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ec075791
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ec075791

Branch: refs/heads/HEAD
Commit: ec075791dab032d434b1697107de14bc5db8c087
Parents: 31fa9bb
Author: Bharat Viswanadham <bha...@apache.org>
Authored: Tue Oct 2 20:13:59 2018 -0700
Committer: Bharat Viswanadham <bha...@apache.org>
Committed: Tue Oct 2 20:13:59 2018 -0700

----------------------------------------------------------------------
 .../apache/hadoop/ozone/s3/EndpointBase.java    | 15 ++++
 .../hadoop/ozone/s3/bucket/HeadBucket.java      | 67 ++++++++++++++
 .../hadoop/ozone/s3/bucket/TestHeadBucket.java  | 95 ++++++++++++++++++++
 3 files changed, 177 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/ec075791/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/EndpointBase.java
----------------------------------------------------------------------
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/EndpointBase.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/EndpointBase.java
index f20d182..007cca2 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/EndpointBase.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/EndpointBase.java
@@ -42,6 +42,7 @@ public class EndpointBase {
       LoggerFactory.getLogger(EndpointBase.class);
   @Inject
   private OzoneClient client;
+  private String requestId;
 
   protected OzoneBucket getBucket(String volumeName, String bucketName)
       throws IOException {
@@ -84,4 +85,18 @@ public class EndpointBase {
   public void setClient(OzoneClient ozoneClient) {
     this.client = ozoneClient;
   }
+
+  /**
+   * Set the requestId.
+   * @param id
+   */
+  protected void setRequestId(String id) {
+    this.requestId = id;
+  }
+
+  @VisibleForTesting
+  public String getRequestId() {
+    return requestId;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ec075791/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/bucket/HeadBucket.java
----------------------------------------------------------------------
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/bucket/HeadBucket.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/bucket/HeadBucket.java
new file mode 100644
index 0000000..296ce3c
--- /dev/null
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/bucket/HeadBucket.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.s3.bucket;
+
+import org.apache.hadoop.ozone.s3.EndpointBase;
+import org.apache.hadoop.ozone.s3.exception.OS3Exception;
+import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
+import org.apache.hadoop.ozone.s3.exception.S3ErrorTable.Resource;
+import org.apache.hadoop.ozone.web.utils.OzoneUtils;
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.HEAD;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+
+/**
+ * Finds the bucket exists or not.
+ */
+@Path("/{volume}/{bucket}")
+public class HeadBucket extends EndpointBase {
+
+  private static final Logger LOG =
+      LoggerFactory.getLogger(HeadBucket.class);
+
+  @HEAD
+  public Response head(@PathParam("volume") String volumeName,
+                       @PathParam("bucket") String bucketName)
+      throws Exception {
+    setRequestId(OzoneUtils.getRequestID());
+    try {
+      getVolume(volumeName).getBucket(bucketName);
+      // Not sure what kind of error, we need to show for volume not exist
+      // to end user. As right now we throw run time exception.
+    } catch (IOException ex) {
+      LOG.error("Exception occurred in headBucket", ex);
+      if (ex.getMessage().contains("NOT_FOUND")) {
+        OS3Exception os3Exception = S3ErrorTable.newError(S3ErrorTable
+                .NO_SUCH_BUCKET, getRequestId(), Resource.BUCKET);
+        throw os3Exception;
+      } else {
+        throw ex;
+      }
+    }
+    return Response.ok().status(HttpStatus.SC_OK).header("x-amz-request-id",
+        getRequestId()).build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ec075791/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/bucket/TestHeadBucket.java
----------------------------------------------------------------------
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/bucket/TestHeadBucket.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/bucket/TestHeadBucket.java
new file mode 100644
index 0000000..8069b11
--- /dev/null
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/bucket/TestHeadBucket.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.hadoop.ozone.s3.bucket;
+
+import org.apache.hadoop.ozone.client.ObjectStore;
+import org.apache.hadoop.ozone.client.OzoneClientStub;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.s3.exception.OS3Exception;
+import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.ws.rs.core.Response;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/**
+ * This class test HeadBucket functionality.
+ */
+public class TestHeadBucket {
+
+  private String volumeName = "myVolume";
+  private String bucketName = "myBucket";
+  private OzoneClientStub clientStub;
+  private ObjectStore objectStoreStub;
+  private HeadBucket headBucket;
+
+  @Before
+  public void setup() throws Exception {
+
+    //Create client stub and object store stub.
+    clientStub = new OzoneClientStub();
+    objectStoreStub = clientStub.getObjectStore();
+
+    // Create volume and bucket
+    objectStoreStub.createVolume(volumeName);
+
+    OzoneVolume volumeStub = objectStoreStub.getVolume(volumeName);
+    volumeStub.createBucket(bucketName);
+
+    // Create HeadBucket and setClient to OzoneClientStub
+    headBucket = new HeadBucket();
+    headBucket.setClient(clientStub);
+
+
+  }
+
+  @Test
+  public void testHeadBucket() throws Exception {
+
+    Response response = headBucket.head(volumeName, bucketName);
+    assertEquals(200, response.getStatus());
+    assertEquals(headBucket.getRequestId(), response.getHeaderString(
+        "x-amz-request-id"));
+  }
+
+  @Test
+  public void testHeadFail() {
+    try {
+      headBucket.head(volumeName, "unknownbucket");
+    } catch (Exception ex) {
+      if (ex instanceof OS3Exception) {
+        assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getCode(),
+            ((OS3Exception) ex).getCode());
+        assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getErrorMessage(), (
+            (OS3Exception) ex).getErrorMessage());
+        assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getResource(), (
+            (OS3Exception) ex).getResource());
+        assertEquals(headBucket.getRequestId(), (
+            (OS3Exception) ex).getRequestId());
+      } else {
+        fail("testHeadFail failed");
+      }
+    }
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to