This is an automated email from the ASF dual-hosted git repository.
ivandika pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new b45525726ed HDDS-14221. Support primitive query params (#9537)
b45525726ed is described below
commit b45525726edd5c8590f05b8d886d580feab67898
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Sun Dec 21 15:48:55 2025 +0100
HDDS-14221. Support primitive query params (#9537)
---
.../ozone/s3/commontypes/RequestParameters.java | 90 +++++++++++
.../hadoop/ozone/s3/endpoint/BucketEndpoint.java | 29 ++--
.../hadoop/ozone/s3/endpoint/EndpointBase.java | 15 +-
.../hadoop/ozone/s3/endpoint/TestBucketAcl.java | 5 +-
.../hadoop/ozone/s3/endpoint/TestBucketList.java | 172 ++++++++++-----------
.../ozone/s3/endpoint/TestPermissionCheck.java | 10 +-
.../ozone/s3/metrics/TestS3GatewayMetrics.java | 18 +--
7 files changed, 209 insertions(+), 130 deletions(-)
diff --git
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/commontypes/RequestParameters.java
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/commontypes/RequestParameters.java
new file mode 100644
index 00000000000..7b5e2d0d6e8
--- /dev/null
+++
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/commontypes/RequestParameters.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.s3.commontypes;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MultivaluedMap;
+import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
+
+/** Allow looking up query parameters as primitive types. */
+public interface RequestParameters {
+
+ String get(String key);
+
+ static MultivaluedMapImpl of(MultivaluedMap<String, String> params) {
+ return new MultivaluedMapImpl(params);
+ }
+
+ default String get(String key, String defaultValue) {
+ final String value = get(key);
+ return value != null ? value : defaultValue;
+ }
+
+ default int getInt(String key, int defaultValue) {
+ final String value = get(key);
+ if (value == null) {
+ return defaultValue;
+ }
+
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ throw translateException(e);
+ }
+ }
+
+ default WebApplicationException translateException(RuntimeException e) {
+ return new WebApplicationException(e.getMessage(),
S3ErrorTable.INVALID_ARGUMENT.getHttpCode());
+ }
+
+ /** Additional methods for tests. */
+ interface Mutable extends RequestParameters {
+
+ void set(String key, String value);
+
+ void unset(String key);
+
+ default void setInt(String key, int value) {
+ set(key, String.valueOf(value));
+ }
+ }
+
+ /** Mutable implementation based on {@link MultivaluedMap}. */
+ final class MultivaluedMapImpl implements Mutable {
+ private final MultivaluedMap<String, String> params;
+
+ private MultivaluedMapImpl(MultivaluedMap<String, String> params) {
+ this.params = params;
+ }
+
+ @Override
+ public String get(String key) {
+ return params.getFirst(key);
+ }
+
+ @Override
+ public void set(String key, String value) {
+ params.putSingle(key, value);
+ }
+
+ @Override
+ public void unset(String key) {
+ params.remove(key);
+ }
+ }
+}
diff --git
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
index 1177c01e5de..6b888ce12fc 100644
---
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
+++
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
@@ -42,7 +42,6 @@
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
@@ -106,20 +105,20 @@ public class BucketEndpoint extends EndpointBase {
@GET
@SuppressWarnings("methodlength")
public Response get(
- @PathParam(BUCKET) String bucketName,
- @DefaultValue("1000") @QueryParam(QueryParams.MAX_KEYS) int maxKeys,
- @DefaultValue("1000") @QueryParam(QueryParams.MAX_UPLOADS) int maxUploads
+ @PathParam(BUCKET) String bucketName
) throws OS3Exception, IOException {
long startNanos = Time.monotonicNowNanos();
S3GAction s3GAction = S3GAction.GET_BUCKET;
PerformanceStringBuilder perf = new PerformanceStringBuilder();
- final String continueToken = getQueryParam(QueryParams.CONTINUATION_TOKEN);
- final String delimiter = getQueryParam(QueryParams.DELIMITER);
- final String encodingType = getQueryParam(QueryParams.ENCODING_TYPE);
- final String marker = getQueryParam(QueryParams.MARKER);
- String prefix = getQueryParam(QueryParams.PREFIX);
- String startAfter = getQueryParam(QueryParams.START_AFTER);
+ final String continueToken =
queryParams().get(QueryParams.CONTINUATION_TOKEN);
+ final String delimiter = queryParams().get(QueryParams.DELIMITER);
+ final String encodingType = queryParams().get(QueryParams.ENCODING_TYPE);
+ final String marker = queryParams().get(QueryParams.MARKER);
+ int maxKeys = queryParams().getInt(QueryParams.MAX_KEYS, 1000);
+ final int maxUploads = queryParams().getInt(QueryParams.MAX_UPLOADS, 1000);
+ String prefix = queryParams().get(QueryParams.PREFIX);
+ String startAfter = queryParams().get(QueryParams.START_AFTER);
Iterator<? extends OzoneKey> ozoneKeyIterator = null;
ContinueToken decodedToken =
@@ -127,7 +126,7 @@ public Response get(
OzoneBucket bucket = null;
try {
- final String aclMarker = getQueryParam(QueryParams.ACL);
+ final String aclMarker = queryParams().get(QueryParams.ACL);
if (aclMarker != null) {
s3GAction = S3GAction.GET_ACL;
S3BucketAcl result = getAcl(bucketName);
@@ -136,11 +135,11 @@ public Response get(
return Response.ok(result, MediaType.APPLICATION_XML_TYPE).build();
}
- final String uploads = getQueryParam(QueryParams.UPLOADS);
+ final String uploads = queryParams().get(QueryParams.UPLOADS);
if (uploads != null) {
s3GAction = S3GAction.LIST_MULTIPART_UPLOAD;
- final String uploadIdMarker =
getQueryParam(QueryParams.UPLOAD_ID_MARKER);
- final String keyMarker = getQueryParam(QueryParams.KEY_MARKER);
+ final String uploadIdMarker =
queryParams().get(QueryParams.UPLOAD_ID_MARKER);
+ final String keyMarker = queryParams().get(QueryParams.KEY_MARKER);
return listMultipartUploads(bucketName, prefix, keyMarker,
uploadIdMarker, maxUploads);
}
@@ -314,7 +313,7 @@ public Response put(
S3GAction s3GAction = S3GAction.CREATE_BUCKET;
try {
- final String aclMarker = getQueryParam(QueryParams.ACL);
+ final String aclMarker = queryParams().get(QueryParams.ACL);
if (aclMarker != null) {
s3GAction = S3GAction.PUT_ACL;
Response response = putAcl(bucketName, body);
diff --git
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
index 99d7adc3042..dbc91c1e55e 100644
---
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
+++
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
@@ -69,6 +69,7 @@
import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
import org.apache.hadoop.ozone.om.protocol.S3Auth;
import org.apache.hadoop.ozone.s3.RequestIdentifier;
+import org.apache.hadoop.ozone.s3.commontypes.RequestParameters;
import org.apache.hadoop.ozone.s3.exception.OS3Exception;
import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
import org.apache.hadoop.ozone.s3.metrics.S3GatewayMetrics;
@@ -106,6 +107,9 @@ public abstract class EndpointBase {
@Context
private HttpHeaders headers;
+ // initialized in @PostConstruct
+ private RequestParameters.MultivaluedMapImpl queryParams;
+
private final Set<String> excludeMetadataFields =
new HashSet<>(Arrays.asList(OzoneConsts.GDPR_FLAG,
STORAGE_CONFIG_HEADER));
private static final Logger LOG =
@@ -114,12 +118,14 @@ public abstract class EndpointBase {
protected static final AuditLogger AUDIT =
new AuditLogger(AuditLoggerType.S3GLOGGER);
- protected String getQueryParam(String key) {
- return getQueryParameters().getFirst(key);
+ /** Read-only access to query parameters. */
+ protected RequestParameters queryParams() {
+ return queryParams;
}
- public MultivaluedMap<String, String> getQueryParameters() {
- return context.getUriInfo().getQueryParameters();
+ /** For setting multiple values use {@link #getContext()}. */
+ public RequestParameters.Mutable queryParamsForTest() {
+ return queryParams;
}
protected OzoneBucket getBucket(OzoneVolume volume, String bucketName)
@@ -149,6 +155,7 @@ protected OzoneBucket getBucket(OzoneVolume volume, String
bucketName)
*/
@PostConstruct
public void initialization() {
+ queryParams =
RequestParameters.of(context.getUriInfo().getQueryParameters());
// Note: userPrincipal is initialized to be the same value as accessId,
// could be updated later in RpcClient#getS3Volume
s3Auth = new S3Auth(signatureInfo.getStringToSign(),
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketAcl.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketAcl.java
index 62af30219d3..1598a48a989 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketAcl.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketAcl.java
@@ -69,7 +69,7 @@ public void setup() throws IOException {
.setClient(client)
.setHeaders(headers)
.build();
- bucketEndpoint.getQueryParameters().add(QueryParams.ACL, ACL_MARKER);
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, ACL_MARKER);
}
@AfterEach
@@ -82,8 +82,7 @@ public void clean() throws IOException {
@Test
public void testGetAcl() throws Exception {
when(parameterMap.containsKey(ACL_MARKER)).thenReturn(true);
- Response response =
- bucketEndpoint.get(BUCKET_NAME, 0, 0);
+ Response response = bucketEndpoint.get(BUCKET_NAME);
assertEquals(HTTP_OK, response.getStatus());
System.out.println(response.getEntity());
}
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketList.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketList.java
index 332b6eb36eb..c62a7e8da1c 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketList.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestBucketList.java
@@ -54,11 +54,9 @@ public void listRoot() throws OS3Exception, IOException {
.setClient(client)
.build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0)
- .getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(1, getBucketResponse.getCommonPrefixes().size());
assertEquals("dir1/",
@@ -74,10 +72,9 @@ public void listDir() throws OS3Exception, IOException {
OzoneClient client = createClientWithKeys("dir1/file2", "dir1/dir2/file2");
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(client).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir1");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir1");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(1, getBucketResponse.getCommonPrefixes().size());
assertEquals("dir1/",
@@ -94,11 +91,9 @@ public void listSubDir() throws OS3Exception, IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir1/");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0)
- .getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir1/");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(1, getBucketResponse.getCommonPrefixes().size());
assertEquals("dir1/dir2/",
@@ -127,10 +122,9 @@ public void listObjectOwner() throws OS3Exception,
IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(client).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "key");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "key");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(2, getBucketResponse.getContents().size());
assertEquals(user1.getShortUserName(),
@@ -147,10 +141,9 @@ public void listWithPrefixAndDelimiter() throws
OS3Exception, IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir1");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir1");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(3, getBucketResponse.getCommonPrefixes().size());
}
@@ -163,10 +156,9 @@ public void listWithPrefixAndDelimiter1() throws
OS3Exception, IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(3, getBucketResponse.getCommonPrefixes().size());
assertEquals("file2", getBucketResponse.getContents().get(0)
@@ -181,11 +173,10 @@ public void listWithPrefixAndDelimiter2() throws
OS3Exception, IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir1bh");
- endpoint.getQueryParameters().putSingle(QueryParams.START_AFTER,
"dir1/dir2/file2");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir1bh");
+ endpoint.queryParamsForTest().set(QueryParams.START_AFTER,
"dir1/dir2/file2");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(2, getBucketResponse.getCommonPrefixes().size());
}
@@ -200,10 +191,9 @@ public void listWithPrefixAndEmptyStrDelimiter()
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
// Should behave the same if delimiter is null
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir1/");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 100, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir1/");
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertEquals(0, getBucketResponse.getCommonPrefixes().size());
assertEquals(4, getBucketResponse.getContents().size());
@@ -229,24 +219,24 @@ public void listWithContinuationToken() throws
OS3Exception, IOException {
// As we have 5 keys, with max keys 2 we should call list 3 times.
// First time
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "");
+ endpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, maxKeys);
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertTrue(getBucketResponse.isTruncated());
assertEquals(2, getBucketResponse.getContents().size());
// 2nd time
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
getBucketResponse.getNextToken());
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ String value1 = getBucketResponse.getNextToken();
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN, value1);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertTrue(getBucketResponse.isTruncated());
assertEquals(2, getBucketResponse.getContents().size());
//3rd time
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
getBucketResponse.getNextToken());
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ String value = getBucketResponse.getNextToken();
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN, value);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertFalse(getBucketResponse.isTruncated());
assertEquals(1, getBucketResponse.getContents().size());
@@ -272,10 +262,10 @@ public void listWithContinuationTokenDirBreak()
ListObjectResponse getBucketResponse;
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "test/");
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "test/");
+ endpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, maxKeys);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertEquals(0, getBucketResponse.getContents().size());
assertEquals(2, getBucketResponse.getCommonPrefixes().size());
@@ -284,9 +274,9 @@ public void listWithContinuationTokenDirBreak()
assertEquals("test/dir2/",
getBucketResponse.getCommonPrefixes().get(1).getPrefix().getName());
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
getBucketResponse.getNextToken());
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ String value = getBucketResponse.getNextToken();
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN, value);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertEquals(1, getBucketResponse.getContents().size());
assertEquals(1, getBucketResponse.getCommonPrefixes().size());
assertEquals("test/dir3/",
@@ -311,25 +301,25 @@ public void listWithContinuationToken1() throws
OS3Exception, IOException {
// As we have 5 keys, with max keys 2 we should call list 3 times.
// First time
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir");
- ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir");
+ endpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, maxKeys);
+ ListObjectResponse getBucketResponse = (ListObjectResponse)
endpoint.get("b1").getEntity();
assertTrue(getBucketResponse.isTruncated());
assertEquals(2, getBucketResponse.getCommonPrefixes().size());
// 2nd time
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
getBucketResponse.getNextToken());
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ String value1 = getBucketResponse.getNextToken();
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN, value1);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertTrue(getBucketResponse.isTruncated());
assertEquals(2, getBucketResponse.getCommonPrefixes().size());
//3rd time
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
getBucketResponse.getNextToken());
- getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", maxKeys, 0).getEntity();
+ String value = getBucketResponse.getNextToken();
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN, value);
+ getBucketResponse = (ListObjectResponse) endpoint.get("b1").getEntity();
assertFalse(getBucketResponse.isTruncated());
assertEquals(1, getBucketResponse.getCommonPrefixes().size());
@@ -343,10 +333,11 @@ public void listWithContinuationTokenFail() throws
IOException {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, "/");
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, "dir");
- endpoint.getQueryParameters().putSingle(QueryParams.CONTINUATION_TOKEN,
"random");
- OS3Exception e = assertThrows(OS3Exception.class, () -> endpoint.get("b1",
2, 1000).getEntity());
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, "/");
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, "dir");
+ endpoint.queryParamsForTest().set(QueryParams.CONTINUATION_TOKEN,
"random");
+ endpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, 2);
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
endpoint.get("b1").getEntity());
assertEquals("random", e.getResource());
assertEquals("Invalid Argument", e.getErrorMessage());
}
@@ -360,7 +351,7 @@ public void testStartAfter() throws IOException,
OS3Exception {
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(ozoneClient).build();
ListObjectResponse getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 1000, 0).getEntity();
+ (ListObjectResponse) endpoint.get("b1").getEntity();
assertFalse(getBucketResponse.isTruncated());
assertEquals(5, getBucketResponse.getContents().size());
@@ -369,16 +360,16 @@ public void testStartAfter() throws IOException,
OS3Exception {
// have 4 keys.
String startAfter = "dir0/file1";
- endpoint.getQueryParameters().putSingle(QueryParams.START_AFTER,
startAfter);
+ endpoint.queryParamsForTest().set(QueryParams.START_AFTER, startAfter);
getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 1000, 0).getEntity();
+ (ListObjectResponse) endpoint.get("b1").getEntity();
assertFalse(getBucketResponse.isTruncated());
assertEquals(4, getBucketResponse.getContents().size());
- endpoint.getQueryParameters().putSingle(QueryParams.START_AFTER, "random");
+ endpoint.queryParamsForTest().set(QueryParams.START_AFTER, "random");
getBucketResponse =
- (ListObjectResponse) endpoint.get("b1", 1000, 0).getEntity();
+ (ListObjectResponse) endpoint.get("b1").getEntity();
assertFalse(getBucketResponse.isTruncated());
assertEquals(0, getBucketResponse.getContents().size());
@@ -419,11 +410,11 @@ public void testEncodingType() throws IOException,
OS3Exception {
String startAfter = "data=";
String encodingType = ENCODING_TYPE;
- endpoint.getQueryParameters().putSingle(QueryParams.DELIMITER, delimiter);
- endpoint.getQueryParameters().putSingle(QueryParams.PREFIX, prefix);
- endpoint.getQueryParameters().putSingle(QueryParams.ENCODING_TYPE,
encodingType);
- endpoint.getQueryParameters().putSingle(QueryParams.START_AFTER,
startAfter);
- ListObjectResponse response = (ListObjectResponse) endpoint.get("b1",
1000, 0).getEntity();
+ endpoint.queryParamsForTest().set(QueryParams.DELIMITER, delimiter);
+ endpoint.queryParamsForTest().set(QueryParams.PREFIX, prefix);
+ endpoint.queryParamsForTest().set(QueryParams.ENCODING_TYPE, encodingType);
+ endpoint.queryParamsForTest().set(QueryParams.START_AFTER, startAfter);
+ ListObjectResponse response = (ListObjectResponse)
endpoint.get("b1").getEntity();
// Assert encodingType == url.
// The Object name will be encoded by ObjectKeyNameAdapter
@@ -439,8 +430,8 @@ public void testEncodingType() throws IOException,
OS3Exception {
assertEquals(encodingType,
response.getContents().get(0).getKey().getEncodingType());
- endpoint.getQueryParameters().remove(QueryParams.ENCODING_TYPE);
- response = (ListObjectResponse) endpoint.get("b1", 1000, 0).getEntity();
+ endpoint.queryParamsForTest().unset(QueryParams.ENCODING_TYPE);
+ response = (ListObjectResponse) endpoint.get("b1").getEntity();
// Assert encodingType == null.
// The Object name will not be encoded by ObjectKeyNameAdapter
@@ -461,9 +452,8 @@ public void testEncodingTypeException() throws IOException {
client.getObjectStore().createS3Bucket("b1");
BucketEndpoint endpoint =
newBucketEndpointBuilder().setClient(client).build();
- endpoint.getQueryParameters().putSingle(QueryParams.ENCODING_TYPE,
"unSupportType");
- OS3Exception e = assertThrows(OS3Exception.class, () -> endpoint.get(
- "b1", 1000, 0).getEntity());
+ endpoint.queryParamsForTest().set(QueryParams.ENCODING_TYPE,
"unSupportType");
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
endpoint.get("b1").getEntity());
assertEquals(S3ErrorTable.INVALID_ARGUMENT.getCode(), e.getCode());
}
@@ -476,9 +466,8 @@ public void testListObjectsWithNegativeMaxKeys() throws
Exception {
.build();
// maxKeys < 0 should throw InvalidArgument
- OS3Exception e1 = assertThrows(OS3Exception.class, () ->
- bucketEndpoint.get("bucket", -1, 1000)
- );
+ bucketEndpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, -1);
+ OS3Exception e1 = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("bucket"));
assertEquals(S3ErrorTable.INVALID_ARGUMENT.getCode(), e1.getCode());
}
@@ -491,8 +480,8 @@ public void testListObjectsWithZeroMaxKeys() throws
Exception {
.build();
// maxKeys = 0, should return empty list and not throw.
- ListObjectResponse response = (ListObjectResponse) bucketEndpoint.get(
- "bucket", 0, 1000).getEntity();
+ bucketEndpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, 0);
+ ListObjectResponse response = (ListObjectResponse)
bucketEndpoint.get("bucket").getEntity();
assertEquals(0, response.getContents().size());
assertFalse(response.isTruncated());
@@ -505,15 +494,15 @@ public void
testListObjectsWithZeroMaxKeysInNonEmptyBucket() throws Exception {
.setClient(client)
.build();
- ListObjectResponse response = (ListObjectResponse) bucketEndpoint.get(
- "b1", 0, 1000).getEntity();
+ bucketEndpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS, 0);
+ ListObjectResponse response = (ListObjectResponse)
bucketEndpoint.get("b1").getEntity();
// Should return empty list and not throw.
assertEquals(0, response.getContents().size());
assertFalse(response.isTruncated());
- ListObjectResponse fullResponse = (ListObjectResponse) bucketEndpoint.get(
- "b1", 1000, 1000).getEntity();
+ bucketEndpoint.queryParamsForTest().unset(QueryParams.MAX_KEYS);
+ ListObjectResponse fullResponse = (ListObjectResponse)
bucketEndpoint.get("b1").getEntity();
assertEquals(5, fullResponse.getContents().size());
}
@@ -540,9 +529,8 @@ public void testListObjectsRespectsConfiguredMaxKeysLimit()
throws Exception {
// Act: Request more keys than the configured max-keys limit
final int requestedMaxKeys = Integer.parseInt(configuredMaxKeysLimit) + 1;
- ListObjectResponse response = (ListObjectResponse)
- bucketEndpoint.get("b1", requestedMaxKeys,
- 1000).getEntity();
+ bucketEndpoint.queryParamsForTest().setInt(QueryParams.MAX_KEYS,
requestedMaxKeys);
+ ListObjectResponse response = (ListObjectResponse)
bucketEndpoint.get("b1").getEntity();
// Assert: The number of returned keys should be capped at the configured
limit
assertEquals(Integer.parseInt(configuredMaxKeysLimit),
response.getContents().size());
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
index 9872a711c63..8e9eef2d974 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
@@ -169,8 +169,7 @@ public void testListKey() throws IOException {
BucketEndpoint bucketEndpoint = EndpointBuilder.newBucketEndpointBuilder()
.setClient(client)
.build();
- OS3Exception e = assertThrows(OS3Exception.class, () -> bucketEndpoint.get(
- "bucketName", 1000, 0));
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("bucketName"));
assertEquals(HTTP_FORBIDDEN, e.getHttpCode());
}
@@ -214,9 +213,8 @@ public void testGetAcl() throws Exception {
.setClient(client)
.setHeaders(headers)
.build();
- bucketEndpoint.getQueryParameters().putSingle(QueryParams.ACL, "acl");
- OS3Exception e = assertThrows(OS3Exception.class, () -> bucketEndpoint.get(
- "bucketName", 1000, 0));
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, "acl");
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("bucketName"));
assertEquals(HTTP_FORBIDDEN, e.getHttpCode());
}
@@ -237,7 +235,7 @@ public void testSetAcl() throws Exception {
.setClient(client)
.setHeaders(headers)
.build();
- bucketEndpoint.getQueryParameters().putSingle(QueryParams.ACL, "acl");
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, "acl");
try {
bucketEndpoint.put("bucketName", null);
} catch (Exception e) {
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
index 018ad0f1f5e..bfc471e22d5 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
@@ -134,7 +134,7 @@ public void testListBucketSuccess() throws Exception {
public void testGetBucketSuccess() throws Exception {
long oriMetric = metrics.getGetBucketSuccess();
- bucketEndpoint.get(bucketName, 1000, 0).getEntity();
+ bucketEndpoint.get(bucketName).getEntity();
long curMetric = metrics.getGetBucketSuccess();
assertEquals(1L, curMetric - oriMetric);
@@ -145,8 +145,7 @@ public void testGetBucketFailure() throws Exception {
long oriMetric = metrics.getGetBucketFailure();
// Searching for a bucket that does not exist
- OS3Exception e = assertThrows(OS3Exception.class, () -> bucketEndpoint.get(
- "newBucket", 1000, 0));
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("newBucket"));
assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getCode(), e.getCode());
assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getErrorMessage(),
e.getErrorMessage());
@@ -207,9 +206,8 @@ public void testDeleteBucketFailure() throws Exception {
public void testGetAclSuccess() throws Exception {
long oriMetric = metrics.getGetAclSuccess();
- bucketEndpoint.getQueryParameters().add(QueryParams.ACL, ACL_MARKER);
- Response response =
- bucketEndpoint.get(bucketName, 0, 0);
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, ACL_MARKER);
+ Response response = bucketEndpoint.get(bucketName);
long curMetric = metrics.getGetAclSuccess();
assertEquals(HTTP_OK, response.getStatus());
assertEquals(1L, curMetric - oriMetric);
@@ -219,9 +217,9 @@ public void testGetAclSuccess() throws Exception {
public void testGetAclFailure() throws Exception {
long oriMetric = metrics.getGetAclFailure();
- bucketEndpoint.getQueryParameters().add(QueryParams.ACL, ACL_MARKER);
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, ACL_MARKER);
// Failing the getACL endpoint by applying ACL on a non-Existent Bucket
- OS3Exception e = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("random_bucket", 0, 0));
+ OS3Exception e = assertThrows(OS3Exception.class, () ->
bucketEndpoint.get("random_bucket"));
assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getCode(), e.getCode());
assertEquals(S3ErrorTable.NO_SUCH_BUCKET.getErrorMessage(),
e.getErrorMessage());
@@ -237,7 +235,7 @@ public void testPutAclSuccess() throws Exception {
InputStream inputBody = TestBucketAcl.class.getClassLoader()
.getResourceAsStream("userAccessControlList.xml");
- bucketEndpoint.getQueryParameters().add(QueryParams.ACL, ACL_MARKER);
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, ACL_MARKER);
bucketEndpoint.put("b1", inputBody);
inputBody.close();
long curMetric = metrics.getPutAclSuccess();
@@ -251,7 +249,7 @@ public void testPutAclFailure() throws Exception {
InputStream inputBody = TestBucketAcl.class.getClassLoader()
.getResourceAsStream("userAccessControlList.xml");
- bucketEndpoint.getQueryParameters().add(QueryParams.ACL, ACL_MARKER);
+ bucketEndpoint.queryParamsForTest().set(QueryParams.ACL, ACL_MARKER);
try {
assertThrows(OS3Exception.class, () ->
bucketEndpoint.put("unknown_bucket", inputBody));
} finally {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]