You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by xy...@apache.org on 2017/09/18 22:25:13 UTC
[1/3] hadoop git commit: HDFS-12385. Ozone: OzoneClient: Refactoring
OzoneClient API. Contributed by Nadakumar.
Repository: hadoop
Updated Branches:
refs/heads/HDFS-7240 19f7f8751 -> e5e7c454d
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java
index 501475b..385f9f9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java
@@ -24,11 +24,15 @@ import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.OzoneConfigKeys;
import org.apache.hadoop.ozone.OzoneConfiguration;
import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.client.BucketArgs;
+import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientFactory;
import org.apache.hadoop.ozone.client.OzoneKey;
+import org.apache.hadoop.ozone.client.OzoneQuota;
import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.VolumeArgs;
import org.apache.hadoop.ozone.client.io.OzoneInputStream;
import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
@@ -54,6 +58,7 @@ public class TestOzoneRpcClient {
private static MiniOzoneCluster cluster = null;
private static OzoneClient ozClient = null;
+ private static ObjectStore store = null;
/**
* Create a MiniDFSCluster for testing.
@@ -70,48 +75,54 @@ public class TestOzoneRpcClient {
OzoneConsts.OZONE_HANDLER_DISTRIBUTED);
cluster = new MiniOzoneCluster.Builder(conf)
.setHandlerType(OzoneConsts.OZONE_HANDLER_DISTRIBUTED).build();
+ conf.set("ozone.client.protocol",
+ "org.apache.hadoop.ozone.client.rpc.RpcClient");
OzoneClientFactory.setConfiguration(conf);
- ozClient = OzoneClientFactory.getRpcClient();
+ ozClient = OzoneClientFactory.getClient();
+ store = ozClient.getObjectStore();
}
@Test
public void testCreateVolume()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
- Assert.assertEquals(volumeName, volume.getVolumeName());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ Assert.assertEquals(volumeName, volume.getName());
}
@Test
public void testCreateVolumeWithOwner()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName, "test");
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
- Assert.assertEquals(volumeName, volume.getVolumeName());
- Assert.assertEquals("test", volume.getOwnerName());
+ VolumeArgs.Builder argsBuilder = VolumeArgs.newBuilder();
+ argsBuilder.setOwner("test");
+ store.createVolume(volumeName, argsBuilder.build());
+ OzoneVolume volume = store.getVolume(volumeName);
+ Assert.assertEquals(volumeName, volume.getName());
+ Assert.assertEquals("test", volume.getOwner());
}
@Test
public void testCreateVolumeWithQuota()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName, "test",
- 10000000000L);
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
- Assert.assertEquals(volumeName, volume.getVolumeName());
- Assert.assertEquals("test", volume.getOwnerName());
- Assert.assertEquals(10000000000L, volume.getQuota());
+ VolumeArgs.Builder argsBuilder = VolumeArgs.newBuilder();
+ argsBuilder.setOwner("test").setQuota("1000000000 BYTES");
+ store.createVolume(volumeName, argsBuilder.build());
+ OzoneVolume volume = store.getVolume(volumeName);
+ Assert.assertEquals(volumeName, volume.getName());
+ Assert.assertEquals("test", volume.getOwner());
+ Assert.assertEquals(1000000000L, volume.getQuota());
}
@Test
public void testVolumeAlreadyExist()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
+ store.createVolume(volumeName);
try {
- ozClient.createVolume(volumeName);
+ store.createVolume(volumeName);
} catch (IOException ex) {
Assert.assertEquals(
"Volume creation failed, error:VOLUME_ALREADY_EXISTS",
@@ -123,20 +134,21 @@ public class TestOzoneRpcClient {
public void testSetVolumeOwner()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.setVolumeOwner(volumeName, "test");
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
- Assert.assertEquals("test", volume.getOwnerName());
+ store.createVolume(volumeName);
+ store.getVolume(volumeName).setOwner("test");
+ OzoneVolume volume = store.getVolume(volumeName);
+ Assert.assertEquals("test", volume.getOwner());
}
@Test
public void testSetVolumeQuota()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.setVolumeQuota(volumeName, 10000000000L);
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
- Assert.assertEquals(10000000000L, volume.getQuota());
+ store.createVolume(volumeName);
+ store.getVolume(volumeName).setQuota(
+ OzoneQuota.parseQuota("100000000 BYTES"));
+ OzoneVolume volume = store.getVolume(volumeName);
+ Assert.assertEquals(100000000L, volume.getQuota());
}
@Test
@@ -144,11 +156,11 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
thrown.expectMessage("Info Volume failed, error");
String volumeName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- OzoneVolume volume = ozClient.getVolumeDetails(volumeName);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
Assert.assertNotNull(volume);
- ozClient.deleteVolume(volumeName);
- ozClient.getVolumeDetails(volumeName);
+ store.deleteVolume(volumeName);
+ store.getVolume(volumeName);
}
@Test
@@ -156,10 +168,11 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, bucket.getName());
}
@Test
@@ -167,13 +180,14 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName,
- OzoneConsts.Versioning.ENABLED);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
- Assert.assertEquals(OzoneConsts.Versioning.ENABLED,
- bucket.getVersioning());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ BucketArgs.Builder builder = BucketArgs.newBuilder();
+ builder.setIsVersionEnabled(true);
+ volume.createBucket(bucketName, builder.build());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, bucket.getName());
+ Assert.assertEquals(true, bucket.getVersioning());
}
@Test
@@ -181,10 +195,13 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName, StorageType.SSD);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ BucketArgs.Builder builder = BucketArgs.newBuilder();
+ builder.setStorageType(StorageType.SSD);
+ volume.createBucket(bucketName, builder.build());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, bucket.getName());
Assert.assertEquals(StorageType.SSD, bucket.getStorageType());
}
@@ -195,10 +212,15 @@ public class TestOzoneRpcClient {
String bucketName = UUID.randomUUID().toString();
OzoneAcl userAcl = new OzoneAcl(OzoneAcl.OzoneACLType.USER, "test",
OzoneAcl.OzoneACLRights.READ_WRITE);
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName, userAcl);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
+ List<OzoneAcl> acls = new ArrayList<>();
+ acls.add(userAcl);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ BucketArgs.Builder builder = BucketArgs.newBuilder();
+ builder.setAcls(acls);
+ volume.createBucket(bucketName, builder.build());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, bucket.getName());
Assert.assertTrue(bucket.getAcls().contains(userAcl));
}
@@ -209,46 +231,38 @@ public class TestOzoneRpcClient {
String bucketName = UUID.randomUUID().toString();
OzoneAcl userAcl = new OzoneAcl(OzoneAcl.OzoneACLType.USER, "test",
OzoneAcl.OzoneACLRights.READ_WRITE);
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName,
- OzoneConsts.Versioning.ENABLED,
- StorageType.SSD, userAcl);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
- Assert.assertEquals(OzoneConsts.Versioning.ENABLED,
- bucket.getVersioning());
+ List<OzoneAcl> acls = new ArrayList<>();
+ acls.add(userAcl);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ BucketArgs.Builder builder = BucketArgs.newBuilder();
+ builder.setIsVersionEnabled(true)
+ .setStorageType(StorageType.SSD)
+ .setAcls(acls);
+ volume.createBucket(bucketName, builder.build());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, bucket.getName());
+ Assert.assertEquals(true, bucket.getVersioning());
Assert.assertEquals(StorageType.SSD, bucket.getStorageType());
Assert.assertTrue(bucket.getAcls().contains(userAcl));
}
@Test
- public void testCreateBucketInInvalidVolume()
- throws IOException, OzoneException {
- String volumeName = UUID.randomUUID().toString();
- String bucketName = UUID.randomUUID().toString();
- try {
- ozClient.createBucket(volumeName, bucketName);
- } catch (IOException ex) {
- Assert.assertEquals(
- "Bucket creation failed, error: VOLUME_NOT_FOUND",
- ex.getMessage());
- }
- }
-
- @Test
public void testAddBucketAcl()
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
List<OzoneAcl> acls = new ArrayList<>();
acls.add(new OzoneAcl(
OzoneAcl.OzoneACLType.USER, "test",
OzoneAcl.OzoneACLRights.READ_WRITE));
- ozClient.addBucketAcls(volumeName, bucketName, acls);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ bucket.addAcls(acls);
+ OzoneBucket newBucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, newBucket.getName());
Assert.assertTrue(bucket.getAcls().contains(acls.get(0)));
}
@@ -259,13 +273,17 @@ public class TestOzoneRpcClient {
String bucketName = UUID.randomUUID().toString();
OzoneAcl userAcl = new OzoneAcl(OzoneAcl.OzoneACLType.USER, "test",
OzoneAcl.OzoneACLRights.READ_WRITE);
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName, userAcl);
List<OzoneAcl> acls = new ArrayList<>();
acls.add(userAcl);
- ozClient.removeBucketAcls(volumeName, bucketName, acls);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ BucketArgs.Builder builder = BucketArgs.newBuilder();
+ builder.setAcls(acls);
+ volume.createBucket(bucketName, builder.build());
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ bucket.removeAcls(acls);
+ OzoneBucket newBucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, newBucket.getName());
Assert.assertTrue(!bucket.getAcls().contains(acls.get(0)));
}
@@ -274,14 +292,14 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
- ozClient.setBucketVersioning(volumeName, bucketName,
- OzoneConsts.Versioning.ENABLED);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
- Assert.assertEquals(OzoneConsts.Versioning.ENABLED,
- bucket.getVersioning());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ bucket.setVersioning(true);
+ OzoneBucket newBucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, newBucket.getName());
+ Assert.assertEquals(true, newBucket.getVersioning());
}
@Test
@@ -289,13 +307,14 @@ public class TestOzoneRpcClient {
throws IOException, OzoneException {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
- ozClient.setBucketStorageType(volumeName, bucketName,
- StorageType.SSD);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
- Assert.assertEquals(bucketName, bucket.getBucketName());
- Assert.assertEquals(StorageType.SSD, bucket.getStorageType());
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ bucket.setStorageType(StorageType.SSD);
+ OzoneBucket newBucket = volume.getBucket(bucketName);
+ Assert.assertEquals(bucketName, newBucket.getName());
+ Assert.assertEquals(StorageType.SSD, newBucket.getStorageType());
}
@@ -305,12 +324,13 @@ public class TestOzoneRpcClient {
thrown.expectMessage("Info Bucket failed, error");
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
- OzoneBucket bucket = ozClient.getBucketDetails(volumeName, bucketName);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
Assert.assertNotNull(bucket);
- ozClient.deleteBucket(volumeName, bucketName);
- ozClient.getBucketDetails(volumeName, bucketName);
+ volume.deleteBucket(bucketName);
+ volume.getBucket(bucketName);
}
@@ -321,19 +341,21 @@ public class TestOzoneRpcClient {
String bucketName = UUID.randomUUID().toString();
String value = "sample value";
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
for (int i = 0; i < 10; i++) {
String keyName = UUID.randomUUID().toString();
- OzoneOutputStream out = ozClient.createKey(volumeName, bucketName,
- keyName, value.getBytes().length);
+ OzoneOutputStream out = bucket.createKey(keyName,
+ value.getBytes().length);
out.write(value.getBytes());
out.close();
- OzoneKey key = ozClient.getKeyDetails(volumeName, bucketName, keyName);
- Assert.assertEquals(keyName, key.getKeyName());
- OzoneInputStream is = ozClient.getKey(volumeName, bucketName, keyName);
+ OzoneKey key = bucket.getKey(keyName);
+ Assert.assertEquals(keyName, key.getName());
+ OzoneInputStream is = bucket.readKey(keyName);
byte[] fileContent = new byte[value.getBytes().length];
is.read(fileContent);
Assert.assertEquals(value, new String(fileContent));
@@ -348,23 +370,28 @@ public class TestOzoneRpcClient {
String bucketName = UUID.randomUUID().toString();
String keyName = UUID.randomUUID().toString();
String value = "sample value";
- ozClient.createVolume(volumeName);
- ozClient.createBucket(volumeName, bucketName);
- OzoneOutputStream out = ozClient.createKey(volumeName, bucketName,
- keyName, value.getBytes().length);
+ store.createVolume(volumeName);
+ OzoneVolume volume = store.getVolume(volumeName);
+ volume.createBucket(bucketName);
+ OzoneBucket bucket = volume.getBucket(bucketName);
+ OzoneOutputStream out = bucket.createKey(keyName,
+ value.getBytes().length);
out.write(value.getBytes());
out.close();
- OzoneKey key = ozClient.getKeyDetails(volumeName, bucketName, keyName);
- Assert.assertEquals(keyName, key.getKeyName());
- ozClient.deleteKey(volumeName, bucketName, keyName);
- ozClient.getKeyDetails(volumeName, bucketName, keyName);
+ OzoneKey key = bucket.getKey(keyName);
+ Assert.assertEquals(keyName, key.getName());
+ bucket.deleteKey(keyName);
+ bucket.getKey(keyName);
}
/**
- * Shutdown MiniDFSCluster.
+ * Close OzoneClient and shutdown MiniDFSCluster.
*/
@AfterClass
- public static void shutdown() {
+ public static void shutdown() throws IOException {
+ if(ozClient != null) {
+ ozClient.close();
+ }
if (cluster != null) {
cluster.shutdown();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org
[3/3] hadoop git commit: HDFS-12385. Ozone: OzoneClient: Refactoring
OzoneClient API. Contributed by Nadakumar.
Posted by xy...@apache.org.
HDFS-12385. Ozone: OzoneClient: Refactoring OzoneClient API. Contributed by Nadakumar.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/e5e7c454
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/e5e7c454
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/e5e7c454
Branch: refs/heads/HDFS-7240
Commit: e5e7c454d5471f7e4b753b3e3b6714278ca6a595
Parents: 19f7f87
Author: Xiaoyu Yao <xy...@apache.org>
Authored: Mon Sep 18 15:16:03 2017 -0700
Committer: Xiaoyu Yao <xy...@apache.org>
Committed: Mon Sep 18 15:24:10 2017 -0700
----------------------------------------------------------------------
.../apache/hadoop/ozone/OzoneConfigKeys.java | 10 +
.../apache/hadoop/ozone/client/BucketArgs.java | 123 ++++
.../apache/hadoop/ozone/client/ObjectStore.java | 91 +++
.../apache/hadoop/ozone/client/OzoneBucket.java | 172 +++++-
.../apache/hadoop/ozone/client/OzoneClient.java | 490 +++-------------
.../hadoop/ozone/client/OzoneClientFactory.java | 118 +++-
.../client/OzoneClientInvocationHandler.java | 62 ++
.../hadoop/ozone/client/OzoneClientUtils.java | 27 +-
.../apache/hadoop/ozone/client/OzoneKey.java | 52 +-
.../apache/hadoop/ozone/client/OzoneQuota.java | 198 +++++++
.../apache/hadoop/ozone/client/OzoneVolume.java | 169 ++++--
.../apache/hadoop/ozone/client/VolumeArgs.java | 128 ++++
.../ozone/client/protocol/ClientProtocol.java | 296 ++++++++++
.../ozone/client/protocol/package-info.java | 23 +
.../ozone/client/rest/OzoneRestClient.java | 510 ----------------
.../hadoop/ozone/client/rest/RestClient.java | 209 +++++++
.../ozone/client/rest/headers/Header.java | 16 +-
.../ozone/client/rest/headers/package-info.java | 18 +-
.../hadoop/ozone/client/rpc/OzoneRpcClient.java | 580 -------------------
.../hadoop/ozone/client/rpc/RpcClient.java | 474 +++++++++++++++
.../org/apache/hadoop/ozone/tools/Corona.java | 52 +-
.../src/main/resources/ozone-default.xml | 11 +
.../ozone/client/rpc/TestOzoneRpcClient.java | 259 +++++----
23 files changed, 2299 insertions(+), 1789 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java
index 272edaf..efa39a5 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java
@@ -20,6 +20,9 @@ package org.apache.hadoop.ozone;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+import org.apache.hadoop.ozone.client.rest.RestClient;
+import org.apache.hadoop.ozone.client.rpc.RpcClient;
import org.apache.hadoop.scm.ScmConfigKeys;
/**
@@ -103,6 +106,13 @@ public final class OzoneConfigKeys {
public static final String OZONE_ADMINISTRATORS =
"ozone.administrators";
+ public static final String OZONE_CLIENT_PROTOCOL =
+ "ozone.client.protocol";
+ public static final Class<? extends ClientProtocol>
+ OZONE_CLIENT_PROTOCOL_RPC = RpcClient.class;
+ public static final Class<? extends ClientProtocol>
+ OZONE_CLIENT_PROTOCOL_REST = RestClient.class;
+
public static final String OZONE_CLIENT_SOCKET_TIMEOUT_MS =
"ozone.client.socket.timeout.ms";
public static final int OZONE_CLIENT_SOCKET_TIMEOUT_MS_DEFAULT = 5000;
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/BucketArgs.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/BucketArgs.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/BucketArgs.java
new file mode 100644
index 0000000..5d07df2
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/BucketArgs.java
@@ -0,0 +1,123 @@
+/**
+ * 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.client;
+
+import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.ozone.OzoneAcl;
+
+import java.util.List;
+
+/**
+ * This class encapsulates the arguments that are
+ * required for creating a bucket.
+ */
+public final class BucketArgs {
+
+ /**
+ * ACL Information.
+ */
+ private List<OzoneAcl> acls;
+ /**
+ * Bucket Version flag.
+ */
+ private Boolean isVersionEnabled;
+ /**
+ * Type of storage to be used for this bucket.
+ * [RAM_DISK, SSD, DISK, ARCHIVE]
+ */
+ private StorageType storageType;
+
+ /**
+ * Private constructor, constructed via builder.
+ * @param isVersionEnabled Bucket version flag.
+ * @param storageType Storage type to be used.
+ * @param acls list of ACLs.
+ */
+ private BucketArgs(Boolean isVersionEnabled, StorageType storageType,
+ List<OzoneAcl> acls) {
+ this.acls = acls;
+ this.isVersionEnabled = isVersionEnabled;
+ this.storageType = storageType;
+ }
+
+ /**
+ * Returns true if bucket version is enabled, else false.
+ * @return isVersionEnabled
+ */
+ public Boolean isVersionEnabled() {
+ return isVersionEnabled;
+ }
+
+ /**
+ * Returns the type of storage to be used.
+ * @return StorageType
+ */
+ public StorageType getStorageType() {
+ return storageType;
+ }
+
+ /**
+ * Returns the ACL's associated with this bucket.
+ * @return List<OzoneAcl>
+ */
+ public List<OzoneAcl> getAcls() {
+ return acls;
+ }
+
+ /**
+ * Returns new builder class that builds a KsmBucketInfo.
+ *
+ * @return Builder
+ */
+ public static BucketArgs.Builder newBuilder() {
+ return new BucketArgs.Builder();
+ }
+
+ /**
+ * Builder for KsmBucketInfo.
+ */
+ public static class Builder {
+ private Boolean isVersionEnabled;
+ private StorageType storageType;
+ private List<OzoneAcl> acls;
+
+ public BucketArgs.Builder setIsVersionEnabled(Boolean versionFlag) {
+ this.isVersionEnabled = versionFlag;
+ return this;
+ }
+
+ public BucketArgs.Builder setStorageType(StorageType storage) {
+ this.storageType = storage;
+ return this;
+ }
+
+ public BucketArgs.Builder setAcls(List<OzoneAcl> listOfAcls) {
+ this.acls = listOfAcls;
+ return this;
+ }
+
+ /**
+ * Constructs the BucketArgs.
+ * @return instance of BucketArgs.
+ */
+ public BucketArgs build() {
+ return new BucketArgs(isVersionEnabled, storageType, acls);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
new file mode 100644
index 0000000..f8bb21a
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
@@ -0,0 +1,91 @@
+/**
+ * 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.client;
+
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+
+import java.io.IOException;
+
+/**
+ * ObjectStore class is responsible for the client operations that can be
+ * performed on Ozone Object Store.
+ */
+public class ObjectStore {
+
+ /**
+ * The proxy used for connecting to the cluster and perform
+ * client operations.
+ */
+ private final ClientProtocol proxy;
+
+ /**
+ * Creates an instance of ObjectStore with the proxy.
+ * @param proxy ClientProtocol proxy
+ */
+ public ObjectStore(ClientProtocol proxy) {
+ this.proxy = proxy;
+ }
+
+ /**
+ * Creates the volume with default values.
+ * @param volumeName Name of the volume to be created.
+ * @throws IOException
+ */
+ public void createVolume(String volumeName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ proxy.createVolume(volumeName);
+ }
+
+ /**
+ * Creates the volume.
+ * @param volumeName Name of the volume to be created.
+ * @param volumeArgs Volume properties.
+ * @throws IOException
+ */
+ public void createVolume(String volumeName, VolumeArgs volumeArgs)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(volumeArgs);
+ proxy.createVolume(volumeName, volumeArgs);
+ }
+
+ /**
+ * Returns the volume information.
+ * @param volumeName Name of the volume.
+ * @return OzoneVolume
+ * @throws IOException
+ */
+ public OzoneVolume getVolume(String volumeName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ OzoneVolume volume = proxy.getVolumeDetails(volumeName);
+ volume.setClientProxy(proxy);
+ return volume;
+ }
+
+ /**
+ * Deletes the volume.
+ * @param volumeName Name of the volume.
+ * @throws IOException
+ */
+ public void deleteVolume(String volumeName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ proxy.deleteVolume(volumeName);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
index bfd5714..6d53c5b 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
@@ -1,29 +1,32 @@
-/*
+/**
* 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
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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.
+ * 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.client;
+import com.google.common.base.Preconditions;
import org.apache.hadoop.fs.StorageType;
-import org.apache.hadoop.ozone.ksm.helpers.KsmBucketInfo;
+import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.OzoneConsts.Versioning;
+import java.io.IOException;
import java.util.List;
/**
@@ -38,36 +41,53 @@ public class OzoneBucket {
/**
* Name of the bucket.
*/
- private final String bucketName;
+ private final String name;
/**
* Bucket ACLs.
*/
- private final List<OzoneAcl> acls;
+ private List<OzoneAcl> acls;
/**
* Type of storage to be used for this bucket.
* [RAM_DISK, SSD, DISK, ARCHIVE]
*/
- private final StorageType storageType;
+ private StorageType storageType;
/**
* Bucket Version flag.
*/
- private final Versioning versioning;
+ private Boolean versioning;
+ /**
+ * The proxy used for connecting to the cluster and perform
+ * client operations.
+ */
+ private ClientProtocol proxy;
/**
- * Constructs OzoneBucket from KsmBucketInfo.
- *
- * @param ksmBucketInfo
- */
- public OzoneBucket(KsmBucketInfo ksmBucketInfo) {
- this.volumeName = ksmBucketInfo.getVolumeName();
- this.bucketName = ksmBucketInfo.getBucketName();
- this.acls = ksmBucketInfo.getAcls();
- this.storageType = ksmBucketInfo.getStorageType();
- this.versioning = ksmBucketInfo.getIsVersionEnabled() ?
- Versioning.ENABLED : Versioning.DISABLED;
+ * Constructs OzoneBucket instance.
+ * @param volumeName Name of the volume the bucket belongs to.
+ * @param bucketName Name of the bucket.
+ * @param acls ACLs associated with the bucket.
+ * @param storageType StorageType of the bucket.
+ * @param versioning versioning status of the bucket.
+ */
+ public OzoneBucket(String volumeName, String bucketName,
+ List<OzoneAcl> acls, StorageType storageType,
+ Boolean versioning) {
+ this.volumeName = volumeName;
+ this.name = bucketName;
+ this.acls = acls;
+ this.storageType = storageType;
+ this.versioning = versioning;
+ }
+
+ /**
+ * Sets the proxy using which client operations are performed.
+ * @param clientProxy
+ */
+ public void setClientProxy(ClientProtocol clientProxy) {
+ this.proxy = clientProxy;
}
/**
@@ -84,8 +104,8 @@ public class OzoneBucket {
*
* @return bucketName
*/
- public String getBucketName() {
- return bucketName;
+ public String getName() {
+ return name;
}
/**
@@ -111,8 +131,104 @@ public class OzoneBucket {
*
* @return versioning
*/
- public Versioning getVersioning() {
+ public Boolean getVersioning() {
return versioning;
}
+ /**
+ * Adds ACLs to the Bucket.
+ * @param addAcls ACLs to be added
+ * @throws IOException
+ */
+ public void addAcls(List<OzoneAcl> addAcls) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(addAcls);
+ proxy.addBucketAcls(volumeName, name, addAcls);
+ addAcls.stream().filter(acl -> !acls.contains(acl)).forEach(
+ acls::add);
+ }
+
+ /**
+ * Removes ACLs from the bucket.
+ * @param removeAcls ACLs to be removed
+ * @throws IOException
+ */
+ public void removeAcls(List<OzoneAcl> removeAcls) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(removeAcls);
+ proxy.removeBucketAcls(volumeName, name, removeAcls);
+ acls.removeAll(removeAcls);
+ }
+
+ /**
+ * Sets/Changes the storage type of the bucket.
+ * @param newStorageType Storage type to be set
+ * @throws IOException
+ */
+ public void setStorageType(StorageType newStorageType) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(newStorageType);
+ proxy.setBucketStorageType(volumeName, name, newStorageType);
+ storageType = newStorageType;
+ }
+
+ /**
+ * Enable/Disable versioning of the bucket.
+ * @param newVersioning
+ * @throws IOException
+ */
+ public void setVersioning(Boolean newVersioning) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(newVersioning);
+ proxy.setBucketVersioning(volumeName, name, newVersioning);
+ versioning = newVersioning;
+ }
+
+ /**
+ * Creates a new key in the bucket.
+ * @param key Name of the key to be created.
+ * @param size Size of the data the key will point to.
+ * @return OzoneOutputStream to which the data has to be written.
+ * @throws IOException
+ */
+ public OzoneOutputStream createKey(String key, long size)throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(key);
+ return proxy.createKey(volumeName, name, key, size);
+ }
+
+ /**
+ * Reads an existing key from the bucket.
+ * @param key Name of the key to be read.
+ * @return OzoneInputStream the stream using which the data can be read.
+ * @throws IOException
+ */
+ public OzoneInputStream readKey(String key) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(key);
+ return proxy.getKey(volumeName, name, key);
+ }
+
+ /**
+ * Returns information about the key.
+ * @param key Name of the key.
+ * @return OzoneKey Information about the key.
+ * @throws IOException
+ */
+ public OzoneKey getKey(String key) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(key);
+ return proxy.getKeyDetails(volumeName, name, key);
+ }
+
+ /**
+ * Deletes key from the bucket.
+ * @param key Name of the key to be deleted.
+ * @throws IOException
+ */
+ public void deleteKey(String key) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(key);
+ proxy.deleteKey(volumeName, name, key);
+ }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClient.java
index a7808d8..b7c3a11 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClient.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClient.java
@@ -1,415 +1,101 @@
/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
+ * 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.
+ * 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.client;
-import org.apache.hadoop.fs.StorageType;
-import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.OzoneConsts.Versioning;
-import org.apache.hadoop.ozone.client.io.OzoneInputStream;
-import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+import java.io.Closeable;
import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
/**
- * OzoneClient can connect to a Ozone Cluster and
+ * OzoneClient connects to Ozone Cluster and
* perform basic operations.
*/
-public interface OzoneClient {
-
- /**
- * Creates a new Volume.
- *
- * @param volumeName Name of the Volume
- *
- * @throws IOException
- */
- void createVolume(String volumeName)
- throws IOException;
-
- /**
- * Creates a new Volume, with owner set.
- *
- * @param volumeName Name of the Volume
- * @param owner Owner to be set for Volume
- *
- * @throws IOException
- */
- void createVolume(String volumeName, String owner)
- throws IOException;
-
- /**
- * Creates a new Volume, with owner and quota set.
- *
- * @param volumeName Name of the Volume
- * @param owner Owner to be set for Volume
- * @param acls ACLs to be added to the Volume
- *
- * @throws IOException
- */
- void createVolume(String volumeName, String owner,
- OzoneAcl... acls)
- throws IOException;
-
- /**
- * Creates a new Volume, with owner and quota set.
- *
- * @param volumeName Name of the Volume
- * @param owner Owner to be set for Volume
- * @param quota Volume Quota
- *
- * @throws IOException
- */
- void createVolume(String volumeName, String owner,
- long quota)
- throws IOException;
-
- /**
- * Creates a new Volume, with owner and quota set.
- *
- * @param volumeName Name of the Volume
- * @param owner Owner to be set for Volume
- * @param quota Volume Quota
- * @param acls ACLs to be added to the Volume
- *
- * @throws IOException
- */
- void createVolume(String volumeName, String owner,
- long quota, OzoneAcl... acls)
- throws IOException;
-
- /**
- * Sets the owner of the volume.
- *
- * @param volumeName Name of the Volume
- * @param owner to be set for the Volume
- *
- * @throws IOException
- */
- void setVolumeOwner(String volumeName, String owner) throws IOException;
-
- /**
- * Set Volume Quota.
- *
- * @param volumeName Name of the Volume
- * @param quota Quota to be set for the Volume
- *
- * @throws IOException
- */
- void setVolumeQuota(String volumeName, long quota)
- throws IOException;
-
- /**
- * Returns {@link OzoneVolume}.
- *
- * @param volumeName Name of the Volume
- *
- * @return KsmVolumeArgs
- *
- * @throws OzoneVolume
- * */
- OzoneVolume getVolumeDetails(String volumeName)
- throws IOException;
-
- /**
- * Checks if a Volume exists and the user with a role specified has access
- * to the Volume.
- *
- * @param volumeName Name of the Volume
- * @param acl requested acls which needs to be checked for access
- *
- * @return Boolean - True if the user with a role can access the volume.
- * This is possible for owners of the volume and admin users
- *
- * @throws IOException
- */
- boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
- throws IOException;
-
- /**
- * Deletes an Empty Volume.
- *
- * @param volumeName Name of the Volume
- *
- * @throws IOException
- */
- void deleteVolume(String volumeName) throws IOException;
-
- /**
- * Returns the List of Volumes owned by current user.
- *
- * @param volumePrefix Volume prefix to match
- *
- * @return KsmVolumeArgs Iterator
- *
- * @throws IOException
- */
- Iterator<OzoneVolume> listVolumes(String volumePrefix)
- throws IOException;
-
- /**
- * Returns the List of Volumes owned by the specific user.
- *
- * @param volumePrefix Volume prefix to match
- * @param user User Name
- *
- * @return KsmVolumeArgs Iterator
- *
- * @throws IOException
- */
- Iterator<OzoneVolume> listVolumes(String volumePrefix, String user)
- throws IOException;
-
- /**
- * Creates a new Bucket in the Volume.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void createBucket(String volumeName, String bucketName)
- throws IOException;
-
- /**
- * Creates a new Bucket in the Volume, with versioning set.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param versioning Bucket versioning
- *
- * @throws IOException
- */
- void createBucket(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException;
-
- /**
- * Creates a new Bucket in the Volume, with storage type set.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param storageType StorageType for the Bucket
- *
- * @throws IOException
- */
- void createBucket(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException;
-
- /**
- * Creates a new Bucket in the Volume, with ACLs set.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param acls OzoneAcls for the Bucket
- *
- * @throws IOException
- */
- void createBucket(String volumeName, String bucketName,
- OzoneAcl... acls)
- throws IOException;
-
-
- /**
- * Creates a new Bucket in the Volume, with versioning
- * storage type and ACLs set.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param storageType StorageType for the Bucket
- *
- * @throws IOException
- */
- void createBucket(String volumeName, String bucketName,
- Versioning versioning,
- StorageType storageType, OzoneAcl... acls)
- throws IOException;
-
- /**
- * Adds or Removes ACLs from a Bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void addBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> addAcls)
- throws IOException;
-
- /**
- * Adds or Removes ACLs from a Bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void removeBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> removeAcls)
- throws IOException;
-
-
- /**
- * Enables or disables Bucket Versioning.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void setBucketVersioning(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException;
-
- /**
- * Sets the Storage Class of a Bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void setBucketStorageType(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException;
-
- /**
- * Deletes a bucket if it is empty.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @throws IOException
- */
- void deleteBucket(String volumeName, String bucketName)
- throws IOException;
-
- /**
- * true if the bucket exists and user has read access
- * to the bucket else throws Exception.
- *
- * @param volumeName Name of the Volume
- *
- * @throws IOException
- */
- void checkBucketAccess(String volumeName, String bucketName)
- throws IOException;
-
- /**
- * Returns {@link OzoneBucket}.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @return OzoneBucket
- *
- * @throws IOException
- */
- OzoneBucket getBucketDetails(String volumeName, String bucketName)
- throws IOException;
-
- /**
- * Returns the List of Buckets in the Volume.
- *
- * @param volumeName Name of the Volume
- * @param bucketPrefix Bucket prefix to match
- *
- * @return KsmVolumeArgs Iterator
- *
- * @throws IOException
- */
- Iterator<OzoneBucket> listBuckets(String volumeName, String bucketPrefix)
- throws IOException;
-
- /**
- * Writes a key in an existing bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param size Size of the data
- *
- * @return OutputStream
- *
- */
- OzoneOutputStream createKey(String volumeName, String bucketName,
- String keyName, long size)
- throws IOException;
-
- /**
- * Reads a key from an existing bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @return LengthInputStream
- *
- * @throws IOException
- */
- OzoneInputStream getKey(String volumeName, String bucketName, String keyName)
- throws IOException;
-
-
- /**
- * Deletes an existing key.
- *
- * @param volumeName Name of the Volume
- *
- * @throws IOException
- */
- void deleteKey(String volumeName, String bucketName, String keyName)
- throws IOException;
-
-
- /**
- * Returns list of {@link OzoneKey} in Volume/Bucket.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- *
- * @return OzoneKey
- *
- * @throws IOException
- */
- List<OzoneKey> listKeys(String volumeName, String bucketName,
- String keyPrefix)
- throws IOException;
-
-
- /**
- * Get OzoneKey.
- *
- * @param volumeName Name of the Volume
- * @param bucketName Name of the Bucket
- * @param keyName Key name
- *
- * @return OzoneKey
- *
- * @throws IOException
- */
- OzoneKey getKeyDetails(String volumeName, String bucketName,
- String keyName)
- throws IOException;
-
- /**
- * Close and release the resources.
- */
- void close() throws IOException;
+public class OzoneClient implements Closeable {
+
+ /*
+ * OzoneClient connects to Ozone Cluster and
+ * perform basic operations.
+ *
+ * +-------------+ +---+ +-------------------------------------+
+ * | OzoneClient | --> | C | | Object Store |
+ * |_____________| | l | | +-------------------------------+ |
+ * | i | | | Volume(s) | |
+ * | e | | | +------------------------+ | |
+ * | n | | | | Bucket(s) | | |
+ * | t | | | | +------------------+ | | |
+ * | | | | | | Key -> Value (s) | | | |
+ * | P |-->| | | | | | | |
+ * | r | | | | |__________________| | | |
+ * | o | | | | | | |
+ * | t | | | |________________________| | |
+ * | o | | | | |
+ * | c | | |_______________________________| |
+ * | o | | |
+ * | l | |_____________________________________|
+ * |___|
+ * Example:
+ * ObjectStore store = client.getObjectStore();
+ * store.createVolume(“volume one”, VolumeArgs);
+ * volume.setQuota(“10 GB”);
+ * OzoneVolume volume = store.getVolume(“volume one”);
+ * volume.createBucket(“bucket one”, BucketArgs);
+ * bucket.setVersioning(true);
+ * OzoneOutputStream os = bucket.createKey(“key one”, 1024);
+ * os.write(byte[]);
+ * os.close();
+ * OzoneInputStream is = bucket.readKey(“key one”);
+ * is.read();
+ * is.close();
+ * bucket.deleteKey(“key one”);
+ * volume.deleteBucket(“bucket one”);
+ * store.deleteVolume(“volume one”);
+ * client.close();
+ */
+
+ private final ClientProtocol proxy;
+ private final ObjectStore objectStore;
+
+ /**
+ * Creates a new OzoneClient object, generally constructed
+ * using {@link OzoneClientFactory}.
+ * @param proxy
+ */
+ public OzoneClient(ClientProtocol proxy) {
+ this.proxy = proxy;
+ this.objectStore = new ObjectStore(this.proxy);
+ }
+
+ /**
+ * Returns the object store associated with the Ozone Cluster.
+ * @return ObjectStore
+ */
+ public ObjectStore getObjectStore() {
+ return objectStore;
+ }
+
+ /**
+ * Closes the client and all the underlying resources.
+ * @throws IOException
+ */
+ @Override
+ public void close() throws IOException {
+ proxy.close();
+ }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientFactory.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientFactory.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientFactory.java
index b098be9..580cd11 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientFactory.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientFactory.java
@@ -20,64 +20,94 @@ package org.apache.hadoop.ozone.client;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ozone.OzoneConfiguration;
-import org.apache.hadoop.ozone.client.rest.OzoneRestClient;
-import org.apache.hadoop.ozone.client.rpc.OzoneRpcClient;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Proxy;
+
+import static org.apache.hadoop.ozone.OzoneConfigKeys
+ .OZONE_CLIENT_PROTOCOL;
+import static org.apache.hadoop.ozone.OzoneConfigKeys
+ .OZONE_CLIENT_PROTOCOL_REST;
+import static org.apache.hadoop.ozone.OzoneConfigKeys
+ .OZONE_CLIENT_PROTOCOL_RPC;
/**
* Factory class to create different types of OzoneClients.
+ * Based on <code>ozone.client.protocol</code>, it decides which
+ * protocol to use for the communication.
+ * Default value is
+ * <code>org.apache.hadoop.ozone.client.rpc.RpcClient</code>.<br>
+ * OzoneClientFactory constructs a proxy using
+ * {@link OzoneClientInvocationHandler}
+ * and creates OzoneClient instance with it.
+ * {@link OzoneClientInvocationHandler} dispatches the call to
+ * underlying {@link ClientProtocol} implementation.
*/
public final class OzoneClientFactory {
+ private enum ClientType {
+ RPC, REST
+ }
+
/**
* Private constructor, class is not meant to be initialized.
*/
private OzoneClientFactory(){}
+ private static final Logger LOG = LoggerFactory.getLogger(
+ OzoneClientFactory.class);
+
private static Configuration configuration;
/**
- * Returns an OzoneClient which will use RPC protocol to perform
- * client operations.
- *
+ * Returns an OzoneClient which will use protocol defined through
+ * <code>ozone.client.protocol</code> to perform client operations.
* @return OzoneClient
* @throws IOException
*/
public static OzoneClient getClient() throws IOException {
- //TODO: get client based on ozone.client.protocol
- return new OzoneRpcClient(getConfiguration());
+ return getClient(null);
}
/**
* Returns an OzoneClient which will use RPC protocol to perform
* client operations.
- *
* @return OzoneClient
* @throws IOException
*/
public static OzoneClient getRpcClient() throws IOException {
- return new OzoneRpcClient(getConfiguration());
+ return getClient(ClientType.RPC);
}
/**
- * Returns an OzoneClient which will use RPC protocol to perform
+ * Returns an OzoneClient which will use REST protocol to perform
* client operations.
- *
* @return OzoneClient
* @throws IOException
*/
public static OzoneClient getRestClient() throws IOException {
- return new OzoneRestClient(getConfiguration());
+ return getClient(ClientType.REST);
}
/**
- * Sets the configuration, which will be used while creating OzoneClient.
- *
- * @param conf
+ * Returns OzoneClient with protocol type set base on ClientType.
+ * @param clientType
+ * @return OzoneClient
+ * @throws IOException
*/
- public static void setConfiguration(Configuration conf) {
- configuration = conf;
+ private static OzoneClient getClient(ClientType clientType)
+ throws IOException {
+ OzoneClientInvocationHandler clientHandler =
+ new OzoneClientInvocationHandler(getProtocolClass(clientType));
+ ClientProtocol proxy = (ClientProtocol) Proxy.newProxyInstance(
+ OzoneClientInvocationHandler.class.getClassLoader(),
+ new Class<?>[]{ClientProtocol.class}, clientHandler);
+ return new OzoneClient(proxy);
}
/**
@@ -92,4 +122,58 @@ public final class OzoneClientFactory {
}
return configuration;
}
+
+ /**
+ * Based on the clientType, client protocol instance is created.
+ * If clientType is null, <code>ozone.client.protocol</code> property
+ * will be used to decide the protocol to be used.
+ * @param clientType type of client protocol to be created
+ * @return ClientProtocol implementation
+ * @throws IOException
+ */
+ private static ClientProtocol getProtocolClass(ClientType clientType)
+ throws IOException {
+ Class<? extends ClientProtocol> protocolClass = null;
+ if(clientType != null) {
+ switch (clientType) {
+ case RPC:
+ protocolClass = OZONE_CLIENT_PROTOCOL_RPC;
+ break;
+ case REST:
+ protocolClass = OZONE_CLIENT_PROTOCOL_REST;
+ break;
+ default:
+ LOG.warn("Invalid ClientProtocol type, falling back to RPC.");
+ protocolClass = OZONE_CLIENT_PROTOCOL_RPC;
+ break;
+ }
+ } else {
+ protocolClass = (Class<ClientProtocol>)
+ getConfiguration().getClass(
+ OZONE_CLIENT_PROTOCOL, OZONE_CLIENT_PROTOCOL_RPC);
+ }
+ try {
+ Constructor<? extends ClientProtocol> ctor =
+ protocolClass.getConstructor(Configuration.class);
+ return ctor.newInstance(getConfiguration());
+ } catch (Exception e) {
+ final String message = "Couldn't create protocol " + protocolClass;
+ LOG.warn(message, e);
+ if (e.getCause() instanceof IOException) {
+ throw (IOException) e.getCause();
+ } else {
+ throw new IOException(message, e);
+ }
+ }
+ }
+
+ /**
+ * Sets the configuration, which will be used while creating OzoneClient.
+ *
+ * @param conf
+ */
+ public static void setConfiguration(Configuration conf) {
+ configuration = conf;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientInvocationHandler.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientInvocationHandler.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientInvocationHandler.java
new file mode 100644
index 0000000..3051e2d
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientInvocationHandler.java
@@ -0,0 +1,62 @@
+/**
+ * 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.client;
+
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+import org.apache.hadoop.util.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Invocation Handler for ozone client which dispatches the call to underlying
+ * ClientProtocol implementation.
+ */
+public class OzoneClientInvocationHandler implements InvocationHandler {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(OzoneClient.class);
+ private final ClientProtocol target;
+
+ /**
+ * Constructs OzoneClientInvocationHandler with the proxy.
+ * @param target proxy to be used for method invocation.
+ */
+ public OzoneClientInvocationHandler(ClientProtocol target) {
+ this.target = target;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ LOG.trace("Invoking method {} on proxy {}", method, proxy);
+ try {
+ long startTime = Time.monotonicNow();
+ Object result = method.invoke(target, args);
+ LOG.debug("Call: {} took {} ms", method,
+ Time.monotonicNow() - startTime);
+ return result;
+ } catch(InvocationTargetException iEx) {
+ throw iEx.getCause();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientUtils.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientUtils.java
index 9390a85..cc3632d 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientUtils.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneClientUtils.java
@@ -1,18 +1,19 @@
/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
+ * 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.
+ * 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.client;
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
index 368736a..d6a591f 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
@@ -1,28 +1,23 @@
-/*
+/**
* 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
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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.
+ * 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.client;
-import org.apache.hadoop.ozone.ksm.helpers.KsmKeyInfo;
-import org.apache.hadoop.ozone.ksm.helpers.KsmKeyLocationInfo;
-
-import java.util.List;
-
/**
* A class that encapsulates OzoneKey.
*/
@@ -39,27 +34,22 @@ public class OzoneKey {
/**
* Name of the Key.
*/
- private final String keyName;
+ private final String name;
/**
* Size of the data.
*/
private final long dataSize;
/**
- * All the locations of this key, in an ordered list.
- */
- private final List<KsmKeyLocationInfo> keyLocations;
- /**
* Constructs OzoneKey from KsmKeyInfo.
*
- * @param ksmKeyInfo
*/
- public OzoneKey(KsmKeyInfo ksmKeyInfo) {
- this.volumeName = ksmKeyInfo.getVolumeName();
- this.bucketName = ksmKeyInfo.getBucketName();
- this.keyName = ksmKeyInfo.getKeyName();
- this.dataSize = ksmKeyInfo.getDataSize();
- this.keyLocations = ksmKeyInfo.getKeyLocationList();
+ public OzoneKey(String volumeName, String bucketName,
+ String keyName, long size) {
+ this.volumeName = volumeName;
+ this.bucketName = bucketName;
+ this.name = keyName;
+ this.dataSize = size;
}
/**
@@ -85,8 +75,8 @@ public class OzoneKey {
*
* @return keyName
*/
- public String getKeyName() {
- return keyName;
+ public String getName() {
+ return name;
}
/**
@@ -98,12 +88,4 @@ public class OzoneKey {
return dataSize;
}
- /**
- * Retruns the list of the key locations.
- *
- * @return key locations
- */
- public List<KsmKeyLocationInfo> getKeyLocations() {
- return keyLocations;
- }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneQuota.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneQuota.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneQuota.java
new file mode 100644
index 0000000..bff529b
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneQuota.java
@@ -0,0 +1,198 @@
+/**
+ * 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.client;
+
+import org.apache.hadoop.ozone.OzoneConsts;
+
+
+/**
+ * represents an OzoneQuota Object that can be applied to
+ * a storage volume.
+ */
+public class OzoneQuota {
+
+ public static final String OZONE_QUOTA_BYTES = "BYTES";
+ public static final String OZONE_QUOTA_MB = "MB";
+ public static final String OZONE_QUOTA_GB = "GB";
+ public static final String OZONE_QUOTA_TB = "TB";
+
+ private Units unit;
+ private int size;
+
+ /** Quota Units.*/
+ public enum Units {UNDEFINED, BYTES, MB, GB, TB}
+
+ /**
+ * Returns size.
+ *
+ * @return int
+ */
+ public int getSize() {
+ return size;
+ }
+
+ /**
+ * Returns Units.
+ *
+ * @return Unit in MB, GB or TB
+ */
+ public Units getUnit() {
+ return unit;
+ }
+
+ /**
+ * Constructs a default Quota object.
+ */
+ public OzoneQuota() {
+ this.size = 0;
+ this.unit = Units.UNDEFINED;
+ }
+
+ /**
+ * Constructor for Ozone Quota.
+ *
+ * @param size - Integer Size
+ * @param unit MB, GB or TB
+ */
+ public OzoneQuota(int size, Units unit) {
+ this.size = size;
+ this.unit = unit;
+ }
+
+ /**
+ * Formats a quota as a string.
+ *
+ * @param quota the quota to format
+ * @return string representation of quota
+ */
+ public static String formatQuota(OzoneQuota quota) {
+ return String.valueOf(quota.size) + quota.unit;
+ }
+
+ /**
+ * Parses a user provided string and returns the
+ * Quota Object.
+ *
+ * @param quotaString Quota String
+ *
+ * @return OzoneQuota object
+ *
+ * @throws IllegalArgumentException
+ */
+ public static OzoneQuota parseQuota(String quotaString)
+ throws IllegalArgumentException {
+
+ if ((quotaString == null) || (quotaString.isEmpty())) {
+ throw new IllegalArgumentException(
+ "Quota string cannot be null or empty.");
+ }
+
+ String uppercase = quotaString.toUpperCase().replaceAll("\\s+", "");
+ String size = "";
+ int nSize;
+ Units currUnit = Units.MB;
+ Boolean found = false;
+ if (uppercase.endsWith(OZONE_QUOTA_MB)) {
+ size = uppercase
+ .substring(0, uppercase.length() - OZONE_QUOTA_MB.length());
+ currUnit = Units.MB;
+ found = true;
+ }
+
+ if (uppercase.endsWith(OZONE_QUOTA_GB)) {
+ size = uppercase
+ .substring(0, uppercase.length() - OZONE_QUOTA_GB.length());
+ currUnit = Units.GB;
+ found = true;
+ }
+
+ if (uppercase.endsWith(OZONE_QUOTA_TB)) {
+ size = uppercase
+ .substring(0, uppercase.length() - OZONE_QUOTA_TB.length());
+ currUnit = Units.TB;
+ found = true;
+ }
+
+ if (uppercase.endsWith(OZONE_QUOTA_BYTES)) {
+ size = uppercase
+ .substring(0, uppercase.length() - OZONE_QUOTA_BYTES.length());
+ currUnit = Units.BYTES;
+ found = true;
+ }
+
+ if (!found) {
+ throw new IllegalArgumentException(
+ "Quota unit not recognized. Supported values are BYTES, MB, GB and " +
+ "TB.");
+ }
+
+ nSize = Integer.parseInt(size);
+ if (nSize < 0) {
+ throw new IllegalArgumentException("Quota cannot be negative.");
+ }
+
+ return new OzoneQuota(nSize, currUnit);
+ }
+
+
+ /**
+ * Returns size in Bytes or -1 if there is no Quota.
+ */
+ public long sizeInBytes() {
+ switch (this.unit) {
+ case BYTES:
+ return this.getSize();
+ case MB:
+ return this.getSize() * OzoneConsts.MB;
+ case GB:
+ return this.getSize() * OzoneConsts.GB;
+ case TB:
+ return this.getSize() * OzoneConsts.TB;
+ case UNDEFINED:
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Returns OzoneQuota corresponding to size in bytes.
+ *
+ * @param sizeInBytes size in bytes to be converted
+ *
+ * @return OzoneQuota object
+ */
+ public static OzoneQuota getOzoneQuota(long sizeInBytes) {
+ long size;
+ Units unit;
+ if (sizeInBytes % OzoneConsts.TB == 0) {
+ size = sizeInBytes / OzoneConsts.TB;
+ unit = Units.TB;
+ } else if (sizeInBytes % OzoneConsts.GB == 0) {
+ size = sizeInBytes / OzoneConsts.GB;
+ unit = Units.GB;
+ } else if (sizeInBytes % OzoneConsts.MB == 0) {
+ size = sizeInBytes / OzoneConsts.MB;
+ unit = Units.MB;
+ } else {
+ size = sizeInBytes;
+ unit = Units.BYTES;
+ }
+ return new OzoneQuota((int)size, unit);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
index 9c2ec3d..575fb25 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
@@ -1,25 +1,29 @@
-/*
+/**
* 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
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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.
+ * 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.client;
-import org.apache.hadoop.ozone.ksm.helpers.KsmOzoneAclMap;
-import org.apache.hadoop.ozone.ksm.helpers.KsmVolumeArgs;
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+
+import java.io.IOException;
+import java.util.List;
/**
* A class that encapsulates OzoneVolume.
@@ -27,64 +31,70 @@ import org.apache.hadoop.ozone.ksm.helpers.KsmVolumeArgs;
public class OzoneVolume {
/**
- * Admin Name of the Volume.
+ * Name of the Volume.
*/
- private final String adminName;
+ private final String name;
+
/**
- * Owner of the Volume.
+ * Admin Name of the Volume.
*/
- private final String ownerName;
+ private String admin;
/**
- * Name of the Volume.
+ * Owner of the Volume.
*/
- private final String volumeName;
+ private String owner;
/**
* Quota allocated for the Volume.
*/
- private final long quotaInBytes;
+ private long quotaInBytes;
/**
* Volume ACLs.
*/
- private final KsmOzoneAclMap aclMap;
+ private List<OzoneAcl> acls;
+
+ private ClientProtocol proxy;
/**
- * Constructs OzoneVolume from KsmVolumeArgs.
- *
- * @param ksmVolumeArgs
- */
- public OzoneVolume(KsmVolumeArgs ksmVolumeArgs) {
- this.adminName = ksmVolumeArgs.getAdminName();
- this.ownerName = ksmVolumeArgs.getOwnerName();
- this.volumeName = ksmVolumeArgs.getVolume();
- this.quotaInBytes = ksmVolumeArgs.getQuotaInBytes();
- this.aclMap = ksmVolumeArgs.getAclMap();
+ * Constructs OzoneVolume.
+ */
+ public OzoneVolume(String name, String admin, String owner,
+ long quotaInBytes, List<OzoneAcl> acls) {
+ this.name = name;
+ this.admin = admin;
+ this.owner = owner;
+ this.quotaInBytes = quotaInBytes;
+ this.acls = acls;
+ }
+
+ public void setClientProxy(ClientProtocol clientProxy) {
+ this.proxy = clientProxy;
}
/**
- * Returns Volume's admin name.
+ * Returns Volume name.
*
- * @return adminName
+ * @return volumeName
*/
- public String getAdminName() {
- return adminName;
+ public String getName() {
+ return name;
}
/**
- * Returns Volume's owner name.
+ * Returns Volume's admin name.
*
- * @return ownerName
+ * @return adminName
*/
- public String getOwnerName() {
- return ownerName;
+ public String getAdmin() {
+ return admin;
}
/**
- * Returns Volume name.
+ * Returns Volume's owner name.
*
- * @return volumeName
+ * @return ownerName
*/
- public String getVolumeName() {
- return volumeName;
+ public String getOwner() {
+ return owner;
}
/**
@@ -101,7 +111,82 @@ public class OzoneVolume {
*
* @return aclMap
*/
- public KsmOzoneAclMap getAclMap() {
- return aclMap;
+ public List<OzoneAcl> getAcls() {
+ return acls;
+ }
+
+ /**
+ * Sets/Changes the owner of this Volume.
+ * @param owner new owner
+ * @throws IOException
+ */
+ public void setOwner(String owner) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(owner);
+ proxy.setVolumeOwner(name, owner);
+ this.owner = owner;
+ }
+
+ /**
+ * Sets/Changes the quota of this Volume.
+ * @param quota new quota
+ * @throws IOException
+ */
+ public void setQuota(OzoneQuota quota) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(quota);
+ proxy.setVolumeQuota(name, quota);
+ this.quotaInBytes = quota.sizeInBytes();
+ }
+
+ /**
+ * Creates a new Bucket in this Volume, with default values.
+ * @param bucketName Name of the Bucket
+ * @throws IOException
+ */
+ public void createBucket(String bucketName)
+ throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(bucketName);
+ proxy.createBucket(name, bucketName);
+ }
+
+ /**
+ * Creates a new Bucket in this Volume, with properties set in bucketArgs.
+ * @param bucketName Name of the Bucket
+ * @param bucketArgs Properties to be set
+ * @throws IOException
+ */
+ public void createBucket(String bucketName, BucketArgs bucketArgs)
+ throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(bucketArgs);
+ proxy.createBucket(name, bucketName, bucketArgs);
+ }
+
+ /**
+ * Get the Bucket from this Volume.
+ * @param bucketName Name of the Bucket
+ * @return OzoneBucket
+ * @throws IOException
+ */
+ public OzoneBucket getBucket(String bucketName) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(bucketName);
+ OzoneBucket bucket = proxy.getBucketDetails(name, bucketName);
+ bucket.setClientProxy(proxy);
+ return bucket;
+ }
+
+ /**
+ * Deletes the Bucket from this Volume.
+ * @param bucketName Name of the Bucket
+ * @throws IOException
+ */
+ public void deleteBucket(String bucketName) throws IOException {
+ Preconditions.checkNotNull(proxy, "Client proxy is not set.");
+ Preconditions.checkNotNull(bucketName);
+ proxy.deleteBucket(name, bucketName);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
new file mode 100644
index 0000000..f1aa031
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
@@ -0,0 +1,128 @@
+/**
+ * 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.client;
+
+import org.apache.hadoop.ozone.OzoneAcl;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This class encapsulates the arguments that are
+ * required for creating a volume.
+ */
+public final class VolumeArgs {
+
+ private final String admin;
+ private final String owner;
+ private final String quota;
+ private final List<OzoneAcl> acls;
+
+ /**
+ * Private constructor, constructed via builder.
+ * @param admin Administrator's name.
+ * @param owner Volume owner's name
+ * @param quota Volume Quota.
+ * @param acls User to access rights map.
+ */
+ private VolumeArgs(String admin, String owner,
+ String quota, List<OzoneAcl> acls) {
+ this.admin = admin;
+ this.owner = owner;
+ this.quota = quota;
+ this.acls = acls;
+ }
+
+ /**
+ * Returns the Admin Name.
+ * @return String.
+ */
+ public String getAdmin() {
+ return admin;
+ }
+
+ /**
+ * Returns the owner Name.
+ * @return String
+ */
+ public String getOwner() {
+ return owner;
+ }
+
+ /**
+ * Returns Volume Quota.
+ * @return Quota.
+ */
+ public String getQuota() {
+ return quota;
+ }
+
+ public List<OzoneAcl> getAcls() {
+ return acls;
+ }
+ /**
+ * Returns new builder class that builds a KsmVolumeArgs.
+ *
+ * @return Builder
+ */
+ public static VolumeArgs.Builder newBuilder() {
+ return new VolumeArgs.Builder();
+ }
+
+ /**
+ * Builder for KsmVolumeArgs.
+ */
+ public static class Builder {
+ private String adminName;
+ private String ownerName;
+ private String volumeQuota;
+ private List<OzoneAcl> listOfAcls;
+
+
+ public VolumeArgs.Builder setAdmin(String admin) {
+ this.adminName = admin;
+ return this;
+ }
+
+ public VolumeArgs.Builder setOwner(String owner) {
+ this.ownerName = owner;
+ return this;
+ }
+
+ public VolumeArgs.Builder setQuota(String quota) {
+ this.volumeQuota = quota;
+ return this;
+ }
+
+ public VolumeArgs.Builder setAcls(List<OzoneAcl> acls)
+ throws IOException {
+ this.listOfAcls = acls;
+ return this;
+ }
+
+ /**
+ * Constructs a CreateVolumeArgument.
+ * @return CreateVolumeArgs.
+ */
+ public VolumeArgs build() {
+ return new VolumeArgs(adminName, ownerName, volumeQuota, listOfAcls);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
new file mode 100644
index 0000000..54aa3f9
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
@@ -0,0 +1,296 @@
+/**
+ * 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.client.protocol;
+
+import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.client.BucketArgs;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.client.OzoneKey;
+import org.apache.hadoop.ozone.client.OzoneQuota;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.VolumeArgs;
+import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * An implementer of this interface is capable of connecting to Ozone Cluster
+ * and perform client operations. The protocol used for communication is
+ * determined by the implementation class specified by
+ * property <code>ozone.client.protocol</code>. The build-in implementation
+ * includes: {@link org.apache.hadoop.ozone.client.rpc.RpcClient} for RPC and
+ * {@link org.apache.hadoop.ozone.client.rest.RestClient} for REST.
+ */
+public interface ClientProtocol {
+
+ /**
+ * Creates a new Volume.
+ * @param volumeName Name of the Volume
+ * @throws IOException
+ */
+ void createVolume(String volumeName)
+ throws IOException;
+
+ /**
+ * Creates a new Volume with properties set in VolumeArgs.
+ * @param volumeName Name of the Volume
+ * @param args Properties to be set for the Volume
+ * @throws IOException
+ */
+ void createVolume(String volumeName, VolumeArgs args)
+ throws IOException;
+
+ /**
+ * Sets the owner of volume.
+ * @param volumeName Name of the Volume
+ * @param owner to be set for the Volume
+ * @throws IOException
+ */
+ void setVolumeOwner(String volumeName, String owner) throws IOException;
+
+ /**
+ * Set Volume Quota.
+ * @param volumeName Name of the Volume
+ * @param quota Quota to be set for the Volume
+ * @throws IOException
+ */
+ void setVolumeQuota(String volumeName, OzoneQuota quota)
+ throws IOException;
+
+ /**
+ * Returns {@link OzoneVolume}.
+ * @param volumeName Name of the Volume
+ * @return {@link OzoneVolume}
+ * @throws IOException
+ * */
+ OzoneVolume getVolumeDetails(String volumeName)
+ throws IOException;
+
+ /**
+ * Checks if a Volume exists and the user with a role specified has access
+ * to the Volume.
+ * @param volumeName Name of the Volume
+ * @param acl requested acls which needs to be checked for access
+ * @return Boolean - True if the user with a role can access the volume.
+ * This is possible for owners of the volume and admin users
+ * @throws IOException
+ */
+ boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
+ throws IOException;
+
+ /**
+ * Deletes an empty Volume.
+ * @param volumeName Name of the Volume
+ * @throws IOException
+ */
+ void deleteVolume(String volumeName) throws IOException;
+
+ /**
+ * Returns the List of Volumes owned by current user.
+ * @param volumePrefix Volume prefix to match
+ * @return {@link OzoneVolume} Iterator
+ * @throws IOException
+ */
+ Iterator<OzoneVolume> listVolumes(String volumePrefix)
+ throws IOException;
+
+ /**
+ * Returns the List of Volumes owned by the specific user.
+ * @param volumePrefix Volume prefix to match
+ * @param user User Name
+ * @return {@link OzoneVolume} Iterator
+ * @throws IOException
+ */
+ Iterator<OzoneVolume> listVolumes(String volumePrefix, String user)
+ throws IOException;
+
+ /**
+ * Creates a new Bucket in the Volume.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @throws IOException
+ */
+ void createBucket(String volumeName, String bucketName)
+ throws IOException;
+
+ /**
+ * Creates a new Bucket in the Volume, with properties set in BucketArgs.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param bucketArgs Bucket Arguments
+ * @throws IOException
+ */
+ void createBucket(String volumeName, String bucketName,
+ BucketArgs bucketArgs)
+ throws IOException;
+
+ /**
+ * Adds ACLs to the Bucket.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param addAcls ACLs to be added
+ * @throws IOException
+ */
+ void addBucketAcls(String volumeName, String bucketName,
+ List<OzoneAcl> addAcls)
+ throws IOException;
+
+ /**
+ * Removes ACLs from a Bucket.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param removeAcls ACLs to be removed
+ * @throws IOException
+ */
+ void removeBucketAcls(String volumeName, String bucketName,
+ List<OzoneAcl> removeAcls)
+ throws IOException;
+
+
+ /**
+ * Enables or disables Bucket Versioning.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param versioning True to enable Versioning, False to disable.
+ * @throws IOException
+ */
+ void setBucketVersioning(String volumeName, String bucketName,
+ Boolean versioning)
+ throws IOException;
+
+ /**
+ * Sets the Storage Class of a Bucket.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param storageType StorageType to be set
+ * @throws IOException
+ */
+ void setBucketStorageType(String volumeName, String bucketName,
+ StorageType storageType)
+ throws IOException;
+
+ /**
+ * Deletes a bucket if it is empty.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @throws IOException
+ */
+ void deleteBucket(String volumeName, String bucketName)
+ throws IOException;
+
+ /**
+ * True if the bucket exists and user has read access
+ * to the bucket else throws Exception.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @throws IOException
+ */
+ void checkBucketAccess(String volumeName, String bucketName)
+ throws IOException;
+
+ /**
+ * Returns {@link OzoneBucket}.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @return {@link OzoneBucket}
+ * @throws IOException
+ */
+ OzoneBucket getBucketDetails(String volumeName, String bucketName)
+ throws IOException;
+
+ /**
+ * Returns the List of Buckets in the Volume.
+ * @param volumeName Name of the Volume
+ * @param bucketPrefix Bucket prefix to match
+ * @return {@link OzoneBucket} Iterator
+ * @throws IOException
+ */
+ Iterator<OzoneBucket> listBuckets(String volumeName, String bucketPrefix)
+ throws IOException;
+
+ /**
+ * Writes a key in an existing bucket.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param keyName Name of the Key
+ * @param size Size of the data
+ * @return {@link OzoneOutputStream}
+ *
+ */
+ OzoneOutputStream createKey(String volumeName, String bucketName,
+ String keyName, long size)
+ throws IOException;
+
+ /**
+ * Reads a key from an existing bucket.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param keyName Name of the Key
+ * @return {@link OzoneInputStream}
+ * @throws IOException
+ */
+ OzoneInputStream getKey(String volumeName, String bucketName, String keyName)
+ throws IOException;
+
+
+ /**
+ * Deletes an existing key.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param keyName Name of the Key
+ * @throws IOException
+ */
+ void deleteKey(String volumeName, String bucketName, String keyName)
+ throws IOException;
+
+
+ /**
+ * Returns list of {@link OzoneKey} in {Volume/Bucket}.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @return {@link OzoneKey} Iterator
+ * @throws IOException
+ */
+ Iterator<OzoneKey> listKeys(String volumeName, String bucketName,
+ String keyPrefix)
+ throws IOException;
+
+
+ /**
+ * Get OzoneKey.
+ * @param volumeName Name of the Volume
+ * @param bucketName Name of the Bucket
+ * @param keyName Key name
+ * @return {@link OzoneKey}
+ * @throws IOException
+ */
+ OzoneKey getKeyDetails(String volumeName, String bucketName,
+ String keyName)
+ throws IOException;
+
+ /**
+ * Close and release the resources.
+ */
+ void close() throws IOException;
+
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/package-info.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/package-info.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/package-info.java
new file mode 100644
index 0000000..f4890a1
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/protocol/package-info.java
@@ -0,0 +1,23 @@
+/**
+ * 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.client.protocol;
+
+/**
+ * This package contains Ozone client protocol library classes.
+ */
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org
[2/3] hadoop git commit: HDFS-12385. Ozone: OzoneClient: Refactoring
OzoneClient API. Contributed by Nadakumar.
Posted by xy...@apache.org.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/OzoneRestClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/OzoneRestClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/OzoneRestClient.java
deleted file mode 100644
index 4955002..0000000
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/OzoneRestClient.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.client.rest;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.StorageType;
-import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.OzoneConfiguration;
-import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.OzoneConsts.Versioning;
-import org.apache.hadoop.ozone.client.OzoneBucket;
-import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientUtils;
-import org.apache.hadoop.ozone.client.OzoneKey;
-import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.client.io.OzoneInputStream;
-import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
-import org.apache.hadoop.ozone.ksm.KSMConfigKeys;
-import org.apache.hadoop.ozone.client.rest.headers.Header;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.util.Time;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.core.HttpHeaders;
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import static java.net.HttpURLConnection.HTTP_CREATED;
-import static java.net.HttpURLConnection.HTTP_OK;
-
-/**
- * Ozone REST Client Implementation, it connects Ozone Handler to execute
- * client calls. This uses REST protocol for the communication with server.
- */
-public class OzoneRestClient implements OzoneClient, Closeable {
-
- private static final Logger LOG =
- LoggerFactory.getLogger(OzoneRestClient.class);
-
- private static final String SCHEMA = "http://";
- private static final int DEFAULT_OZONE_PORT = 50070;
-
- private final URI uri;
- private final UserGroupInformation ugi;
- private final OzoneAcl.OzoneACLRights userRights;
- private final OzoneAcl.OzoneACLRights groupRights;
-
-
- /**
- * Creates OzoneRpcClient instance with new OzoneConfiguration.
- *
- * @throws IOException
- */
- public OzoneRestClient() throws IOException, URISyntaxException {
- this(new OzoneConfiguration());
- }
-
- /**
- * Creates OzoneRpcClient instance with the given configuration.
- *
- * @param conf
- *
- * @throws IOException
- */
- public OzoneRestClient(Configuration conf)
- throws IOException {
- Preconditions.checkNotNull(conf);
- this.ugi = UserGroupInformation.getCurrentUser();
- this.userRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_USER_RIGHTS,
- KSMConfigKeys.OZONE_KSM_USER_RIGHTS_DEFAULT);
- this.groupRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS,
- KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS_DEFAULT);
-
- //TODO: get uri from property ozone.reset.servers
- URIBuilder ozoneURI = null;
- try {
- ozoneURI = new URIBuilder(SCHEMA + "localhost");
- if (ozoneURI.getPort() == 0) {
- ozoneURI.setPort(DEFAULT_OZONE_PORT);
- }
- uri = ozoneURI.build();
- } catch (URISyntaxException e) {
- throw new IOException(e);
- }
- }
-
- @Override
- public void createVolume(String volumeName)
- throws IOException {
- createVolume(volumeName, ugi.getUserName());
- }
-
- @Override
- public void createVolume(String volumeName, String owner)
- throws IOException {
-
- createVolume(volumeName, owner, OzoneConsts.MAX_QUOTA_IN_BYTES,
- (OzoneAcl[])null);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- OzoneAcl... acls)
- throws IOException {
- createVolume(volumeName, owner, OzoneConsts.MAX_QUOTA_IN_BYTES, acls);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- long quota)
- throws IOException {
- createVolume(volumeName, owner, quota, (OzoneAcl[])null);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- long quota, OzoneAcl... acls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(owner);
- Preconditions.checkNotNull(quota);
- Preconditions.checkState(quota >= 0);
-
- Set<OzoneAcl> aclSet = new HashSet<>();
-
- if(acls != null) {
- aclSet.addAll(Arrays.asList(acls));
- }
-
- LOG.info("Creating Volume: {}, with {} as owner and " +
- "quota set to {} bytes.", volumeName, owner, quota);
- HttpPost httpPost = null;
- HttpEntity entity = null;
- try (CloseableHttpClient httpClient = OzoneClientUtils.newHttpClient()) {
- URIBuilder builder = new URIBuilder(uri);
- builder.setPath("/" + volumeName);
- String quotaString = quota + Header.OZONE_QUOTA_BYTES;
- builder.setParameter(Header.OZONE_QUOTA_QUERY_TAG, quotaString);
- httpPost = getHttpPost(owner, builder.build().toString());
- for (OzoneAcl acl : aclSet) {
- httpPost.addHeader(
- Header.OZONE_ACLS, Header.OZONE_ACL_ADD + " " + acl.toString());
- }
-
- HttpResponse response = httpClient.execute(httpPost);
- entity = response.getEntity();
- int errorCode = response.getStatusLine().getStatusCode();
- if ((errorCode == HTTP_OK) || (errorCode == HTTP_CREATED)) {
- return;
- }
- if (entity != null) {
- throw new IOException(EntityUtils.toString(entity));
- } else {
- throw new IOException("Unexpected null in http payload");
- }
- } catch (URISyntaxException | IllegalArgumentException ex) {
- throw new IOException(ex.getMessage());
- } finally {
- EntityUtils.consume(entity);
- OzoneClientUtils.releaseConnection(httpPost);
- }
- }
-
- @Override
- public void setVolumeOwner(String volumeName, String owner)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(owner);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void setVolumeQuota(String volumeName, long quota)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(quota);
- Preconditions.checkState(quota >= 0);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneVolume getVolumeDetails(String volumeName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void deleteVolume(String volumeName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public Iterator<OzoneVolume> listVolumes(String volumePrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public Iterator<OzoneVolume> listVolumes(String volumePrefix,
- String user)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- StorageType.DEFAULT, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException {
- createBucket(volumeName, bucketName, versioning,
- StorageType.DEFAULT, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- storageType, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- OzoneAcl... acls)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- StorageType.DEFAULT, acls);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- Versioning versioning, StorageType storageType,
- OzoneAcl... acls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(versioning);
- Preconditions.checkNotNull(storageType);
-
- String owner = ugi.getUserName();
- final List<OzoneAcl> listOfAcls = new ArrayList<>();
-
- //User ACL
- OzoneAcl userAcl =
- new OzoneAcl(OzoneAcl.OzoneACLType.USER,
- owner, userRights);
- listOfAcls.add(userAcl);
-
- //Group ACLs of the User
- List<String> userGroups = Arrays.asList(UserGroupInformation
- .createRemoteUser(owner).getGroupNames());
- userGroups.stream().forEach((group) -> listOfAcls.add(
- new OzoneAcl(OzoneAcl.OzoneACLType.GROUP, group, groupRights)));
-
- //ACLs passed as argument
- if(acls != null) {
- Arrays.stream(acls).forEach((acl) -> listOfAcls.add(acl));
- }
-
- LOG.info("Creating Bucket: {}/{}, with Versioning {} and " +
- "Storage Type set to {}", volumeName, bucketName, versioning,
- storageType);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- /**
- * Converts OzoneConts.Versioning enum to boolean.
- *
- * @param version
- * @return corresponding boolean value
- */
- private boolean getBucketVersioningProtobuf(
- Versioning version) {
- if(version != null) {
- switch(version) {
- case ENABLED:
- return true;
- case NOT_DEFINED:
- case DISABLED:
- default:
- return false;
- }
- }
- return false;
- }
-
- @Override
- public void addBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> addAcls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(addAcls);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void removeBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> removeAcls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(removeAcls);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void setBucketVersioning(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(versioning);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void setBucketStorageType(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(storageType);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void deleteBucket(String volumeName, String bucketName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void checkBucketAccess(String volumeName, String bucketName)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneBucket getBucketDetails(String volumeName,
- String bucketName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public Iterator<OzoneBucket> listBuckets(String volumeName,
- String bucketPrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneOutputStream createKey(String volumeName, String bucketName,
- String keyName, long size)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneInputStream getKey(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void deleteKey(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public List<OzoneKey> listKeys(String volumeName, String bucketName,
- String keyPrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneKey getKeyDetails(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- /**
- * Converts Versioning to boolean.
- *
- * @param version
- * @return corresponding boolean value
- */
- private boolean getBucketVersioningFlag(
- Versioning version) {
- if(version != null) {
- switch(version) {
- case ENABLED:
- return true;
- case DISABLED:
- case NOT_DEFINED:
- default:
- return false;
- }
- }
- return false;
- }
-
- /**
- * Returns a standard HttpPost Object to use for ozone post requests.
- *
- * @param user - If the use is being made on behalf of user, that user
- * @param uriString - UriString
- * @return HttpPost
- */
- public HttpPost getHttpPost(String user, String uriString) {
- HttpPost httpPost = new HttpPost(uriString);
- addOzoneHeaders(httpPost);
- if (user != null) {
- httpPost.addHeader(Header.OZONE_USER, user);
- }
- return httpPost;
- }
-
- /**
- * Add Ozone Headers.
- *
- * @param httpRequest - Http Request
- */
- private void addOzoneHeaders(HttpRequestBase httpRequest) {
- SimpleDateFormat format =
- new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss ZZZ", Locale.US);
-
- httpRequest.addHeader(Header.OZONE_VERSION_HEADER,
- Header.OZONE_V1_VERSION_HEADER);
- httpRequest.addHeader(HttpHeaders.DATE,
- format.format(new Date(Time.monotonicNow())));
- httpRequest.addHeader(HttpHeaders.AUTHORIZATION,
- Header.OZONE_SIMPLE_AUTHENTICATION_SCHEME + " " +
- ugi.getUserName());
- }
-
- @Override
- public void close() throws IOException {
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/RestClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/RestClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/RestClient.java
new file mode 100644
index 0000000..b525aa8
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/RestClient.java
@@ -0,0 +1,209 @@
+/**
+ * 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.client.rest;
+
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.client.BucketArgs;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.client.OzoneKey;
+import org.apache.hadoop.ozone.client.OzoneQuota;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Ozone Client REST protocol implementation. It uses REST protocol to
+ * connect to Ozone Handler that executes client calls
+ */
+public class RestClient implements ClientProtocol {
+
+ /**
+ * Creates RestClient instance with the given configuration.
+ * @param conf Configuration
+ * @throws IOException
+ */
+ public RestClient(Configuration conf)
+ throws IOException {
+ Preconditions.checkNotNull(conf);
+ }
+
+ @Override
+ public void createVolume(String volumeName) throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void createVolume(
+ String volumeName, org.apache.hadoop.ozone.client.VolumeArgs args)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void setVolumeOwner(String volumeName, String owner)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void setVolumeQuota(String volumeName, OzoneQuota quota)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneVolume getVolumeDetails(String volumeName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void deleteVolume(String volumeName) throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public Iterator<OzoneVolume> listVolumes(String volumePrefix)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public Iterator<OzoneVolume> listVolumes(String volumePrefix, String user)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void createBucket(String volumeName, String bucketName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void createBucket(
+ String volumeName, String bucketName, BucketArgs bucketArgs)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void addBucketAcls(
+ String volumeName, String bucketName, List<OzoneAcl> addAcls)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void removeBucketAcls(
+ String volumeName, String bucketName, List<OzoneAcl> removeAcls)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void setBucketVersioning(
+ String volumeName, String bucketName, Boolean versioning)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void setBucketStorageType(
+ String volumeName, String bucketName, StorageType storageType)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void deleteBucket(String volumeName, String bucketName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void checkBucketAccess(String volumeName, String bucketName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneBucket getBucketDetails(String volumeName, String bucketName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public Iterator<OzoneBucket> listBuckets(
+ String volumeName, String bucketPrefix) throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneOutputStream createKey(
+ String volumeName, String bucketName, String keyName, long size)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneInputStream getKey(
+ String volumeName, String bucketName, String keyName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void deleteKey(String volumeName, String bucketName, String keyName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public Iterator<OzoneKey> listKeys(
+ String volumeName, String bucketName, String keyPrefix)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneKey getKeyDetails(
+ String volumeName, String bucketName, String keyName)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/Header.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/Header.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/Header.java
index 5221a0e..7e7995b 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/Header.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/Header.java
@@ -1,19 +1,19 @@
-/*
+/**
* 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
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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.
+ * 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.client.rest.headers;
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/package-info.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/package-info.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/package-info.java
index 54157f0..340709f 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/package-info.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rest/headers/package-info.java
@@ -1,4 +1,4 @@
-/*
+/**
* 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
@@ -7,19 +7,15 @@
* "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
+ * 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.
+ * 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.
*/
-/**
- * Ozone HTTP header definitions.
- */
@InterfaceAudience.Private
package org.apache.hadoop.ozone.client.rest.headers;
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClient.java
deleted file mode 100644
index 13cb370..0000000
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClient.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.client.rpc;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.StorageType;
-import org.apache.hadoop.io.IOUtils;
-import org.apache.hadoop.ipc.Client;
-import org.apache.hadoop.ipc.ProtobufRpcEngine;
-import org.apache.hadoop.ipc.RPC;
-import org.apache.hadoop.ozone.client.io.LengthInputStream;
-import org.apache.hadoop.ozone.ksm.helpers.KsmBucketArgs;
-import org.apache.hadoop.ozone.ksm.helpers.KsmBucketInfo;
-import org.apache.hadoop.ozone.ksm.helpers.KsmKeyArgs;
-import org.apache.hadoop.ozone.ksm.helpers.KsmKeyInfo;
-import org.apache.hadoop.ozone.ksm.helpers.KsmVolumeArgs;
-import org.apache.hadoop.ozone.ksm.protocolPB
- .KeySpaceManagerProtocolClientSideTranslatorPB;
-import org.apache.hadoop.ozone.ksm.protocolPB
- .KeySpaceManagerProtocolPB;
-import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.OzoneConfiguration;
-import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.client.OzoneBucket;
-import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientUtils;
-import org.apache.hadoop.ozone.client.OzoneKey;
-import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.client.io.ChunkGroupInputStream;
-import org.apache.hadoop.ozone.client.io.OzoneInputStream;
-import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
-import org.apache.hadoop.ozone.ksm.KSMConfigKeys;
-import org.apache.hadoop.ozone.OzoneConsts.Versioning;
-import org.apache.hadoop.ozone.protocolPB.KSMPBHelper;
-import org.apache.hadoop.ozone.client.io.ChunkGroupOutputStream;
-import org.apache.hadoop.scm.ScmConfigKeys;
-import org.apache.hadoop.scm.XceiverClientManager;
-import org.apache.hadoop.scm.protocolPB
- .StorageContainerLocationProtocolClientSideTranslatorPB;
-import org.apache.hadoop.scm.protocolPB
- .StorageContainerLocationProtocolPB;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.util.Time;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-/**
- * Ozone RPC Client Implementation, it connects to KSM, SCM and DataNode
- * to execute client calls. This uses RPC protocol for communication
- * with the servers.
- */
-public class OzoneRpcClient implements OzoneClient, Closeable {
-
- private static final Logger LOG =
- LoggerFactory.getLogger(OzoneRpcClient.class);
-
- private final StorageContainerLocationProtocolClientSideTranslatorPB
- storageContainerLocationClient;
- private final KeySpaceManagerProtocolClientSideTranslatorPB
- keySpaceManagerClient;
- private final XceiverClientManager xceiverClientManager;
- private final int chunkSize;
-
-
- private final UserGroupInformation ugi;
- private final OzoneAcl.OzoneACLRights userRights;
- private final OzoneAcl.OzoneACLRights groupRights;
-
- /**
- * Creates OzoneRpcClient instance with new OzoneConfiguration.
- *
- * @throws IOException
- */
- public OzoneRpcClient() throws IOException {
- this(new OzoneConfiguration());
- }
-
- /**
- * Creates OzoneRpcClient instance with the given configuration.
- *
- * @param conf
- *
- * @throws IOException
- */
- public OzoneRpcClient(Configuration conf) throws IOException {
- Preconditions.checkNotNull(conf);
- this.ugi = UserGroupInformation.getCurrentUser();
- this.userRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_USER_RIGHTS,
- KSMConfigKeys.OZONE_KSM_USER_RIGHTS_DEFAULT);
- this.groupRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS,
- KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS_DEFAULT);
-
- long scmVersion =
- RPC.getProtocolVersion(StorageContainerLocationProtocolPB.class);
- InetSocketAddress scmAddress =
- OzoneClientUtils.getScmAddressForClients(conf);
- RPC.setProtocolEngine(conf, StorageContainerLocationProtocolPB.class,
- ProtobufRpcEngine.class);
- this.storageContainerLocationClient =
- new StorageContainerLocationProtocolClientSideTranslatorPB(
- RPC.getProxy(StorageContainerLocationProtocolPB.class, scmVersion,
- scmAddress, UserGroupInformation.getCurrentUser(), conf,
- NetUtils.getDefaultSocketFactory(conf),
- Client.getRpcTimeout(conf)));
-
- long ksmVersion =
- RPC.getProtocolVersion(KeySpaceManagerProtocolPB.class);
- InetSocketAddress ksmAddress = OzoneClientUtils.getKsmAddress(conf);
- RPC.setProtocolEngine(conf, KeySpaceManagerProtocolPB.class,
- ProtobufRpcEngine.class);
- this.keySpaceManagerClient =
- new KeySpaceManagerProtocolClientSideTranslatorPB(
- RPC.getProxy(KeySpaceManagerProtocolPB.class, ksmVersion,
- ksmAddress, UserGroupInformation.getCurrentUser(), conf,
- NetUtils.getDefaultSocketFactory(conf),
- Client.getRpcTimeout(conf)));
-
- this.xceiverClientManager = new XceiverClientManager(conf);
-
- int configuredChunkSize = conf.getInt(
- ScmConfigKeys.OZONE_SCM_CHUNK_SIZE_KEY,
- ScmConfigKeys.OZONE_SCM_CHUNK_SIZE_DEFAULT);
- if(configuredChunkSize > ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE) {
- LOG.warn("The chunk size ({}) is not allowed to be more than"
- + " the maximum size ({}),"
- + " resetting to the maximum size.",
- configuredChunkSize, ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE);
- chunkSize = ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE;
- } else {
- chunkSize = configuredChunkSize;
- }
- }
-
- @Override
- public void createVolume(String volumeName)
- throws IOException {
- createVolume(volumeName, ugi.getUserName());
- }
-
- @Override
- public void createVolume(String volumeName, String owner)
- throws IOException {
-
- createVolume(volumeName, owner, OzoneConsts.MAX_QUOTA_IN_BYTES,
- (OzoneAcl[])null);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- OzoneAcl... acls)
- throws IOException {
- createVolume(volumeName, owner, OzoneConsts.MAX_QUOTA_IN_BYTES, acls);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- long quota)
- throws IOException {
- createVolume(volumeName, owner, quota, (OzoneAcl[])null);
- }
-
- @Override
- public void createVolume(String volumeName, String owner,
- long quota, OzoneAcl... acls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(owner);
- Preconditions.checkNotNull(quota);
- Preconditions.checkState(quota >= 0);
- OzoneAcl userAcl =
- new OzoneAcl(OzoneAcl.OzoneACLType.USER,
- owner, userRights);
- KsmVolumeArgs.Builder builder = KsmVolumeArgs.newBuilder();
- builder.setAdminName(ugi.getUserName())
- .setOwnerName(owner)
- .setVolume(volumeName)
- .setQuotaInBytes(quota)
- .setCreationTime(Time.now())
- .addOzoneAcls(KSMPBHelper.convertOzoneAcl(userAcl));
-
- List<OzoneAcl> listOfAcls = new ArrayList<>();
-
- //Group ACLs of the User
- List<String> userGroups = Arrays.asList(UserGroupInformation
- .createRemoteUser(owner).getGroupNames());
- userGroups.stream().forEach((group) -> listOfAcls.add(
- new OzoneAcl(OzoneAcl.OzoneACLType.GROUP, group, groupRights)));
-
- //ACLs passed as argument
- if(acls != null) {
- listOfAcls.addAll(Arrays.asList(acls));
- }
-
- //Remove duplicates and set
- for (OzoneAcl ozoneAcl :
- listOfAcls.stream().distinct().collect(Collectors.toList())) {
- builder.addOzoneAcls(KSMPBHelper.convertOzoneAcl(ozoneAcl));
- }
-
- LOG.info("Creating Volume: {}, with {} as owner and quota set to {} bytes.",
- volumeName, owner, quota);
- keySpaceManagerClient.createVolume(builder.build());
- }
-
- @Override
- public void setVolumeOwner(String volumeName, String owner)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(owner);
- keySpaceManagerClient.setOwner(volumeName, owner);
- }
-
- @Override
- public void setVolumeQuota(String volumeName, long quota)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(quota);
- Preconditions.checkState(quota >= 0);
- keySpaceManagerClient.setQuota(volumeName, quota);
- }
-
- @Override
- public OzoneVolume getVolumeDetails(String volumeName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- KsmVolumeArgs volumeArgs =
- keySpaceManagerClient.getVolumeInfo(volumeName);
- return new OzoneVolume(volumeArgs);
- }
-
- @Override
- public boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- return keySpaceManagerClient.checkVolumeAccess(volumeName,
- KSMPBHelper.convertOzoneAcl(acl));
- }
-
- @Override
- public void deleteVolume(String volumeName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- keySpaceManagerClient.deleteVolume(volumeName);
- }
-
- @Override
- public Iterator<OzoneVolume> listVolumes(String volumePrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public Iterator<OzoneVolume> listVolumes(String volumePrefix,
- String user)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- StorageType.DEFAULT, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException {
- createBucket(volumeName, bucketName, versioning,
- StorageType.DEFAULT, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- storageType, (OzoneAcl[])null);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- OzoneAcl... acls)
- throws IOException {
- createBucket(volumeName, bucketName, Versioning.NOT_DEFINED,
- StorageType.DEFAULT, acls);
- }
-
- @Override
- public void createBucket(String volumeName, String bucketName,
- Versioning versioning, StorageType storageType,
- OzoneAcl... acls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(versioning);
- Preconditions.checkNotNull(storageType);
-
- KsmBucketInfo.Builder builder = KsmBucketInfo.newBuilder();
- builder.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setStorageType(storageType)
- .setIsVersionEnabled(getBucketVersioningProtobuf(
- versioning));
-
- String owner = ugi.getUserName();
- final List<OzoneAcl> listOfAcls = new ArrayList<>();
-
- //User ACL
- OzoneAcl userAcl =
- new OzoneAcl(OzoneAcl.OzoneACLType.USER,
- owner, userRights);
- listOfAcls.add(userAcl);
-
- //Group ACLs of the User
- List<String> userGroups = Arrays.asList(UserGroupInformation
- .createRemoteUser(owner).getGroupNames());
- userGroups.stream().forEach((group) -> listOfAcls.add(
- new OzoneAcl(OzoneAcl.OzoneACLType.GROUP, group, groupRights)));
-
- //ACLs passed as argument
- if(acls != null) {
- Arrays.stream(acls).forEach((acl) -> listOfAcls.add(acl));
- }
-
- //Remove duplicates and set
- builder.setAcls(listOfAcls.stream().distinct()
- .collect(Collectors.toList()));
- LOG.info("Creating Bucket: {}/{}, with Versioning {} and " +
- "Storage Type set to {}", volumeName, bucketName, versioning,
- storageType);
- keySpaceManagerClient.createBucket(builder.build());
- }
-
- /**
- * Converts OzoneConts.Versioning enum to boolean.
- *
- * @param version
- * @return corresponding boolean value
- */
- private boolean getBucketVersioningProtobuf(
- Versioning version) {
- if(version != null) {
- switch(version) {
- case ENABLED:
- return true;
- case NOT_DEFINED:
- case DISABLED:
- default:
- return false;
- }
- }
- return false;
- }
-
- @Override
- public void addBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> addAcls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(addAcls);
- KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
- builder.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setAddAcls(addAcls);
- keySpaceManagerClient.setBucketProperty(builder.build());
- }
-
- @Override
- public void removeBucketAcls(String volumeName, String bucketName,
- List<OzoneAcl> removeAcls)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(removeAcls);
- KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
- builder.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setRemoveAcls(removeAcls);
- keySpaceManagerClient.setBucketProperty(builder.build());
- }
-
- @Override
- public void setBucketVersioning(String volumeName, String bucketName,
- Versioning versioning)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(versioning);
- KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
- builder.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setIsVersionEnabled(getBucketVersioningFlag(
- versioning));
- keySpaceManagerClient.setBucketProperty(builder.build());
- }
-
- @Override
- public void setBucketStorageType(String volumeName, String bucketName,
- StorageType storageType)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(storageType);
- KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
- builder.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setStorageType(storageType);
- keySpaceManagerClient.setBucketProperty(builder.build());
- }
-
- @Override
- public void deleteBucket(String volumeName, String bucketName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- keySpaceManagerClient.deleteBucket(volumeName, bucketName);
- }
-
- @Override
- public void checkBucketAccess(String volumeName, String bucketName)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneBucket getBucketDetails(String volumeName,
- String bucketName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- KsmBucketInfo bucketInfo =
- keySpaceManagerClient.getBucketInfo(volumeName, bucketName);
- return new OzoneBucket(bucketInfo);
- }
-
- @Override
- public Iterator<OzoneBucket> listBuckets(String volumeName,
- String bucketPrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneOutputStream createKey(String volumeName, String bucketName,
- String keyName, long size)
- throws IOException {
- String requestId = UUID.randomUUID().toString();
- KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
- .setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setKeyName(keyName)
- .setDataSize(size)
- .build();
-
- KsmKeyInfo keyInfo = keySpaceManagerClient.allocateKey(keyArgs);
- ChunkGroupOutputStream groupOutputStream =
- ChunkGroupOutputStream.getFromKsmKeyInfo(keyInfo, xceiverClientManager,
- storageContainerLocationClient, chunkSize, requestId);
- return new OzoneOutputStream(groupOutputStream);
- }
-
- @Override
- public OzoneInputStream getKey(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- String requestId = UUID.randomUUID().toString();
- KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
- .setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setKeyName(keyName)
- .build();
- KsmKeyInfo keyInfo = keySpaceManagerClient.lookupKey(keyArgs);
- LengthInputStream lengthInputStream =
- ChunkGroupInputStream.getFromKsmKeyInfo(
- keyInfo, xceiverClientManager, storageContainerLocationClient,
- requestId);
- return new OzoneInputStream(
- (ChunkGroupInputStream)lengthInputStream.getWrappedStream());
- }
-
- @Override
- public void deleteKey(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
- .setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setKeyName(keyName)
- .build();
- keySpaceManagerClient.deleteKey(keyArgs);
- }
-
- @Override
- public List<OzoneKey> listKeys(String volumeName, String bucketName,
- String keyPrefix)
- throws IOException {
- throw new UnsupportedOperationException("Not yet implemented.");
- }
-
- @Override
- public OzoneKey getKeyDetails(String volumeName, String bucketName,
- String keyName)
- throws IOException {
- Preconditions.checkNotNull(volumeName);
- Preconditions.checkNotNull(bucketName);
- Preconditions.checkNotNull(keyName);
- KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
- .setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setKeyName(keyName)
- .build();
- KsmKeyInfo keyInfo =
- keySpaceManagerClient.lookupKey(keyArgs);
- return new OzoneKey(keyInfo);
- }
-
- /**
- * Converts Versioning to boolean.
- *
- * @param version
- * @return corresponding boolean value
- */
- private boolean getBucketVersioningFlag(
- Versioning version) {
- if(version != null) {
- switch(version) {
- case ENABLED:
- return true;
- case DISABLED:
- case NOT_DEFINED:
- default:
- return false;
- }
- }
- return false;
- }
-
- @Override
- public void close() throws IOException {
- IOUtils.cleanupWithLogger(LOG, storageContainerLocationClient);
- IOUtils.cleanupWithLogger(LOG, keySpaceManagerClient);
- IOUtils.cleanupWithLogger(LOG, xceiverClientManager);
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
new file mode 100644
index 0000000..6464c5d
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -0,0 +1,474 @@
+/**
+ * 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.client.rpc;
+
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.io.IOUtils;
+import org.apache.hadoop.ipc.Client;
+import org.apache.hadoop.ipc.ProtobufRpcEngine;
+import org.apache.hadoop.ipc.RPC;
+import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.client.BucketArgs;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.client.OzoneKey;
+import org.apache.hadoop.ozone.client.OzoneQuota;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.VolumeArgs;
+import org.apache.hadoop.ozone.client.io.ChunkGroupInputStream;
+import org.apache.hadoop.ozone.client.io.ChunkGroupOutputStream;
+import org.apache.hadoop.ozone.client.io.LengthInputStream;
+import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
+import org.apache.hadoop.ozone.ksm.helpers.KsmBucketArgs;
+import org.apache.hadoop.ozone.ksm.helpers.KsmBucketInfo;
+import org.apache.hadoop.ozone.ksm.helpers.KsmKeyArgs;
+import org.apache.hadoop.ozone.ksm.helpers.KsmKeyInfo;
+import org.apache.hadoop.ozone.ksm.helpers.KsmVolumeArgs;
+import org.apache.hadoop.ozone.ksm.protocolPB
+ .KeySpaceManagerProtocolClientSideTranslatorPB;
+import org.apache.hadoop.ozone.ksm.protocolPB
+ .KeySpaceManagerProtocolPB;
+import org.apache.hadoop.net.NetUtils;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.client.OzoneClientUtils;
+import org.apache.hadoop.ozone.ksm.KSMConfigKeys;
+import org.apache.hadoop.ozone.protocolPB.KSMPBHelper;
+import org.apache.hadoop.scm.ScmConfigKeys;
+import org.apache.hadoop.scm.XceiverClientManager;
+import org.apache.hadoop.scm.protocolPB
+ .StorageContainerLocationProtocolClientSideTranslatorPB;
+import org.apache.hadoop.scm.protocolPB
+ .StorageContainerLocationProtocolPB;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * Ozone RPC Client Implementation, it connects to KSM, SCM and DataNode
+ * to execute client calls. This uses RPC protocol for communication
+ * with the servers.
+ */
+public class RpcClient implements ClientProtocol {
+
+ private static final Logger LOG =
+ LoggerFactory.getLogger(RpcClient.class);
+
+ private final StorageContainerLocationProtocolClientSideTranslatorPB
+ storageContainerLocationClient;
+ private final KeySpaceManagerProtocolClientSideTranslatorPB
+ keySpaceManagerClient;
+ private final XceiverClientManager xceiverClientManager;
+ private final int chunkSize;
+
+
+ private final UserGroupInformation ugi;
+ private final OzoneAcl.OzoneACLRights userRights;
+ private final OzoneAcl.OzoneACLRights groupRights;
+
+ /**
+ * Creates RpcClient instance with the given configuration.
+ * @param conf
+ * @throws IOException
+ */
+ public RpcClient(Configuration conf) throws IOException {
+ Preconditions.checkNotNull(conf);
+ this.ugi = UserGroupInformation.getCurrentUser();
+ this.userRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_USER_RIGHTS,
+ KSMConfigKeys.OZONE_KSM_USER_RIGHTS_DEFAULT);
+ this.groupRights = conf.getEnum(KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS,
+ KSMConfigKeys.OZONE_KSM_GROUP_RIGHTS_DEFAULT);
+
+ long scmVersion =
+ RPC.getProtocolVersion(StorageContainerLocationProtocolPB.class);
+ InetSocketAddress scmAddress =
+ OzoneClientUtils.getScmAddressForClients(conf);
+ RPC.setProtocolEngine(conf, StorageContainerLocationProtocolPB.class,
+ ProtobufRpcEngine.class);
+ this.storageContainerLocationClient =
+ new StorageContainerLocationProtocolClientSideTranslatorPB(
+ RPC.getProxy(StorageContainerLocationProtocolPB.class, scmVersion,
+ scmAddress, UserGroupInformation.getCurrentUser(), conf,
+ NetUtils.getDefaultSocketFactory(conf),
+ Client.getRpcTimeout(conf)));
+
+ long ksmVersion =
+ RPC.getProtocolVersion(KeySpaceManagerProtocolPB.class);
+ InetSocketAddress ksmAddress = OzoneClientUtils.getKsmAddress(conf);
+ RPC.setProtocolEngine(conf, KeySpaceManagerProtocolPB.class,
+ ProtobufRpcEngine.class);
+ this.keySpaceManagerClient =
+ new KeySpaceManagerProtocolClientSideTranslatorPB(
+ RPC.getProxy(KeySpaceManagerProtocolPB.class, ksmVersion,
+ ksmAddress, UserGroupInformation.getCurrentUser(), conf,
+ NetUtils.getDefaultSocketFactory(conf),
+ Client.getRpcTimeout(conf)));
+
+ this.xceiverClientManager = new XceiverClientManager(conf);
+
+ int configuredChunkSize = conf.getInt(
+ ScmConfigKeys.OZONE_SCM_CHUNK_SIZE_KEY,
+ ScmConfigKeys.OZONE_SCM_CHUNK_SIZE_DEFAULT);
+ if(configuredChunkSize > ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE) {
+ LOG.warn("The chunk size ({}) is not allowed to be more than"
+ + " the maximum size ({}),"
+ + " resetting to the maximum size.",
+ configuredChunkSize, ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE);
+ chunkSize = ScmConfigKeys.OZONE_SCM_CHUNK_MAX_SIZE;
+ } else {
+ chunkSize = configuredChunkSize;
+ }
+ }
+
+ @Override
+ public void createVolume(String volumeName) throws IOException {
+ createVolume(volumeName, VolumeArgs.newBuilder().build());
+ }
+
+ @Override
+ public void createVolume(String volumeName, VolumeArgs volArgs)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(volArgs);
+
+ String admin = volArgs.getAdmin() == null ?
+ ugi.getUserName() : volArgs.getAdmin();
+ String owner = volArgs.getOwner() == null ?
+ ugi.getUserName() : volArgs.getOwner();
+ long quota = volArgs.getQuota() == null ?
+ OzoneConsts.MAX_QUOTA_IN_BYTES :
+ OzoneQuota.parseQuota(volArgs.getQuota()).sizeInBytes();
+ List<OzoneAcl> listOfAcls = new ArrayList<>();
+ //User ACL
+ listOfAcls.add(new OzoneAcl(OzoneAcl.OzoneACLType.USER,
+ owner, userRights));
+ //Group ACLs of the User
+ List<String> userGroups = Arrays.asList(UserGroupInformation
+ .createRemoteUser(owner).getGroupNames());
+ userGroups.stream().forEach((group) -> listOfAcls.add(
+ new OzoneAcl(OzoneAcl.OzoneACLType.GROUP, group, groupRights)));
+ //ACLs from VolumeArgs
+ if(volArgs.getAcls() != null) {
+ listOfAcls.addAll(volArgs.getAcls());
+ }
+
+ KsmVolumeArgs.Builder builder = KsmVolumeArgs.newBuilder();
+ builder.setVolume(volumeName);
+ builder.setAdminName(admin);
+ builder.setOwnerName(owner);
+ builder.setQuotaInBytes(quota);
+
+ //Remove duplicates and add ACLs
+ for (OzoneAcl ozoneAcl :
+ listOfAcls.stream().distinct().collect(Collectors.toList())) {
+ builder.addOzoneAcls(KSMPBHelper.convertOzoneAcl(ozoneAcl));
+ }
+
+ LOG.info("Creating Volume: {}, with {} as owner and quota set to {} bytes.",
+ volumeName, owner, quota);
+ keySpaceManagerClient.createVolume(builder.build());
+ }
+
+ @Override
+ public void setVolumeOwner(String volumeName, String owner)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(owner);
+ keySpaceManagerClient.setOwner(volumeName, owner);
+ }
+
+ @Override
+ public void setVolumeQuota(String volumeName, OzoneQuota quota)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(quota);
+ long quotaInBytes = quota.sizeInBytes();
+ keySpaceManagerClient.setQuota(volumeName, quotaInBytes);
+ }
+
+ @Override
+ public OzoneVolume getVolumeDetails(String volumeName)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ KsmVolumeArgs volume = keySpaceManagerClient.getVolumeInfo(volumeName);
+ return new OzoneVolume(volume.getVolume(), volume.getAdminName(),
+ volume.getOwnerName(), volume.getQuotaInBytes(),
+ volume.getAclMap().ozoneAclGetProtobuf().stream().
+ map(KSMPBHelper::convertOzoneAcl).collect(Collectors.toList()));
+ }
+
+ @Override
+ public boolean checkVolumeAccess(String volumeName, OzoneAcl acl)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void deleteVolume(String volumeName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ keySpaceManagerClient.deleteVolume(volumeName);
+ }
+
+ @Override
+ public Iterator<OzoneVolume> listVolumes(String volumePrefix)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public Iterator<OzoneVolume> listVolumes(String volumePrefix, String user)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public void createBucket(String volumeName, String bucketName)
+ throws IOException {
+ createBucket(volumeName, bucketName, BucketArgs.newBuilder().build());
+ }
+
+ @Override
+ public void createBucket(
+ String volumeName, String bucketName, BucketArgs bucketArgs)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(bucketArgs);
+
+ Boolean isVersionEnabled = bucketArgs.isVersionEnabled() == null ?
+ false : bucketArgs.isVersionEnabled();
+ StorageType storageType = bucketArgs.getStorageType() == null ?
+ StorageType.DEFAULT : bucketArgs.getStorageType();
+ List<OzoneAcl> listOfAcls = new ArrayList<>();
+ //User ACL
+ listOfAcls.add(new OzoneAcl(OzoneAcl.OzoneACLType.USER,
+ ugi.getUserName(), userRights));
+ //Group ACLs of the User
+ List<String> userGroups = Arrays.asList(UserGroupInformation
+ .createRemoteUser(ugi.getUserName()).getGroupNames());
+ userGroups.stream().forEach((group) -> listOfAcls.add(
+ new OzoneAcl(OzoneAcl.OzoneACLType.GROUP, group, groupRights)));
+ //ACLs from BucketArgs
+ if(bucketArgs.getAcls() != null) {
+ listOfAcls.addAll(bucketArgs.getAcls());
+ }
+
+ KsmBucketInfo.Builder builder = KsmBucketInfo.newBuilder();
+ builder.setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setIsVersionEnabled(isVersionEnabled)
+ .setStorageType(storageType)
+ .setAcls(listOfAcls.stream().distinct().collect(Collectors.toList()));
+
+ LOG.info("Creating Bucket: {}/{}, with Versioning {} and " +
+ "Storage Type set to {}", volumeName, bucketName, isVersionEnabled,
+ storageType);
+ keySpaceManagerClient.createBucket(builder.build());
+ }
+
+ @Override
+ public void addBucketAcls(
+ String volumeName, String bucketName, List<OzoneAcl> addAcls)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(addAcls);
+ KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
+ builder.setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setAddAcls(addAcls);
+ keySpaceManagerClient.setBucketProperty(builder.build());
+ }
+
+ @Override
+ public void removeBucketAcls(
+ String volumeName, String bucketName, List<OzoneAcl> removeAcls)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(removeAcls);
+ KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
+ builder.setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setRemoveAcls(removeAcls);
+ keySpaceManagerClient.setBucketProperty(builder.build());
+ }
+
+ @Override
+ public void setBucketVersioning(
+ String volumeName, String bucketName, Boolean versioning)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(versioning);
+ KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
+ builder.setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setIsVersionEnabled(versioning);
+ keySpaceManagerClient.setBucketProperty(builder.build());
+ }
+
+ @Override
+ public void setBucketStorageType(
+ String volumeName, String bucketName, StorageType storageType)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(storageType);
+ KsmBucketArgs.Builder builder = KsmBucketArgs.newBuilder();
+ builder.setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setStorageType(storageType);
+ keySpaceManagerClient.setBucketProperty(builder.build());
+ }
+
+ @Override
+ public void deleteBucket(
+ String volumeName, String bucketName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ keySpaceManagerClient.deleteBucket(volumeName, bucketName);
+ }
+
+ @Override
+ public void checkBucketAccess(
+ String volumeName, String bucketName) throws IOException {
+
+ }
+
+ @Override
+ public OzoneBucket getBucketDetails(
+ String volumeName, String bucketName) throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ KsmBucketInfo bucketArgs =
+ keySpaceManagerClient.getBucketInfo(volumeName, bucketName);
+ return new OzoneBucket(bucketArgs.getVolumeName(),
+ bucketArgs.getBucketName(),
+ bucketArgs.getAcls(),
+ bucketArgs.getStorageType(),
+ bucketArgs.getIsVersionEnabled());
+ }
+
+ @Override
+ public Iterator<OzoneBucket> listBuckets(
+ String volumeName, String bucketPrefix) throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneOutputStream createKey(
+ String volumeName, String bucketName, String keyName, long size)
+ throws IOException {
+ String requestId = UUID.randomUUID().toString();
+ KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .setDataSize(size)
+ .build();
+
+ KsmKeyInfo keyInfo = keySpaceManagerClient.allocateKey(keyArgs);
+ ChunkGroupOutputStream groupOutputStream =
+ ChunkGroupOutputStream.getFromKsmKeyInfo(keyInfo, xceiverClientManager,
+ storageContainerLocationClient, chunkSize, requestId);
+ return new OzoneOutputStream(groupOutputStream);
+ }
+
+ @Override
+ public OzoneInputStream getKey(
+ String volumeName, String bucketName, String keyName)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(keyName);
+ String requestId = UUID.randomUUID().toString();
+ KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+ KsmKeyInfo keyInfo = keySpaceManagerClient.lookupKey(keyArgs);
+ LengthInputStream lengthInputStream =
+ ChunkGroupInputStream.getFromKsmKeyInfo(
+ keyInfo, xceiverClientManager, storageContainerLocationClient,
+ requestId);
+ return new OzoneInputStream(
+ (ChunkGroupInputStream)lengthInputStream.getWrappedStream());
+ }
+
+ @Override
+ public void deleteKey(
+ String volumeName, String bucketName, String keyName)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(keyName);
+ KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+ keySpaceManagerClient.deleteKey(keyArgs);
+ }
+
+ @Override
+ public Iterator<OzoneKey> listKeys(
+ String volumeName, String bucketName, String keyPrefix)
+ throws IOException {
+ throw new UnsupportedOperationException("Not yet implemented.");
+ }
+
+ @Override
+ public OzoneKey getKeyDetails(
+ String volumeName, String bucketName, String keyName)
+ throws IOException {
+ Preconditions.checkNotNull(volumeName);
+ Preconditions.checkNotNull(bucketName);
+ Preconditions.checkNotNull(keyName);
+ KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+ KsmKeyInfo keyInfo = keySpaceManagerClient.lookupKey(keyArgs);
+ return new OzoneKey(keyInfo.getVolumeName(),
+ keyInfo.getBucketName(),
+ keyInfo.getKeyName(),
+ keyInfo.getDataSize());
+ }
+
+ @Override
+ public void close() throws IOException {
+ IOUtils.cleanupWithLogger(LOG, storageContainerLocationClient);
+ IOUtils.cleanupWithLogger(LOG, keySpaceManagerClient);
+ IOUtils.cleanupWithLogger(LOG, xceiverClientManager);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/tools/Corona.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/tools/Corona.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/tools/Corona.java
index be8a191..18785a0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/tools/Corona.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/tools/Corona.java
@@ -28,9 +28,12 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.ozone.OzoneConfiguration;
+import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.ObjectStore;
+import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientFactory;
-import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.OzoneVolume;
import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
@@ -123,6 +126,7 @@ public final class Corona extends Configured implements Tool {
private boolean validateWrites;
private OzoneClient ozoneClient;
+ private ObjectStore objectStore;
private ExecutorService processor;
private long startTime;
@@ -157,6 +161,7 @@ public final class Corona extends Configured implements Tool {
numberOfKeysAdded = new AtomicLong();
OzoneClientFactory.setConfiguration(conf);
ozoneClient = OzoneClientFactory.getClient();
+ objectStore = ozoneClient.getObjectStore();
}
@Override
@@ -208,6 +213,7 @@ public final class Corona extends Configured implements Tool {
if(validateWrites) {
validator.join();
}
+ ozoneClient.close();
return 0;
}
@@ -334,30 +340,32 @@ public final class Corona extends Configured implements Tool {
private int totalBuckets;
private int totalKeys;
- private String volume;
+ private OzoneVolume volume;
- OfflineProcessor(String volume) throws Exception {
+ OfflineProcessor(String volumeName) throws Exception {
this.totalBuckets = Integer.parseInt(numOfBuckets);
this.totalKeys = Integer.parseInt(numOfKeys);
- this.volume = volume;
- LOG.trace("Creating volume: {}", volume);
+ LOG.trace("Creating volume: {}", volumeName);
long start = System.nanoTime();
- ozoneClient.createVolume(this.volume);
+ objectStore.createVolume(volumeName);
volumeCreationTime.getAndAdd(System.nanoTime() - start);
numberOfVolumesCreated.getAndIncrement();
+ volume = objectStore.getVolume(volumeName);
}
@Override
public void run() {
for (int j = 0; j < totalBuckets; j++) {
- String bucket = "bucket-" + j + "-" +
+ String bucketName = "bucket-" + j + "-" +
RandomStringUtils.randomNumeric(5);
try {
- LOG.trace("Creating bucket: {} in volume: {}", bucket, volume);
+ LOG.trace("Creating bucket: {} in volume: {}",
+ bucketName, volume.getName());
long start = System.nanoTime();
- ozoneClient.createBucket(volume, bucket);
+ volume.createBucket(bucketName);
bucketCreationTime.getAndAdd(System.nanoTime() - start);
numberOfBucketsCreated.getAndIncrement();
+ OzoneBucket bucket = volume.getBucket(bucketName);
for (int k = 0; k < totalKeys; k++) {
String key = "key-" + k + "-" +
RandomStringUtils.randomNumeric(5);
@@ -367,8 +375,7 @@ public final class Corona extends Configured implements Tool {
LOG.trace("Adding key: {} in bucket: {} of volume: {}",
key, bucket, volume);
long keyCreateStart = System.nanoTime();
- OzoneOutputStream os = ozoneClient.createKey(
- volume, bucket, key, value.length);
+ OzoneOutputStream os = bucket.createKey(key, value.length);
keyCreationTime.getAndAdd(System.nanoTime() - keyCreateStart);
long keyWriteStart = System.nanoTime();
os.write(value);
@@ -378,7 +385,7 @@ public final class Corona extends Configured implements Tool {
numberOfKeysAdded.getAndIncrement();
if(validateWrites) {
boolean validate = validationQueue.offer(
- new KeyValue(volume, bucket, key, value));
+ new KeyValue(bucket, key, value));
if(validate) {
LOG.trace("Key {}, is queued for validation.", key);
}
@@ -392,7 +399,7 @@ public final class Corona extends Configured implements Tool {
} catch (Exception e) {
exception = true;
LOG.error("Exception while creating bucket: {}" +
- " in volume: {}.", bucket, volume, e);
+ " in volume: {}.", bucketName, volume, e);
}
}
}
@@ -660,8 +667,8 @@ public final class Corona extends Configured implements Tool {
try {
KeyValue kv = validationQueue.poll(5, TimeUnit.SECONDS);
if(kv != null) {
- OzoneInputStream is = ozoneClient.
- getKey(kv.volume, kv.bucket, kv.key);
+
+ OzoneInputStream is = kv.bucket.readKey(kv.key);
byte[] value = new byte[kv.value.length];
int length = is.read(value);
totalWritesValidated++;
@@ -670,7 +677,7 @@ public final class Corona extends Configured implements Tool {
} else {
writeValidationFailureCount++;
LOG.warn("Data validation error for key {}/{}/{}",
- kv.volume, kv.bucket, kv.key);
+ kv.bucket.getVolumeName(), kv.bucket, kv.key);
LOG.warn("Expected: {}, Actual: {}",
DFSUtil.bytes2String(kv.value),
DFSUtil.bytes2String(value));
@@ -683,22 +690,15 @@ public final class Corona extends Configured implements Tool {
}
}
-
-
/**
* Wrapper to hold ozone key-value pair.
*/
private static class KeyValue {
/**
- * Volume name associated with the key-value.
- */
- private String volume;
-
- /**
* Bucket name associated with the key-value.
*/
- private String bucket;
+ private OzoneBucket bucket;
/**
* Key name associated with the key-value.
*/
@@ -714,9 +714,7 @@ public final class Corona extends Configured implements Tool {
* @param key key part
* @param value value part
*/
- KeyValue(
- String volume, String bucket, String key, byte[] value) {
- this.volume = volume;
+ KeyValue(OzoneBucket bucket, String key, byte[] value) {
this.bucket = bucket;
this.key = key;
this.value = value;
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e5e7c454/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/ozone-default.xml
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/ozone-default.xml b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/ozone-default.xml
index 7a504b3..492ab06 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/ozone-default.xml
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/ozone-default.xml
@@ -86,6 +86,17 @@
</property>
<property>
+ <name>ozone.client.protocol</name>
+ <value>org.apache.hadoop.ozone.client.rpc.RpcClient</value>
+ <description>
+ Protocol class to be used by client to connect to ozone cluster.
+ The build-in implementation includes:
+ org.apache.hadoop.ozone.client.rpc.RpcClient for RPC
+ org.apache.hadoop.ozone.client.rest.RestClient for REST
+ </description>
+ </property>
+
+ <property>
<name>ozone.client.socket.timeout.ms</name>
<value>5000</value>
<description>
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org