diff --git a/moto/s3/models.py b/moto/s3/models.py index 409b24174..9c6bd0b9f 100644 --- a/moto/s3/models.py +++ b/moto/s3/models.py @@ -53,21 +53,13 @@ from moto.s3.exceptions import ( from .cloud_formation import cfn_to_api_encryption, is_replacement_update from . import notifications from .utils import clean_key_name, _VersionedKeyStore, undo_clean_key_name +from .utils import ARCHIVE_STORAGE_CLASSES, STORAGE_CLASS from ..events.notifications import send_notification as events_send_notification from ..settings import get_s3_default_key_buffer_size, S3_UPLOAD_PART_MIN_SIZE MAX_BUCKET_NAME_LENGTH = 63 MIN_BUCKET_NAME_LENGTH = 3 UPLOAD_ID_BYTES = 43 -STORAGE_CLASS = [ - "STANDARD", - "REDUCED_REDUNDANCY", - "STANDARD_IA", - "ONEZONE_IA", - "INTELLIGENT_TIERING", - "GLACIER", - "DEEP_ARCHIVE", -] DEFAULT_TEXT_ENCODING = sys.getdefaultencoding() OWNER = "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a" @@ -2249,7 +2241,7 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider): if acl is not None: new_key.set_acl(acl) - if src_key.storage_class in "GLACIER": + if src_key.storage_class in ARCHIVE_STORAGE_CLASSES: # Object copied from Glacier object should not have expiry new_key.set_expiry(None) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 205ba3c45..4cf8e7df7 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -58,6 +58,7 @@ from .utils import ( metadata_from_headers, parse_region_from_url, compute_checksum, + ARCHIVE_STORAGE_CLASSES, ) from xml.dom import minidom @@ -1311,8 +1312,8 @@ class S3Response(BaseResponse): if key.version_id: response_headers["x-amz-version-id"] = key.version_id - if key.storage_class == "GLACIER": - raise InvalidObjectState(storage_class="GLACIER") + if key.storage_class in ARCHIVE_STORAGE_CLASSES: + raise InvalidObjectState(storage_class=key.storage_class) if if_unmodified_since: if_unmodified_since = str_to_rfc_1123_datetime(if_unmodified_since) if key.last_modified.replace(microsecond=0) > if_unmodified_since: @@ -1515,7 +1516,7 @@ class S3Response(BaseResponse): ) if key is not None: - if key.storage_class in ["GLACIER", "DEEP_ARCHIVE"]: + if key.storage_class in ARCHIVE_STORAGE_CLASSES: if key.response_dict.get( "x-amz-restore" ) is None or 'ongoing-request="true"' in key.response_dict.get( @@ -2090,7 +2091,7 @@ class S3Response(BaseResponse): es = minidom.parseString(body).getElementsByTagName("Days") days = es[0].childNodes[0].wholeText key = self.backend.get_object(bucket_name, key_name) - if key.storage_class not in ["GLACIER", "DEEP_ARCHIVE"]: + if key.storage_class not in ARCHIVE_STORAGE_CLASSES: raise InvalidObjectState(storage_class=key.storage_class) r = 202 if key.expiry_date is not None: diff --git a/moto/s3/utils.py b/moto/s3/utils.py index d6bd84fb5..76a174978 100644 --- a/moto/s3/utils.py +++ b/moto/s3/utils.py @@ -24,6 +24,18 @@ user_settable_fields = { "content-disposition", "x-robots-tag", } +ARCHIVE_STORAGE_CLASSES = [ + "GLACIER", + "DEEP_ARCHIVE", + "GLACIER_IR", +] +STORAGE_CLASS = [ + "STANDARD", + "REDUCED_REDUNDANCY", + "STANDARD_IA", + "ONEZONE_IA", + "INTELLIGENT_TIERING", +] + ARCHIVE_STORAGE_CLASSES def bucket_name_from_url(url):