From 62df7310063a774903ec0e71032579a6bfba4267 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Wed, 24 May 2023 22:52:39 -0700 Subject: [PATCH] Add updatedAt for GetBucketLifecycleConfig (#17271) --- cmd/admin-bucket-handlers.go | 2 +- cmd/api-errors.go | 6 + cmd/apierrorcode_string.go | 303 ++++++++++++++++--------------- cmd/bucket-lifecycle-handlers.go | 16 +- cmd/bucket-lifecycle.go | 3 +- cmd/bucket-metadata-sys.go | 11 +- cmd/bucket-metadata.go | 5 + cmd/bucket-metadata_gen.go | 35 +++- internal/http/headers.go | 4 +- 9 files changed, 219 insertions(+), 166 deletions(-) diff --git a/cmd/admin-bucket-handlers.go b/cmd/admin-bucket-handlers.go index a83328979..834f0fea0 100644 --- a/cmd/admin-bucket-handlers.go +++ b/cmd/admin-bucket-handlers.go @@ -460,7 +460,7 @@ func (a adminAPIHandlers) ExportBucketMetadataHandler(w http.ResponseWriter, r * return } case bucketLifecycleConfig: - config, err := globalBucketMetadataSys.GetLifecycleConfig(bucket) + config, _, err := globalBucketMetadataSys.GetLifecycleConfig(bucket) if err != nil { if errors.Is(err, BucketLifecycleNotFound{Bucket: bucket}) { continue diff --git a/cmd/api-errors.go b/cmd/api-errors.go index 296afc9df..1ef5d5e50 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -253,6 +253,7 @@ const ( ErrInvalidObjectName ErrInvalidObjectNamePrefixSlash ErrInvalidResourceName + ErrInvalidLifecycleQueryParameter ErrServerNotInitialized ErrOperationTimedOut ErrClientDisconnected @@ -1255,6 +1256,11 @@ var errorCodes = errorCodeMap{ Description: "The JSON you provided was not well-formed or did not validate against our published format.", HTTPStatusCode: http.StatusBadRequest, }, + ErrInvalidLifecycleQueryParameter: { + Code: "XMinioInvalidLifecycleParameter", + Description: "The boolean value provided for withUpdatedAt query parameter was invalid.", + HTTPStatusCode: http.StatusBadRequest, + }, ErrAdminNoSuchUser: { Code: "XMinioAdminNoSuchUser", Description: "The specified user does not exist.", diff --git a/cmd/apierrorcode_string.go b/cmd/apierrorcode_string.go index f25a94be1..cfeaa45d7 100644 --- a/cmd/apierrorcode_string.go +++ b/cmd/apierrorcode_string.go @@ -169,160 +169,161 @@ func _() { _ = x[ErrInvalidObjectName-158] _ = x[ErrInvalidObjectNamePrefixSlash-159] _ = x[ErrInvalidResourceName-160] - _ = x[ErrServerNotInitialized-161] - _ = x[ErrOperationTimedOut-162] - _ = x[ErrClientDisconnected-163] - _ = x[ErrOperationMaxedOut-164] - _ = x[ErrInvalidRequest-165] - _ = x[ErrTransitionStorageClassNotFoundError-166] - _ = x[ErrInvalidStorageClass-167] - _ = x[ErrBackendDown-168] - _ = x[ErrMalformedJSON-169] - _ = x[ErrAdminNoSuchUser-170] - _ = x[ErrAdminNoSuchGroup-171] - _ = x[ErrAdminGroupNotEmpty-172] - _ = x[ErrAdminGroupDisabled-173] - _ = x[ErrAdminNoSuchJob-174] - _ = x[ErrAdminNoSuchPolicy-175] - _ = x[ErrAdminPolicyChangeAlreadyApplied-176] - _ = x[ErrAdminInvalidArgument-177] - _ = x[ErrAdminInvalidAccessKey-178] - _ = x[ErrAdminInvalidSecretKey-179] - _ = x[ErrAdminConfigNoQuorum-180] - _ = x[ErrAdminConfigTooLarge-181] - _ = x[ErrAdminConfigBadJSON-182] - _ = x[ErrAdminNoSuchConfigTarget-183] - _ = x[ErrAdminConfigEnvOverridden-184] - _ = x[ErrAdminConfigDuplicateKeys-185] - _ = x[ErrAdminConfigInvalidIDPType-186] - _ = x[ErrAdminConfigLDAPNonDefaultConfigName-187] - _ = x[ErrAdminConfigLDAPValidation-188] - _ = x[ErrAdminConfigIDPCfgNameAlreadyExists-189] - _ = x[ErrAdminConfigIDPCfgNameDoesNotExist-190] - _ = x[ErrAdminCredentialsMismatch-191] - _ = x[ErrInsecureClientRequest-192] - _ = x[ErrObjectTampered-193] - _ = x[ErrSiteReplicationInvalidRequest-194] - _ = x[ErrSiteReplicationPeerResp-195] - _ = x[ErrSiteReplicationBackendIssue-196] - _ = x[ErrSiteReplicationServiceAccountError-197] - _ = x[ErrSiteReplicationBucketConfigError-198] - _ = x[ErrSiteReplicationBucketMetaError-199] - _ = x[ErrSiteReplicationIAMError-200] - _ = x[ErrSiteReplicationConfigMissing-201] - _ = x[ErrAdminRebalanceAlreadyStarted-202] - _ = x[ErrAdminRebalanceNotStarted-203] - _ = x[ErrAdminBucketQuotaExceeded-204] - _ = x[ErrAdminNoSuchQuotaConfiguration-205] - _ = x[ErrHealNotImplemented-206] - _ = x[ErrHealNoSuchProcess-207] - _ = x[ErrHealInvalidClientToken-208] - _ = x[ErrHealMissingBucket-209] - _ = x[ErrHealAlreadyRunning-210] - _ = x[ErrHealOverlappingPaths-211] - _ = x[ErrIncorrectContinuationToken-212] - _ = x[ErrEmptyRequestBody-213] - _ = x[ErrUnsupportedFunction-214] - _ = x[ErrInvalidExpressionType-215] - _ = x[ErrBusy-216] - _ = x[ErrUnauthorizedAccess-217] - _ = x[ErrExpressionTooLong-218] - _ = x[ErrIllegalSQLFunctionArgument-219] - _ = x[ErrInvalidKeyPath-220] - _ = x[ErrInvalidCompressionFormat-221] - _ = x[ErrInvalidFileHeaderInfo-222] - _ = x[ErrInvalidJSONType-223] - _ = x[ErrInvalidQuoteFields-224] - _ = x[ErrInvalidRequestParameter-225] - _ = x[ErrInvalidDataType-226] - _ = x[ErrInvalidTextEncoding-227] - _ = x[ErrInvalidDataSource-228] - _ = x[ErrInvalidTableAlias-229] - _ = x[ErrMissingRequiredParameter-230] - _ = x[ErrObjectSerializationConflict-231] - _ = x[ErrUnsupportedSQLOperation-232] - _ = x[ErrUnsupportedSQLStructure-233] - _ = x[ErrUnsupportedSyntax-234] - _ = x[ErrUnsupportedRangeHeader-235] - _ = x[ErrLexerInvalidChar-236] - _ = x[ErrLexerInvalidOperator-237] - _ = x[ErrLexerInvalidLiteral-238] - _ = x[ErrLexerInvalidIONLiteral-239] - _ = x[ErrParseExpectedDatePart-240] - _ = x[ErrParseExpectedKeyword-241] - _ = x[ErrParseExpectedTokenType-242] - _ = x[ErrParseExpected2TokenTypes-243] - _ = x[ErrParseExpectedNumber-244] - _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-245] - _ = x[ErrParseExpectedTypeName-246] - _ = x[ErrParseExpectedWhenClause-247] - _ = x[ErrParseUnsupportedToken-248] - _ = x[ErrParseUnsupportedLiteralsGroupBy-249] - _ = x[ErrParseExpectedMember-250] - _ = x[ErrParseUnsupportedSelect-251] - _ = x[ErrParseUnsupportedCase-252] - _ = x[ErrParseUnsupportedCaseClause-253] - _ = x[ErrParseUnsupportedAlias-254] - _ = x[ErrParseUnsupportedSyntax-255] - _ = x[ErrParseUnknownOperator-256] - _ = x[ErrParseMissingIdentAfterAt-257] - _ = x[ErrParseUnexpectedOperator-258] - _ = x[ErrParseUnexpectedTerm-259] - _ = x[ErrParseUnexpectedToken-260] - _ = x[ErrParseUnexpectedKeyword-261] - _ = x[ErrParseExpectedExpression-262] - _ = x[ErrParseExpectedLeftParenAfterCast-263] - _ = x[ErrParseExpectedLeftParenValueConstructor-264] - _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-265] - _ = x[ErrParseExpectedArgumentDelimiter-266] - _ = x[ErrParseCastArity-267] - _ = x[ErrParseInvalidTypeParam-268] - _ = x[ErrParseEmptySelect-269] - _ = x[ErrParseSelectMissingFrom-270] - _ = x[ErrParseExpectedIdentForGroupName-271] - _ = x[ErrParseExpectedIdentForAlias-272] - _ = x[ErrParseUnsupportedCallWithStar-273] - _ = x[ErrParseNonUnaryAgregateFunctionCall-274] - _ = x[ErrParseMalformedJoin-275] - _ = x[ErrParseExpectedIdentForAt-276] - _ = x[ErrParseAsteriskIsNotAloneInSelectList-277] - _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-278] - _ = x[ErrParseInvalidContextForWildcardInSelectList-279] - _ = x[ErrIncorrectSQLFunctionArgumentType-280] - _ = x[ErrValueParseFailure-281] - _ = x[ErrEvaluatorInvalidArguments-282] - _ = x[ErrIntegerOverflow-283] - _ = x[ErrLikeInvalidInputs-284] - _ = x[ErrCastFailed-285] - _ = x[ErrInvalidCast-286] - _ = x[ErrEvaluatorInvalidTimestampFormatPattern-287] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-288] - _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-289] - _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-290] - _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-291] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-292] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-293] - _ = x[ErrEvaluatorBindingDoesNotExist-294] - _ = x[ErrMissingHeaders-295] - _ = x[ErrInvalidColumnIndex-296] - _ = x[ErrAdminConfigNotificationTargetsFailed-297] - _ = x[ErrAdminProfilerNotEnabled-298] - _ = x[ErrInvalidDecompressedSize-299] - _ = x[ErrAddUserInvalidArgument-300] - _ = x[ErrAdminResourceInvalidArgument-301] - _ = x[ErrAdminAccountNotEligible-302] - _ = x[ErrAccountNotEligible-303] - _ = x[ErrAdminServiceAccountNotFound-304] - _ = x[ErrPostPolicyConditionInvalidFormat-305] - _ = x[ErrInvalidChecksum-306] - _ = x[ErrLambdaARNInvalid-307] - _ = x[ErrLambdaARNNotFound-308] - _ = x[apiErrCodeEnd-309] + _ = x[ErrInvalidLifecycleQueryParameter-161] + _ = x[ErrServerNotInitialized-162] + _ = x[ErrOperationTimedOut-163] + _ = x[ErrClientDisconnected-164] + _ = x[ErrOperationMaxedOut-165] + _ = x[ErrInvalidRequest-166] + _ = x[ErrTransitionStorageClassNotFoundError-167] + _ = x[ErrInvalidStorageClass-168] + _ = x[ErrBackendDown-169] + _ = x[ErrMalformedJSON-170] + _ = x[ErrAdminNoSuchUser-171] + _ = x[ErrAdminNoSuchGroup-172] + _ = x[ErrAdminGroupNotEmpty-173] + _ = x[ErrAdminGroupDisabled-174] + _ = x[ErrAdminNoSuchJob-175] + _ = x[ErrAdminNoSuchPolicy-176] + _ = x[ErrAdminPolicyChangeAlreadyApplied-177] + _ = x[ErrAdminInvalidArgument-178] + _ = x[ErrAdminInvalidAccessKey-179] + _ = x[ErrAdminInvalidSecretKey-180] + _ = x[ErrAdminConfigNoQuorum-181] + _ = x[ErrAdminConfigTooLarge-182] + _ = x[ErrAdminConfigBadJSON-183] + _ = x[ErrAdminNoSuchConfigTarget-184] + _ = x[ErrAdminConfigEnvOverridden-185] + _ = x[ErrAdminConfigDuplicateKeys-186] + _ = x[ErrAdminConfigInvalidIDPType-187] + _ = x[ErrAdminConfigLDAPNonDefaultConfigName-188] + _ = x[ErrAdminConfigLDAPValidation-189] + _ = x[ErrAdminConfigIDPCfgNameAlreadyExists-190] + _ = x[ErrAdminConfigIDPCfgNameDoesNotExist-191] + _ = x[ErrAdminCredentialsMismatch-192] + _ = x[ErrInsecureClientRequest-193] + _ = x[ErrObjectTampered-194] + _ = x[ErrSiteReplicationInvalidRequest-195] + _ = x[ErrSiteReplicationPeerResp-196] + _ = x[ErrSiteReplicationBackendIssue-197] + _ = x[ErrSiteReplicationServiceAccountError-198] + _ = x[ErrSiteReplicationBucketConfigError-199] + _ = x[ErrSiteReplicationBucketMetaError-200] + _ = x[ErrSiteReplicationIAMError-201] + _ = x[ErrSiteReplicationConfigMissing-202] + _ = x[ErrAdminRebalanceAlreadyStarted-203] + _ = x[ErrAdminRebalanceNotStarted-204] + _ = x[ErrAdminBucketQuotaExceeded-205] + _ = x[ErrAdminNoSuchQuotaConfiguration-206] + _ = x[ErrHealNotImplemented-207] + _ = x[ErrHealNoSuchProcess-208] + _ = x[ErrHealInvalidClientToken-209] + _ = x[ErrHealMissingBucket-210] + _ = x[ErrHealAlreadyRunning-211] + _ = x[ErrHealOverlappingPaths-212] + _ = x[ErrIncorrectContinuationToken-213] + _ = x[ErrEmptyRequestBody-214] + _ = x[ErrUnsupportedFunction-215] + _ = x[ErrInvalidExpressionType-216] + _ = x[ErrBusy-217] + _ = x[ErrUnauthorizedAccess-218] + _ = x[ErrExpressionTooLong-219] + _ = x[ErrIllegalSQLFunctionArgument-220] + _ = x[ErrInvalidKeyPath-221] + _ = x[ErrInvalidCompressionFormat-222] + _ = x[ErrInvalidFileHeaderInfo-223] + _ = x[ErrInvalidJSONType-224] + _ = x[ErrInvalidQuoteFields-225] + _ = x[ErrInvalidRequestParameter-226] + _ = x[ErrInvalidDataType-227] + _ = x[ErrInvalidTextEncoding-228] + _ = x[ErrInvalidDataSource-229] + _ = x[ErrInvalidTableAlias-230] + _ = x[ErrMissingRequiredParameter-231] + _ = x[ErrObjectSerializationConflict-232] + _ = x[ErrUnsupportedSQLOperation-233] + _ = x[ErrUnsupportedSQLStructure-234] + _ = x[ErrUnsupportedSyntax-235] + _ = x[ErrUnsupportedRangeHeader-236] + _ = x[ErrLexerInvalidChar-237] + _ = x[ErrLexerInvalidOperator-238] + _ = x[ErrLexerInvalidLiteral-239] + _ = x[ErrLexerInvalidIONLiteral-240] + _ = x[ErrParseExpectedDatePart-241] + _ = x[ErrParseExpectedKeyword-242] + _ = x[ErrParseExpectedTokenType-243] + _ = x[ErrParseExpected2TokenTypes-244] + _ = x[ErrParseExpectedNumber-245] + _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-246] + _ = x[ErrParseExpectedTypeName-247] + _ = x[ErrParseExpectedWhenClause-248] + _ = x[ErrParseUnsupportedToken-249] + _ = x[ErrParseUnsupportedLiteralsGroupBy-250] + _ = x[ErrParseExpectedMember-251] + _ = x[ErrParseUnsupportedSelect-252] + _ = x[ErrParseUnsupportedCase-253] + _ = x[ErrParseUnsupportedCaseClause-254] + _ = x[ErrParseUnsupportedAlias-255] + _ = x[ErrParseUnsupportedSyntax-256] + _ = x[ErrParseUnknownOperator-257] + _ = x[ErrParseMissingIdentAfterAt-258] + _ = x[ErrParseUnexpectedOperator-259] + _ = x[ErrParseUnexpectedTerm-260] + _ = x[ErrParseUnexpectedToken-261] + _ = x[ErrParseUnexpectedKeyword-262] + _ = x[ErrParseExpectedExpression-263] + _ = x[ErrParseExpectedLeftParenAfterCast-264] + _ = x[ErrParseExpectedLeftParenValueConstructor-265] + _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-266] + _ = x[ErrParseExpectedArgumentDelimiter-267] + _ = x[ErrParseCastArity-268] + _ = x[ErrParseInvalidTypeParam-269] + _ = x[ErrParseEmptySelect-270] + _ = x[ErrParseSelectMissingFrom-271] + _ = x[ErrParseExpectedIdentForGroupName-272] + _ = x[ErrParseExpectedIdentForAlias-273] + _ = x[ErrParseUnsupportedCallWithStar-274] + _ = x[ErrParseNonUnaryAgregateFunctionCall-275] + _ = x[ErrParseMalformedJoin-276] + _ = x[ErrParseExpectedIdentForAt-277] + _ = x[ErrParseAsteriskIsNotAloneInSelectList-278] + _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-279] + _ = x[ErrParseInvalidContextForWildcardInSelectList-280] + _ = x[ErrIncorrectSQLFunctionArgumentType-281] + _ = x[ErrValueParseFailure-282] + _ = x[ErrEvaluatorInvalidArguments-283] + _ = x[ErrIntegerOverflow-284] + _ = x[ErrLikeInvalidInputs-285] + _ = x[ErrCastFailed-286] + _ = x[ErrInvalidCast-287] + _ = x[ErrEvaluatorInvalidTimestampFormatPattern-288] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-289] + _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-290] + _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-291] + _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-292] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-293] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-294] + _ = x[ErrEvaluatorBindingDoesNotExist-295] + _ = x[ErrMissingHeaders-296] + _ = x[ErrInvalidColumnIndex-297] + _ = x[ErrAdminConfigNotificationTargetsFailed-298] + _ = x[ErrAdminProfilerNotEnabled-299] + _ = x[ErrInvalidDecompressedSize-300] + _ = x[ErrAddUserInvalidArgument-301] + _ = x[ErrAdminResourceInvalidArgument-302] + _ = x[ErrAdminAccountNotEligible-303] + _ = x[ErrAccountNotEligible-304] + _ = x[ErrAdminServiceAccountNotFound-305] + _ = x[ErrPostPolicyConditionInvalidFormat-306] + _ = x[ErrInvalidChecksum-307] + _ = x[ErrLambdaARNInvalid-308] + _ = x[ErrLambdaARNNotFound-309] + _ = x[apiErrCodeEnd-310] } -const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorRemoteTargetDenyAddErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledPolicyInvalidVersionMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectivePolicyAlreadyAttachedPolicyNotAttachedExcessDataInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidEncryptionParametersSSECInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionKMSDefaultKeyAlreadyConfiguredNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminGroupDisabledAdminNoSuchJobAdminNoSuchPolicyAdminPolicyChangeAlreadyAppliedAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminConfigInvalidIDPTypeAdminConfigLDAPNonDefaultConfigNameAdminConfigLDAPValidationAdminConfigIDPCfgNameAlreadyExistsAdminConfigIDPCfgNameDoesNotExistAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminRebalanceAlreadyStartedAdminRebalanceNotStartedAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksumLambdaARNInvalidLambdaARNNotFoundapiErrCodeEnd" +const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorRemoteTargetDenyAddErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledPolicyInvalidVersionMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectivePolicyAlreadyAttachedPolicyNotAttachedExcessDataInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidEncryptionParametersSSECInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionKMSDefaultKeyAlreadyConfiguredNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameInvalidLifecycleQueryParameterServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminGroupDisabledAdminNoSuchJobAdminNoSuchPolicyAdminPolicyChangeAlreadyAppliedAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminConfigInvalidIDPTypeAdminConfigLDAPNonDefaultConfigNameAdminConfigLDAPValidationAdminConfigIDPCfgNameAlreadyExistsAdminConfigIDPCfgNameDoesNotExistAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminRebalanceAlreadyStartedAdminRebalanceNotStartedAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksumLambdaARNInvalidLambdaARNNotFoundapiErrCodeEnd" -var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1249, 1277, 1307, 1316, 1328, 1344, 1357, 1371, 1389, 1409, 1430, 1446, 1457, 1473, 1501, 1521, 1537, 1565, 1579, 1596, 1616, 1629, 1643, 1656, 1669, 1685, 1702, 1723, 1737, 1758, 1771, 1793, 1816, 1832, 1847, 1862, 1883, 1901, 1916, 1933, 1958, 1976, 1999, 2014, 2033, 2049, 2068, 2082, 2090, 2109, 2119, 2134, 2170, 2201, 2234, 2263, 2275, 2295, 2319, 2343, 2364, 2388, 2407, 2428, 2445, 2455, 2478, 2500, 2526, 2547, 2565, 2592, 2623, 2650, 2671, 2692, 2716, 2741, 2769, 2797, 2813, 2836, 2866, 2877, 2889, 2906, 2921, 2939, 2968, 2985, 3001, 3017, 3035, 3053, 3076, 3097, 3120, 3131, 3147, 3170, 3187, 3215, 3234, 3254, 3271, 3289, 3306, 3320, 3355, 3374, 3385, 3398, 3413, 3429, 3447, 3465, 3479, 3496, 3527, 3547, 3568, 3589, 3608, 3627, 3645, 3668, 3692, 3716, 3741, 3776, 3801, 3835, 3868, 3892, 3913, 3927, 3956, 3979, 4006, 4040, 4072, 4102, 4125, 4153, 4181, 4205, 4229, 4258, 4276, 4293, 4315, 4332, 4350, 4370, 4396, 4412, 4431, 4452, 4456, 4474, 4491, 4517, 4531, 4555, 4576, 4591, 4609, 4632, 4647, 4666, 4683, 4700, 4724, 4751, 4774, 4797, 4814, 4836, 4852, 4872, 4891, 4913, 4934, 4954, 4976, 5000, 5019, 5061, 5082, 5105, 5126, 5157, 5176, 5198, 5218, 5244, 5265, 5287, 5307, 5331, 5354, 5373, 5393, 5415, 5438, 5469, 5507, 5548, 5578, 5592, 5613, 5629, 5651, 5681, 5707, 5735, 5768, 5786, 5809, 5844, 5884, 5926, 5958, 5975, 6000, 6015, 6032, 6042, 6053, 6091, 6145, 6191, 6243, 6291, 6334, 6378, 6406, 6420, 6438, 6474, 6497, 6520, 6542, 6570, 6593, 6611, 6638, 6670, 6685, 6701, 6718, 6731} +var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1249, 1277, 1307, 1316, 1328, 1344, 1357, 1371, 1389, 1409, 1430, 1446, 1457, 1473, 1501, 1521, 1537, 1565, 1579, 1596, 1616, 1629, 1643, 1656, 1669, 1685, 1702, 1723, 1737, 1758, 1771, 1793, 1816, 1832, 1847, 1862, 1883, 1901, 1916, 1933, 1958, 1976, 1999, 2014, 2033, 2049, 2068, 2082, 2090, 2109, 2119, 2134, 2170, 2201, 2234, 2263, 2275, 2295, 2319, 2343, 2364, 2388, 2407, 2428, 2445, 2455, 2478, 2500, 2526, 2547, 2565, 2592, 2623, 2650, 2671, 2692, 2716, 2741, 2769, 2797, 2813, 2836, 2866, 2877, 2889, 2906, 2921, 2939, 2968, 2985, 3001, 3017, 3035, 3053, 3076, 3097, 3120, 3131, 3147, 3170, 3187, 3215, 3234, 3264, 3284, 3301, 3319, 3336, 3350, 3385, 3404, 3415, 3428, 3443, 3459, 3477, 3495, 3509, 3526, 3557, 3577, 3598, 3619, 3638, 3657, 3675, 3698, 3722, 3746, 3771, 3806, 3831, 3865, 3898, 3922, 3943, 3957, 3986, 4009, 4036, 4070, 4102, 4132, 4155, 4183, 4211, 4235, 4259, 4288, 4306, 4323, 4345, 4362, 4380, 4400, 4426, 4442, 4461, 4482, 4486, 4504, 4521, 4547, 4561, 4585, 4606, 4621, 4639, 4662, 4677, 4696, 4713, 4730, 4754, 4781, 4804, 4827, 4844, 4866, 4882, 4902, 4921, 4943, 4964, 4984, 5006, 5030, 5049, 5091, 5112, 5135, 5156, 5187, 5206, 5228, 5248, 5274, 5295, 5317, 5337, 5361, 5384, 5403, 5423, 5445, 5468, 5499, 5537, 5578, 5608, 5622, 5643, 5659, 5681, 5711, 5737, 5765, 5798, 5816, 5839, 5874, 5914, 5956, 5988, 6005, 6030, 6045, 6062, 6072, 6083, 6121, 6175, 6221, 6273, 6321, 6364, 6408, 6436, 6450, 6468, 6504, 6527, 6550, 6572, 6600, 6623, 6641, 6668, 6700, 6715, 6731, 6748, 6761} func (i APIErrorCode) String() string { if i < 0 || i >= APIErrorCode(len(_APIErrorCode_index)-1) { diff --git a/cmd/bucket-lifecycle-handlers.go b/cmd/bucket-lifecycle-handlers.go index 5d9000236..2632a08fd 100644 --- a/cmd/bucket-lifecycle-handlers.go +++ b/cmd/bucket-lifecycle-handlers.go @@ -21,6 +21,7 @@ import ( "encoding/xml" "io" "net/http" + "strconv" "github.com/minio/minio/internal/bucket/lifecycle" xhttp "github.com/minio/minio/internal/http" @@ -115,6 +116,16 @@ func (api objectAPIHandlers) GetBucketLifecycleHandler(w http.ResponseWriter, r vars := mux.Vars(r) bucket := vars["bucket"] + var withUpdatedAt bool + if updatedAtStr := r.Form.Get("withUpdatedAt"); updatedAtStr != "" { + var err error + withUpdatedAt, err = strconv.ParseBool(updatedAtStr) + if err != nil { + writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidLifecycleQueryParameter), r.URL) + return + } + } + if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketLifecycleAction, bucket, ""); s3Error != ErrNone { writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL) return @@ -126,7 +137,7 @@ func (api objectAPIHandlers) GetBucketLifecycleHandler(w http.ResponseWriter, r return } - config, err := globalBucketMetadataSys.GetLifecycleConfig(bucket) + config, updatedAt, err := globalBucketMetadataSys.GetLifecycleConfig(bucket) if err != nil { writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL) return @@ -138,6 +149,9 @@ func (api objectAPIHandlers) GetBucketLifecycleHandler(w http.ResponseWriter, r return } + if withUpdatedAt { + w.Header().Set(xhttp.MinIOLifecycleCfgUpdatedAt, updatedAt.Format(iso8601Format)) + } // Write lifecycle configuration to client. writeSuccessResponseXML(w, configData) } diff --git a/cmd/bucket-lifecycle.go b/cmd/bucket-lifecycle.go index a6807f00d..6eda7559b 100644 --- a/cmd/bucket-lifecycle.go +++ b/cmd/bucket-lifecycle.go @@ -63,7 +63,8 @@ type LifecycleSys struct{} // Get - gets lifecycle config associated to a given bucket name. func (sys *LifecycleSys) Get(bucketName string) (lc *lifecycle.Lifecycle, err error) { - return globalBucketMetadataSys.GetLifecycleConfig(bucketName) + lc, _, err = globalBucketMetadataSys.GetLifecycleConfig(bucketName) + return lc, err } // NewLifecycleSys - creates new lifecycle system. diff --git a/cmd/bucket-metadata-sys.go b/cmd/bucket-metadata-sys.go index a21a5c3f7..14ca646bf 100644 --- a/cmd/bucket-metadata-sys.go +++ b/cmd/bucket-metadata-sys.go @@ -121,6 +121,7 @@ func (sys *BucketMetadataSys) updateAndParse(ctx context.Context, bucket string, meta.NotificationConfigXML = configData case bucketLifecycleConfig: meta.LifecycleConfigXML = configData + meta.LifecycleConfigUpdatedAt = updatedAt case bucketSSEConfig: meta.EncryptionConfigXML = configData meta.EncryptionConfigUpdatedAt = updatedAt @@ -246,18 +247,18 @@ func (sys *BucketMetadataSys) GetObjectLockConfig(bucket string) (*objectlock.Co // GetLifecycleConfig returns configured lifecycle config // The returned object may not be modified. -func (sys *BucketMetadataSys) GetLifecycleConfig(bucket string) (*lifecycle.Lifecycle, error) { +func (sys *BucketMetadataSys) GetLifecycleConfig(bucket string) (*lifecycle.Lifecycle, time.Time, error) { meta, _, err := sys.GetConfig(GlobalContext, bucket) if err != nil { if errors.Is(err, errConfigNotFound) { - return nil, BucketLifecycleNotFound{Bucket: bucket} + return nil, time.Time{}, BucketLifecycleNotFound{Bucket: bucket} } - return nil, err + return nil, time.Time{}, err } if meta.lifecycleConfig == nil { - return nil, BucketLifecycleNotFound{Bucket: bucket} + return nil, time.Time{}, BucketLifecycleNotFound{Bucket: bucket} } - return meta.lifecycleConfig, nil + return meta.lifecycleConfig, meta.LifecycleConfigUpdatedAt, nil } // GetNotificationConfig returns configured notification config diff --git a/cmd/bucket-metadata.go b/cmd/bucket-metadata.go index 4e5c375e0..64d5aa799 100644 --- a/cmd/bucket-metadata.go +++ b/cmd/bucket-metadata.go @@ -88,6 +88,7 @@ type BucketMetadata struct { QuotaConfigUpdatedAt time.Time ReplicationConfigUpdatedAt time.Time VersioningConfigUpdatedAt time.Time + LifecycleConfigUpdatedAt time.Time // Unexported fields. Must be updated atomically. policyConfig *policy.Policy @@ -427,6 +428,10 @@ func (b *BucketMetadata) defaultTimestamps() { if b.VersioningConfigUpdatedAt.IsZero() { b.VersioningConfigUpdatedAt = b.Created } + + if b.LifecycleConfigUpdatedAt.IsZero() { + b.LifecycleConfigUpdatedAt = b.Created + } } // Save config to supplied ObjectLayer api. diff --git a/cmd/bucket-metadata_gen.go b/cmd/bucket-metadata_gen.go index 43bd3a442..3e86a80e4 100644 --- a/cmd/bucket-metadata_gen.go +++ b/cmd/bucket-metadata_gen.go @@ -150,6 +150,12 @@ func (z *BucketMetadata) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "VersioningConfigUpdatedAt") return } + case "LifecycleConfigUpdatedAt": + z.LifecycleConfigUpdatedAt, err = dc.ReadTime() + if err != nil { + err = msgp.WrapError(err, "LifecycleConfigUpdatedAt") + return + } default: err = dc.Skip() if err != nil { @@ -163,9 +169,9 @@ func (z *BucketMetadata) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *BucketMetadata) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 21 + // map header, size 22 // write "Name" - err = en.Append(0xde, 0x0, 0x15, 0xa4, 0x4e, 0x61, 0x6d, 0x65) + err = en.Append(0xde, 0x0, 0x16, 0xa4, 0x4e, 0x61, 0x6d, 0x65) if err != nil { return } @@ -374,15 +380,25 @@ func (z *BucketMetadata) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "VersioningConfigUpdatedAt") return } + // write "LifecycleConfigUpdatedAt" + err = en.Append(0xb8, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74) + if err != nil { + return + } + err = en.WriteTime(z.LifecycleConfigUpdatedAt) + if err != nil { + err = msgp.WrapError(err, "LifecycleConfigUpdatedAt") + return + } return } // MarshalMsg implements msgp.Marshaler func (z *BucketMetadata) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // map header, size 21 + // map header, size 22 // string "Name" - o = append(o, 0xde, 0x0, 0x15, 0xa4, 0x4e, 0x61, 0x6d, 0x65) + o = append(o, 0xde, 0x0, 0x16, 0xa4, 0x4e, 0x61, 0x6d, 0x65) o = msgp.AppendString(o, z.Name) // string "Created" o = append(o, 0xa7, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64) @@ -444,6 +460,9 @@ func (z *BucketMetadata) MarshalMsg(b []byte) (o []byte, err error) { // string "VersioningConfigUpdatedAt" o = append(o, 0xb9, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74) o = msgp.AppendTime(o, z.VersioningConfigUpdatedAt) + // string "LifecycleConfigUpdatedAt" + o = append(o, 0xb8, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74) + o = msgp.AppendTime(o, z.LifecycleConfigUpdatedAt) return } @@ -591,6 +610,12 @@ func (z *BucketMetadata) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "VersioningConfigUpdatedAt") return } + case "LifecycleConfigUpdatedAt": + z.LifecycleConfigUpdatedAt, bts, err = msgp.ReadTimeBytes(bts) + if err != nil { + err = msgp.WrapError(err, "LifecycleConfigUpdatedAt") + return + } default: bts, err = msgp.Skip(bts) if err != nil { @@ -605,6 +630,6 @@ func (z *BucketMetadata) UnmarshalMsg(bts []byte) (o []byte, err error) { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *BucketMetadata) Msgsize() (s int) { - s = 3 + 5 + msgp.StringPrefixSize + len(z.Name) + 8 + msgp.TimeSize + 12 + msgp.BoolSize + 17 + msgp.BytesPrefixSize + len(z.PolicyConfigJSON) + 22 + msgp.BytesPrefixSize + len(z.NotificationConfigXML) + 19 + msgp.BytesPrefixSize + len(z.LifecycleConfigXML) + 20 + msgp.BytesPrefixSize + len(z.ObjectLockConfigXML) + 20 + msgp.BytesPrefixSize + len(z.VersioningConfigXML) + 20 + msgp.BytesPrefixSize + len(z.EncryptionConfigXML) + 17 + msgp.BytesPrefixSize + len(z.TaggingConfigXML) + 16 + msgp.BytesPrefixSize + len(z.QuotaConfigJSON) + 21 + msgp.BytesPrefixSize + len(z.ReplicationConfigXML) + 24 + msgp.BytesPrefixSize + len(z.BucketTargetsConfigJSON) + 28 + msgp.BytesPrefixSize + len(z.BucketTargetsConfigMetaJSON) + 22 + msgp.TimeSize + 26 + msgp.TimeSize + 26 + msgp.TimeSize + 23 + msgp.TimeSize + 21 + msgp.TimeSize + 27 + msgp.TimeSize + 26 + msgp.TimeSize + s = 3 + 5 + msgp.StringPrefixSize + len(z.Name) + 8 + msgp.TimeSize + 12 + msgp.BoolSize + 17 + msgp.BytesPrefixSize + len(z.PolicyConfigJSON) + 22 + msgp.BytesPrefixSize + len(z.NotificationConfigXML) + 19 + msgp.BytesPrefixSize + len(z.LifecycleConfigXML) + 20 + msgp.BytesPrefixSize + len(z.ObjectLockConfigXML) + 20 + msgp.BytesPrefixSize + len(z.VersioningConfigXML) + 20 + msgp.BytesPrefixSize + len(z.EncryptionConfigXML) + 17 + msgp.BytesPrefixSize + len(z.TaggingConfigXML) + 16 + msgp.BytesPrefixSize + len(z.QuotaConfigJSON) + 21 + msgp.BytesPrefixSize + len(z.ReplicationConfigXML) + 24 + msgp.BytesPrefixSize + len(z.BucketTargetsConfigJSON) + 28 + msgp.BytesPrefixSize + len(z.BucketTargetsConfigMetaJSON) + 22 + msgp.TimeSize + 26 + msgp.TimeSize + 26 + msgp.TimeSize + 23 + msgp.TimeSize + 21 + msgp.TimeSize + 27 + msgp.TimeSize + 26 + msgp.TimeSize + 25 + msgp.TimeSize return } diff --git a/internal/http/headers.go b/internal/http/headers.go index cd1e3010c..a960ee147 100644 --- a/internal/http/headers.go +++ b/internal/http/headers.go @@ -211,8 +211,8 @@ const ( // Header indiicates last rtention update time on source MinIOSourceObjectLegalHoldTimestamp = "X-Minio-Source-Replication-LegalHold-Timestamp" // predicted date/time of transition - MinIOTransition = "X-Minio-Transition" - + MinIOTransition = "X-Minio-Transition" + MinIOLifecycleCfgUpdatedAt = "X-Minio-LifecycleConfig-UpdatedAt" // MinIOCompressed is returned when object is compressed MinIOCompressed = "X-Minio-Compressed"