[
https://issues.apache.org/jira/browse/HDDS-16372?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Priyesh Karatha updated HDDS-16372:
-----------------------------------
Description:
While testing the S3 bucket lifecycle configuration, providing an
Expiration.Date in the past results in an HTTP 400 error. However, the response
does not indicate that the date is invalid because it is in the past. Instead,
the client receives only the generic error message: Invalid Request.
Steps to Reproduce
Create a lifecycle configuration with an expiration date in the past:
{code:java}
cat > /tmp/lifecycle.json <<EOF
{
"Rules": [
{ "ID": "expire-key1-fso", "Status": "Enabled", "Filter": \{
"Prefix": "key1/" }
,
"Expiration": { "Date": "2020-01-01T00:00:00Z" }
}]
}
EOF
{code}
Run the following command:
{code:java}
ozones3api put-bucket-lifecycle-configuration \
--bucket "$BUCKET" \
--lifecycle-configuration file:///tmp/lifecycle.json{code}
Actual Result
The request fails with HTTP 400 and the following generic error:
An error occurred (InvalidRequest) when calling the
PutBucketLifecycleConfiguration operation: Invalid Request
Expected Result
The response should provide a meaningful error message indicating that the
specified expiration date is invalid because it is in the past.
For example:
The expiration date must not be earlier than the bucket creation time.
Root Cause
S3LifecycleConfiguration.toOmLifecycleConfiguration() builds the OM model with
creationTime=0. As a result, the S3 Gateway's client-side validation cannot
determine whether the specified expiration date is genuinely in the past.
The actual validation is performed by OM in
OmLCExpiration#validateExpirationDate, which uses the bucket's actual creation
time. This validation is triggered when BucketEndpoint calls:
ozoneBucket.setLifecycleConfiguration(...)
BucketLifecycleHandler.putBucketLifecycleConfiguration() catches the resulting
OMException and converts it to an OS3Exception using:
S3ErrorTable.newError(bucketName, ex)
However, the OS3Exception constructor sets errorMessage to the static, generic
message from S3ErrorTable. It does not preserve ex.getMessage() from the
underlying OMException, causing the detailed validation message from OM to be
lost.
was:
While testing the S3 bucket lifecycle configuration, providing an
Expiration.Date in the past results in an HTTP 400 error. However, the response
does not indicate that the date is invalid because it is in the past. Instead,
the client receives only the generic error message: Invalid Request.
Steps to Reproduce
Create a lifecycle configuration with an expiration date in the past:
cat > /tmp/lifecycle.json <<EOF
{code:java}
{
"Rules": [
{ "ID": "expire-key1-fso", "Status": "Enabled", "Filter": \{
"Prefix": "key1/" }
,
"Expiration": { "Date": "2020-01-01T00:00:00Z" }
}]
}
EOF
{code}
Run the following command:
ozones3api put-bucket-lifecycle-configuration \
--bucket "$BUCKET" \
--lifecycle-configuration [file:///tmp/lifecycle.json]
Actual Result
The request fails with HTTP 400 and the following generic error:
An error occurred (InvalidRequest) when calling the
PutBucketLifecycleConfiguration operation: Invalid Request
Expected Result
The response should provide a meaningful error message indicating that the
specified expiration date is invalid because it is in the past.
For example:
The expiration date must not be earlier than the bucket creation time.
Root Cause
S3LifecycleConfiguration.toOmLifecycleConfiguration() builds the OM model with
creationTime=0. As a result, the S3 Gateway's client-side validation cannot
determine whether the specified expiration date is genuinely in the past.
The actual validation is performed by OM in
OmLCExpiration#validateExpirationDate, which uses the bucket's actual creation
time. This validation is triggered when BucketEndpoint calls:
ozoneBucket.setLifecycleConfiguration(...)
BucketLifecycleHandler.putBucketLifecycleConfiguration() catches the resulting
OMException and converts it to an OS3Exception using:
S3ErrorTable.newError(bucketName, ex)
However, the OS3Exception constructor sets errorMessage to the static, generic
message from S3ErrorTable. It does not preserve ex.getMessage() from the
underlying OMException, causing the detailed validation message from OM to be
lost.
> PutBucketLifecycleConfiguration returns generic "Invalid Request" message
> for a past Expiration Date
> -----------------------------------------------------------------------------------------------------
>
> Key: HDDS-16372
> URL: https://issues.apache.org/jira/browse/HDDS-16372
> Project: Apache Ozone
> Issue Type: Sub-task
> Reporter: Priyesh Karatha
> Assignee: Priyesh Karatha
> Priority: Major
> Labels: pull-request-available
>
> While testing the S3 bucket lifecycle configuration, providing an
> Expiration.Date in the past results in an HTTP 400 error. However, the
> response does not indicate that the date is invalid because it is in the
> past. Instead, the client receives only the generic error message: Invalid
> Request.
> Steps to Reproduce
> Create a lifecycle configuration with an expiration date in the past:
>
> {code:java}
> cat > /tmp/lifecycle.json <<EOF
> {
> "Rules": [
> { "ID": "expire-key1-fso", "Status": "Enabled", "Filter": \{
> "Prefix": "key1/" }
> ,
> "Expiration": { "Date": "2020-01-01T00:00:00Z" }
> }]
> }
> EOF
> {code}
>
> Run the following command:
> {code:java}
> ozones3api put-bucket-lifecycle-configuration \
> --bucket "$BUCKET" \
> --lifecycle-configuration file:///tmp/lifecycle.json{code}
> Actual Result
> The request fails with HTTP 400 and the following generic error:
> An error occurred (InvalidRequest) when calling the
> PutBucketLifecycleConfiguration operation: Invalid Request
> Expected Result
> The response should provide a meaningful error message indicating that the
> specified expiration date is invalid because it is in the past.
> For example:
> The expiration date must not be earlier than the bucket creation time.
> Root Cause
> S3LifecycleConfiguration.toOmLifecycleConfiguration() builds the OM model
> with creationTime=0. As a result, the S3 Gateway's client-side validation
> cannot determine whether the specified expiration date is genuinely in the
> past.
> The actual validation is performed by OM in
> OmLCExpiration#validateExpirationDate, which uses the bucket's actual
> creation time. This validation is triggered when BucketEndpoint calls:
> ozoneBucket.setLifecycleConfiguration(...)
> BucketLifecycleHandler.putBucketLifecycleConfiguration() catches the
> resulting OMException and converts it to an OS3Exception using:
> S3ErrorTable.newError(bucketName, ex)
> However, the OS3Exception constructor sets errorMessage to the static,
> generic message from S3ErrorTable. It does not preserve ex.getMessage() from
> the underlying OMException, causing the detailed validation message from OM
> to be lost.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]