HDFS-12030. Ozone: CLI: support infoKey command. Contributed by Yiqun Lin.
This commit is contained in:
parent
4b63e3e504
commit
5379ffa8de
|
@ -508,4 +508,66 @@ public class OzoneBucket {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get info of the specified key.
|
||||||
|
*/
|
||||||
|
public OzoneKey getKeyInfo(String keyName) throws OzoneException {
|
||||||
|
if ((keyName == null) || keyName.isEmpty()) {
|
||||||
|
throw new OzoneRestClientException(
|
||||||
|
"Unable to get key info, key name is null or empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpGet getRequest = null;
|
||||||
|
try (CloseableHttpClient httpClient = OzoneClientUtils.newHttpClient()) {
|
||||||
|
OzoneRestClient client = getVolume().getClient();
|
||||||
|
URIBuilder builder = new URIBuilder(volume.getClient().getEndPointURI());
|
||||||
|
builder
|
||||||
|
.setPath("/" + getVolume().getVolumeName() + "/" + getBucketName()
|
||||||
|
+ "/" + keyName)
|
||||||
|
.setParameter(Header.OZONE_LIST_QUERY_TAG,
|
||||||
|
Header.OZONE_LIST_QUERY_KEY)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
getRequest = client.getHttpGet(builder.toString());
|
||||||
|
return executeGetKeyInfo(getRequest, httpClient);
|
||||||
|
} catch (IOException | URISyntaxException e) {
|
||||||
|
throw new OzoneRestClientException(e.getMessage());
|
||||||
|
} finally {
|
||||||
|
OzoneClientUtils.releaseConnection(getRequest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute get Key info.
|
||||||
|
*
|
||||||
|
* @param getRequest - HttpGet
|
||||||
|
* @param httpClient - HttpClient
|
||||||
|
* @return List<OzoneKey>
|
||||||
|
* @throws IOException
|
||||||
|
* @throws OzoneException
|
||||||
|
*/
|
||||||
|
private OzoneKey executeGetKeyInfo(HttpGet getRequest,
|
||||||
|
CloseableHttpClient httpClient) throws IOException, OzoneException {
|
||||||
|
HttpEntity entity = null;
|
||||||
|
try {
|
||||||
|
HttpResponse response = httpClient.execute(getRequest);
|
||||||
|
int errorCode = response.getStatusLine().getStatusCode();
|
||||||
|
entity = response.getEntity();
|
||||||
|
if (entity == null) {
|
||||||
|
throw new OzoneRestClientException("Unexpected null in http payload");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errorCode == HTTP_OK) {
|
||||||
|
OzoneKey key = new OzoneKey(
|
||||||
|
KeyInfo.parse(EntityUtils.toString(entity)));
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
throw OzoneException.parse(EntityUtils.toString(entity));
|
||||||
|
} finally {
|
||||||
|
if (entity != null) {
|
||||||
|
EntityUtils.consumeQuietly(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,12 @@ package org.apache.hadoop.ozone.web.handlers;
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Hex;
|
import org.apache.commons.codec.binary.Hex;
|
||||||
import org.apache.hadoop.hdfs.server.datanode.fsdataset.LengthInputStream;
|
import org.apache.hadoop.hdfs.server.datanode.fsdataset.LengthInputStream;
|
||||||
|
import org.apache.hadoop.ozone.web.exceptions.ErrorTable;
|
||||||
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
||||||
|
import org.apache.hadoop.ozone.web.headers.Header;
|
||||||
import org.apache.hadoop.ozone.web.interfaces.Keys;
|
import org.apache.hadoop.ozone.web.interfaces.Keys;
|
||||||
import org.apache.hadoop.ozone.web.interfaces.StorageHandler;
|
import org.apache.hadoop.ozone.web.interfaces.StorageHandler;
|
||||||
|
import org.apache.hadoop.ozone.web.response.KeyInfo;
|
||||||
import org.apache.hadoop.ozone.web.utils.OzoneUtils;
|
import org.apache.hadoop.ozone.web.utils.OzoneUtils;
|
||||||
|
|
||||||
import javax.ws.rs.core.HttpHeaders;
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
@ -44,19 +47,21 @@ import static java.net.HttpURLConnection.HTTP_OK;
|
||||||
public class KeyHandler implements Keys {
|
public class KeyHandler implements Keys {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Key if it exists.
|
* Gets the Key/key information if it exists.
|
||||||
*
|
*
|
||||||
* @param volume Storage Volume
|
* @param volume Storage Volume
|
||||||
* @param bucket Name of the bucket
|
* @param bucket Name of the bucket
|
||||||
* @param req Request
|
* @param key Name of the key
|
||||||
* @param info - UriInfo
|
* @param info Tag info
|
||||||
|
* @param req Request
|
||||||
|
* @param uriInfo Uri Info
|
||||||
* @param headers Http Header
|
* @param headers Http Header
|
||||||
* @return Response
|
* @return Response
|
||||||
* @throws OzoneException
|
* @throws OzoneException
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Response getKey(String volume, String bucket, String key,
|
public Response getKey(String volume, String bucket, String key, String info,
|
||||||
Request req, UriInfo info, HttpHeaders headers)
|
Request req, UriInfo uriInfo, HttpHeaders headers)
|
||||||
throws OzoneException {
|
throws OzoneException {
|
||||||
return new KeyProcessTemplate() {
|
return new KeyProcessTemplate() {
|
||||||
/**
|
/**
|
||||||
|
@ -77,13 +82,40 @@ public class KeyHandler implements Keys {
|
||||||
@Override
|
@Override
|
||||||
public Response doProcess(KeyArgs args, InputStream input,
|
public Response doProcess(KeyArgs args, InputStream input,
|
||||||
Request request, HttpHeaders headers,
|
Request request, HttpHeaders headers,
|
||||||
UriInfo info)
|
UriInfo uriInfo)
|
||||||
throws IOException, OzoneException, NoSuchAlgorithmException {
|
throws IOException, OzoneException, NoSuchAlgorithmException {
|
||||||
StorageHandler fs = StorageHandlerBuilder.getStorageHandler();
|
if (info == null) {
|
||||||
LengthInputStream stream = fs.newKeyReader(args);
|
return getKey(args);
|
||||||
return OzoneUtils.getResponse(args, HTTP_OK, stream);
|
} else if (info.equals(Header.OZONE_LIST_QUERY_KEY)) {
|
||||||
|
return getKeyInfo(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
OzoneException ozException = ErrorTable
|
||||||
|
.newError(ErrorTable.INVALID_QUERY_PARAM, args);
|
||||||
|
ozException.setMessage("Unrecognized query param : " + info);
|
||||||
|
throw ozException;
|
||||||
}
|
}
|
||||||
}.handleCall(volume, bucket, key, req, headers, info, null);
|
}.handleCall(volume, bucket, key, req, headers, uriInfo, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the Key if it exists.
|
||||||
|
*/
|
||||||
|
private Response getKey(KeyArgs args)
|
||||||
|
throws IOException, OzoneException {
|
||||||
|
StorageHandler fs = StorageHandlerBuilder.getStorageHandler();
|
||||||
|
LengthInputStream stream = fs.newKeyReader(args);
|
||||||
|
return OzoneUtils.getResponse(args, HTTP_OK, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the Key information if it exists.
|
||||||
|
*/
|
||||||
|
private Response getKeyInfo(KeyArgs args)
|
||||||
|
throws IOException, OzoneException {
|
||||||
|
StorageHandler fs = StorageHandlerBuilder.getStorageHandler();
|
||||||
|
KeyInfo keyInfo = fs.getKeyInfo(args);
|
||||||
|
return OzoneUtils.getResponse(args, HTTP_OK, keyInfo.toJsonString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
package org.apache.hadoop.ozone.web.interfaces;
|
package org.apache.hadoop.ozone.web.interfaces;
|
||||||
|
|
||||||
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
||||||
|
import org.apache.hadoop.ozone.web.headers.Header;
|
||||||
|
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.DELETE;
|
import javax.ws.rs.DELETE;
|
||||||
|
@ -26,7 +27,7 @@ import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.PUT;
|
import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.HttpHeaders;
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
@ -76,7 +77,9 @@ public interface Keys {
|
||||||
* @param volume Storage Volume
|
* @param volume Storage Volume
|
||||||
* @param bucket Name of the bucket
|
* @param bucket Name of the bucket
|
||||||
* @param keys Object Name
|
* @param keys Object Name
|
||||||
|
* @param info Tag info
|
||||||
* @param req Request
|
* @param req Request
|
||||||
|
* @param uriInfo Uri info
|
||||||
* @param headers Http Header
|
* @param headers Http Header
|
||||||
*
|
*
|
||||||
* @return Response
|
* @return Response
|
||||||
|
@ -84,12 +87,13 @@ public interface Keys {
|
||||||
* @throws OzoneException
|
* @throws OzoneException
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
|
||||||
Response getKey(@PathParam("volume") String volume,
|
Response getKey(@PathParam("volume") String volume,
|
||||||
@PathParam("bucket") String bucket,
|
@PathParam("bucket") String bucket,
|
||||||
@PathParam("keys") String keys,
|
@PathParam("keys") String keys,
|
||||||
|
@QueryParam(Header.OZONE_LIST_QUERY_TAG)
|
||||||
|
String info,
|
||||||
@Context Request req,
|
@Context Request req,
|
||||||
@Context UriInfo info,
|
@Context UriInfo uriInfo,
|
||||||
@Context HttpHeaders headers)
|
@Context HttpHeaders headers)
|
||||||
throws OzoneException;
|
throws OzoneException;
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.apache.hadoop.ozone.web.handlers.ListArgs;
|
||||||
import org.apache.hadoop.ozone.web.handlers.VolumeArgs;
|
import org.apache.hadoop.ozone.web.handlers.VolumeArgs;
|
||||||
import org.apache.hadoop.ozone.OzoneAcl;
|
import org.apache.hadoop.ozone.OzoneAcl;
|
||||||
import org.apache.hadoop.ozone.web.response.BucketInfo;
|
import org.apache.hadoop.ozone.web.response.BucketInfo;
|
||||||
|
import org.apache.hadoop.ozone.web.response.KeyInfo;
|
||||||
import org.apache.hadoop.ozone.web.response.ListBuckets;
|
import org.apache.hadoop.ozone.web.response.ListBuckets;
|
||||||
import org.apache.hadoop.ozone.web.response.ListKeys;
|
import org.apache.hadoop.ozone.web.response.ListKeys;
|
||||||
import org.apache.hadoop.ozone.web.response.ListVolumes;
|
import org.apache.hadoop.ozone.web.response.ListVolumes;
|
||||||
|
@ -274,6 +275,18 @@ public interface StorageHandler {
|
||||||
*/
|
*/
|
||||||
ListKeys listKeys(ListArgs args) throws IOException, OzoneException;
|
ListKeys listKeys(ListArgs args) throws IOException, OzoneException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get information of the specified Key.
|
||||||
|
*
|
||||||
|
* @param args Key Args
|
||||||
|
*
|
||||||
|
* @return KeyInfo
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* @throws OzoneException
|
||||||
|
*/
|
||||||
|
KeyInfo getKeyInfo(KeyArgs args) throws IOException, OzoneException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes all the opened resources.
|
* Closes all the opened resources.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.apache.hadoop.ozone.web.interfaces.StorageHandler;
|
||||||
import org.apache.hadoop.ozone.OzoneAcl;
|
import org.apache.hadoop.ozone.OzoneAcl;
|
||||||
import org.apache.hadoop.ozone.web.request.OzoneQuota;
|
import org.apache.hadoop.ozone.web.request.OzoneQuota;
|
||||||
import org.apache.hadoop.ozone.web.response.BucketInfo;
|
import org.apache.hadoop.ozone.web.response.BucketInfo;
|
||||||
|
import org.apache.hadoop.ozone.web.response.KeyInfo;
|
||||||
import org.apache.hadoop.ozone.web.response.ListBuckets;
|
import org.apache.hadoop.ozone.web.response.ListBuckets;
|
||||||
import org.apache.hadoop.ozone.web.response.ListKeys;
|
import org.apache.hadoop.ozone.web.response.ListKeys;
|
||||||
import org.apache.hadoop.ozone.web.response.ListVolumes;
|
import org.apache.hadoop.ozone.web.response.ListVolumes;
|
||||||
|
@ -353,6 +354,23 @@ public class LocalStorageHandler implements StorageHandler {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get information of the specified Key.
|
||||||
|
*
|
||||||
|
* @param args Key Args
|
||||||
|
*
|
||||||
|
* @return KeyInfo
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* @throws OzoneException
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public KeyInfo getKeyInfo(KeyArgs args) throws IOException, OzoneException {
|
||||||
|
OzoneMetadataManager oz = OzoneMetadataManager
|
||||||
|
.getOzoneMetadataManager(conf);
|
||||||
|
return oz.getKeyInfo(args);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
//No resource to close, do nothing.
|
//No resource to close, do nothing.
|
||||||
|
|
|
@ -1108,6 +1108,42 @@ public final class OzoneMetadataManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Key information for a given key.
|
||||||
|
*
|
||||||
|
* @param args - Key Args
|
||||||
|
* @return KeyInfo - Key Information
|
||||||
|
* @throws OzoneException
|
||||||
|
*/
|
||||||
|
public KeyInfo getKeyInfo(KeyArgs args) throws IOException, OzoneException {
|
||||||
|
lock.readLock().lock();
|
||||||
|
try {
|
||||||
|
byte[] bucketInfo = metadataDB
|
||||||
|
.get(args.getParentName().getBytes(encoding));
|
||||||
|
if (bucketInfo == null) {
|
||||||
|
throw ErrorTable.newError(ErrorTable.INVALID_BUCKET_NAME, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] bucketListBytes = userDB
|
||||||
|
.get(args.getParentName().getBytes(encoding));
|
||||||
|
if (bucketListBytes == null) {
|
||||||
|
throw ErrorTable.newError(ErrorTable.INVALID_BUCKET_NAME, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] objectBytes = metadataDB
|
||||||
|
.get(args.getResourceName().getBytes(encoding));
|
||||||
|
if (objectBytes == null) {
|
||||||
|
throw ErrorTable.newError(ErrorTable.INVALID_KEY, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
return KeyInfo.parse(new String(objectBytes, encoding));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw ErrorTable.newError(ErrorTable.SERVER_ERROR, args, e);
|
||||||
|
} finally {
|
||||||
|
lock.readLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used in updates to volume metadata.
|
* This is used in updates to volume metadata.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,18 +18,22 @@
|
||||||
|
|
||||||
package org.apache.hadoop.ozone.web.ozShell.keys;
|
package org.apache.hadoop.ozone.web.ozShell.keys;
|
||||||
|
|
||||||
import org.apache.commons.cli.CommandLine;
|
|
||||||
import org.apache.hadoop.ozone.web.client.OzoneRestClientException;
|
|
||||||
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
|
||||||
import org.apache.hadoop.ozone.web.ozShell.Handler;
|
|
||||||
import org.apache.hadoop.ozone.web.ozShell.Shell;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.apache.commons.cli.CommandLine;
|
||||||
|
import org.apache.hadoop.ozone.web.client.OzoneBucket;
|
||||||
|
import org.apache.hadoop.ozone.web.client.OzoneKey;
|
||||||
|
import org.apache.hadoop.ozone.web.client.OzoneRestClientException;
|
||||||
|
import org.apache.hadoop.ozone.web.client.OzoneVolume;
|
||||||
|
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
||||||
|
import org.apache.hadoop.ozone.web.ozShell.Handler;
|
||||||
|
import org.apache.hadoop.ozone.web.ozShell.Shell;
|
||||||
|
import org.apache.hadoop.ozone.web.utils.JsonUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes Info Object.
|
* Executes Info Object.
|
||||||
*/
|
*/
|
||||||
|
@ -84,10 +88,11 @@ public class InfoKeyHandler extends Handler {
|
||||||
client.setEndPointURI(ozoneURI);
|
client.setEndPointURI(ozoneURI);
|
||||||
client.setUserAuth(userName);
|
client.setUserAuth(userName);
|
||||||
|
|
||||||
|
OzoneVolume vol = client.getVolume(volumeName);
|
||||||
|
OzoneBucket bucket = vol.getBucket(bucketName);
|
||||||
|
OzoneKey key = bucket.getKeyInfo(keyName);
|
||||||
|
|
||||||
// OzoneVolume vol = client.getVolume(volumeName);
|
System.out.printf("%s%n", JsonUtils.toJsonStringWithDefaultPrettyPrinter(
|
||||||
// OzoneBucket bucket = vol.createBucket(bucketName);
|
key.getObjectInfo().toJsonString()));
|
||||||
|
|
||||||
throw new OzoneRestClientException("Not supported yet");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -469,6 +469,23 @@ public final class DistributedStorageHandler implements StorageHandler {
|
||||||
keySpaceManagerClient.deleteKey(keyArgs);
|
keySpaceManagerClient.deleteKey(keyArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public KeyInfo getKeyInfo(KeyArgs args) throws IOException, OzoneException {
|
||||||
|
KsmKeyArgs keyArgs = new KsmKeyArgs.Builder()
|
||||||
|
.setVolumeName(args.getVolumeName())
|
||||||
|
.setBucketName(args.getBucketName())
|
||||||
|
.setKeyName(args.getKeyName())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
KsmKeyInfo ksmKeyInfo = keySpaceManagerClient.lookupKey(keyArgs);
|
||||||
|
KeyInfo keyInfo = new KeyInfo();
|
||||||
|
keyInfo.setVersion(0);
|
||||||
|
keyInfo.setKeyName(ksmKeyInfo.getKeyName());
|
||||||
|
keyInfo.setSize(ksmKeyInfo.getDataSize());
|
||||||
|
|
||||||
|
return keyInfo;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListKeys listKeys(ListArgs args) throws IOException, OzoneException {
|
public ListKeys listKeys(ListArgs args) throws IOException, OzoneException {
|
||||||
ListKeys result = new ListKeys();
|
ListKeys result = new ListKeys();
|
||||||
|
|
|
@ -930,4 +930,40 @@ public class TestKeySpaceManager {
|
||||||
volumes = storageHandler.listVolumes(listVolumeArgs);
|
volumes = storageHandler.listVolumes(listVolumeArgs);
|
||||||
Assert.assertEquals(0, volumes.getVolumes().size());
|
Assert.assertEquals(0, volumes.getVolumes().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get key information.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* @throws OzoneException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetKeyInfo() throws IOException, OzoneException {
|
||||||
|
String userName = "user" + RandomStringUtils.randomNumeric(5);
|
||||||
|
String adminName = "admin" + RandomStringUtils.randomNumeric(5);
|
||||||
|
String volumeName = "volume" + RandomStringUtils.randomNumeric(5);
|
||||||
|
String bucketName = "bucket" + RandomStringUtils.randomNumeric(5);
|
||||||
|
|
||||||
|
VolumeArgs createVolumeArgs = new VolumeArgs(volumeName, userArgs);
|
||||||
|
createVolumeArgs.setUserName(userName);
|
||||||
|
createVolumeArgs.setAdminName(adminName);
|
||||||
|
storageHandler.createVolume(createVolumeArgs);
|
||||||
|
|
||||||
|
BucketArgs bucketArgs = new BucketArgs(bucketName, createVolumeArgs);
|
||||||
|
bucketArgs.setAddAcls(new LinkedList<>());
|
||||||
|
bucketArgs.setRemoveAcls(new LinkedList<>());
|
||||||
|
bucketArgs.setStorageType(StorageType.DISK);
|
||||||
|
storageHandler.createBucket(bucketArgs);
|
||||||
|
|
||||||
|
String keyName = "testKey";
|
||||||
|
KeyArgs keyArgs = new KeyArgs(keyName, bucketArgs);
|
||||||
|
keyArgs.setSize(4096);
|
||||||
|
|
||||||
|
OutputStream stream = storageHandler.newKeyWriter(keyArgs);
|
||||||
|
stream.close();
|
||||||
|
|
||||||
|
KeyInfo keyInfo = storageHandler.getKeyInfo(keyArgs);
|
||||||
|
Assert.assertEquals(keyName, keyInfo.getKeyName());
|
||||||
|
Assert.assertEquals(4096, keyInfo.getSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
/**
|
||||||
|
* 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.ozShell;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.RandomStringUtils;
|
||||||
|
import org.apache.hadoop.fs.FileUtil;
|
||||||
|
import org.apache.hadoop.hdfs.server.datanode.DataNode;
|
||||||
|
import org.apache.hadoop.ozone.MiniOzoneCluster;
|
||||||
|
import org.apache.hadoop.ozone.OzoneConfigKeys;
|
||||||
|
import org.apache.hadoop.ozone.OzoneConfiguration;
|
||||||
|
import org.apache.hadoop.ozone.OzoneConsts;
|
||||||
|
import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos.Status;
|
||||||
|
import org.apache.hadoop.ozone.web.exceptions.OzoneException;
|
||||||
|
import org.apache.hadoop.ozone.web.ozShell.Shell;
|
||||||
|
import org.apache.hadoop.test.GenericTestUtils;
|
||||||
|
import org.apache.hadoop.util.ToolRunner;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.Timeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test class specified for testing Ozone shell command.
|
||||||
|
*/
|
||||||
|
public class TestOzoneShell {
|
||||||
|
/**
|
||||||
|
* Set the timeout for every test.
|
||||||
|
*/
|
||||||
|
@Rule
|
||||||
|
public Timeout testTimeout = new Timeout(300000);
|
||||||
|
|
||||||
|
private static String url;
|
||||||
|
private static File baseDir;
|
||||||
|
private static OzoneConfiguration conf = null;
|
||||||
|
private static MiniOzoneCluster cluster = null;
|
||||||
|
private static Shell shell = null;
|
||||||
|
|
||||||
|
private final ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
private final ByteArrayOutputStream err = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MiniDFSCluster for testing with using distributed Ozone
|
||||||
|
* handler type.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@BeforeClass
|
||||||
|
public static void init()
|
||||||
|
throws IOException, URISyntaxException, OzoneException {
|
||||||
|
conf = new OzoneConfiguration();
|
||||||
|
|
||||||
|
String path = GenericTestUtils.getTempPath(
|
||||||
|
TestOzoneShell.class.getSimpleName());
|
||||||
|
baseDir = new File(path);
|
||||||
|
baseDir.mkdirs();
|
||||||
|
|
||||||
|
path += conf.getTrimmed(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT,
|
||||||
|
OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT_DEFAULT);
|
||||||
|
|
||||||
|
conf.set(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT, path);
|
||||||
|
conf.setQuietMode(false);
|
||||||
|
shell = new Shell();
|
||||||
|
shell.setConf(conf);
|
||||||
|
|
||||||
|
cluster = new MiniOzoneCluster.Builder(conf)
|
||||||
|
.setHandlerType(OzoneConsts.OZONE_HANDLER_DISTRIBUTED).build();
|
||||||
|
DataNode dataNode = cluster.getDataNodes().get(0);
|
||||||
|
final int port = dataNode.getInfoPort();
|
||||||
|
url = String.format("http://localhost:%d", port);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shutdown MiniDFSCluster.
|
||||||
|
*/
|
||||||
|
@AfterClass
|
||||||
|
public static void shutdown() {
|
||||||
|
if (cluster != null) {
|
||||||
|
cluster.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseDir != null) {
|
||||||
|
FileUtil.fullyDelete(baseDir, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetKeyInfo() throws Exception {
|
||||||
|
// create a volume
|
||||||
|
String volume = "volume" + RandomStringUtils.randomNumeric(5);
|
||||||
|
String[] args = new String[] {"-createVolume", url + "/" + volume, "-user",
|
||||||
|
"bilbo", "-root"};
|
||||||
|
assertEquals(0, ToolRunner.run(shell, args));
|
||||||
|
|
||||||
|
// create a bucket
|
||||||
|
String bucket = "bucket" + RandomStringUtils.randomNumeric(5);
|
||||||
|
args = new String[] {"-createBucket", url + "/" + volume + "/" + bucket};
|
||||||
|
assertEquals(0, ToolRunner.run(shell, args));
|
||||||
|
|
||||||
|
// write a new file that used for putting key
|
||||||
|
String key = "key" + RandomStringUtils.randomNumeric(5);
|
||||||
|
File tmpFile = new File(baseDir, "/testfile");
|
||||||
|
FileOutputStream randFile = new FileOutputStream(tmpFile);
|
||||||
|
Random r = new Random();
|
||||||
|
for (int x = 0; x < 10; x++) {
|
||||||
|
char c = (char) (r.nextInt(26) + 'a');
|
||||||
|
randFile.write(c);
|
||||||
|
}
|
||||||
|
randFile.close();
|
||||||
|
|
||||||
|
// create the key in above bucket
|
||||||
|
args = new String[] {"-putKey",
|
||||||
|
url + "/" + volume + "/" + bucket + "/" + key, "-file",
|
||||||
|
tmpFile.getAbsolutePath()};
|
||||||
|
assertEquals(0, ToolRunner.run(shell, args));
|
||||||
|
|
||||||
|
System.setOut(new PrintStream(out));
|
||||||
|
System.setErr(new PrintStream(err));
|
||||||
|
args = new String[] {"-infoKey",
|
||||||
|
url + "/" + volume + "/" + bucket + "/" + key};
|
||||||
|
|
||||||
|
// verify the response output
|
||||||
|
assertEquals(0, ToolRunner.run(shell, args));
|
||||||
|
assertTrue(out.toString().contains(key));
|
||||||
|
|
||||||
|
// reset stream
|
||||||
|
out.reset();
|
||||||
|
err.reset();
|
||||||
|
|
||||||
|
// get the info of a non-exist key
|
||||||
|
args = new String[] {"-infoKey",
|
||||||
|
url + "/" + volume + "/" + bucket + "/invalid-key"};
|
||||||
|
|
||||||
|
// verify the response output
|
||||||
|
// get the non-exist key info should be failed
|
||||||
|
assertEquals(1, ToolRunner.run(shell, args));
|
||||||
|
assertTrue(err.toString().contains(Status.KEY_NOT_FOUND.toString()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -315,7 +315,6 @@ public class TestKeys {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPutAndListKey() throws OzoneException, IOException {
|
public void testPutAndListKey() throws OzoneException, IOException {
|
||||||
PutHelper helper = new PutHelper();
|
PutHelper helper = new PutHelper();
|
||||||
|
@ -353,4 +352,16 @@ public class TestKeys {
|
||||||
ErrorTable.INVALID_RESOURCE_NAME.getMessage(), e);
|
ErrorTable.INVALID_RESOURCE_NAME.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetKeyInfo() throws OzoneException, IOException {
|
||||||
|
PutHelper helper = new PutHelper();
|
||||||
|
String keyName = helper.putKey();
|
||||||
|
assertNotNull(helper.getBucket());
|
||||||
|
assertNotNull(helper.getFile());
|
||||||
|
|
||||||
|
OzoneKey keyInfo = helper.getBucket().getKeyInfo(keyName);
|
||||||
|
assertNotNull(keyInfo.getObjectInfo());
|
||||||
|
assertEquals(keyName, keyInfo.getObjectInfo().getKeyName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue