| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sure  # noqa | 
					
						
							|  |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | from nose.tools import assert_raises | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | from moto import mock_s3 | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_storage_class_standard(): | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3 = boto3.client("s3", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.create_bucket(Bucket="Bucket") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     # add an object to the bucket with standard storage | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object(Bucket="Bucket", Key="my_key", Body="my_value") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     list_of_objects = s3.list_objects(Bucket="Bucket") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     list_of_objects["Contents"][0]["StorageClass"].should.equal("STANDARD") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_storage_class_infrequent_access(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3 = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-2"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     # add an object to the bucket with standard storage | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", | 
					
						
							|  |  |  |         Key="my_key_infrequent", | 
					
						
							|  |  |  |         Body="my_value_infrequent", | 
					
						
							|  |  |  |         StorageClass="STANDARD_IA", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     D = s3.list_objects(Bucket="Bucket") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     D["Contents"][0]["StorageClass"].should.equal("STANDARD_IA") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_storage_class_intelligent_tiering(): | 
					
						
							|  |  |  |     s3 = boto3.client("s3") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-east-2"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", | 
					
						
							|  |  |  |         Key="my_key_infrequent", | 
					
						
							|  |  |  |         Body="my_value_infrequent", | 
					
						
							|  |  |  |         StorageClass="INTELLIGENT_TIERING", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     objects = s3.list_objects(Bucket="Bucket") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     objects["Contents"][0]["StorageClass"].should.equal("INTELLIGENT_TIERING") | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_storage_class_copy(): | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3 = boto3.client("s3", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.create_bucket(Bucket="Bucket") | 
					
						
							|  |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", Key="First_Object", Body="Body", StorageClass="STANDARD" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.create_bucket(Bucket="Bucket2") | 
					
						
							|  |  |  |     # second object is originally of storage class REDUCED_REDUNDANCY | 
					
						
							|  |  |  |     s3.put_object(Bucket="Bucket2", Key="Second_Object", Body="Body2") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.copy_object( | 
					
						
							|  |  |  |         CopySource={"Bucket": "Bucket", "Key": "First_Object"}, | 
					
						
							|  |  |  |         Bucket="Bucket2", | 
					
						
							|  |  |  |         Key="Second_Object", | 
					
						
							|  |  |  |         StorageClass="ONEZONE_IA", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     list_of_copied_objects = s3.list_objects(Bucket="Bucket2") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     # checks that a copied object can be properly copied | 
					
						
							|  |  |  |     list_of_copied_objects["Contents"][0]["StorageClass"].should.equal("ONEZONE_IA") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_invalid_copied_storage_class(): | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3 = boto3.client("s3", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.create_bucket(Bucket="Bucket") | 
					
						
							|  |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", Key="First_Object", Body="Body", StorageClass="STANDARD" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s3.create_bucket(Bucket="Bucket2") | 
					
						
							|  |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket2", | 
					
						
							|  |  |  |         Key="Second_Object", | 
					
						
							|  |  |  |         Body="Body2", | 
					
						
							|  |  |  |         StorageClass="REDUCED_REDUNDANCY", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Try to copy an object with an invalid storage class | 
					
						
							|  |  |  |     with assert_raises(ClientError) as err: | 
					
						
							|  |  |  |         s3.copy_object( | 
					
						
							|  |  |  |             CopySource={"Bucket": "Bucket", "Key": "First_Object"}, | 
					
						
							|  |  |  |             Bucket="Bucket2", | 
					
						
							|  |  |  |             Key="Second_Object", | 
					
						
							|  |  |  |             StorageClass="STANDARD2", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     e = err.exception | 
					
						
							|  |  |  |     e.response["Error"]["Code"].should.equal("InvalidStorageClass") | 
					
						
							|  |  |  |     e.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "The storage class you specified is not valid" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_invalid_storage_class(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3 = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     # Try to add an object with an invalid storage class | 
					
						
							|  |  |  |     with assert_raises(ClientError) as err: | 
					
						
							|  |  |  |         s3.put_object( | 
					
						
							|  |  |  |             Bucket="Bucket", Key="First_Object", Body="Body", StorageClass="STANDARDD" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     e = err.exception | 
					
						
							|  |  |  |     e.response["Error"]["Code"].should.equal("InvalidStorageClass") | 
					
						
							|  |  |  |     e.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "The storage class you specified is not valid" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_default_storage_class(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3 = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object(Bucket="Bucket", Key="First_Object", Body="Body") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     list_of_objects = s3.list_objects(Bucket="Bucket") | 
					
						
							| 
									
										
										
										
											2018-06-07 03:09:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     # tests that the default storage class is still STANDARD | 
					
						
							|  |  |  |     list_of_objects["Contents"][0]["StorageClass"].should.equal("STANDARD") | 
					
						
							| 
									
										
										
										
											2018-07-10 13:52:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_copy_object_error_for_glacier_storage_class(): | 
					
						
							|  |  |  |     s3 = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", Key="First_Object", Body="Body", StorageClass="GLACIER" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with assert_raises(ClientError) as exc: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3.copy_object( | 
					
						
							|  |  |  |             CopySource={"Bucket": "Bucket", "Key": "First_Object"}, | 
					
						
							|  |  |  |             Bucket="Bucket", | 
					
						
							|  |  |  |             Key="Second_Object", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     exc.exception.response["Error"]["Code"].should.equal("ObjectNotInActiveTierError") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_s3_copy_object_error_for_deep_archive_storage_class(): | 
					
						
							|  |  |  |     s3 = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     s3.create_bucket( | 
					
						
							|  |  |  |         Bucket="Bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3.put_object( | 
					
						
							|  |  |  |         Bucket="Bucket", Key="First_Object", Body="Body", StorageClass="DEEP_ARCHIVE" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with assert_raises(ClientError) as exc: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3.copy_object( | 
					
						
							|  |  |  |             CopySource={"Bucket": "Bucket", "Key": "First_Object"}, | 
					
						
							|  |  |  |             Bucket="Bucket", | 
					
						
							|  |  |  |             Key="Second_Object", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-07-10 13:52:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 17:34:39 +02:00
										 |  |  |     exc.exception.response["Error"]["Code"].should.equal("ObjectNotInActiveTierError") |