| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2015-06-02 23:13:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 14:18:57 -01:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2015-06-02 23:13:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 14:18:57 -01:00
										 |  |  | from moto import mock_s3 | 
					
						
							| 
									
										
										
										
											2015-06-02 23:13:51 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_filters(): | 
					
						
							|  |  |  |     client = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     client.create_bucket( | 
					
						
							|  |  |  |         Bucket="bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a lifecycle rule with a Filter (no tags): | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Expiration": {"Days": 7}, | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result["Rules"][0]["Filter"]["Prefix"] == "" | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     assert not result["Rules"][0]["Filter"].get("And") | 
					
						
							|  |  |  |     assert not result["Rules"][0]["Filter"].get("Tag") | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     # Without any prefixes and an empty filter (this is by default a prefix for the whole bucket): | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Expiration": {"Days": 7}, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							|  |  |  |                 "Filter": {}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # If we remove the filter -- and don't specify a Prefix, then this is bad: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     lfc["Rules"][0].pop("Filter") | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     # With a tag: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     lfc["Rules"][0]["Filter"] = {"Tag": {"Key": "mytag", "Value": "mytagvalue"}} | 
					
						
							|  |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert result["Rules"][0]["Filter"]["Prefix"] | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     assert not result["Rules"][0]["Filter"].get("And") | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["Tag"]["Key"] == "mytag" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["Tag"]["Value"] == "mytagvalue" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # With And (single tag): | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     lfc["Rules"][0]["Filter"] = { | 
					
						
							|  |  |  |         "And": { | 
					
						
							|  |  |  |             "Prefix": "some/prefix", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "Tags": [{"Key": "mytag", "Value": "mytagvalue"}], | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							|  |  |  |     assert not result["Rules"][0]["Filter"].get("Prefix") | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Prefix"] == "some/prefix" | 
					
						
							|  |  |  |     assert len(result["Rules"][0]["Filter"]["And"]["Tags"]) == 1 | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Key"] == "mytag" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Value"] == "mytagvalue" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # With multiple And tags: | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     lfc["Rules"][0]["Filter"]["And"] = { | 
					
						
							|  |  |  |         "Prefix": "some/prefix", | 
					
						
							|  |  |  |         "Tags": [ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             {"Key": "mytag", "Value": "mytagvalue"}, | 
					
						
							|  |  |  |             {"Key": "mytag2", "Value": "mytagvalue2"}, | 
					
						
							|  |  |  |         ], | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     assert not result["Rules"][0]["Filter"].get("Prefix") | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     assert result["Rules"][0]["Filter"]["And"]["Prefix"] == "some/prefix" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     assert len(result["Rules"][0]["Filter"]["And"]["Tags"]) == 2 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Key"] == "mytag" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Value"] == "mytagvalue" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][1]["Key"] == "mytag2" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][1]["Value"] == "mytagvalue2" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     # And filter without Prefix but multiple Tags: | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     lfc["Rules"][0]["Filter"]["And"] = { | 
					
						
							|  |  |  |         "Tags": [ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             {"Key": "mytag", "Value": "mytagvalue"}, | 
					
						
							|  |  |  |             {"Key": "mytag2", "Value": "mytagvalue2"}, | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         assert result["Rules"][0]["Filter"]["And"]["Prefix"] | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     assert len(result["Rules"][0]["Filter"]["And"]["Tags"]) == 2 | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Key"] == "mytag" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][0]["Value"] == "mytagvalue" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][1]["Key"] == "mytag2" | 
					
						
							|  |  |  |     assert result["Rules"][0]["Filter"]["And"]["Tags"][1]["Value"] == "mytagvalue2" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(KeyError): | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |         assert result["Rules"][0]["Prefix"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Can't have both filter and prefix: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     lfc["Rules"][0]["Prefix"] = "" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     lfc["Rules"][0]["Prefix"] = "some/path" | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # No filters -- just a prefix: | 
					
						
							|  |  |  |     del lfc["Rules"][0]["Filter"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert not result["Rules"][0].get("Filter") | 
					
						
							|  |  |  |     assert result["Rules"][0]["Prefix"] == "some/path" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     # Can't have Tag, Prefix, and And in a filter: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     del lfc["Rules"][0]["Prefix"] | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     lfc["Rules"][0]["Filter"] = { | 
					
						
							|  |  |  |         "Prefix": "some/prefix", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Tag": {"Key": "mytag", "Value": "mytagvalue"}, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lfc["Rules"][0]["Filter"] = { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Tag": {"Key": "mytag", "Value": "mytagvalue"}, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         "And": { | 
					
						
							|  |  |  |             "Prefix": "some/prefix", | 
					
						
							|  |  |  |             "Tags": [ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"Key": "mytag", "Value": "mytagvalue"}, | 
					
						
							|  |  |  |                 {"Key": "mytag2", "Value": "mytagvalue2"}, | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make sure multiple rules work: | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Expiration": {"Days": 7}, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Expiration": {"Days": 10}, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |                 "ID": "Tags", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Tag": {"Key": "somekey", "Value": "somevalue"}}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket")["Rules"] | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  |     assert len(result) == 2 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["ID"] == "wholebucket" | 
					
						
							|  |  |  |     assert result[1]["ID"] == "Tags" | 
					
						
							| 
									
										
										
										
											2019-10-05 11:46:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_eodm(): | 
					
						
							|  |  |  |     client = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     client.create_bucket( | 
					
						
							|  |  |  |         Bucket="bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Expiration": {"ExpiredObjectDeleteMarker": True}, | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							|  |  |  |     assert result["Rules"][0]["Expiration"]["ExpiredObjectDeleteMarker"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Set to False: | 
					
						
							|  |  |  |     lfc["Rules"][0]["Expiration"]["ExpiredObjectDeleteMarker"] = False | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							|  |  |  |     assert not result["Rules"][0]["Expiration"]["ExpiredObjectDeleteMarker"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # With failure: | 
					
						
							|  |  |  |     lfc["Rules"][0]["Expiration"]["Days"] = 7 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  |     del lfc["Rules"][0]["Expiration"]["Days"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     lfc["Rules"][0]["Expiration"]["Date"] = datetime(2015, 1, 1) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-04-02 14:19:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_nve(): | 
					
						
							|  |  |  |     client = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     client.create_bucket( | 
					
						
							|  |  |  |         Bucket="bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "NoncurrentVersionExpiration": {"NoncurrentDays": 30}, | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							|  |  |  |     assert result["Rules"][0]["NoncurrentVersionExpiration"]["NoncurrentDays"] == 30 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Change NoncurrentDays: | 
					
						
							|  |  |  |     lfc["Rules"][0]["NoncurrentVersionExpiration"]["NoncurrentDays"] = 10 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							|  |  |  |     assert result["Rules"][0]["NoncurrentVersionExpiration"]["NoncurrentDays"] == 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 11:04:55 -05:00
										 |  |  |     # TODO: Add test for failures due to missing children | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_nvt(): | 
					
						
							|  |  |  |     client = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     client.create_bucket( | 
					
						
							|  |  |  |         Bucket="bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "NoncurrentVersionTransitions": [ | 
					
						
							|  |  |  |                     {"NoncurrentDays": 30, "StorageClass": "ONEZONE_IA"} | 
					
						
							|  |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     assert result["Rules"][0]["NoncurrentVersionTransitions"][0]["NoncurrentDays"] == 30 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         result["Rules"][0]["NoncurrentVersionTransitions"][0]["StorageClass"] | 
					
						
							|  |  |  |         == "ONEZONE_IA" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Change NoncurrentDays: | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     lfc["Rules"][0]["NoncurrentVersionTransitions"][0]["NoncurrentDays"] = 10 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     assert result["Rules"][0]["NoncurrentVersionTransitions"][0]["NoncurrentDays"] == 10 | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Change StorageClass: | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     lfc["Rules"][0]["NoncurrentVersionTransitions"][0]["StorageClass"] = "GLACIER" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         result["Rules"][0]["NoncurrentVersionTransitions"][0]["StorageClass"] | 
					
						
							|  |  |  |         == "GLACIER" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With failures for missing children: | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     del lfc["Rules"][0]["NoncurrentVersionTransitions"][0]["NoncurrentDays"] | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     lfc["Rules"][0]["NoncurrentVersionTransitions"][0]["NoncurrentDays"] = 30 | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 01:11:11 -05:00
										 |  |  |     del lfc["Rules"][0]["NoncurrentVersionTransitions"][0]["StorageClass"] | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |             Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert err.value.response["Error"]["Code"] == "MalformedXML" | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_aimu(): | 
					
						
							|  |  |  |     client = boto3.client("s3") | 
					
						
							| 
									
										
										
										
											2020-02-02 10:36:51 +00:00
										 |  |  |     client.create_bucket( | 
					
						
							|  |  |  |         Bucket="bucket", CreateBucketConfiguration={"LocationConstraint": "us-west-1"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lfc = { | 
					
						
							|  |  |  |         "Rules": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}, | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |                 "ID": "wholebucket", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Filter": {"Prefix": ""}, | 
					
						
							|  |  |  |                 "Status": "Enabled", | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         result["Rules"][0]["AbortIncompleteMultipartUpload"]["DaysAfterInitiation"] == 7 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Change DaysAfterInitiation: | 
					
						
							|  |  |  |     lfc["Rules"][0]["AbortIncompleteMultipartUpload"]["DaysAfterInitiation"] = 30 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="bucket", LifecycleConfiguration=lfc | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  |     result = client.get_bucket_lifecycle_configuration(Bucket="bucket") | 
					
						
							|  |  |  |     assert len(result["Rules"]) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         result["Rules"][0]["AbortIncompleteMultipartUpload"]["DaysAfterInitiation"] | 
					
						
							|  |  |  |         == 30 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 11:04:55 -05:00
										 |  |  |     # TODO: Add test for failures due to missing children | 
					
						
							| 
									
										
										
										
											2018-10-03 00:40:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 20:06:42 +00:00
										 |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_with_glacier_transition_boto3(): | 
					
						
							|  |  |  |     s3 = boto3.resource("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     client = boto3.client("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     s3.create_bucket(Bucket="foobar") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="foobar", | 
					
						
							|  |  |  |         LifecycleConfiguration={ | 
					
						
							|  |  |  |             "Rules": [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ID": "myid", | 
					
						
							|  |  |  |                     "Prefix": "", | 
					
						
							|  |  |  |                     "Status": "Enabled", | 
					
						
							|  |  |  |                     "Transitions": [{"Days": 30, "StorageClass": "GLACIER"}], | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = client.get_bucket_lifecycle_configuration(Bucket="foobar") | 
					
						
							|  |  |  |     response.should.have.key("Rules") | 
					
						
							|  |  |  |     rules = response["Rules"] | 
					
						
							|  |  |  |     rules.should.have.length_of(1) | 
					
						
							|  |  |  |     rules[0].should.have.key("ID").equal("myid") | 
					
						
							|  |  |  |     transition = rules[0]["Transitions"][0] | 
					
						
							|  |  |  |     transition["Days"].should.equal(30) | 
					
						
							|  |  |  |     transition["StorageClass"].should.equal("GLACIER") | 
					
						
							|  |  |  |     transition.shouldnt.have.key("Date") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_multi_boto3(): | 
					
						
							|  |  |  |     s3 = boto3.resource("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     client = boto3.client("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     s3.create_bucket(Bucket="foobar") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     date = "2022-10-12T00:00:00.000Z" | 
					
						
							|  |  |  |     sc = "GLACIER" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="foobar", | 
					
						
							|  |  |  |         LifecycleConfiguration={ | 
					
						
							|  |  |  |             "Rules": [ | 
					
						
							|  |  |  |                 {"ID": "1", "Prefix": "1/", "Status": "Enabled"}, | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ID": "2", | 
					
						
							|  |  |  |                     "Prefix": "2/", | 
					
						
							|  |  |  |                     "Status": "Enabled", | 
					
						
							|  |  |  |                     "Expiration": {"Days": 2}, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ID": "3", | 
					
						
							|  |  |  |                     "Prefix": "3/", | 
					
						
							|  |  |  |                     "Status": "Enabled", | 
					
						
							|  |  |  |                     "Expiration": {"Date": date}, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ID": "4", | 
					
						
							|  |  |  |                     "Prefix": "4/", | 
					
						
							|  |  |  |                     "Status": "Enabled", | 
					
						
							|  |  |  |                     "Transitions": [{"Days": 4, "StorageClass": "GLACIER"}], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ID": "5", | 
					
						
							|  |  |  |                     "Prefix": "5/", | 
					
						
							|  |  |  |                     "Status": "Enabled", | 
					
						
							|  |  |  |                     "Transitions": [{"Date": date, "StorageClass": "GLACIER"}], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # read the lifecycle back | 
					
						
							|  |  |  |     rules = client.get_bucket_lifecycle_configuration(Bucket="foobar")["Rules"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for rule in rules: | 
					
						
							|  |  |  |         if rule["ID"] == "1": | 
					
						
							|  |  |  |             rule["Prefix"].should.equal("1/") | 
					
						
							|  |  |  |             rule.shouldnt.have.key("Expiration") | 
					
						
							|  |  |  |         elif rule["ID"] == "2": | 
					
						
							|  |  |  |             rule["Prefix"].should.equal("2/") | 
					
						
							|  |  |  |             rule["Expiration"]["Days"].should.equal(2) | 
					
						
							|  |  |  |         elif rule["ID"] == "3": | 
					
						
							|  |  |  |             rule["Prefix"].should.equal("3/") | 
					
						
							|  |  |  |             rule["Expiration"]["Date"].should.be.a(datetime) | 
					
						
							|  |  |  |             rule["Expiration"]["Date"].strftime("%Y-%m-%dT%H:%M:%S.000Z").should.equal( | 
					
						
							|  |  |  |                 date | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         elif rule["ID"] == "4": | 
					
						
							|  |  |  |             rule["Prefix"].should.equal("4/") | 
					
						
							|  |  |  |             rule["Transitions"][0]["Days"].should.equal(4) | 
					
						
							|  |  |  |             rule["Transitions"][0]["StorageClass"].should.equal(sc) | 
					
						
							|  |  |  |         elif rule["ID"] == "5": | 
					
						
							|  |  |  |             rule["Prefix"].should.equal("5/") | 
					
						
							|  |  |  |             rule["Transitions"][0]["Date"].should.be.a(datetime) | 
					
						
							|  |  |  |             rule["Transitions"][0]["Date"].strftime( | 
					
						
							|  |  |  |                 "%Y-%m-%dT%H:%M:%S.000Z" | 
					
						
							|  |  |  |             ).should.equal(date) | 
					
						
							|  |  |  |             rule["Transitions"][0]["StorageClass"].should.equal(sc) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             assert False, "Invalid rule id" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_lifecycle_delete_boto3(): | 
					
						
							|  |  |  |     s3 = boto3.resource("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     client = boto3.client("s3", region_name="us-east-1") | 
					
						
							|  |  |  |     s3.create_bucket(Bucket="foobar") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.put_bucket_lifecycle_configuration( | 
					
						
							|  |  |  |         Bucket="foobar", | 
					
						
							|  |  |  |         LifecycleConfiguration={ | 
					
						
							|  |  |  |             "Rules": [{"ID": "myid", "Prefix": "", "Status": "Enabled"}] | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.delete_bucket_lifecycle(Bucket="foobar") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.get_bucket_lifecycle_configuration(Bucket="foobar") | 
					
						
							|  |  |  |     ex.value.response["Error"]["Code"].should.equal("NoSuchLifecycleConfiguration") | 
					
						
							|  |  |  |     ex.value.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "The lifecycle configuration does not exist" | 
					
						
							|  |  |  |     ) |